[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\npatreon: gamemode4\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Report broken or unintended behavior\ntitle: ''\nlabels: bug, needs investigation\nassignees: ''\n\n---\n\n**Describe the bug**\nTell us how this bug affects gameplay.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Spawn a cat and '...'\n2. Drop '....' onto the cat\n3. Watch the cat eat '....'\n4. cat.mcfunction stops working\n\n**Expected behavior**\nDescribe what you expected to happen.\n\n**Fix**\nOutline how this bug could be fixed.\n\n**Screenshots**\nIf applicable, add screenshots to help others understand your problem.\n\n**Environment**\n - Minecraft version:\n - Server version:\n - Installed Datapacks:\n - Installed Mods:\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feat_request.md",
    "content": "---\nname: Feature Request\nabout: Request a feature / change to a data pack\ntitle: ''\nlabels: feature-update\nassignees: ''\n\n---\n\n**Describe the feature**\nGive a headline summary of the feature.\n- What is the motivation\n- What data pack does it affect\n- Does credit need to be given?\n- Can you link to a discussion on Discord about it?\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: Build modules\n\non:\n  push:\n    branches: [ master, ver/* ]\n  pull_request:\n  workflow_dispatch:\n\nenv:\n  VERSION: '26.1'\n  COMMIT_MSG: ${{ github.event.head_commit.message }}\n\njobs:\n  build:\n    runs-on: ubuntu-24.04\n    concurrency:\n      group: ${{ github.event_name != 'pull_request' && 'release' || format('pr-{0}', github.event.number) }}\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Checkout release branch\n        if: github.event_name != 'pull_request'\n        uses: actions/checkout@v4\n        with:\n          ref: release\n          path: release\n\n      - name: Fetch pull request base\n        if: github.event_name == 'pull_request'\n        run: git fetch origin ${{ github.base_ref }}\n\n      - name: Set up uv\n        uses: astral-sh/setup-uv@v7\n\n      - name: Build and publish all modules\n        if: github.event_name != 'pull_request'\n        run: uv run beet -p beet-release.yaml -l ${{ env.LOG_LEVEL }} build\n        env:\n          BEET_MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }}\n          BEET_SMITHED_TOKEN: ${{ secrets.SMITHED_TOKEN }}\n          LOG_LEVEL: ${{ runner.debug == 1 && 'DEBUG' || 'INFO'}}\n          MASTER_BUILD: true\n\n      - name: Build all modules for pull request\n        if: github.event_name == 'pull_request'\n        run: uv run beet -p beet-release.yaml -l ${{ env.LOG_LEVEL }} build\n        env:\n          LOG_LEVEL: ${{ runner.debug == 1 && 'DEBUG' || 'INFO'}}\n\n      - name: Remove non-modules for artifact\n        if: github.event_name == 'pull_request'\n        run: |\n          rm -r release/$VERSION/generated\n          rm release/$VERSION/lib_*\n          rm release/$VERSION/meta.json\n\n      - name: Upload artifact\n        if: github.event_name == 'pull_request'\n        uses: actions/upload-artifact@v4\n        with:\n          name: 'Modules for pull request #${{ github.event.number }}'\n          path: ${{ github.workspace }}/release/${{ env.VERSION }}/\n\n      - name: Commit release\n        if: github.event_name != 'pull_request'\n        run: |\n          git config --global user.email \"${{ github.event.head_commit.author.email }}\"\n          git config --global user.name \"${{ github.event.head_commit.author.username }}\"\n          cd release\n          git add .\n          git commit -m \"🚀 ${{ github.event.after }} $COMMIT_MSG\"\n\n      - name: Push release\n        if: github.event_name != 'pull_request'\n        uses: ad-m/github-push-action@v0.8.0\n        with:\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          directory: release\n          branch: release\n\n  test:\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n          # https://fabricmc.net/use/server/\n          # https://modrinth.com/mod/fabric-api/versions\n          # https://modrinth.com/mod/packtest/versions\n          - version: '26.1'\n            fabric_server_url: https://meta.fabricmc.net/v2/versions/loader/26.1-snapshot-6/0.18.4/1.1.1/server/jar\n            fabric_api_url: https://cdn.modrinth.com/data/P7dR8mSH/versions/WAZ95Yd8/fabric-api-0.143.2%2B26.1.jar\n            packtest_url: https://cdn.modrinth.com/data/XsKUhp45/versions/eupLiv70/packtest-2.5.0-beta1.jar\n            command_limit_tracer_url: https://cdn.modrinth.com/data/Ao12dSbt/versions/DxBN5h3K/commandlimittracer-0.2.0.jar\n    name: 'test-${{ matrix.version }}'\n    runs-on: ubuntu-24.04\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Set up uv\n        uses: astral-sh/setup-uv@v7\n\n      - name: Build all modules for tests\n        run: uv run beet -p beet-test.yaml -l ${{ env.LOG_LEVEL }} build\n        env:\n          LOG_LEVEL: ${{ runner.debug == 1 && 'DEBUG' || 'INFO'}}\n\n      - name: Setup Java\n        uses: actions/setup-java@v4\n        with:\n          distribution: 'temurin'\n          java-version: '25'\n\n      - name: Download server files\n        run: |\n          curl -o server.jar ${{ matrix.fabric_server_url }}\n          mkdir mods\n          curl -o mods/fabric-api.jar ${{ matrix.fabric_api_url }}\n          curl -o mods/packtest.jar ${{ matrix.packtest_url }}\n          curl -o mods/command_limit_tracer.jar ${{ matrix.command_limit_tracer_url }}\n\n      - name: Copy packs to world\n        run: |\n          mkdir -p world/datapacks\n          rm out/gm4_zauber_liquids.zip\n          cp out/gm4_*.zip world/datapacks\n\n      - name: Run test server\n        id: run-tests\n        run: |\n          java -Xmx2G -Dpacktest.auto -Dpacktest.auto.annotations -jar server.jar nogui\n\n      - name: Upload test world\n        if: ${{ failure() && steps.run-tests.conclusion == 'failure' }}\n        uses: actions/upload-artifact@v4\n        with:\n          name: 'Test world in ${{ matrix.version }} for ${{ github.sha }}'\n          path: ${{ github.workspace }}/world/\n"
  },
  {
    "path": ".gitignore",
    "content": "### macOS ###\n.DS_Store\n.AppleDouble\n.LSOverride\n\n### Libre Office ###\n.~lock.*\n\n### Python ###\n__pycache__/\n*.py[cod]\n*$py.class\n*.egg-info/\n\n### Beet ###\nout/\nrelease/\n.beet_cache/\n"
  },
  {
    "path": ".python-version",
    "content": "3.14\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n\t\"files.insertFinalNewline\": true,\n\t\"files.trimFinalNewlines\": true\n}\n"
  },
  {
    "path": ".vscode/tasks.json",
    "content": "{\n\t// See https://go.microsoft.com/fwlink/?LinkId=733558\n\t// for the documentation about the tasks.json format\n\t\"version\": \"2.0.0\",\n\t\"tasks\": [\n\t\t{\n\t\t\t\"label\": \"Develop module\",\n\t\t\t\"type\": \"shell\",\n\t\t\t\"command\": \"beet\",\n\t\t\t\"args\": [\"--set\", \"'meta.dev=${input:module}'\", \"watch\", \"--link\", \"'${input:world}'\"],\n\t\t\t\"group\": \"build\",\n\t\t\t\"presentation\": {\n\t\t\t\t\"reveal\": \"always\",\n\t\t\t\t\"panel\": \"shared\"\n\t\t\t},\n\t\t\t\"isBackground\": true,\n\t\t\t\"problemMatcher\": {\n\t\t\t\t\"pattern\": {\n\t\t\t\t\t\"regexp\": \"^dewrhfguyrwedjwgfw(.)(.)(.)(.)(.)$\"\n\t\t\t\t},\n\t\t\t\t\"background\": {\n\t\t\t\t\t\"activeOnStart\": true,\n\t\t\t\t\t\"beginsPattern\": \"(\\\\d+ changes detected|Edited '.*')\",\n\t\t\t\t\t\"endsPattern\": \"\\\\[GM4\\\\] Generated development pack\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t],\n\t\"inputs\": [\n\t\t{\n\t\t\t\"id\": \"world\",\n\t\t\t\"type\": \"promptString\",\n\t\t\t\"description\": \"What world save should it be linked to?\",\n\t\t},\n\t\t{\n\t\t\t\"id\": \"module\",\n\t\t\t\"type\": \"promptString\",\n\t\t\t\"description\": \"Which module should be watched?\",\n\t\t\t\"default\": \"bat_grenades\",\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "LICENSE.md",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "# Gamemode 4 Data Packs\n> Gamemode 4 is an open-source data pack collection designed to augment the vanilla survival experience.\n\n[![Download our Data Packs](./docs/images/badges/gm4-website.svg)](https://gm4.co/modules)\n[![Available on Modrinth](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/available/modrinth_vector.svg)](https://modrinth.com/organization/gamemode4/)\n[![Chat with us on Discord](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/social/discord-plural_vector.svg)](https://gm4.co/discord)\n[![Read our Wiki](./docs/images/badges/gm4-wiki.svg)](https://wiki.gm4.co/Main_Page)\n\n## Contributing\nContributions are welcome! We use [Beet](https://mcbeet.dev) to build our modules. See [our documentation on how to get started](./docs/getting-started.md).\n\nFound a bug with one of our modules? You can [create an issue on GitHub](https://github.com/Gamemode4Dev/GM4_Datapacks/issues)!\n"
  },
  {
    "path": "base/assets/gm4/font/container_gui.json",
    "content": "{\n    \"providers\": [\n        {\n            \"type\": \"space\",\n            \"advances\": {\n                \"\\uf824\": 5,\n                \"\\uf808\": -8\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "base/assets/gm4/font/default.json",
    "content": "{\n    \"providers\": [\n        {\n            \"type\": \"reference\",\n            \"id\": \"minecraft:default\"\n        }\n    ]\n}\n"
  },
  {
    "path": "base/assets/gm4/font/half_invert.json",
    "content": "{\n    \"providers\": [\n        {\n            \"type\": \"space\",\n            \"advances\": {\n                \"0\": -3,\n                \"1\": -3,\n                \"2\": -3,\n                \"3\": -3,\n                \"4\": -3,\n                \"5\": -3,\n                \"6\": -3,\n                \"7\": -3,\n                \"8\": -3,\n                \"9\": -3,\n                \"\\u0000\": -4.5,\n                \"\\u0001\": -4.5,\n                \"\\u0002\": -4.5,\n                \"\\u0003\": -4.5,\n                \"\\u0004\": -4.5,\n                \"\\u0005\": -4.5,\n                \"\\u0006\": -4.5,\n                \"\\u0007\": -4.5,\n                \"\\b\": -4.5,\n                \"\\t\": -4.5,\n                \"\\n\": -4.5,\n                \"\\u000b\": -4.5,\n                \"\\f\": -4.5,\n                \"\\r\": -4.5,\n                \"\\u000e\": -4.5,\n                \"\\u000f\": -4.5,\n                \"\\u0010\": -4.5,\n                \"\\u0011\": -4.5,\n                \"\\u0012\": -4.5,\n                \"\\u0013\": -4.5,\n                \"\\u0014\": -4.5,\n                \"\\u0015\": -4.5,\n                \"\\u0016\": -4.5,\n                \"\\u0017\": -4.5,\n                \"\\u0018\": -4.5,\n                \"\\u0019\": -4.5,\n                \"\\u001a\": -4.5,\n                \"\\u001b\": -4.5,\n                \"\\u001c\": -4.5,\n                \"\\u001d\": -4.5,\n                \"\\u001e\": -4.5,\n                \"\\u001f\": -4.5,\n                \" \": -2,\n                \"!\": -1,\n                \"\\\"\": -2,\n                \"#\": -3,\n                \"$\": -3,\n                \"%\": -3,\n                \"&\": -3,\n                \"'\": -1,\n                \"(\": -2,\n                \")\": -2,\n                \"*\": -2,\n                \"+\": -3,\n                \",\": -1,\n                \"-\": -3,\n                \".\": -1,\n                \"/\": -3,\n                \":\": -1,\n                \";\": -1,\n                \"<\": -2.5,\n                \"=\": -3,\n                \">\": -2.5,\n                \"?\": -3,\n                \"@\": -3.5,\n                \"A\": -3,\n                \"B\": -3,\n                \"C\": -3,\n                \"D\": -3,\n                \"E\": -3,\n                \"F\": -3,\n                \"G\": -3,\n                \"H\": -3,\n                \"I\": -2,\n                \"J\": -3,\n                \"K\": -3,\n                \"L\": -3,\n                \"M\": -3,\n                \"N\": -3,\n                \"O\": -3,\n                \"P\": -3,\n                \"Q\": -3,\n                \"R\": -3,\n                \"S\": -3,\n                \"T\": -3,\n                \"U\": -3,\n                \"V\": -3,\n                \"W\": -3,\n                \"X\": -3,\n                \"Y\": -3,\n                \"Z\": -3,\n                \"[\": -2,\n                \"\\\\\": -3,\n                \"]\": -2,\n                \"^\": -3,\n                \"_\": -3,\n                \"`\": -1.5,\n                \"a\": -3,\n                \"b\": -3,\n                \"c\": -3,\n                \"d\": -3,\n                \"e\": -3,\n                \"f\": -2.5,\n                \"g\": -3,\n                \"h\": -3,\n                \"i\": -1,\n                \"j\": -3,\n                \"k\": -2.5,\n                \"l\": -1.5,\n                \"m\": -3,\n                \"n\": -3,\n                \"o\": -3,\n                \"p\": -3,\n                \"q\": -3,\n                \"r\": -3,\n                \"s\": -3,\n                \"t\": -2,\n                \"u\": -3,\n                \"v\": -3,\n                \"w\": -3,\n                \"x\": -3,\n                \"y\": -3,\n                \"z\": -3,\n                \"{\": -2,\n                \"|\": -1,\n                \"}\": -2,\n                \"~\": -3.5,\n                \"\\u007f\": -4.5,\n                \"\\u0080\": -4.5,\n                \"\\u0081\": -4.5,\n                \"\\u0082\": -4.5,\n                \"\\u0083\": -4.5,\n                \"\\u0084\": -4.5,\n                \"\\u0085\": -4.5,\n                \"\\u0086\": -4.5,\n                \"\\u0087\": -4.5,\n                \"\\u0088\": -4.5,\n                \"\\u0089\": -4.5,\n                \"\\u008a\": -4.5,\n                \"\\u008b\": -4.5,\n                \"\\u008c\": -4.5,\n                \"\\u008d\": -4.5,\n                \"\\u008e\": -4.5,\n                \"\\u008f\": -4.5,\n                \"\\u0090\": -4.5,\n                \"\\u0091\": -4.5,\n                \"\\u0092\": -4.5,\n                \"\\u0093\": -4.5,\n                \"\\u0094\": -4.5,\n                \"\\u0095\": -4.5,\n                \"\\u0096\": -4.5,\n                \"\\u0097\": -4.5,\n                \"\\u0098\": -4.5,\n                \"\\u0099\": -4.5,\n                \"\\u009a\": -4.5,\n                \"\\u009b\": -4.5,\n                \"\\u009c\": -4.5,\n                \"\\u009d\": -4.5,\n                \"\\u009e\": -4.5,\n                \"\\u009f\": -4.5,\n                \"\\u00a0\": -4.5,\n                \"\\u00a1\": -1,\n                \"\\u00a2\": -3,\n                \"\\u00a3\": -3,\n                \"\\u00a4\": -4,\n                \"\\u00a5\": -3,\n                \"\\u00a6\": -1,\n                \"\\u00a7\": -3,\n                \"\\u00a8\": -2,\n                \"\\u00a9\": -4,\n                \"\\u00aa\": -2.5,\n                \"\\u00ab\": -3.5,\n                \"\\u00ac\": -3,\n                \"\\u00ad\": -2,\n                \"\\u00ae\": -4,\n                \"\\u00af\": -3,\n                \"\\u00b0\": -2.5,\n                \"\\u00b1\": -3,\n                \"\\u00b2\": -2.5,\n                \"\\u00b3\": -2.5,\n                \"\\u00b4\": -1.5,\n                \"\\u00b5\": -3,\n                \"\\u00b6\": -3.5,\n                \"\\u00b7\": -1,\n                \"\\u00b8\": -1,\n                \"\\u00b9\": -2,\n                \"\\u00ba\": -2.5,\n                \"\\u00bb\": -3.5,\n                \"\\u00bc\": -4,\n                \"\\u00bd\": -4,\n                \"\\u00be\": -4,\n                \"\\u00bf\": -3,\n                \"\\u00c0\": -3,\n                \"\\u00c1\": -3,\n                \"\\u00c2\": -3,\n                \"\\u00c3\": -3,\n                \"\\u00c4\": -3,\n                \"\\u00c5\": -3,\n                \"\\u00c6\": -5,\n                \"\\u00c7\": -3,\n                \"\\u00c8\": -3,\n                \"\\u00c9\": -3,\n                \"\\u00ca\": -3,\n                \"\\u00cb\": -3,\n                \"\\u00cc\": -2,\n                \"\\u00cd\": -2,\n                \"\\u00ce\": -2,\n                \"\\u00cf\": -2,\n                \"\\u00d0\": -3.5,\n                \"\\u00d1\": -3,\n                \"\\u00d2\": -3,\n                \"\\u00d3\": -3,\n                \"\\u00d4\": -3,\n                \"\\u00d5\": -3,\n                \"\\u00d6\": -3,\n                \"\\u00d7\": -3,\n                \"\\u00d8\": -3,\n                \"\\u00d9\": -3,\n                \"\\u00da\": -3,\n                \"\\u00db\": -3,\n                \"\\u00dc\": -3,\n                \"\\u00dd\": -3,\n                \"\\u00de\": -3,\n                \"\\u00df\": -3,\n                \"\\u00e0\": -3,\n                \"\\u00e1\": -3,\n                \"\\u00e2\": -3,\n                \"\\u00e3\": -3,\n                \"\\u00e4\": -3,\n                \"\\u00e5\": -3,\n                \"\\u00e6\": -5,\n                \"\\u00e7\": -3,\n                \"\\u00e8\": -3,\n                \"\\u00e9\": -3,\n                \"\\u00ea\": -3,\n                \"\\u00eb\": -3,\n                \"\\u00ec\": -1.5,\n                \"\\u00ed\": -1.5,\n                \"\\u00ee\": -2,\n                \"\\u00ef\": -2,\n                \"\\u00f0\": -3,\n                \"\\u00f1\": -3,\n                \"\\u00f2\": -3,\n                \"\\u00f3\": -3,\n                \"\\u00f4\": -3,\n                \"\\u00f5\": -3,\n                \"\\u00f6\": -3,\n                \"\\u00f7\": -3,\n                \"\\u00f8\": -3,\n                \"\\u00f9\": -3,\n                \"\\u00fa\": -3,\n                \"\\u00fb\": -3,\n                \"\\u00fc\": -3,\n                \"\\u00fd\": -3,\n                \"\\u00fe\": -3,\n                \"\\u00ff\": -3,\n                \"\\u0192\": -3,\n                \"\\u2591\": -4,\n                \"\\u2592\": -4.5,\n                \"\\u2593\": -4.5,\n                \"\\u2502\": -3,\n                \"\\u2524\": -3,\n                \"\\u2561\": -3,\n                \"\\u2562\": -4,\n                \"\\u2556\": -4,\n                \"\\u2555\": -3,\n                \"\\u2563\": -4,\n                \"\\u2551\": -4,\n                \"\\u2557\": -4,\n                \"\\u255d\": -4,\n                \"\\u255c\": -4,\n                \"\\u255b\": -3,\n                \"\\u2510\": -3,\n                \"\\u2514\": -4.5,\n                \"\\u2534\": -4.5,\n                \"\\u252c\": -4.5,\n                \"\\u251c\": -4.5,\n                \"\\u2500\": -4.5,\n                \"\\u253c\": -4.5,\n                \"\\u255e\": -4.5,\n                \"\\u255f\": -4.5,\n                \"\\u255a\": -4.5,\n                \"\\u2554\": -4.5,\n                \"\\u2569\": -4.5,\n                \"\\u2566\": -4.5,\n                \"\\u2560\": -4.5,\n                \"\\u2550\": -4.5,\n                \"\\u256c\": -4.5,\n                \"\\u2567\": -4.5,\n                \"\\u2568\": -4.5,\n                \"\\u2564\": -4.5,\n                \"\\u2565\": -4.5,\n                \"\\u2559\": -4.5,\n                \"\\u2558\": -4.5,\n                \"\\u2552\": -4.5,\n                \"\\u2553\": -4.5,\n                \"\\u256b\": -4.5,\n                \"\\u256a\": -4.5,\n                \"\\u2518\": -3,\n                \"\\u250c\": -4.5,\n                \"\\u2588\": -4.5,\n                \"\\u2584\": -4.5,\n                \"\\u258c\": -2.5,\n                \"\\u2590\": -4.5,\n                \"\\u2580\": -4.5,\n                \"\\u2205\": -4,\n                \"\\u2208\": -3,\n                \"\\u2261\": -3.5,\n                \"\\u2265\": -3,\n                \"\\u2264\": -3,\n                \"\\u2320\": -4,\n                \"\\u2321\": -2.5,\n                \"\\u2248\": -3.5,\n                \"\\u2219\": -3,\n                \"\\u221a\": -3.5,\n                \"\\u207f\": -2.5,\n                \"\\u25a0\": -3,\n                \"\\u0100\": -3,\n                \"\\u0101\": -3,\n                \"\\u0102\": -3,\n                \"\\u0103\": -3,\n                \"\\u0104\": -3,\n                \"\\u0105\": -3,\n                \"\\u0106\": -3,\n                \"\\u0107\": -3,\n                \"\\u0108\": -3,\n                \"\\u0109\": -3,\n                \"\\u010a\": -3,\n                \"\\u010b\": -3,\n                \"\\u010c\": -3,\n                \"\\u010d\": -3,\n                \"\\u010e\": -3,\n                \"\\u010f\": -4,\n                \"\\u0110\": -3.5,\n                \"\\u0111\": -3.5,\n                \"\\u0112\": -3,\n                \"\\u0113\": -3,\n                \"\\u0114\": -3,\n                \"\\u0115\": -3,\n                \"\\u0116\": -3,\n                \"\\u0117\": -3,\n                \"\\u0118\": -3,\n                \"\\u0119\": -3,\n                \"\\u011a\": -3,\n                \"\\u011b\": -3,\n                \"\\u011c\": -3,\n                \"\\u011d\": -3,\n                \"\\u1e20\": -3,\n                \"\\u1e21\": -3,\n                \"\\u011e\": -3,\n                \"\\u011f\": -3,\n                \"\\u0120\": -3,\n                \"\\u0121\": -3,\n                \"\\u0122\": -3,\n                \"\\u0123\": -3,\n                \"\\u0124\": -3,\n                \"\\u0125\": -3,\n                \"\\u0126\": -4,\n                \"\\u0127\": -3.5,\n                \"\\u0128\": -2.5,\n                \"\\u0129\": -2.5,\n                \"\\u012a\": -2,\n                \"\\u012b\": -2,\n                \"\\u012c\": -2.5,\n                \"\\u012d\": -2.5,\n                \"\\u012e\": -2,\n                \"\\u012f\": -1.5,\n                \"\\u0130\": -2,\n                \"\\u0131\": -1,\n                \"\\u0134\": -3,\n                \"\\u0135\": -3,\n                \"\\u0136\": -3,\n                \"\\u0137\": -2.5,\n                \"\\u0139\": -3,\n                \"\\u013a\": -1.5,\n                \"\\u013b\": -3,\n                \"\\u013c\": -1.5,\n                \"\\u013d\": -3,\n                \"\\u013e\": -2,\n                \"\\u013f\": -3,\n                \"\\u0140\": -2,\n                \"\\u0141\": -3.5,\n                \"\\u0142\": -2.5,\n                \"\\u0143\": -3,\n                \"\\u0144\": -3,\n                \"\\u0145\": -3,\n                \"\\u0146\": -3,\n                \"\\u0147\": -3,\n                \"\\u0148\": -3,\n                \"\\u014a\": -3,\n                \"\\u014b\": -3,\n                \"\\u014c\": -3,\n                \"\\u014d\": -3,\n                \"\\u014e\": -3,\n                \"\\u014f\": -3,\n                \"\\u0150\": -3,\n                \"\\u0151\": -3,\n                \"\\u0152\": -5,\n                \"\\u0153\": -5,\n                \"\\u0154\": -3,\n                \"\\u0155\": -3,\n                \"\\u0156\": -3,\n                \"\\u0157\": -3,\n                \"\\u0158\": -3,\n                \"\\u0159\": -3,\n                \"\\u015a\": -3,\n                \"\\u015b\": -3,\n                \"\\u015c\": -3,\n                \"\\u015d\": -3,\n                \"\\u015e\": -3,\n                \"\\u015f\": -3,\n                \"\\u0160\": -3,\n                \"\\u0161\": -3,\n                \"\\u0162\": -3,\n                \"\\u0163\": -2,\n                \"\\u0164\": -3,\n                \"\\u0165\": -2.5,\n                \"\\u0166\": -3,\n                \"\\u0167\": -2,\n                \"\\u0168\": -3,\n                \"\\u0169\": -3,\n                \"\\u016a\": -3,\n                \"\\u016b\": -3,\n                \"\\u016c\": -3,\n                \"\\u016d\": -3,\n                \"\\u016e\": -3,\n                \"\\u016f\": -3,\n                \"\\u0170\": -3,\n                \"\\u0171\": -3,\n                \"\\u0172\": -3,\n                \"\\u0173\": -3,\n                \"\\u0174\": -3,\n                \"\\u0175\": -3,\n                \"\\u0176\": -3,\n                \"\\u0177\": -3,\n                \"\\u0178\": -3,\n                \"\\u0179\": -3,\n                \"\\u017a\": -3,\n                \"\\u017b\": -3,\n                \"\\u017c\": -3,\n                \"\\u017d\": -3,\n                \"\\u017e\": -3,\n                \"\\u01fc\": -5,\n                \"\\u01fd\": -5,\n                \"\\u01fe\": -3,\n                \"\\u01ff\": -3,\n                \"\\u0218\": -3,\n                \"\\u0219\": -3,\n                \"\\u021a\": -3,\n                \"\\u021b\": -2,\n                \"\\u0386\": -4,\n                \"\\u0388\": -4,\n                \"\\u0389\": -4,\n                \"\\u038a\": -3,\n                \"\\u038c\": -4,\n                \"\\u038e\": -4,\n                \"\\u038f\": -4,\n                \"\\u0390\": -3,\n                \"\\u03aa\": -2,\n                \"\\u03ab\": -3,\n                \"\\u03ac\": -3,\n                \"\\u03ad\": -3,\n                \"\\u03ae\": -3,\n                \"\\u03af\": -1.5,\n                \"\\u03b0\": -3,\n                \"\\u03ca\": -2,\n                \"\\u03cb\": -3,\n                \"\\u03cc\": -3,\n                \"\\u03cd\": -3,\n                \"\\u03ce\": -4,\n                \"\\u0400\": -3,\n                \"\\u0401\": -3,\n                \"\\u0403\": -3,\n                \"\\u0407\": -2,\n                \"\\u040c\": -3,\n                \"\\u040d\": -3,\n                \"\\u040e\": -3,\n                \"\\u0419\": -3,\n                \"\\u0439\": -3,\n                \"\\u0450\": -3,\n                \"\\u0451\": -3,\n                \"\\u0452\": -3.5,\n                \"\\u0453\": -2.5,\n                \"\\u0457\": -2,\n                \"\\u045b\": -3.5,\n                \"\\u045c\": -2.5,\n                \"\\u045d\": -3,\n                \"\\u045e\": -3,\n                \"\\u045f\": -3,\n                \"\\u0490\": -3,\n                \"\\u0491\": -3,\n                \"\\u1e02\": -3,\n                \"\\u1e03\": -3,\n                \"\\u1e0a\": -3,\n                \"\\u1e0b\": -3,\n                \"\\u1e1e\": -3,\n                \"\\u1e1f\": -2.5,\n                \"\\u1e22\": -3,\n                \"\\u1e23\": -3,\n                \"\\u1e30\": -3,\n                \"\\u1e31\": -2.5,\n                \"\\u1e40\": -3,\n                \"\\u1e41\": -3,\n                \"\\u1e56\": -3,\n                \"\\u1e57\": -3,\n                \"\\u1e60\": -3,\n                \"\\u1e61\": -3,\n                \"\\u1e6a\": -3,\n                \"\\u1e6b\": -2,\n                \"\\u1e80\": -3,\n                \"\\u1e81\": -3,\n                \"\\u1e82\": -3,\n                \"\\u1e83\": -3,\n                \"\\u1e84\": -3,\n                \"\\u1e85\": -3,\n                \"\\u1ef2\": -3,\n                \"\\u1ef3\": -3,\n                \"\\u0149\": -4,\n                \"\\u01e7\": -3,\n                \"\\u01eb\": -3,\n                \"\\u040f\": -3,\n                \"\\u1e0d\": -3,\n                \"\\u1e25\": -3,\n                \"\\u1e5b\": -3,\n                \"\\u1e6d\": -2,\n                \"\\u1e92\": -3,\n                \"\\u1eca\": -2,\n                \"\\u1ecb\": -1,\n                \"\\u1ecc\": -3,\n                \"\\u1ecd\": -3,\n                \"\\u1ee4\": -3,\n                \"\\u1ee5\": -3,\n                \"\\u2116\": -5,\n                \"\\u0207\": -3,\n                \"\\u0194\": -3,\n                \"\\u0263\": -3,\n                \"\\u0283\": -3,\n                \"\\u2047\": -5,\n                \"\\u01f1\": -5,\n                \"\\u01f2\": -5,\n                \"\\u01f3\": -5,\n                \"\\u01c4\": -5,\n                \"\\u01c5\": -5,\n                \"\\u01c6\": -5,\n                \"\\u01c7\": -5,\n                \"\\u01c8\": -5,\n                \"\\u01ca\": -5,\n                \"\\u01cb\": -5,\n                \"\\u01cc\": -5,\n                \"\\u2139\": -5,\n                \"\\u1d6b\": -5,\n                \"\\ua732\": -5,\n                \"\\ua733\": -5,\n                \"\\ua734\": -5,\n                \"\\ua735\": -5,\n                \"\\ua736\": -5,\n                \"\\ua737\": -5,\n                \"\\ua738\": -5,\n                \"\\ua73a\": -5,\n                \"\\ua73c\": -5,\n                \"\\ua73d\": -4.5,\n                \"\\ua74e\": -5,\n                \"\\ua74f\": -5,\n                \"\\ua760\": -3,\n                \"\\ua761\": -3,\n                \"\\ufb04\": -5,\n                \"\\ufb06\": -5,\n                \"\\u16a1\": -2.5,\n                \"\\u16b5\": -2.5,\n                \"\\u01a0\": -4,\n                \"\\u01a1\": -4,\n                \"\\u01af\": -4,\n                \"\\u01b0\": -4,\n                \"\\u1eae\": -3,\n                \"\\u1eaf\": -3,\n                \"\\u1ea4\": -3,\n                \"\\u1ea5\": -3,\n                \"\\u1ebe\": -3,\n                \"\\u1ebf\": -3,\n                \"\\u1ed1\": -3,\n                \"\\u1eda\": -4,\n                \"\\u1edb\": -4,\n                \"\\u1ee8\": -4,\n                \"\\u1ee9\": -4,\n                \"\\u1eb0\": -3,\n                \"\\u1eb1\": -3,\n                \"\\u1ea6\": -3,\n                \"\\u1ea7\": -3,\n                \"\\u1ec0\": -3,\n                \"\\u1ec1\": -3,\n                \"\\u1ed3\": -3,\n                \"\\u1edc\": -4,\n                \"\\u1edd\": -4,\n                \"\\u1eea\": -4,\n                \"\\u1eeb\": -4,\n                \"\\u1ea2\": -3,\n                \"\\u1ea3\": -3,\n                \"\\u1eb2\": -3,\n                \"\\u1eb3\": -3,\n                \"\\u1ea8\": -3,\n                \"\\u1ea9\": -3,\n                \"\\u1eba\": -3,\n                \"\\u1ebb\": -3,\n                \"\\u1ed5\": -3,\n                \"\\u1ede\": -4,\n                \"\\u1ec2\": -3,\n                \"\\u1ec3\": -3,\n                \"\\u1ec8\": -2,\n                \"\\u1ec9\": -2,\n                \"\\u1ece\": -3,\n                \"\\u1ecf\": -3,\n                \"\\u1ed4\": -3,\n                \"\\u1edf\": -4,\n                \"\\u1ee6\": -3,\n                \"\\u1ee7\": -3,\n                \"\\u1eec\": -4,\n                \"\\u1eed\": -4,\n                \"\\u1ef6\": -3,\n                \"\\u1ef7\": -3,\n                \"\\u1ea0\": -3,\n                \"\\u1ea1\": -3,\n                \"\\u1eb6\": -3,\n                \"\\u1eb7\": -3,\n                \"\\u1eac\": -3,\n                \"\\u1ead\": -3,\n                \"\\u1eb8\": -3,\n                \"\\u1eb9\": -3,\n                \"\\u1ec6\": -3,\n                \"\\u1ec7\": -3,\n                \"\\u1ed8\": -3,\n                \"\\u1ed9\": -3,\n                \"\\u1ee2\": -4,\n                \"\\u1ee3\": -4,\n                \"\\u1ef0\": -4,\n                \"\\u1ef1\": -4,\n                \"\\u1ef4\": -3,\n                \"\\u1ef5\": -3,\n                \"\\u1ed0\": -3,\n                \"\\u0195\": -4.5,\n                \"\\u1eaa\": -3,\n                \"\\u1eab\": -3,\n                \"\\u1ed6\": -3,\n                \"\\u1ed7\": -3,\n                \"\\u1eef\": -4,\n                \"\\u261e\": -5,\n                \"\\u261c\": -5,\n                \"\\u262e\": -5,\n                \"\\u1eb4\": -3,\n                \"\\u1eb5\": -3,\n                \"\\u1ebc\": -3,\n                \"\\u1ebd\": -3,\n                \"\\u1ec4\": -3,\n                \"\\u1ec5\": -3,\n                \"\\u1ed2\": -3,\n                \"\\u1ee0\": -4,\n                \"\\u1ee1\": -4,\n                \"\\u1eee\": -4,\n                \"\\u1ef8\": -3,\n                \"\\u1ef9\": -3,\n                \"\\u0498\": -3,\n                \"\\u0499\": -3,\n                \"\\u04a0\": -3.5,\n                \"\\u04a1\": -3,\n                \"\\u04aa\": -3,\n                \"\\u04ab\": -3,\n                \"\\u01f6\": -4.5,\n                \"\\u26a0\": -5,\n                \"\\u24ea\": -5,\n                \"\\u2460\": -5,\n                \"\\u2461\": -5,\n                \"\\u2462\": -5,\n                \"\\u2463\": -5,\n                \"\\u2464\": -5,\n                \"\\u2465\": -5,\n                \"\\u2466\": -5,\n                \"\\u2467\": -5,\n                \"\\u2468\": -5,\n                \"\\u2469\": -5,\n                \"\\u246a\": -5,\n                \"\\u246b\": -5,\n                \"\\u246c\": -5,\n                \"\\u246d\": -5,\n                \"\\u246e\": -5,\n                \"\\u246f\": -5,\n                \"\\u2470\": -5,\n                \"\\u2471\": -5,\n                \"\\u2472\": -5,\n                \"\\u2473\": -5,\n                \"\\u24b6\": -5,\n                \"\\u24b7\": -5,\n                \"\\u24b8\": -5,\n                \"\\u24b9\": -5,\n                \"\\u24ba\": -5,\n                \"\\u24bb\": -5,\n                \"\\u24bc\": -5,\n                \"\\u24bd\": -5,\n                \"\\u24be\": -5,\n                \"\\u24bf\": -5,\n                \"\\u24c0\": -5,\n                \"\\u24c1\": -5,\n                \"\\u24c2\": -5,\n                \"\\u24c3\": -5,\n                \"\\u24c4\": -5,\n                \"\\u24c5\": -5,\n                \"\\u24c6\": -5,\n                \"\\u24c7\": -5,\n                \"\\u24c8\": -5,\n                \"\\u24c9\": -5,\n                \"\\u24ca\": -5,\n                \"\\u24cb\": -5,\n                \"\\u24cc\": -5,\n                \"\\u24cd\": -5,\n                \"\\u24ce\": -5,\n                \"\\u24cf\": -5,\n                \"\\u24d0\": -5,\n                \"\\u24d1\": -5,\n                \"\\u24d2\": -5,\n                \"\\u24d3\": -5,\n                \"\\u24d4\": -5,\n                \"\\u24d5\": -5,\n                \"\\u24d6\": -5,\n                \"\\u24d7\": -5,\n                \"\\u24d8\": -5,\n                \"\\u24d9\": -5,\n                \"\\u24da\": -5,\n                \"\\u24db\": -5,\n                \"\\u24dc\": -5,\n                \"\\u24dd\": -5,\n                \"\\u24de\": -5,\n                \"\\u24df\": -5,\n                \"\\u24e0\": -5,\n                \"\\u24e1\": -5,\n                \"\\u24e2\": -5,\n                \"\\u24e3\": -5,\n                \"\\u24e4\": -5,\n                \"\\u24e5\": -5,\n                \"\\u24e6\": -5,\n                \"\\u24e7\": -5,\n                \"\\u24e8\": -5,\n                \"\\u24e9\": -5,\n                \"\\u0327\": -1.5,\n                \"\\u0282\": -3,\n                \"\\u0290\": -3.5,\n                \"\\u0276\": -5,\n                \"\\u01cd\": -3,\n                \"\\u01ce\": -3,\n                \"\\u01de\": -3,\n                \"\\u01df\": -3,\n                \"\\u01fa\": -3,\n                \"\\u01fb\": -3,\n                \"\\u0202\": -3,\n                \"\\u0203\": -3,\n                \"\\u0226\": -3,\n                \"\\u0227\": -3,\n                \"\\u01e0\": -3,\n                \"\\u01e1\": -3,\n                \"\\u1e00\": -3,\n                \"\\u1e01\": -3,\n                \"\\u0200\": -3,\n                \"\\u0201\": -3,\n                \"\\u1e06\": -3,\n                \"\\u1e07\": -3,\n                \"\\u1e04\": -3,\n                \"\\u1e05\": -3,\n                \"\\u1d6c\": -4,\n                \"\\u1e08\": -3,\n                \"\\u1e09\": -3,\n                \"\\u1e10\": -3,\n                \"\\u1e11\": -3,\n                \"\\u1e12\": -3,\n                \"\\u1e13\": -3,\n                \"\\u1e0e\": -3,\n                \"\\u1e0f\": -3,\n                \"\\u1e0c\": -3,\n                \"\\u1d6d\": -4,\n                \"\\u1e14\": -3,\n                \"\\u1e15\": -3,\n                \"\\u1e16\": -3,\n                \"\\u1e17\": -3,\n                \"\\u1e18\": -3,\n                \"\\u1e19\": -3,\n                \"\\u1e1c\": -3,\n                \"\\u1e1d\": -3,\n                \"\\u0228\": -3,\n                \"\\u0229\": -3,\n                \"\\u1e1a\": -3,\n                \"\\u1e1b\": -3,\n                \"\\u0204\": -3,\n                \"\\u0205\": -3,\n                \"\\u0206\": -3,\n                \"\\u1d6e\": -3,\n                \"\\u01f4\": -3,\n                \"\\u01f5\": -3,\n                \"\\u01e6\": -3,\n                \"\\u1e26\": -3,\n                \"\\u1e27\": -3,\n                \"\\u1e28\": -3,\n                \"\\u1e29\": -3,\n                \"\\u1e2a\": -3,\n                \"\\u1e2b\": -3,\n                \"\\u021e\": -3,\n                \"\\u021f\": -3,\n                \"\\u1e24\": -3,\n                \"\\u1e96\": -3,\n                \"\\u1e2e\": -2,\n                \"\\u1e2f\": -2,\n                \"\\u020a\": -2.5,\n                \"\\u020b\": -2.5,\n                \"\\u01cf\": -2,\n                \"\\u01d0\": -2,\n                \"\\u0208\": -3,\n                \"\\u0209\": -3,\n                \"\\u1e2c\": -2.5,\n                \"\\u1e2d\": -2.5,\n                \"\\u01f0\": -3,\n                \"\\u0237\": -3,\n                \"\\u01e8\": -3,\n                \"\\u01e9\": -2.5,\n                \"\\u1e32\": -3,\n                \"\\u1e33\": -2.5,\n                \"\\u1e34\": -3,\n                \"\\u1e35\": -2.5,\n                \"\\u1e3a\": -3,\n                \"\\u1e3b\": -2,\n                \"\\u1e3c\": -3,\n                \"\\u1e3d\": -2,\n                \"\\u1e36\": -3,\n                \"\\u1e37\": -1.5,\n                \"\\u1e38\": -3,\n                \"\\u1e39\": -2,\n                \"\\u2c62\": -4,\n                \"\\u1e3e\": -3,\n                \"\\u1e3f\": -3,\n                \"\\u1e42\": -3,\n                \"\\u1e43\": -3,\n                \"\\u1d6f\": -4,\n                \"\\u1e44\": -3,\n                \"\\u1e45\": -3,\n                \"\\u1e46\": -3,\n                \"\\u1e47\": -3,\n                \"\\u1e4a\": -3,\n                \"\\u1e4b\": -3,\n                \"\\u01f8\": -3,\n                \"\\u01f9\": -3,\n                \"\\u1e48\": -3,\n                \"\\u1e49\": -3,\n                \"\\u1d70\": -4,\n                \"\\u01ec\": -3,\n                \"\\u01ed\": -3,\n                \"\\u022c\": -3,\n                \"\\u022d\": -3,\n                \"\\u1e4c\": -3,\n                \"\\u1e4d\": -3,\n                \"\\u1e4e\": -3,\n                \"\\u1e4f\": -3,\n                \"\\u1e50\": -3,\n                \"\\u1e51\": -3,\n                \"\\u1e52\": -3,\n                \"\\u1e53\": -3,\n                \"\\u020e\": -3,\n                \"\\u020f\": -3,\n                \"\\u022a\": -3,\n                \"\\u022b\": -3,\n                \"\\u01d1\": -3,\n                \"\\u01d2\": -3,\n                \"\\u022e\": -3,\n                \"\\u022f\": -3,\n                \"\\u0230\": -3,\n                \"\\u0231\": -3,\n                \"\\u020c\": -3,\n                \"\\u020d\": -3,\n                \"\\u01ea\": -3,\n                \"\\u1e54\": -3,\n                \"\\u1e55\": -3,\n                \"\\u1d71\": -4,\n                \"\\u0212\": -3,\n                \"\\u0213\": -3,\n                \"\\u1e58\": -3,\n                \"\\u1e59\": -3,\n                \"\\u1e5c\": -3,\n                \"\\u1e5d\": -3,\n                \"\\u1e5e\": -3,\n                \"\\u1e5f\": -3,\n                \"\\u0210\": -3,\n                \"\\u0211\": -3,\n                \"\\u1e5a\": -3,\n                \"\\u1d73\": -4,\n                \"\\u1d72\": -4,\n                \"\\u1e64\": -3,\n                \"\\u1e65\": -3,\n                \"\\u1e66\": -3,\n                \"\\u1e67\": -3,\n                \"\\u1e62\": -3,\n                \"\\u1e63\": -3,\n                \"\\u1e68\": -3,\n                \"\\u1e69\": -3,\n                \"\\u1d74\": -4,\n                \"\\u1e70\": -3,\n                \"\\u1e71\": -2,\n                \"\\u1e6e\": -3,\n                \"\\u1e6f\": -2,\n                \"\\u1e6c\": -3,\n                \"\\u1e97\": -2,\n                \"\\u1d75\": -3,\n                \"\\u1e72\": -3,\n                \"\\u1e73\": -3,\n                \"\\u1e76\": -3,\n                \"\\u1e77\": -3,\n                \"\\u1e78\": -3,\n                \"\\u1e79\": -3,\n                \"\\u1e7a\": -3,\n                \"\\u1e7b\": -3,\n                \"\\u01d3\": -3,\n                \"\\u01d4\": -3,\n                \"\\u01d5\": -3,\n                \"\\u01d6\": -3,\n                \"\\u01d7\": -3,\n                \"\\u01d8\": -3,\n                \"\\u01d9\": -3,\n                \"\\u01da\": -3,\n                \"\\u01db\": -3,\n                \"\\u01dc\": -3,\n                \"\\u1e74\": -3,\n                \"\\u1e75\": -3,\n                \"\\u0214\": -3,\n                \"\\u0215\": -3,\n                \"\\u0216\": -3,\n                \"\\u1e7e\": -3,\n                \"\\u1e7f\": -3,\n                \"\\u1e7c\": -3,\n                \"\\u1e7d\": -3,\n                \"\\u1e86\": -3,\n                \"\\u1e87\": -3,\n                \"\\u1e88\": -3,\n                \"\\u1e89\": -3,\n                \"\\u1e98\": -3,\n                \"\\u1e8c\": -3,\n                \"\\u1e8d\": -3,\n                \"\\u1e8a\": -3,\n                \"\\u1e8b\": -3,\n                \"\\u0232\": -3,\n                \"\\u0233\": -3,\n                \"\\u1e8e\": -3,\n                \"\\u1e8f\": -3,\n                \"\\u1e99\": -3,\n                \"\\u1e94\": -3,\n                \"\\u1e95\": -3,\n                \"\\u1e90\": -3,\n                \"\\u1e91\": -3,\n                \"\\u1e93\": -3,\n                \"\\u1d76\": -3,\n                \"\\u01ee\": -3,\n                \"\\u01ef\": -3,\n                \"\\u1e9b\": -2,\n                \"\\ua73e\": -3,\n                \"\\ua73f\": -3,\n                \"\\u01e2\": -5,\n                \"\\u01e3\": -5,\n                \"\\u1d7a\": -4.5,\n                \"\\u1efb\": -3.5,\n                \"\\u1d02\": -5,\n                \"\\u1d14\": -5,\n                \"\\uab63\": -5,\n                \"\\u0238\": -5,\n                \"\\u02a3\": -5,\n                \"\\u02a5\": -5,\n                \"\\u02a4\": -5,\n                \"\\u02a9\": -5,\n                \"\\u02aa\": -4,\n                \"\\u02ab\": -4,\n                \"\\u0239\": -5,\n                \"\\u02a8\": -4.5,\n                \"\\u02a6\": -4.5,\n                \"\\u02a7\": -4,\n                \"\\uab50\": -3,\n                \"\\uab51\": -3,\n                \"\\u20a7\": -5,\n                \"\\u1efa\": -4,\n                \"\\ufb2e\": -3,\n                \"\\ufb2f\": -3,\n                \"\\u0180\": -3.5,\n                \"\\u0182\": -3,\n                \"\\u0183\": -3,\n                \"\\u0187\": -3.5,\n                \"\\u0188\": -3.5,\n                \"\\u018a\": -4,\n                \"\\u018b\": -3,\n                \"\\u018c\": -3,\n                \"\\u0193\": -3.5,\n                \"\\u01e4\": -3.5,\n                \"\\u01e5\": -3.5,\n                \"\\u0197\": -2,\n                \"\\u0196\": -2,\n                \"\\u0269\": -1.5,\n                \"\\u0198\": -3,\n                \"\\u0199\": -2.5,\n                \"\\u019d\": -3.5,\n                \"\\u01a4\": -4,\n                \"\\u01a5\": -3,\n                \"\\u027d\": -3,\n                \"\\u01a6\": -3,\n                \"\\u01ac\": -3.5,\n                \"\\u01ad\": -2,\n                \"\\u01ab\": -2,\n                \"\\u01ae\": -3,\n                \"\\u0217\": -3,\n                \"\\u01b1\": -3,\n                \"\\u019c\": -3,\n                \"\\u01b3\": -3.5,\n                \"\\u01b4\": -4,\n                \"\\u01b5\": -3,\n                \"\\u01b6\": -3,\n                \"\\u01a2\": -4,\n                \"\\u01a3\": -4,\n                \"\\u0222\": -3,\n                \"\\u0223\": -3,\n                \"\\u02ad\": -3,\n                \"\\u02ae\": -3.5,\n                \"\\u02af\": -4,\n                \"\\ufb14\": -5,\n                \"\\ufb15\": -5,\n                \"\\ufb17\": -5,\n                \"\\ufb16\": -5,\n                \"\\ufb13\": -5,\n                \"\\u04d0\": -3,\n                \"\\u04d1\": -3,\n                \"\\u04d2\": -3,\n                \"\\u04d3\": -3,\n                \"\\u04f6\": -3,\n                \"\\u04f7\": -2.5,\n                \"\\u0494\": -3,\n                \"\\u0495\": -2.5,\n                \"\\u04d6\": -3,\n                \"\\u04d7\": -3,\n                \"\\u04bc\": -4,\n                \"\\u04bd\": -4,\n                \"\\u04be\": -4,\n                \"\\u04bf\": -4,\n                \"\\u04da\": -3,\n                \"\\u04db\": -3,\n                \"\\u04dc\": -4,\n                \"\\u04dd\": -3,\n                \"\\u04c1\": -4,\n                \"\\u04c2\": -3,\n                \"\\u04de\": -3,\n                \"\\u04df\": -3,\n                \"\\u04e2\": -3,\n                \"\\u04e3\": -3,\n                \"\\u04e4\": -3,\n                \"\\u04e5\": -3,\n                \"\\u04e6\": -3,\n                \"\\u04e7\": -3,\n                \"\\u04ea\": -3,\n                \"\\u04eb\": -3,\n                \"\\u04f0\": -3,\n                \"\\u04f1\": -3,\n                \"\\u04ee\": -3,\n                \"\\u04ef\": -3,\n                \"\\u04f2\": -3,\n                \"\\u04f3\": -3,\n                \"\\u04f4\": -3,\n                \"\\u04f5\": -3,\n                \"\\u04f8\": -4,\n                \"\\u04f9\": -3.5,\n                \"\\u04ec\": -3,\n                \"\\u04ed\": -3,\n                \"\\u0476\": -3.5,\n                \"\\u0477\": -3.5,\n                \"\\u04d4\": -5,\n                \"\\u04fa\": -3.5,\n                \"\\u0502\": -4.5,\n                \"\\ua682\": -3,\n                \"\\ua680\": -3.5,\n                \"\\ua688\": -3.5,\n                \"\\u052a\": -5,\n                \"\\u052c\": -3.5,\n                \"\\ua684\": -5,\n                \"\\u0504\": -4,\n                \"\\u0510\": -3,\n                \"\\u04e0\": -3,\n                \"\\u0506\": -3.5,\n                \"\\u048a\": -3.5,\n                \"\\u04c3\": -3,\n                \"\\u049e\": -3.5,\n                \"\\u049c\": -3,\n                \"\\u051e\": -3,\n                \"\\u051a\": -3,\n                \"\\u04c5\": -3.5,\n                \"\\u052e\": -3.5,\n                \"\\u0512\": -3,\n                \"\\u0520\": -4.5,\n                \"\\u0508\": -4.5,\n                \"\\u0514\": -4.5,\n                \"\\u04cd\": -3.5,\n                \"\\u04c9\": -3.5,\n                \"\\u0528\": -3.5,\n                \"\\u04c7\": -3,\n                \"\\u04a4\": -3.5,\n                \"\\u0522\": -4.5,\n                \"\\u050a\": -4.5,\n                \"\\u04a8\": -3.5,\n                \"\\u0524\": -3.5,\n                \"\\u04a6\": -4.5,\n                \"\\u048e\": -3,\n                \"\\u0516\": -4.5,\n                \"\\u050c\": -3,\n                \"\\ua690\": -3,\n                \"\\u04ac\": -3,\n                \"\\ua68a\": -3.5,\n                \"\\ua68c\": -3,\n                \"\\u050e\": -3.5,\n                \"\\u04b2\": -3.5,\n                \"\\u04fc\": -3,\n                \"\\u04fe\": -3,\n                \"\\u0526\": -3.5,\n                \"\\ua694\": -3,\n                \"\\u04b4\": -4,\n                \"\\ua68e\": -3.5,\n                \"\\u04b6\": -3.5,\n                \"\\u04cb\": -3,\n                \"\\u04b8\": -3,\n                \"\\ua692\": -3.5,\n                \"\\ua696\": -4.5,\n                \"\\ua686\": -3,\n                \"\\u048c\": -3.5,\n                \"\\u0518\": -5,\n                \"\\u051c\": -3,\n                \"\\u04d5\": -5,\n                \"\\u04fb\": -3,\n                \"\\u0503\": -4.5,\n                \"\\ua683\": -3,\n                \"\\ua681\": -3.5,\n                \"\\ua689\": -3.5,\n                \"\\u052b\": -5,\n                \"\\u052d\": -3.5,\n                \"\\ua685\": -4.5,\n                \"\\u0505\": -4,\n                \"\\u0511\": -3,\n                \"\\u04e1\": -3,\n                \"\\u0507\": -3.5,\n                \"\\u048b\": -3.5,\n                \"\\u04c4\": -2.5,\n                \"\\u049f\": -3,\n                \"\\u049d\": -3,\n                \"\\u051f\": -3,\n                \"\\u051b\": -3,\n                \"\\u04c6\": -3.5,\n                \"\\u052f\": -3.5,\n                \"\\u0513\": -3,\n                \"\\u0521\": -4.5,\n                \"\\u0509\": -4.5,\n                \"\\u0515\": -4.5,\n                \"\\u04ce\": -3.5,\n                \"\\u04ca\": -3.5,\n                \"\\u0529\": -3.5,\n                \"\\u04c8\": -3,\n                \"\\u04a5\": -3.5,\n                \"\\u0523\": -4.5,\n                \"\\u050b\": -4.5,\n                \"\\u04a9\": -3.5,\n                \"\\u0525\": -3.5,\n                \"\\u04a7\": -4.5,\n                \"\\u048f\": -3,\n                \"\\u0517\": -4.5,\n                \"\\u050d\": -3,\n                \"\\ua691\": -3,\n                \"\\u04ad\": -3,\n                \"\\ua68b\": -3.5,\n                \"\\ua68d\": -3,\n                \"\\u050f\": -3.5,\n                \"\\u04b3\": -3.5,\n                \"\\u04fd\": -3,\n                \"\\u04ff\": -3,\n                \"\\u0527\": -3.5,\n                \"\\ua695\": -3,\n                \"\\u04b5\": -3.5,\n                \"\\ua68f\": -3,\n                \"\\u04b7\": -3.5,\n                \"\\u04cc\": -3,\n                \"\\u04b9\": -3,\n                \"\\ua693\": -3.5,\n                \"\\ua697\": -3.5,\n                \"\\ua687\": -3,\n                \"\\u048d\": -3.5,\n                \"\\u0519\": -5,\n                \"\\u051d\": -3,\n                \"\\u1f08\": -4.5,\n                \"\\u1f00\": -3,\n                \"\\u1f09\": -4.5,\n                \"\\u1f01\": -3,\n                \"\\u1f0a\": -5,\n                \"\\u1f02\": -3,\n                \"\\u1f0b\": -5,\n                \"\\u1f03\": -3,\n                \"\\u1f0c\": -5,\n                \"\\u1f04\": -3,\n                \"\\u1f0d\": -5,\n                \"\\u1f05\": -3.5,\n                \"\\u1f0e\": -4.5,\n                \"\\u1f06\": -3,\n                \"\\u1f0f\": -4.5,\n                \"\\u1f07\": -3,\n                \"\\u1fba\": -4.5,\n                \"\\u1f70\": -3,\n                \"\\u1fb8\": -3,\n                \"\\u1fb0\": -3,\n                \"\\u1fb9\": -3,\n                \"\\u1fb1\": -3,\n                \"\\u1fbb\": -4.5,\n                \"\\u1f71\": -3,\n                \"\\u1f88\": -4.5,\n                \"\\u1f80\": -3,\n                \"\\u1f89\": -4.5,\n                \"\\u1f81\": -3,\n                \"\\u1f8a\": -5,\n                \"\\u1f82\": -3,\n                \"\\u1f8b\": -5,\n                \"\\u1f83\": -3,\n                \"\\u1f8c\": -5,\n                \"\\u1f84\": -3,\n                \"\\u1f8d\": -5,\n                \"\\u1f85\": -3,\n                \"\\u1f8e\": -4.5,\n                \"\\u1f86\": -3,\n                \"\\u1f8f\": -4.5,\n                \"\\u1f87\": -3,\n                \"\\u1fbc\": -3,\n                \"\\u1fb4\": -3,\n                \"\\u1fb6\": -3,\n                \"\\u1fb7\": -3,\n                \"\\u1fb2\": -3,\n                \"\\u1fb3\": -3,\n                \"\\u1f18\": -4.5,\n                \"\\u1f10\": -3,\n                \"\\u1f19\": -4.5,\n                \"\\u1f11\": -3,\n                \"\\u1f1a\": -5,\n                \"\\u1f12\": -3,\n                \"\\u1f1b\": -5,\n                \"\\u1f13\": -3,\n                \"\\u1f1c\": -5,\n                \"\\u1f14\": -3,\n                \"\\u1f1d\": -5,\n                \"\\u1f15\": -3,\n                \"\\u1fc8\": -4.5,\n                \"\\u1fc9\": -4.5,\n                \"\\u1f72\": -3,\n                \"\\u1f73\": -3,\n                \"\\u1f28\": -4.5,\n                \"\\u1f20\": -3,\n                \"\\u1fca\": -4.5,\n                \"\\u1f74\": -3,\n                \"\\u1f29\": -4.5,\n                \"\\u1f21\": -3,\n                \"\\u1f2a\": -5,\n                \"\\u1f22\": -3,\n                \"\\u1f2b\": -5,\n                \"\\u1f23\": -3,\n                \"\\u1f2c\": -5,\n                \"\\u1f24\": -3,\n                \"\\u1f2d\": -5,\n                \"\\u1f25\": -3,\n                \"\\u1f2e\": -4.5,\n                \"\\u1f26\": -3,\n                \"\\u1f2f\": -4.5,\n                \"\\u1f27\": -3,\n                \"\\u1f98\": -4.5,\n                \"\\u1f90\": -3,\n                \"\\u1f99\": -4.5,\n                \"\\u1f91\": -3,\n                \"\\u1f9a\": -5,\n                \"\\u1f92\": -3,\n                \"\\u1f9b\": -5,\n                \"\\u1f93\": -3,\n                \"\\u1f9c\": -5,\n                \"\\u1f94\": -3,\n                \"\\u1f9d\": -5,\n                \"\\u1f95\": -3,\n                \"\\u1f9e\": -4.5,\n                \"\\u1f96\": -3,\n                \"\\u1f9f\": -4.5,\n                \"\\u1f97\": -3,\n                \"\\u1fcb\": -4.5,\n                \"\\u1f75\": -3,\n                \"\\u1fcc\": -3,\n                \"\\u1fc3\": -3,\n                \"\\u1fc2\": -3,\n                \"\\u1fc4\": -3,\n                \"\\u1fc6\": -3,\n                \"\\u1fc7\": -3,\n                \"\\u1fda\": -3.5,\n                \"\\u1f76\": -2,\n                \"\\u1fdb\": -3.5,\n                \"\\u1f77\": -1.5,\n                \"\\u1f38\": -3.5,\n                \"\\u1f30\": -2,\n                \"\\u1f39\": -5,\n                \"\\u1f31\": -1.5,\n                \"\\u1f3a\": -4.5,\n                \"\\u1f32\": -3,\n                \"\\u1f3b\": -4,\n                \"\\u1f33\": -3,\n                \"\\u1f3c\": -4.5,\n                \"\\u1f34\": -3,\n                \"\\u1f3d\": -4,\n                \"\\u1f35\": -3,\n                \"\\u1f3e\": -3.5,\n                \"\\u1f36\": -2.5,\n                \"\\u1f3f\": -3.5,\n                \"\\u1f37\": -2.5,\n                \"\\u1fd8\": -2.5,\n                \"\\u1fd0\": -2.5,\n                \"\\u1fd9\": -2,\n                \"\\u1fd1\": -2,\n                \"\\u1fd2\": -2,\n                \"\\u1fd3\": -2,\n                \"\\u1fd6\": -2.5,\n                \"\\u1fd7\": -2.5,\n                \"\\u1ff8\": -4.5,\n                \"\\u1f78\": -3,\n                \"\\u1ff9\": -4.5,\n                \"\\u1f79\": -3,\n                \"\\u1f48\": -4.5,\n                \"\\u1f40\": -3,\n                \"\\u1f49\": -4.5,\n                \"\\u1f41\": -3,\n                \"\\u1f4a\": -5,\n                \"\\u1f42\": -3,\n                \"\\u1f4b\": -5,\n                \"\\u1f43\": -3,\n                \"\\u1f4c\": -5,\n                \"\\u1f44\": -3,\n                \"\\u1f4d\": -5,\n                \"\\u1f45\": -3,\n                \"\\u1fec\": -4.5,\n                \"\\u1fe4\": -3,\n                \"\\u1fe5\": -3,\n                \"\\u1fea\": -4.5,\n                \"\\u1f7a\": -3,\n                \"\\u1feb\": -4.5,\n                \"\\u1f7b\": -3,\n                \"\\u1f59\": -4.5,\n                \"\\u1f51\": -3,\n                \"\\u1f5b\": -5,\n                \"\\u1f53\": -3,\n                \"\\u1f5d\": -5,\n                \"\\u1f55\": -3,\n                \"\\u1f5f\": -4.5,\n                \"\\u1f57\": -3,\n                \"\\u1fe8\": -3,\n                \"\\u1fe0\": -3,\n                \"\\u1fe9\": -3,\n                \"\\u1fe1\": -3,\n                \"\\u03d3\": -5,\n                \"\\u03d4\": -3.5,\n                \"\\u1fe2\": -3,\n                \"\\u1fe3\": -3,\n                \"\\u1fe7\": -3,\n                \"\\u1f50\": -3,\n                \"\\u1f52\": -3,\n                \"\\u1f54\": -3,\n                \"\\u1fe6\": -3,\n                \"\\u1f56\": -3,\n                \"\\u1ffa\": -4.5,\n                \"\\u1f7c\": -4,\n                \"\\u1ffb\": -4.5,\n                \"\\u1f7d\": -4,\n                \"\\u1f68\": -4.5,\n                \"\\u1f60\": -4,\n                \"\\u1f69\": -4.5,\n                \"\\u1f61\": -4,\n                \"\\u1f6a\": -5,\n                \"\\u1f62\": -4,\n                \"\\u1f6b\": -5,\n                \"\\u1f63\": -4,\n                \"\\u1f6c\": -5,\n                \"\\u1f64\": -4,\n                \"\\u1f6d\": -5,\n                \"\\u1f65\": -4,\n                \"\\u1f6e\": -4.5,\n                \"\\u1f66\": -4,\n                \"\\u1f6f\": -5,\n                \"\\u1f67\": -4,\n                \"\\u1fa8\": -4.5,\n                \"\\u1fa0\": -4,\n                \"\\u1fa9\": -4.5,\n                \"\\u1fa1\": -4,\n                \"\\u1faa\": -5,\n                \"\\u1fa2\": -4,\n                \"\\u1fab\": -5,\n                \"\\u1fa3\": -4,\n                \"\\u1fac\": -5,\n                \"\\u1fa4\": -4,\n                \"\\u1fad\": -5,\n                \"\\u1fa5\": -4,\n                \"\\u1fae\": -4.5,\n                \"\\u1fa6\": -4,\n                \"\\u1faf\": -5,\n                \"\\u1fa7\": -4,\n                \"\\u1ffc\": -3,\n                \"\\u1ff3\": -4,\n                \"\\u1ff2\": -4,\n                \"\\u1ff4\": -4,\n                \"\\u1ff6\": -4,\n                \"\\u1ff7\": -4,\n                \"\\u262f\": -5,\n                \"\\u2610\": -5,\n                \"\\u2611\": -5,\n                \"\\u2612\": -5,\n                \"\\u018d\": -3,\n                \"\\u01ba\": -3,\n                \"\\u2c7e\": -3,\n                \"\\u023f\": -3,\n                \"\\u2c7f\": -3,\n                \"\\u0240\": -3,\n                \"\\u1d80\": -3,\n                \"\\ua7c4\": -3,\n                \"\\ua794\": -3,\n                \"\\u1d81\": -3.5,\n                \"\\u1d82\": -2.5,\n                \"\\u1d83\": -3.5,\n                \"\\ua795\": -3.5,\n                \"\\u1d84\": -3,\n                \"\\u1d85\": -1.5,\n                \"\\u1d86\": -3.5,\n                \"\\u1d87\": -3.5,\n                \"\\u1d88\": -3,\n                \"\\u1d89\": -3,\n                \"\\u1d8a\": -3,\n                \"\\u1d8b\": -3,\n                \"\\u1d8c\": -3,\n                \"\\u1d8d\": -3.5,\n                \"\\ua7c6\": -3.5,\n                \"\\u1d8e\": -3.5,\n                \"\\u1d8f\": -3.5,\n                \"\\u1d90\": -3.5,\n                \"\\u1d92\": -3.5,\n                \"\\u1d93\": -3.5,\n                \"\\u1d94\": -3,\n                \"\\u1d95\": -3.5,\n                \"\\u1d96\": -1.5,\n                \"\\u1d97\": -3.5,\n                \"\\u1d98\": -3,\n                \"\\u1d99\": -3.5,\n                \"\\u1d9a\": -3,\n                \"\\u1e9a\": -3,\n                \"\\u2152\": -5,\n                \"\\u2158\": -5,\n                \"\\u20a8\": -5,\n                \"\\u20af\": -5,\n                \"\\u2030\": -4,\n                \"\\u20b4\": -4,\n                \"\\u2260\": -3,\n                \"\\u04bb\": -3,\n                \"\\u0391\": -3,\n                \"\\u0392\": -3,\n                \"\\u0393\": -3,\n                \"\\u0394\": -3,\n                \"\\u0395\": -3,\n                \"\\u0396\": -3,\n                \"\\u0397\": -3,\n                \"\\u0398\": -3,\n                \"\\u0399\": -2,\n                \"\\u039a\": -3,\n                \"\\u039b\": -3,\n                \"\\u039c\": -3,\n                \"\\u039d\": -3,\n                \"\\u039e\": -3,\n                \"\\u039f\": -3,\n                \"\\u03a0\": -3,\n                \"\\u03a1\": -3,\n                \"\\u03a3\": -3,\n                \"\\u03a4\": -3,\n                \"\\u03a5\": -3,\n                \"\\u03a6\": -3,\n                \"\\u03a7\": -3,\n                \"\\u03a8\": -3,\n                \"\\u03a9\": -3,\n                \"\\u03b1\": -3,\n                \"\\u03b2\": -3,\n                \"\\u03b3\": -3,\n                \"\\u03b4\": -3,\n                \"\\u03b5\": -3,\n                \"\\u03b6\": -3,\n                \"\\u03b7\": -3,\n                \"\\u03b8\": -3,\n                \"\\u03b9\": -1.5,\n                \"\\u03ba\": -2.5,\n                \"\\u03bb\": -3,\n                \"\\u03bc\": -3,\n                \"\\u03bd\": -3,\n                \"\\u03be\": -3,\n                \"\\u03bf\": -3,\n                \"\\u03c0\": -3,\n                \"\\u03c1\": -3,\n                \"\\u03c2\": -3,\n                \"\\u03c3\": -3.5,\n                \"\\u03c4\": -3,\n                \"\\u03c5\": -3,\n                \"\\u03c6\": -3,\n                \"\\u03c7\": -3,\n                \"\\u03c8\": -3,\n                \"\\u03c9\": -4,\n                \"\\u0402\": -4,\n                \"\\u0405\": -3,\n                \"\\u0406\": -2,\n                \"\\u0408\": -3,\n                \"\\u0409\": -4,\n                \"\\u040a\": -3.5,\n                \"\\u040b\": -3.5,\n                \"\\u0410\": -3,\n                \"\\u0411\": -3,\n                \"\\u0412\": -3,\n                \"\\u0413\": -3,\n                \"\\u0414\": -3.5,\n                \"\\u0415\": -3,\n                \"\\u0416\": -4,\n                \"\\u0417\": -3,\n                \"\\u0418\": -3,\n                \"\\u041a\": -3,\n                \"\\u041b\": -3,\n                \"\\u041c\": -3,\n                \"\\u041d\": -3,\n                \"\\u041e\": -3,\n                \"\\u041f\": -3,\n                \"\\u0420\": -3,\n                \"\\u0421\": -3,\n                \"\\u0422\": -3,\n                \"\\u0423\": -3,\n                \"\\u0424\": -4,\n                \"\\u0425\": -3,\n                \"\\u0426\": -3.5,\n                \"\\u0427\": -3,\n                \"\\u0428\": -4,\n                \"\\u0429\": -4.5,\n                \"\\u042a\": -3.5,\n                \"\\u042b\": -4,\n                \"\\u042c\": -3,\n                \"\\u042d\": -3,\n                \"\\u042e\": -4,\n                \"\\u042f\": -3,\n                \"\\u0430\": -3,\n                \"\\u0431\": -3,\n                \"\\u0432\": -3,\n                \"\\u0433\": -2.5,\n                \"\\u0434\": -3.5,\n                \"\\u0435\": -3,\n                \"\\u0436\": -3,\n                \"\\u0437\": -3,\n                \"\\u0438\": -3,\n                \"\\u043a\": -2.5,\n                \"\\u043b\": -3,\n                \"\\u043c\": -3,\n                \"\\u043d\": -3,\n                \"\\u043e\": -3,\n                \"\\u043f\": -3,\n                \"\\u0440\": -3,\n                \"\\u0441\": -3,\n                \"\\u0442\": -3,\n                \"\\u0443\": -3,\n                \"\\u0444\": -3,\n                \"\\u0445\": -3,\n                \"\\u0446\": -3,\n                \"\\u0447\": -3,\n                \"\\u0448\": -3,\n                \"\\u0449\": -3.5,\n                \"\\u044a\": -3.5,\n                \"\\u044b\": -3.5,\n                \"\\u044c\": -3,\n                \"\\u044d\": -3,\n                \"\\u044e\": -4,\n                \"\\u044f\": -3,\n                \"\\u0454\": -3,\n                \"\\u0455\": -3,\n                \"\\u0456\": -1,\n                \"\\u0458\": -3,\n                \"\\u0459\": -4,\n                \"\\u045a\": -3.5,\n                \"\\u2013\": -3.5,\n                \"\\u2014\": -4.5,\n                \"\\u2018\": -1.5,\n                \"\\u2019\": -1.5,\n                \"\\u201c\": -2.5,\n                \"\\u201d\": -2.5,\n                \"\\u201e\": -2.5,\n                \"\\u2026\": -4,\n                \"\\u204a\": -2.5,\n                \"\\u2190\": -4,\n                \"\\u2191\": -3,\n                \"\\u2192\": -4,\n                \"\\u2193\": -3,\n                \"\\u21c4\": -4,\n                \"\\uff0b\": -3,\n                \"\\u018f\": -3,\n                \"\\u0259\": -3,\n                \"\\u025b\": -3,\n                \"\\u026a\": -2,\n                \"\\u04ae\": -3,\n                \"\\u04af\": -3,\n                \"\\u04e8\": -3,\n                \"\\u04e9\": -3,\n                \"\\u02bb\": -1,\n                \"\\u02cc\": -1,\n                \"\\u037e\": -1,\n                \"\\u0138\": -2.5,\n                \"\\u1e9e\": -3,\n                \"\\u20bd\": -3.5,\n                \"\\u20ac\": -3.5,\n                \"\\u0462\": -3.5,\n                \"\\u0463\": -3.5,\n                \"\\u0474\": -3.5,\n                \"\\u0475\": -3.5,\n                \"\\u04c0\": -2,\n                \"\\u0472\": -3,\n                \"\\u0473\": -3,\n                \"\\u2070\": -2.5,\n                \"\\u2074\": -2.5,\n                \"\\u2075\": -2.5,\n                \"\\u2076\": -2.5,\n                \"\\u2077\": -2.5,\n                \"\\u2078\": -2.5,\n                \"\\u2079\": -2.5,\n                \"\\u207a\": -2,\n                \"\\u207b\": -2,\n                \"\\u207c\": -2,\n                \"\\u207d\": -1.5,\n                \"\\u207e\": -1.5,\n                \"\\u2071\": -1,\n                \"\\u2122\": -4.5,\n                \"\\u0294\": -3,\n                \"\\u0295\": -3,\n                \"\\u29c8\": -4,\n                \"\\u2694\": -4,\n                \"\\u2620\": -4,\n                \"\\u049a\": -3.5,\n                \"\\u049b\": -3,\n                \"\\u0492\": -3.5,\n                \"\\u0493\": -3,\n                \"\\u04b0\": -3,\n                \"\\u04b1\": -3,\n                \"\\u04d8\": -3,\n                \"\\u04d9\": -3,\n                \"\\u0496\": -4.5,\n                \"\\u0497\": -3.5,\n                \"\\u04a2\": -3.5,\n                \"\\u04a3\": -3.5,\n                \"\\u04ba\": -3,\n                \"\\u05d0\": -3,\n                \"\\u05d1\": -3,\n                \"\\u05d2\": -2.5,\n                \"\\u05d3\": -3,\n                \"\\u05d4\": -3,\n                \"\\u05d5\": -1,\n                \"\\u05d6\": -2,\n                \"\\u05d7\": -3,\n                \"\\u05d8\": -3,\n                \"\\u05d9\": -1,\n                \"\\u05db\": -3,\n                \"\\u05dc\": -3,\n                \"\\u05de\": -3,\n                \"\\u05dd\": -3,\n                \"\\u05e0\": -2,\n                \"\\u05df\": -1,\n                \"\\u05e1\": -3,\n                \"\\u05e2\": -3,\n                \"\\u05e4\": -3,\n                \"\\u05e3\": -3,\n                \"\\u05e6\": -3,\n                \"\\u05e5\": -3,\n                \"\\u05e7\": -3,\n                \"\\u05e8\": -3,\n                \"\\u0387\": -1,\n                \"\\u2010\": -2,\n                \"\\u201a\": -1.5,\n                \"\\u2020\": -3,\n                \"\\u2021\": -3,\n                \"\\u2022\": -1.5,\n                \"\\u2031\": -4.5,\n                \"\\u2032\": -1.5,\n                \"\\u2033\": -2.5,\n                \"\\u2034\": -3.5,\n                \"\\u2035\": -1.5,\n                \"\\u2036\": -2.5,\n                \"\\u2037\": -3.5,\n                \"\\u2039\": -2,\n                \"\\u203a\": -2,\n                \"\\u203b\": -4,\n                \"\\u203c\": -2,\n                \"\\u203d\": -3,\n                \"\\u2042\": -4,\n                \"\\u2048\": -4,\n                \"\\u2049\": -4,\n                \"\\u204b\": -3.5,\n                \"\\u204e\": -2,\n                \"\\u204f\": -1,\n                \"\\u2051\": -2,\n                \"\\u2052\": -2,\n                \"\\u2057\": -4.5,\n                \"\\u2117\": -4,\n                \"\\u2212\": -3,\n                \"\\u2213\": -3,\n                \"\\u221e\": -4,\n                \"\\u2600\": -4.5,\n                \"\\u2601\": -4.5,\n                \"\\u2608\": -4,\n                \"\\u0404\": -3,\n                \"\\u2632\": -3,\n                \"\\u2635\": -3,\n                \"\\u263d\": -4.5,\n                \"\\u2640\": -2,\n                \"\\u2642\": -3,\n                \"\\u26a5\": -3,\n                \"\\u2660\": -3,\n                \"\\u2663\": -3,\n                \"\\u2665\": -3,\n                \"\\u2666\": -3,\n                \"\\u2669\": -2,\n                \"\\u266a\": -3,\n                \"\\u266b\": -4,\n                \"\\u266c\": -4,\n                \"\\u266d\": -2,\n                \"\\u266e\": -2,\n                \"\\u266f\": -3,\n                \"\\u2680\": -4,\n                \"\\u2681\": -4,\n                \"\\u2682\": -4,\n                \"\\u2683\": -4,\n                \"\\u2684\": -4,\n                \"\\u2685\": -4,\n                \"\\u02ac\": -3,\n                \"\\u26a1\": -3,\n                \"\\u26cf\": -4.5,\n                \"\\u2714\": -3.5,\n                \"\\u2744\": -4,\n                \"\\u274c\": -3.5,\n                \"\\u2764\": -4,\n                \"\\u2b50\": -4,\n                \"\\u2e18\": -3,\n                \"\\u2e2e\": -3,\n                \"\\u2e35\": -1,\n                \"\\u2e38\": -3,\n                \"\\u2e41\": -1,\n                \"\\u2e4b\": -3,\n                \"\\u295d\": -3,\n                \"\\u1614\": -3,\n                \"\\u0190\": -3,\n                \"\\u07c8\": -3,\n                \"\\u03db\": -3,\n                \"\\u3125\": -3,\n                \"\\u2c6f\": -3,\n                \"\\u15fa\": -3,\n                \"\\u0186\": -3,\n                \"\\u15e1\": -3,\n                \"\\u018e\": -3,\n                \"\\u2132\": -3,\n                \"\\u2141\": -3,\n                \"\\ua7b0\": -3,\n                \"\\ua780\": -3,\n                \"\\u0500\": -3,\n                \"\\ua779\": -3,\n                \"\\u1d1a\": -3,\n                \"\\u27d8\": -3,\n                \"\\u2229\": -3,\n                \"\\u0245\": -3,\n                \"\\u2144\": -3,\n                \"\\u0250\": -3,\n                \"\\u0254\": -3,\n                \"\\u01dd\": -3,\n                \"\\u025f\": -2.5,\n                \"\\u1d77\": -3,\n                \"\\u0265\": -3,\n                \"\\u1d09\": -1,\n                \"\\u027e\": -3,\n                \"\\u029e\": -2.5,\n                \"\\ua781\": -1.5,\n                \"\\u026f\": -3,\n                \"\\u0279\": -3,\n                \"\\u0287\": -2,\n                \"\\u028c\": -3,\n                \"\\u028d\": -3,\n                \"\\u028e\": -3,\n                \"\\u0531\": -3,\n                \"\\u0532\": -3,\n                \"\\u0533\": -3.5,\n                \"\\u0534\": -3.5,\n                \"\\u0536\": -3,\n                \"\\u0537\": -3,\n                \"\\u0539\": -3.5,\n                \"\\u053a\": -3.5,\n                \"\\u053b\": -3,\n                \"\\u053c\": -2.5,\n                \"\\u053d\": -3.5,\n                \"\\u053e\": -3,\n                \"\\u053f\": -3,\n                \"\\u0540\": -3,\n                \"\\u0541\": -3,\n                \"\\u0542\": -3.5,\n                \"\\u0543\": -3,\n                \"\\u0544\": -3.5,\n                \"\\u0545\": -3,\n                \"\\u0546\": -3,\n                \"\\u0547\": -3,\n                \"\\u0548\": -3,\n                \"\\u0549\": -3,\n                \"\\u054b\": -3,\n                \"\\u054c\": -3.5,\n                \"\\u054d\": -3,\n                \"\\u054e\": -3,\n                \"\\u054f\": -3,\n                \"\\u0550\": -3,\n                \"\\u0551\": -3,\n                \"\\u0552\": -2.5,\n                \"\\u0553\": -3,\n                \"\\u0554\": -3,\n                \"\\u0555\": -3,\n                \"\\u0556\": -3,\n                \"\\u0559\": -1.5,\n                \"\\u0561\": -3,\n                \"\\u0562\": -3,\n                \"\\u0563\": -3.5,\n                \"\\u0564\": -3.5,\n                \"\\u0565\": -3,\n                \"\\u0566\": -3.5,\n                \"\\u0567\": -2.5,\n                \"\\u0568\": -3,\n                \"\\u0569\": -3,\n                \"\\u056a\": -3.5,\n                \"\\u056b\": -3,\n                \"\\u056c\": -1.5,\n                \"\\u056d\": -3.5,\n                \"\\u056e\": -3,\n                \"\\u056f\": -3,\n                \"\\u0570\": -3,\n                \"\\u0571\": -3,\n                \"\\u0572\": -3.5,\n                \"\\u0573\": -3,\n                \"\\u0574\": -3.5,\n                \"\\u0575\": -3,\n                \"\\u0576\": -3.5,\n                \"\\u0577\": -3,\n                \"\\u0578\": -3,\n                \"\\u0579\": -3,\n                \"\\u057a\": -3,\n                \"\\u057b\": -3,\n                \"\\u057c\": -3,\n                \"\\u057d\": -3,\n                \"\\u057e\": -3.5,\n                \"\\u057f\": -4,\n                \"\\u0580\": -3,\n                \"\\u0581\": -3,\n                \"\\u0582\": -2.5,\n                \"\\u0583\": -4,\n                \"\\u0584\": -3.5,\n                \"\\u0585\": -3,\n                \"\\u0586\": -3,\n                \"\\u0587\": -3.5,\n                \"\\u05e9\": -3,\n                \"\\u05ea\": -3,\n                \"\\u0538\": -3,\n                \"\\u055a\": -1.5,\n                \"\\u055b\": -1.5,\n                \"\\u055c\": -2,\n                \"\\u055d\": -1.5,\n                \"\\u055e\": -2,\n                \"\\u055f\": -3,\n                \"\\u0560\": -3,\n                \"\\u0588\": -3.5,\n                \"\\u058f\": -3,\n                \"\\u017f\": -2,\n                \"\\u01b7\": -3,\n                \"\\u0292\": -3,\n                \"\\u01f7\": -3,\n                \"\\u01bf\": -3,\n                \"\\u021c\": -3,\n                \"\\u021d\": -3,\n                \"\\u0224\": -3,\n                \"\\u0225\": -3,\n                \"\\u02d9\": -1,\n                \"\\ua75a\": -3,\n                \"\\ua75b\": -2.5,\n                \"\\u2011\": -2,\n                \"\\u214b\": -3,\n                \"\\u23cf\": -3,\n                \"\\u23e9\": -3.5,\n                \"\\u23ea\": -3.5,\n                \"\\u23ed\": -4,\n                \"\\u23ee\": -4,\n                \"\\u23ef\": -3.5,\n                \"\\u23f4\": -2,\n                \"\\u23f5\": -2,\n                \"\\u23f6\": -3,\n                \"\\u23f7\": -3,\n                \"\\u23f8\": -2,\n                \"\\u23f9\": -3,\n                \"\\u23fa\": -3,\n                \"\\u23fb\": -4,\n                \"\\u23fc\": -4,\n                \"\\u23fd\": -1,\n                \"\\u2b58\": -4,\n                \"\\u25b2\": -3,\n                \"\\u25b6\": -3.5,\n                \"\\u25bc\": -3,\n                \"\\u25c0\": -3.5,\n                \"\\u25cf\": -2.5,\n                \"\\u25e6\": -2,\n                \"\\u25d8\": -2,\n                \"\\u2693\": -4,\n                \"\\u26e8\": -4,\n                \"\\u0132\": -3,\n                \"\\u0133\": -2.5,\n                \"\\u01c9\": -4,\n                \"\\ua728\": -4,\n                \"\\ua729\": -3.5,\n                \"\\ua739\": -4.5,\n                \"\\ua73b\": -4.5,\n                \"\\ufb00\": -4,\n                \"\\ufb01\": -3,\n                \"\\ufb02\": -3.5,\n                \"\\ufb03\": -4.5,\n                \"\\ufb05\": -3,\n                \"\\ufffd\": -4,\n                \"\\u0535\": -3,\n                \"\\u054a\": -3,\n                \"\\u16a0\": -2.5,\n                \"\\u16a2\": -3,\n                \"\\u16a3\": -3,\n                \"\\u16a4\": -3,\n                \"\\u16a5\": -3,\n                \"\\u16a6\": -2.5,\n                \"\\u16a7\": -2.5,\n                \"\\u16a8\": -2,\n                \"\\u16a9\": -2.5,\n                \"\\u16aa\": -2.5,\n                \"\\u16ab\": -2.5,\n                \"\\u16ac\": -3,\n                \"\\u16ad\": -2,\n                \"\\u16ae\": -2,\n                \"\\u16af\": -3,\n                \"\\u16b0\": -3,\n                \"\\u16b1\": -2.5,\n                \"\\u16b2\": -2,\n                \"\\u16b3\": -2.5,\n                \"\\u16b4\": -2.5,\n                \"\\u16b6\": -3,\n                \"\\u16b7\": -3,\n                \"\\u16b8\": -3,\n                \"\\u16b9\": -2.5,\n                \"\\u16ba\": -3,\n                \"\\u16bb\": -3,\n                \"\\u16bc\": -3,\n                \"\\u16bd\": -2,\n                \"\\u16be\": -3,\n                \"\\u16bf\": -2,\n                \"\\u16c0\": -3,\n                \"\\u16c1\": -1,\n                \"\\u16c2\": -2,\n                \"\\u16c3\": -3.5,\n                \"\\u16c4\": -3,\n                \"\\u16c5\": -3,\n                \"\\u16c6\": -2,\n                \"\\u16c7\": -3,\n                \"\\u16c8\": -2.5,\n                \"\\u16c9\": -3,\n                \"\\u16ca\": -2,\n                \"\\u16cb\": -3,\n                \"\\u16cc\": -1,\n                \"\\u16cd\": -2,\n                \"\\u16ce\": -3,\n                \"\\u16cf\": -3,\n                \"\\u16d0\": -2,\n                \"\\u16d1\": -2.5,\n                \"\\u16d2\": -2.5,\n                \"\\u16d3\": -2,\n                \"\\u16d4\": -2.5,\n                \"\\u16d5\": -2.5,\n                \"\\u16d6\": -3,\n                \"\\u16d7\": -3,\n                \"\\u16d8\": -3,\n                \"\\u16d9\": -2,\n                \"\\u16da\": -2,\n                \"\\u16db\": -2.5,\n                \"\\u16dc\": -3,\n                \"\\u16dd\": -3,\n                \"\\u16de\": -3,\n                \"\\u16df\": -3.5,\n                \"\\u16e0\": -4,\n                \"\\u16e1\": -3,\n                \"\\u16e2\": -4,\n                \"\\u16e3\": -3,\n                \"\\u16e4\": -3,\n                \"\\u16e5\": -3,\n                \"\\u16e6\": -3,\n                \"\\u16e7\": -1,\n                \"\\u16e8\": -3,\n                \"\\u16e9\": -2.5,\n                \"\\u16ea\": -4,\n                \"\\u16eb\": -1.5,\n                \"\\u16ec\": -1,\n                \"\\u16ed\": -3,\n                \"\\u16ee\": -3,\n                \"\\u16ef\": -3,\n                \"\\u16f0\": -3,\n                \"\\u16f1\": -3,\n                \"\\u16f2\": -3,\n                \"\\u16f3\": -4,\n                \"\\u16f4\": -2.5,\n                \"\\u16f5\": -1.5,\n                \"\\u16f6\": -3,\n                \"\\u16f7\": -3,\n                \"\\u16f8\": -3,\n                \"\\u263a\": -3,\n                \"\\u263b\": -4,\n                \"\\u2639\": -3,\n                \"\\u05da\": -3,\n                \"\\u05f3\": -1.5,\n                \"\\u05f4\": -2.5,\n                \"\\u05f0\": -2,\n                \"\\u05f1\": -2,\n                \"\\u05f2\": -2,\n                \"\\u05be\": -3,\n                \"\\u05c3\": -1,\n                \"\\u05c6\": -2,\n                \"\\u1d00\": -3,\n                \"\\u0299\": -3,\n                \"\\u1d04\": -3,\n                \"\\u1d05\": -3,\n                \"\\u1d07\": -3,\n                \"\\ua730\": -3,\n                \"\\u0262\": -3,\n                \"\\u029c\": -3,\n                \"\\u1d0a\": -3,\n                \"\\u1d0b\": -3,\n                \"\\u029f\": -3,\n                \"\\u1d0d\": -3,\n                \"\\u0274\": -3,\n                \"\\u1d0f\": -3,\n                \"\\u1d18\": -3,\n                \"\\ua7af\": -3,\n                \"\\u0280\": -3,\n                \"\\ua731\": -3,\n                \"\\u1d1b\": -3,\n                \"\\u1d1c\": -3,\n                \"\\u1d20\": -3,\n                \"\\u1d21\": -3,\n                \"\\u028f\": -3,\n                \"\\u1d22\": -3,\n                \"\\u0271\": -3,\n                \"\\u0273\": -3.5,\n                \"\\u0272\": -3.5,\n                \"\\u0288\": -2,\n                \"\\u0256\": -3.5,\n                \"\\u0261\": -3,\n                \"\\u02a1\": -3,\n                \"\\u0255\": -3,\n                \"\\u0291\": -3,\n                \"\\u0278\": -3,\n                \"\\u029d\": -3,\n                \"\\u02a2\": -3,\n                \"\\u027b\": -3.5,\n                \"\\u0281\": -3,\n                \"\\u0266\": -3,\n                \"\\u028b\": -3,\n                \"\\u0270\": -3,\n                \"\\u026c\": -2.5,\n                \"\\u026e\": -3,\n                \"\\u0298\": -3,\n                \"\\u01c0\": -1,\n                \"\\u01c3\": -1,\n                \"\\u01c2\": -3,\n                \"\\u01c1\": -2,\n                \"\\u0253\": -3,\n                \"\\u0257\": -3.5,\n                \"\\u1d91\": -3.5,\n                \"\\u0284\": -3.5,\n                \"\\u0260\": -3.5,\n                \"\\u029b\": -3.5,\n                \"\\u0267\": -3,\n                \"\\u026b\": -3,\n                \"\\u0268\": -2,\n                \"\\u0289\": -4,\n                \"\\u028a\": -3,\n                \"\\u0258\": -3,\n                \"\\u0275\": -3,\n                \"\\u0264\": -3,\n                \"\\u025c\": -3,\n                \"\\u025e\": -3,\n                \"\\u0251\": -3,\n                \"\\u0252\": -3,\n                \"\\u025a\": -4,\n                \"\\u025d\": -4,\n                \"\\u0181\": -4,\n                \"\\u0189\": -3.5,\n                \"\\u0191\": -3.5,\n                \"\\u01a9\": -3,\n                \"\\u01b2\": -3,\n                \"\\u10a0\": -3,\n                \"\\u10a1\": -4,\n                \"\\u10a2\": -4,\n                \"\\u10a3\": -3,\n                \"\\u10a4\": -3,\n                \"\\u10a5\": -4,\n                \"\\u10a6\": -4,\n                \"\\u10a7\": -4,\n                \"\\u10a8\": -3,\n                \"\\u10a9\": -3,\n                \"\\u10aa\": -4,\n                \"\\u10ab\": -3.5,\n                \"\\u10ac\": -3,\n                \"\\u10ad\": -4,\n                \"\\u10ae\": -4,\n                \"\\u10af\": -3.5,\n                \"\\u10b0\": -4,\n                \"\\u10b1\": -3,\n                \"\\u10b2\": -3,\n                \"\\u10b3\": -4,\n                \"\\u10b4\": -3,\n                \"\\u10b5\": -3,\n                \"\\u10b6\": -3,\n                \"\\u10b7\": -3,\n                \"\\u10b8\": -3,\n                \"\\u10b9\": -3,\n                \"\\u10ba\": -3,\n                \"\\u10bb\": -4,\n                \"\\u10bc\": -3,\n                \"\\u10bd\": -3,\n                \"\\u10be\": -3,\n                \"\\u10bf\": -3,\n                \"\\u10c0\": -4,\n                \"\\u10c1\": -3,\n                \"\\u10c2\": -3,\n                \"\\u10c3\": -3,\n                \"\\u10c4\": -3,\n                \"\\u10c5\": -4,\n                \"\\u10c7\": -3,\n                \"\\u10cd\": -3,\n                \"\\u10d0\": -3,\n                \"\\u10d1\": -3,\n                \"\\u10d2\": -3,\n                \"\\u10d3\": -3,\n                \"\\u10d4\": -3,\n                \"\\u10d5\": -3,\n                \"\\u10d6\": -3,\n                \"\\u10d7\": -3,\n                \"\\u10d8\": -3,\n                \"\\u10d9\": -3,\n                \"\\u10da\": -4,\n                \"\\u10db\": -3,\n                \"\\u10dc\": -3,\n                \"\\u10dd\": -3,\n                \"\\u10de\": -3,\n                \"\\u10df\": -3,\n                \"\\u10e0\": -3,\n                \"\\u10e1\": -3,\n                \"\\u10e2\": -3,\n                \"\\u10e3\": -3,\n                \"\\u10e4\": -3,\n                \"\\u10e5\": -3,\n                \"\\u10e6\": -3,\n                \"\\u10e7\": -3,\n                \"\\u10e8\": -3,\n                \"\\u10e9\": -3,\n                \"\\u10ea\": -3,\n                \"\\u10eb\": -3,\n                \"\\u10ec\": -3,\n                \"\\u10ed\": -3,\n                \"\\u10ee\": -3,\n                \"\\u10ef\": -2.5,\n                \"\\u10f0\": -3,\n                \"\\u10f1\": -3.5,\n                \"\\u10f2\": -3,\n                \"\\u10f3\": -3,\n                \"\\u10f4\": -3,\n                \"\\u10f5\": -3,\n                \"\\u10f6\": -3,\n                \"\\u10f7\": -3,\n                \"\\u10f8\": -3,\n                \"\\u10f9\": -3,\n                \"\\u10fa\": -3,\n                \"\\u10fb\": -2,\n                \"\\u10fc\": -2,\n                \"\\u10fd\": -3,\n                \"\\u10fe\": -3,\n                \"\\u10ff\": -3,\n                \"\\ufb4a\": -3,\n                \"\\ufb2b\": -3,\n                \"\\ufb4e\": -3,\n                \"\\ufb44\": -3,\n                \"\\ufb3b\": -2.5,\n                \"\\ufb1f\": -2,\n                \"\\ufb1d\": -1,\n                \"\\ufb4b\": -1.5,\n                \"\\ufb35\": -2,\n                \"\\ufb4c\": -3,\n                \"\\ufb31\": -3,\n                \"\\ua727\": -3,\n                \"\\ua726\": -3,\n                \"\\u027a\": -3,\n                \"\\u2c71\": -4,\n                \"\\u02a0\": -3.5,\n                \"\\u0297\": -3,\n                \"\\u0296\": -3,\n                \"\\u026d\": -1.5,\n                \"\\u0277\": -4,\n                \"\\u027f\": -3,\n                \"\\u0285\": -3,\n                \"\\u0286\": -3.5,\n                \"\\u0293\": -3,\n                \"\\u029a\": -3,\n                \"\\u20aa\": -4,\n                \"\\u20be\": -3.5,\n                \"\\u058a\": -3,\n                \"\\u2d00\": -3,\n                \"\\u2d01\": -3.5,\n                \"\\u2d02\": -3.5,\n                \"\\u2d03\": -3,\n                \"\\u2d04\": -3,\n                \"\\u2d05\": -3,\n                \"\\u2d06\": -3.5,\n                \"\\u2d21\": -3,\n                \"\\u2d07\": -3,\n                \"\\u2d08\": -3,\n                \"\\u2d09\": -3,\n                \"\\u2d0a\": -3,\n                \"\\u2d0b\": -3,\n                \"\\u2d0c\": -3,\n                \"\\u2d22\": -3,\n                \"\\u2d0d\": -3,\n                \"\\u2d0e\": -3.5,\n                \"\\u2d0f\": -3.5,\n                \"\\u2d10\": -3,\n                \"\\u2d11\": -3,\n                \"\\u2d12\": -3,\n                \"\\u2d23\": -3,\n                \"\\u2d13\": -3,\n                \"\\u2d14\": -3,\n                \"\\u2d15\": -3,\n                \"\\u2d16\": -3,\n                \"\\u2d17\": -3,\n                \"\\u2d18\": -3,\n                \"\\u2d19\": -3,\n                \"\\u2d1a\": -3,\n                \"\\u2d1b\": -3,\n                \"\\u2d1c\": -3,\n                \"\\u2d1d\": -3.5,\n                \"\\u2d1e\": -3,\n                \"\\u2d24\": -3,\n                \"\\u2d1f\": -3,\n                \"\\u2d20\": -3,\n                \"\\u2d25\": -3,\n                \"\\u215b\": -4.5,\n                \"\\u215c\": -4.5,\n                \"\\u215d\": -4.5,\n                \"\\u215e\": -4.5,\n                \"\\u2153\": -4.5,\n                \"\\u2154\": -4.5,\n                \"\\u2709\": -4,\n                \"\\u2602\": -4,\n                \"\\u2614\": -4,\n                \"\\u2604\": -4,\n                \"\\u26c4\": -3.5,\n                \"\\u2603\": -4,\n                \"\\u231b\": -4,\n                \"\\u231a\": -4,\n                \"\\u2690\": -4,\n                \"\\u270e\": -4,\n                \"\\u2763\": -3,\n                \"\\u2664\": -3,\n                \"\\u2667\": -3,\n                \"\\u2661\": -3,\n                \"\\u2662\": -3,\n                \"\\u26c8\": -4.5,\n                \"\\u2630\": -3,\n                \"\\u2631\": -3,\n                \"\\u2633\": -3,\n                \"\\u2634\": -3,\n                \"\\u2636\": -3,\n                \"\\u2637\": -3,\n                \"\\u2194\": -4.5,\n                \"\\u21d2\": -4.5,\n                \"\\u21cf\": -4.5,\n                \"\\u21d4\": -4.5,\n                \"\\u21f5\": -3.5,\n                \"\\u2200\": -4,\n                \"\\u2203\": -3,\n                \"\\u2204\": -3,\n                \"\\u2209\": -3,\n                \"\\u220b\": -3,\n                \"\\u220c\": -3,\n                \"\\u2282\": -3,\n                \"\\u2283\": -3,\n                \"\\u2284\": -3,\n                \"\\u2285\": -3,\n                \"\\u2227\": -3,\n                \"\\u2228\": -3,\n                \"\\u22bb\": -3,\n                \"\\u22bc\": -3,\n                \"\\u22bd\": -3,\n                \"\\u2225\": -2,\n                \"\\u2262\": -3.5,\n                \"\\u22c6\": -2,\n                \"\\u2211\": -3,\n                \"\\u22a4\": -3,\n                \"\\u22a5\": -3,\n                \"\\u22a2\": -3,\n                \"\\u22a8\": -3,\n                \"\\u2254\": -4,\n                \"\\u2201\": -2.5,\n                \"\\u2234\": -3,\n                \"\\u2235\": -3,\n                \"\\u221b\": -4,\n                \"\\u221c\": -4,\n                \"\\u2202\": -3,\n                \"\\u22c3\": -3,\n                \"\\u2286\": -3,\n                \"\\u2287\": -3,\n                \"\\u25a1\": -3,\n                \"\\u25b3\": -3,\n                \"\\u25b7\": -3.5,\n                \"\\u25bd\": -3,\n                \"\\u25c1\": -3.5,\n                \"\\u25c6\": -3,\n                \"\\u25c7\": -3,\n                \"\\u25cb\": -3,\n                \"\\u25ce\": -4,\n                \"\\u2606\": -4,\n                \"\\u2605\": -4,\n                \"\\u2718\": -3.5,\n                \"\\u2080\": -2.5,\n                \"\\u2081\": -2,\n                \"\\u2082\": -2.5,\n                \"\\u2083\": -2.5,\n                \"\\u2084\": -2.5,\n                \"\\u2085\": -2.5,\n                \"\\u2086\": -2.5,\n                \"\\u2087\": -2.5,\n                \"\\u2088\": -2.5,\n                \"\\u2089\": -2.5,\n                \"\\u208a\": -2,\n                \"\\u208b\": -2,\n                \"\\u208c\": -2,\n                \"\\u208d\": -1.5,\n                \"\\u208e\": -1.5,\n                \"\\u222b\": -3,\n                \"\\u222e\": -3,\n                \"\\u221d\": -3.5,\n                \"\\u2300\": -4,\n                \"\\u2302\": -4,\n                \"\\u2318\": -4,\n                \"\\u3012\": -3,\n                \"\\u027c\": -3,\n                \"\\u0184\": -3.5,\n                \"\\u0185\": -3.5,\n                \"\\u1e9f\": -3,\n                \"\\u023d\": -3.5,\n                \"\\u019a\": -2,\n                \"\\u019b\": -3,\n                \"\\u0220\": -3,\n                \"\\u019e\": -3,\n                \"\\u019f\": -3,\n                \"\\u01a7\": -3,\n                \"\\u01a8\": -3,\n                \"\\u01aa\": -3,\n                \"\\u01b8\": -3,\n                \"\\u01b9\": -3,\n                \"\\u01bb\": -3,\n                \"\\u01bc\": -3,\n                \"\\u01bd\": -3,\n                \"\\u01be\": -3,\n                \"\\u0221\": -4,\n                \"\\u0234\": -2,\n                \"\\u0235\": -4,\n                \"\\u0236\": -2.5,\n                \"\\u023a\": -3,\n                \"\\u2c65\": -3.5,\n                \"\\u023b\": -3,\n                \"\\u023c\": -3,\n                \"\\u0246\": -3,\n                \"\\u0247\": -3.5,\n                \"\\u023e\": -3,\n                \"\\u2c66\": -3,\n                \"\\u0241\": -3,\n                \"\\u0242\": -3,\n                \"\\u0243\": -3.5,\n                \"\\u0244\": -4,\n                \"\\u0248\": -3.5,\n                \"\\u0249\": -3.5,\n                \"\\u024a\": -3.5,\n                \"\\u024b\": -3.5,\n                \"\\u024c\": -3.5,\n                \"\\u024d\": -3.5,\n                \"\\u024e\": -4,\n                \"\\u024f\": -4,\n                \"\\u1e9c\": -2.5,\n                \"\\u1e9d\": -2.5,\n                \"\\u1efc\": -3,\n                \"\\u1efd\": -2.5,\n                \"\\u1efe\": -3,\n                \"\\u1eff\": -3.5,\n                \"\\ua7a8\": -3.5,\n                \"\\ua7a9\": -3,\n                \"\\ud800\\udf30\": -3,\n                \"\\ud800\\udf31\": -3,\n                \"\\ud800\\udf32\": -3,\n                \"\\ud800\\udf33\": -3,\n                \"\\ud800\\udf34\": -3,\n                \"\\ud800\\udf35\": -3,\n                \"\\ud800\\udf36\": -3,\n                \"\\ud800\\udf37\": -3,\n                \"\\ud800\\udf38\": -3,\n                \"\\ud800\\udf39\": -1,\n                \"\\ud800\\udf3a\": -3,\n                \"\\ud800\\udf3b\": -3,\n                \"\\ud800\\udf3c\": -3,\n                \"\\ud800\\udf3d\": -3,\n                \"\\ud800\\udf3e\": -3,\n                \"\\ud800\\udf3f\": -3,\n                \"\\ud800\\udf40\": -3,\n                \"\\ud800\\udf41\": -3,\n                \"\\ud800\\udf42\": -3,\n                \"\\ud800\\udf43\": -3,\n                \"\\ud800\\udf44\": -3,\n                \"\\ud800\\udf45\": -3,\n                \"\\ud800\\udf46\": -3,\n                \"\\ud800\\udf47\": -3,\n                \"\\ud800\\udf48\": -3,\n                \"\\ud800\\udf49\": -3,\n                \"\\ud800\\udf4a\": -3,\n                \"\\ud83c\\udf27\": -4.5,\n                \"\\ud83d\\udd25\": -3.5,\n                \"\\ud83c\\udf0a\": -4.5,\n                \"\\u2150\": -4.5,\n                \"\\u2151\": -4.5,\n                \"\\u2155\": -4.5,\n                \"\\u2156\": -4.5,\n                \"\\u2157\": -4.5,\n                \"\\u2159\": -4,\n                \"\\u215a\": -4,\n                \"\\u215f\": -3.5,\n                \"\\u2189\": -4.5,\n                \"\\ud83d\\udde1\": -4.5,\n                \"\\ud83c\\udff9\": -4.5,\n                \"\\ud83e\\ude93\": -3.5,\n                \"\\ud83d\\udd31\": -4.5,\n                \"\\ud83c\\udfa3\": -4.5,\n                \"\\ud83e\\uddea\": -4,\n                \"\\u2697\": -4,\n                \"\\u2bea\": -4,\n                \"\\u2beb\": -4,\n                \"\\u2c6d\": -3,\n                \"\\ud83d\\udee1\": -4,\n                \"\\u2702\": -4,\n                \"\\ud83c\\udf56\": -4.5,\n                \"\\ud83e\\udea3\": -4,\n                \"\\ud83d\\udd14\": -4,\n                \"\\u23f3\": -4,\n                \"\\u2691\": -4,\n                \"\\u20a0\": -3,\n                \"\\u20a1\": -3,\n                \"\\u20a2\": -3,\n                \"\\u20a3\": -3.5,\n                \"\\u20a4\": -3,\n                \"\\u20a5\": -3,\n                \"\\u20a6\": -4,\n                \"\\u20a9\": -4,\n                \"\\u20ab\": -3.5,\n                \"\\u20ad\": -3.5,\n                \"\\u20ae\": -3,\n                \"\\u20b0\": -3,\n                \"\\u20b1\": -4,\n                \"\\u20b2\": -3,\n                \"\\u20b3\": -4,\n                \"\\u20b5\": -3,\n                \"\\u20b6\": -3,\n                \"\\u20b7\": -4,\n                \"\\u20b8\": -3,\n                \"\\u20b9\": -3,\n                \"\\u20ba\": -3.5,\n                \"\\u20bb\": -4,\n                \"\\u20bc\": -3,\n                \"\\u20bf\": -3\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "base/assets/gm4/font/offscreen.json",
    "content": "{\n    \"providers\": [\n        {\n            \"type\": \"space\",\n            \"advances\": {\n                \"0\": 6,\n                \"1\": 6,\n                \"2\": 6,\n                \"3\": 6,\n                \"4\": 6,\n                \"5\": 6,\n                \"6\": 6,\n                \"7\": 6,\n                \"8\": 6,\n                \"9\": 6,\n                \"\\u0000\": 9,\n                \"\\u0001\": 9,\n                \"\\u0002\": 9,\n                \"\\u0003\": 9,\n                \"\\u0004\": 9,\n                \"\\u0005\": 9,\n                \"\\u0006\": 9,\n                \"\\u0007\": 9,\n                \"\\b\": 9,\n                \"\\t\": 9,\n                \"\\n\": 9,\n                \"\\u000b\": 9,\n                \"\\f\": 9,\n                \"\\r\": 9,\n                \"\\u000e\": 9,\n                \"\\u000f\": 9,\n                \"\\u0010\": 9,\n                \"\\u0011\": 9,\n                \"\\u0012\": 9,\n                \"\\u0013\": 9,\n                \"\\u0014\": 9,\n                \"\\u0015\": 9,\n                \"\\u0016\": 9,\n                \"\\u0017\": 9,\n                \"\\u0018\": 9,\n                \"\\u0019\": 9,\n                \"\\u001a\": 9,\n                \"\\u001b\": 9,\n                \"\\u001c\": 9,\n                \"\\u001d\": 9,\n                \"\\u001e\": 9,\n                \"\\u001f\": 9,\n                \" \": 4,\n                \"!\": 2,\n                \"\\\"\": 4,\n                \"#\": 6,\n                \"$\": 6,\n                \"%\": 6,\n                \"&\": 6,\n                \"'\": 2,\n                \"(\": 4,\n                \")\": 4,\n                \"*\": 4,\n                \"+\": 6,\n                \",\": 2,\n                \"-\": 6,\n                \".\": 2,\n                \"/\": 6,\n                \":\": 2,\n                \";\": 2,\n                \"<\": 5,\n                \"=\": 6,\n                \">\": 5,\n                \"?\": 6,\n                \"@\": 7,\n                \"A\": 6,\n                \"B\": 6,\n                \"C\": 6,\n                \"D\": 6,\n                \"E\": 6,\n                \"F\": 6,\n                \"G\": 6,\n                \"H\": 6,\n                \"I\": 4,\n                \"J\": 6,\n                \"K\": 6,\n                \"L\": 6,\n                \"M\": 6,\n                \"N\": 6,\n                \"O\": 6,\n                \"P\": 6,\n                \"Q\": 6,\n                \"R\": 6,\n                \"S\": 6,\n                \"T\": 6,\n                \"U\": 6,\n                \"V\": 6,\n                \"W\": 6,\n                \"X\": 6,\n                \"Y\": 6,\n                \"Z\": 6,\n                \"[\": 4,\n                \"\\\\\": 6,\n                \"]\": 4,\n                \"^\": 6,\n                \"_\": 6,\n                \"`\": 3,\n                \"a\": 6,\n                \"b\": 6,\n                \"c\": 6,\n                \"d\": 6,\n                \"e\": 6,\n                \"f\": 5,\n                \"g\": 6,\n                \"h\": 6,\n                \"i\": 2,\n                \"j\": 6,\n                \"k\": 5,\n                \"l\": 3,\n                \"m\": 6,\n                \"n\": 6,\n                \"o\": 6,\n                \"p\": 6,\n                \"q\": 6,\n                \"r\": 6,\n                \"s\": 6,\n                \"t\": 4,\n                \"u\": 6,\n                \"v\": 6,\n                \"w\": 6,\n                \"x\": 6,\n                \"y\": 6,\n                \"z\": 6,\n                \"{\": 4,\n                \"|\": 2,\n                \"}\": 4,\n                \"~\": 7,\n                \"\\u007f\": 9,\n                \"\\u0080\": 9,\n                \"\\u0081\": 9,\n                \"\\u0082\": 9,\n                \"\\u0083\": 9,\n                \"\\u0084\": 9,\n                \"\\u0085\": 9,\n                \"\\u0086\": 9,\n                \"\\u0087\": 9,\n                \"\\u0088\": 9,\n                \"\\u0089\": 9,\n                \"\\u008a\": 9,\n                \"\\u008b\": 9,\n                \"\\u008c\": 9,\n                \"\\u008d\": 9,\n                \"\\u008e\": 9,\n                \"\\u008f\": 9,\n                \"\\u0090\": 9,\n                \"\\u0091\": 9,\n                \"\\u0092\": 9,\n                \"\\u0093\": 9,\n                \"\\u0094\": 9,\n                \"\\u0095\": 9,\n                \"\\u0096\": 9,\n                \"\\u0097\": 9,\n                \"\\u0098\": 9,\n                \"\\u0099\": 9,\n                \"\\u009a\": 9,\n                \"\\u009b\": 9,\n                \"\\u009c\": 9,\n                \"\\u009d\": 9,\n                \"\\u009e\": 9,\n                \"\\u009f\": 9,\n                \"\\u00a0\": 9,\n                \"\\u00a1\": 2,\n                \"\\u00a2\": 6,\n                \"\\u00a3\": 6,\n                \"\\u00a4\": 8,\n                \"\\u00a5\": 6,\n                \"\\u00a6\": 2,\n                \"\\u00a7\": 6,\n                \"\\u00a8\": 4,\n                \"\\u00a9\": 8,\n                \"\\u00aa\": 5,\n                \"\\u00ab\": 7,\n                \"\\u00ac\": 6,\n                \"\\u00ad\": 4,\n                \"\\u00ae\": 8,\n                \"\\u00af\": 6,\n                \"\\u00b0\": 5,\n                \"\\u00b1\": 6,\n                \"\\u00b2\": 5,\n                \"\\u00b3\": 5,\n                \"\\u00b4\": 3,\n                \"\\u00b5\": 6,\n                \"\\u00b6\": 7,\n                \"\\u00b7\": 2,\n                \"\\u00b8\": 2,\n                \"\\u00b9\": 4,\n                \"\\u00ba\": 5,\n                \"\\u00bb\": 7,\n                \"\\u00bc\": 8,\n                \"\\u00bd\": 8,\n                \"\\u00be\": 8,\n                \"\\u00bf\": 6,\n                \"\\u00c0\": 6,\n                \"\\u00c1\": 6,\n                \"\\u00c2\": 6,\n                \"\\u00c3\": 6,\n                \"\\u00c4\": 6,\n                \"\\u00c5\": 6,\n                \"\\u00c6\": 10,\n                \"\\u00c7\": 6,\n                \"\\u00c8\": 6,\n                \"\\u00c9\": 6,\n                \"\\u00ca\": 6,\n                \"\\u00cb\": 6,\n                \"\\u00cc\": 4,\n                \"\\u00cd\": 4,\n                \"\\u00ce\": 4,\n                \"\\u00cf\": 4,\n                \"\\u00d0\": 7,\n                \"\\u00d1\": 6,\n                \"\\u00d2\": 6,\n                \"\\u00d3\": 6,\n                \"\\u00d4\": 6,\n                \"\\u00d5\": 6,\n                \"\\u00d6\": 6,\n                \"\\u00d7\": 6,\n                \"\\u00d8\": 6,\n                \"\\u00d9\": 6,\n                \"\\u00da\": 6,\n                \"\\u00db\": 6,\n                \"\\u00dc\": 6,\n                \"\\u00dd\": 6,\n                \"\\u00de\": 6,\n                \"\\u00df\": 6,\n                \"\\u00e0\": 6,\n                \"\\u00e1\": 6,\n                \"\\u00e2\": 6,\n                \"\\u00e3\": 6,\n                \"\\u00e4\": 6,\n                \"\\u00e5\": 6,\n                \"\\u00e6\": 10,\n                \"\\u00e7\": 6,\n                \"\\u00e8\": 6,\n                \"\\u00e9\": 6,\n                \"\\u00ea\": 6,\n                \"\\u00eb\": 6,\n                \"\\u00ec\": 3,\n                \"\\u00ed\": 3,\n                \"\\u00ee\": 4,\n                \"\\u00ef\": 4,\n                \"\\u00f0\": 6,\n                \"\\u00f1\": 6,\n                \"\\u00f2\": 6,\n                \"\\u00f3\": 6,\n                \"\\u00f4\": 6,\n                \"\\u00f5\": 6,\n                \"\\u00f6\": 6,\n                \"\\u00f7\": 6,\n                \"\\u00f8\": 6,\n                \"\\u00f9\": 6,\n                \"\\u00fa\": 6,\n                \"\\u00fb\": 6,\n                \"\\u00fc\": 6,\n                \"\\u00fd\": 6,\n                \"\\u00fe\": 6,\n                \"\\u00ff\": 6,\n                \"\\u0192\": 6,\n                \"\\u2591\": 8,\n                \"\\u2592\": 9,\n                \"\\u2593\": 9,\n                \"\\u2502\": 6,\n                \"\\u2524\": 6,\n                \"\\u2561\": 6,\n                \"\\u2562\": 8,\n                \"\\u2556\": 8,\n                \"\\u2555\": 6,\n                \"\\u2563\": 8,\n                \"\\u2551\": 8,\n                \"\\u2557\": 8,\n                \"\\u255d\": 8,\n                \"\\u255c\": 8,\n                \"\\u255b\": 6,\n                \"\\u2510\": 6,\n                \"\\u2514\": 9,\n                \"\\u2534\": 9,\n                \"\\u252c\": 9,\n                \"\\u251c\": 9,\n                \"\\u2500\": 9,\n                \"\\u253c\": 9,\n                \"\\u255e\": 9,\n                \"\\u255f\": 9,\n                \"\\u255a\": 9,\n                \"\\u2554\": 9,\n                \"\\u2569\": 9,\n                \"\\u2566\": 9,\n                \"\\u2560\": 9,\n                \"\\u2550\": 9,\n                \"\\u256c\": 9,\n                \"\\u2567\": 9,\n                \"\\u2568\": 9,\n                \"\\u2564\": 9,\n                \"\\u2565\": 9,\n                \"\\u2559\": 9,\n                \"\\u2558\": 9,\n                \"\\u2552\": 9,\n                \"\\u2553\": 9,\n                \"\\u256b\": 9,\n                \"\\u256a\": 9,\n                \"\\u2518\": 6,\n                \"\\u250c\": 9,\n                \"\\u2588\": 9,\n                \"\\u2584\": 9,\n                \"\\u258c\": 5,\n                \"\\u2590\": 9,\n                \"\\u2580\": 9,\n                \"\\u2205\": 8,\n                \"\\u2208\": 6,\n                \"\\u2261\": 7,\n                \"\\u2265\": 6,\n                \"\\u2264\": 6,\n                \"\\u2320\": 8,\n                \"\\u2321\": 5,\n                \"\\u2248\": 7,\n                \"\\u2219\": 6,\n                \"\\u221a\": 7,\n                \"\\u207f\": 5,\n                \"\\u25a0\": 6,\n                \"\\u0100\": 6,\n                \"\\u0101\": 6,\n                \"\\u0102\": 6,\n                \"\\u0103\": 6,\n                \"\\u0104\": 6,\n                \"\\u0105\": 6,\n                \"\\u0106\": 6,\n                \"\\u0107\": 6,\n                \"\\u0108\": 6,\n                \"\\u0109\": 6,\n                \"\\u010a\": 6,\n                \"\\u010b\": 6,\n                \"\\u010c\": 6,\n                \"\\u010d\": 6,\n                \"\\u010e\": 6,\n                \"\\u010f\": 8,\n                \"\\u0110\": 7,\n                \"\\u0111\": 7,\n                \"\\u0112\": 6,\n                \"\\u0113\": 6,\n                \"\\u0114\": 6,\n                \"\\u0115\": 6,\n                \"\\u0116\": 6,\n                \"\\u0117\": 6,\n                \"\\u0118\": 6,\n                \"\\u0119\": 6,\n                \"\\u011a\": 6,\n                \"\\u011b\": 6,\n                \"\\u011c\": 6,\n                \"\\u011d\": 6,\n                \"\\u1e20\": 6,\n                \"\\u1e21\": 6,\n                \"\\u011e\": 6,\n                \"\\u011f\": 6,\n                \"\\u0120\": 6,\n                \"\\u0121\": 6,\n                \"\\u0122\": 6,\n                \"\\u0123\": 6,\n                \"\\u0124\": 6,\n                \"\\u0125\": 6,\n                \"\\u0126\": 8,\n                \"\\u0127\": 7,\n                \"\\u0128\": 5,\n                \"\\u0129\": 5,\n                \"\\u012a\": 4,\n                \"\\u012b\": 4,\n                \"\\u012c\": 5,\n                \"\\u012d\": 5,\n                \"\\u012e\": 4,\n                \"\\u012f\": 3,\n                \"\\u0130\": 4,\n                \"\\u0131\": 2,\n                \"\\u0134\": 6,\n                \"\\u0135\": 6,\n                \"\\u0136\": 6,\n                \"\\u0137\": 5,\n                \"\\u0139\": 6,\n                \"\\u013a\": 3,\n                \"\\u013b\": 6,\n                \"\\u013c\": 3,\n                \"\\u013d\": 6,\n                \"\\u013e\": 4,\n                \"\\u013f\": 6,\n                \"\\u0140\": 4,\n                \"\\u0141\": 7,\n                \"\\u0142\": 5,\n                \"\\u0143\": 6,\n                \"\\u0144\": 6,\n                \"\\u0145\": 6,\n                \"\\u0146\": 6,\n                \"\\u0147\": 6,\n                \"\\u0148\": 6,\n                \"\\u014a\": 6,\n                \"\\u014b\": 6,\n                \"\\u014c\": 6,\n                \"\\u014d\": 6,\n                \"\\u014e\": 6,\n                \"\\u014f\": 6,\n                \"\\u0150\": 6,\n                \"\\u0151\": 6,\n                \"\\u0152\": 10,\n                \"\\u0153\": 10,\n                \"\\u0154\": 6,\n                \"\\u0155\": 6,\n                \"\\u0156\": 6,\n                \"\\u0157\": 6,\n                \"\\u0158\": 6,\n                \"\\u0159\": 6,\n                \"\\u015a\": 6,\n                \"\\u015b\": 6,\n                \"\\u015c\": 6,\n                \"\\u015d\": 6,\n                \"\\u015e\": 6,\n                \"\\u015f\": 6,\n                \"\\u0160\": 6,\n                \"\\u0161\": 6,\n                \"\\u0162\": 6,\n                \"\\u0163\": 4,\n                \"\\u0164\": 6,\n                \"\\u0165\": 5,\n                \"\\u0166\": 6,\n                \"\\u0167\": 4,\n                \"\\u0168\": 6,\n                \"\\u0169\": 6,\n                \"\\u016a\": 6,\n                \"\\u016b\": 6,\n                \"\\u016c\": 6,\n                \"\\u016d\": 6,\n                \"\\u016e\": 6,\n                \"\\u016f\": 6,\n                \"\\u0170\": 6,\n                \"\\u0171\": 6,\n                \"\\u0172\": 6,\n                \"\\u0173\": 6,\n                \"\\u0174\": 6,\n                \"\\u0175\": 6,\n                \"\\u0176\": 6,\n                \"\\u0177\": 6,\n                \"\\u0178\": 6,\n                \"\\u0179\": 6,\n                \"\\u017a\": 6,\n                \"\\u017b\": 6,\n                \"\\u017c\": 6,\n                \"\\u017d\": 6,\n                \"\\u017e\": 6,\n                \"\\u01fc\": 10,\n                \"\\u01fd\": 10,\n                \"\\u01fe\": 6,\n                \"\\u01ff\": 6,\n                \"\\u0218\": 6,\n                \"\\u0219\": 6,\n                \"\\u021a\": 6,\n                \"\\u021b\": 4,\n                \"\\u0386\": 8,\n                \"\\u0388\": 8,\n                \"\\u0389\": 8,\n                \"\\u038a\": 6,\n                \"\\u038c\": 8,\n                \"\\u038e\": 8,\n                \"\\u038f\": 8,\n                \"\\u0390\": 6,\n                \"\\u03aa\": 4,\n                \"\\u03ab\": 6,\n                \"\\u03ac\": 6,\n                \"\\u03ad\": 6,\n                \"\\u03ae\": 6,\n                \"\\u03af\": 3,\n                \"\\u03b0\": 6,\n                \"\\u03ca\": 4,\n                \"\\u03cb\": 6,\n                \"\\u03cc\": 6,\n                \"\\u03cd\": 6,\n                \"\\u03ce\": 8,\n                \"\\u0400\": 6,\n                \"\\u0401\": 6,\n                \"\\u0403\": 6,\n                \"\\u0407\": 4,\n                \"\\u040c\": 6,\n                \"\\u040d\": 6,\n                \"\\u040e\": 6,\n                \"\\u0419\": 6,\n                \"\\u0439\": 6,\n                \"\\u0450\": 6,\n                \"\\u0451\": 6,\n                \"\\u0452\": 7,\n                \"\\u0453\": 5,\n                \"\\u0457\": 4,\n                \"\\u045b\": 7,\n                \"\\u045c\": 5,\n                \"\\u045d\": 6,\n                \"\\u045e\": 6,\n                \"\\u045f\": 6,\n                \"\\u0490\": 6,\n                \"\\u0491\": 6,\n                \"\\u1e02\": 6,\n                \"\\u1e03\": 6,\n                \"\\u1e0a\": 6,\n                \"\\u1e0b\": 6,\n                \"\\u1e1e\": 6,\n                \"\\u1e1f\": 5,\n                \"\\u1e22\": 6,\n                \"\\u1e23\": 6,\n                \"\\u1e30\": 6,\n                \"\\u1e31\": 5,\n                \"\\u1e40\": 6,\n                \"\\u1e41\": 6,\n                \"\\u1e56\": 6,\n                \"\\u1e57\": 6,\n                \"\\u1e60\": 6,\n                \"\\u1e61\": 6,\n                \"\\u1e6a\": 6,\n                \"\\u1e6b\": 4,\n                \"\\u1e80\": 6,\n                \"\\u1e81\": 6,\n                \"\\u1e82\": 6,\n                \"\\u1e83\": 6,\n                \"\\u1e84\": 6,\n                \"\\u1e85\": 6,\n                \"\\u1ef2\": 6,\n                \"\\u1ef3\": 6,\n                \"\\u0149\": 8,\n                \"\\u01e7\": 6,\n                \"\\u01eb\": 6,\n                \"\\u040f\": 6,\n                \"\\u1e0d\": 6,\n                \"\\u1e25\": 6,\n                \"\\u1e5b\": 6,\n                \"\\u1e6d\": 4,\n                \"\\u1e92\": 6,\n                \"\\u1eca\": 4,\n                \"\\u1ecb\": 2,\n                \"\\u1ecc\": 6,\n                \"\\u1ecd\": 6,\n                \"\\u1ee4\": 6,\n                \"\\u1ee5\": 6,\n                \"\\u2116\": 10,\n                \"\\u0207\": 6,\n                \"\\u0194\": 6,\n                \"\\u0263\": 6,\n                \"\\u0283\": 6,\n                \"\\u2047\": 10,\n                \"\\u01f1\": 10,\n                \"\\u01f2\": 10,\n                \"\\u01f3\": 10,\n                \"\\u01c4\": 10,\n                \"\\u01c5\": 10,\n                \"\\u01c6\": 10,\n                \"\\u01c7\": 10,\n                \"\\u01c8\": 10,\n                \"\\u01ca\": 10,\n                \"\\u01cb\": 10,\n                \"\\u01cc\": 10,\n                \"\\u2139\": 10,\n                \"\\u1d6b\": 10,\n                \"\\ua732\": 10,\n                \"\\ua733\": 10,\n                \"\\ua734\": 10,\n                \"\\ua735\": 10,\n                \"\\ua736\": 10,\n                \"\\ua737\": 10,\n                \"\\ua738\": 10,\n                \"\\ua73a\": 10,\n                \"\\ua73c\": 10,\n                \"\\ua73d\": 9,\n                \"\\ua74e\": 10,\n                \"\\ua74f\": 10,\n                \"\\ua760\": 6,\n                \"\\ua761\": 6,\n                \"\\ufb04\": 10,\n                \"\\ufb06\": 10,\n                \"\\u16a1\": 5,\n                \"\\u16b5\": 5,\n                \"\\u01a0\": 8,\n                \"\\u01a1\": 8,\n                \"\\u01af\": 8,\n                \"\\u01b0\": 8,\n                \"\\u1eae\": 6,\n                \"\\u1eaf\": 6,\n                \"\\u1ea4\": 6,\n                \"\\u1ea5\": 6,\n                \"\\u1ebe\": 6,\n                \"\\u1ebf\": 6,\n                \"\\u1ed1\": 6,\n                \"\\u1eda\": 8,\n                \"\\u1edb\": 8,\n                \"\\u1ee8\": 8,\n                \"\\u1ee9\": 8,\n                \"\\u1eb0\": 6,\n                \"\\u1eb1\": 6,\n                \"\\u1ea6\": 6,\n                \"\\u1ea7\": 6,\n                \"\\u1ec0\": 6,\n                \"\\u1ec1\": 6,\n                \"\\u1ed3\": 6,\n                \"\\u1edc\": 8,\n                \"\\u1edd\": 8,\n                \"\\u1eea\": 8,\n                \"\\u1eeb\": 8,\n                \"\\u1ea2\": 6,\n                \"\\u1ea3\": 6,\n                \"\\u1eb2\": 6,\n                \"\\u1eb3\": 6,\n                \"\\u1ea8\": 6,\n                \"\\u1ea9\": 6,\n                \"\\u1eba\": 6,\n                \"\\u1ebb\": 6,\n                \"\\u1ed5\": 6,\n                \"\\u1ede\": 8,\n                \"\\u1ec2\": 6,\n                \"\\u1ec3\": 6,\n                \"\\u1ec8\": 4,\n                \"\\u1ec9\": 4,\n                \"\\u1ece\": 6,\n                \"\\u1ecf\": 6,\n                \"\\u1ed4\": 6,\n                \"\\u1edf\": 8,\n                \"\\u1ee6\": 6,\n                \"\\u1ee7\": 6,\n                \"\\u1eec\": 8,\n                \"\\u1eed\": 8,\n                \"\\u1ef6\": 6,\n                \"\\u1ef7\": 6,\n                \"\\u1ea0\": 6,\n                \"\\u1ea1\": 6,\n                \"\\u1eb6\": 6,\n                \"\\u1eb7\": 6,\n                \"\\u1eac\": 6,\n                \"\\u1ead\": 6,\n                \"\\u1eb8\": 6,\n                \"\\u1eb9\": 6,\n                \"\\u1ec6\": 6,\n                \"\\u1ec7\": 6,\n                \"\\u1ed8\": 6,\n                \"\\u1ed9\": 6,\n                \"\\u1ee2\": 8,\n                \"\\u1ee3\": 8,\n                \"\\u1ef0\": 8,\n                \"\\u1ef1\": 8,\n                \"\\u1ef4\": 6,\n                \"\\u1ef5\": 6,\n                \"\\u1ed0\": 6,\n                \"\\u0195\": 9,\n                \"\\u1eaa\": 6,\n                \"\\u1eab\": 6,\n                \"\\u1ed6\": 6,\n                \"\\u1ed7\": 6,\n                \"\\u1eef\": 8,\n                \"\\u261e\": 10,\n                \"\\u261c\": 10,\n                \"\\u262e\": 10,\n                \"\\u1eb4\": 6,\n                \"\\u1eb5\": 6,\n                \"\\u1ebc\": 6,\n                \"\\u1ebd\": 6,\n                \"\\u1ec4\": 6,\n                \"\\u1ec5\": 6,\n                \"\\u1ed2\": 6,\n                \"\\u1ee0\": 8,\n                \"\\u1ee1\": 8,\n                \"\\u1eee\": 8,\n                \"\\u1ef8\": 6,\n                \"\\u1ef9\": 6,\n                \"\\u0498\": 6,\n                \"\\u0499\": 6,\n                \"\\u04a0\": 7,\n                \"\\u04a1\": 6,\n                \"\\u04aa\": 6,\n                \"\\u04ab\": 6,\n                \"\\u01f6\": 9,\n                \"\\u26a0\": 10,\n                \"\\u24ea\": 10,\n                \"\\u2460\": 10,\n                \"\\u2461\": 10,\n                \"\\u2462\": 10,\n                \"\\u2463\": 10,\n                \"\\u2464\": 10,\n                \"\\u2465\": 10,\n                \"\\u2466\": 10,\n                \"\\u2467\": 10,\n                \"\\u2468\": 10,\n                \"\\u2469\": 10,\n                \"\\u246a\": 10,\n                \"\\u246b\": 10,\n                \"\\u246c\": 10,\n                \"\\u246d\": 10,\n                \"\\u246e\": 10,\n                \"\\u246f\": 10,\n                \"\\u2470\": 10,\n                \"\\u2471\": 10,\n                \"\\u2472\": 10,\n                \"\\u2473\": 10,\n                \"\\u24b6\": 10,\n                \"\\u24b7\": 10,\n                \"\\u24b8\": 10,\n                \"\\u24b9\": 10,\n                \"\\u24ba\": 10,\n                \"\\u24bb\": 10,\n                \"\\u24bc\": 10,\n                \"\\u24bd\": 10,\n                \"\\u24be\": 10,\n                \"\\u24bf\": 10,\n                \"\\u24c0\": 10,\n                \"\\u24c1\": 10,\n                \"\\u24c2\": 10,\n                \"\\u24c3\": 10,\n                \"\\u24c4\": 10,\n                \"\\u24c5\": 10,\n                \"\\u24c6\": 10,\n                \"\\u24c7\": 10,\n                \"\\u24c8\": 10,\n                \"\\u24c9\": 10,\n                \"\\u24ca\": 10,\n                \"\\u24cb\": 10,\n                \"\\u24cc\": 10,\n                \"\\u24cd\": 10,\n                \"\\u24ce\": 10,\n                \"\\u24cf\": 10,\n                \"\\u24d0\": 10,\n                \"\\u24d1\": 10,\n                \"\\u24d2\": 10,\n                \"\\u24d3\": 10,\n                \"\\u24d4\": 10,\n                \"\\u24d5\": 10,\n                \"\\u24d6\": 10,\n                \"\\u24d7\": 10,\n                \"\\u24d8\": 10,\n                \"\\u24d9\": 10,\n                \"\\u24da\": 10,\n                \"\\u24db\": 10,\n                \"\\u24dc\": 10,\n                \"\\u24dd\": 10,\n                \"\\u24de\": 10,\n                \"\\u24df\": 10,\n                \"\\u24e0\": 10,\n                \"\\u24e1\": 10,\n                \"\\u24e2\": 10,\n                \"\\u24e3\": 10,\n                \"\\u24e4\": 10,\n                \"\\u24e5\": 10,\n                \"\\u24e6\": 10,\n                \"\\u24e7\": 10,\n                \"\\u24e8\": 10,\n                \"\\u24e9\": 10,\n                \"\\u0327\": 3,\n                \"\\u0282\": 6,\n                \"\\u0290\": 7,\n                \"\\u0276\": 10,\n                \"\\u01cd\": 6,\n                \"\\u01ce\": 6,\n                \"\\u01de\": 6,\n                \"\\u01df\": 6,\n                \"\\u01fa\": 6,\n                \"\\u01fb\": 6,\n                \"\\u0202\": 6,\n                \"\\u0203\": 6,\n                \"\\u0226\": 6,\n                \"\\u0227\": 6,\n                \"\\u01e0\": 6,\n                \"\\u01e1\": 6,\n                \"\\u1e00\": 6,\n                \"\\u1e01\": 6,\n                \"\\u0200\": 6,\n                \"\\u0201\": 6,\n                \"\\u1e06\": 6,\n                \"\\u1e07\": 6,\n                \"\\u1e04\": 6,\n                \"\\u1e05\": 6,\n                \"\\u1d6c\": 8,\n                \"\\u1e08\": 6,\n                \"\\u1e09\": 6,\n                \"\\u1e10\": 6,\n                \"\\u1e11\": 6,\n                \"\\u1e12\": 6,\n                \"\\u1e13\": 6,\n                \"\\u1e0e\": 6,\n                \"\\u1e0f\": 6,\n                \"\\u1e0c\": 6,\n                \"\\u1d6d\": 8,\n                \"\\u1e14\": 6,\n                \"\\u1e15\": 6,\n                \"\\u1e16\": 6,\n                \"\\u1e17\": 6,\n                \"\\u1e18\": 6,\n                \"\\u1e19\": 6,\n                \"\\u1e1c\": 6,\n                \"\\u1e1d\": 6,\n                \"\\u0228\": 6,\n                \"\\u0229\": 6,\n                \"\\u1e1a\": 6,\n                \"\\u1e1b\": 6,\n                \"\\u0204\": 6,\n                \"\\u0205\": 6,\n                \"\\u0206\": 6,\n                \"\\u1d6e\": 6,\n                \"\\u01f4\": 6,\n                \"\\u01f5\": 6,\n                \"\\u01e6\": 6,\n                \"\\u1e26\": 6,\n                \"\\u1e27\": 6,\n                \"\\u1e28\": 6,\n                \"\\u1e29\": 6,\n                \"\\u1e2a\": 6,\n                \"\\u1e2b\": 6,\n                \"\\u021e\": 6,\n                \"\\u021f\": 6,\n                \"\\u1e24\": 6,\n                \"\\u1e96\": 6,\n                \"\\u1e2e\": 4,\n                \"\\u1e2f\": 4,\n                \"\\u020a\": 5,\n                \"\\u020b\": 5,\n                \"\\u01cf\": 4,\n                \"\\u01d0\": 4,\n                \"\\u0208\": 6,\n                \"\\u0209\": 6,\n                \"\\u1e2c\": 5,\n                \"\\u1e2d\": 5,\n                \"\\u01f0\": 6,\n                \"\\u0237\": 6,\n                \"\\u01e8\": 6,\n                \"\\u01e9\": 5,\n                \"\\u1e32\": 6,\n                \"\\u1e33\": 5,\n                \"\\u1e34\": 6,\n                \"\\u1e35\": 5,\n                \"\\u1e3a\": 6,\n                \"\\u1e3b\": 4,\n                \"\\u1e3c\": 6,\n                \"\\u1e3d\": 4,\n                \"\\u1e36\": 6,\n                \"\\u1e37\": 3,\n                \"\\u1e38\": 6,\n                \"\\u1e39\": 4,\n                \"\\u2c62\": 8,\n                \"\\u1e3e\": 6,\n                \"\\u1e3f\": 6,\n                \"\\u1e42\": 6,\n                \"\\u1e43\": 6,\n                \"\\u1d6f\": 8,\n                \"\\u1e44\": 6,\n                \"\\u1e45\": 6,\n                \"\\u1e46\": 6,\n                \"\\u1e47\": 6,\n                \"\\u1e4a\": 6,\n                \"\\u1e4b\": 6,\n                \"\\u01f8\": 6,\n                \"\\u01f9\": 6,\n                \"\\u1e48\": 6,\n                \"\\u1e49\": 6,\n                \"\\u1d70\": 8,\n                \"\\u01ec\": 6,\n                \"\\u01ed\": 6,\n                \"\\u022c\": 6,\n                \"\\u022d\": 6,\n                \"\\u1e4c\": 6,\n                \"\\u1e4d\": 6,\n                \"\\u1e4e\": 6,\n                \"\\u1e4f\": 6,\n                \"\\u1e50\": 6,\n                \"\\u1e51\": 6,\n                \"\\u1e52\": 6,\n                \"\\u1e53\": 6,\n                \"\\u020e\": 6,\n                \"\\u020f\": 6,\n                \"\\u022a\": 6,\n                \"\\u022b\": 6,\n                \"\\u01d1\": 6,\n                \"\\u01d2\": 6,\n                \"\\u022e\": 6,\n                \"\\u022f\": 6,\n                \"\\u0230\": 6,\n                \"\\u0231\": 6,\n                \"\\u020c\": 6,\n                \"\\u020d\": 6,\n                \"\\u01ea\": 6,\n                \"\\u1e54\": 6,\n                \"\\u1e55\": 6,\n                \"\\u1d71\": 8,\n                \"\\u0212\": 6,\n                \"\\u0213\": 6,\n                \"\\u1e58\": 6,\n                \"\\u1e59\": 6,\n                \"\\u1e5c\": 6,\n                \"\\u1e5d\": 6,\n                \"\\u1e5e\": 6,\n                \"\\u1e5f\": 6,\n                \"\\u0210\": 6,\n                \"\\u0211\": 6,\n                \"\\u1e5a\": 6,\n                \"\\u1d73\": 8,\n                \"\\u1d72\": 8,\n                \"\\u1e64\": 6,\n                \"\\u1e65\": 6,\n                \"\\u1e66\": 6,\n                \"\\u1e67\": 6,\n                \"\\u1e62\": 6,\n                \"\\u1e63\": 6,\n                \"\\u1e68\": 6,\n                \"\\u1e69\": 6,\n                \"\\u1d74\": 8,\n                \"\\u1e70\": 6,\n                \"\\u1e71\": 4,\n                \"\\u1e6e\": 6,\n                \"\\u1e6f\": 4,\n                \"\\u1e6c\": 6,\n                \"\\u1e97\": 4,\n                \"\\u1d75\": 6,\n                \"\\u1e72\": 6,\n                \"\\u1e73\": 6,\n                \"\\u1e76\": 6,\n                \"\\u1e77\": 6,\n                \"\\u1e78\": 6,\n                \"\\u1e79\": 6,\n                \"\\u1e7a\": 6,\n                \"\\u1e7b\": 6,\n                \"\\u01d3\": 6,\n                \"\\u01d4\": 6,\n                \"\\u01d5\": 6,\n                \"\\u01d6\": 6,\n                \"\\u01d7\": 6,\n                \"\\u01d8\": 6,\n                \"\\u01d9\": 6,\n                \"\\u01da\": 6,\n                \"\\u01db\": 6,\n                \"\\u01dc\": 6,\n                \"\\u1e74\": 6,\n                \"\\u1e75\": 6,\n                \"\\u0214\": 6,\n                \"\\u0215\": 6,\n                \"\\u0216\": 6,\n                \"\\u1e7e\": 6,\n                \"\\u1e7f\": 6,\n                \"\\u1e7c\": 6,\n                \"\\u1e7d\": 6,\n                \"\\u1e86\": 6,\n                \"\\u1e87\": 6,\n                \"\\u1e88\": 6,\n                \"\\u1e89\": 6,\n                \"\\u1e98\": 6,\n                \"\\u1e8c\": 6,\n                \"\\u1e8d\": 6,\n                \"\\u1e8a\": 6,\n                \"\\u1e8b\": 6,\n                \"\\u0232\": 6,\n                \"\\u0233\": 6,\n                \"\\u1e8e\": 6,\n                \"\\u1e8f\": 6,\n                \"\\u1e99\": 6,\n                \"\\u1e94\": 6,\n                \"\\u1e95\": 6,\n                \"\\u1e90\": 6,\n                \"\\u1e91\": 6,\n                \"\\u1e93\": 6,\n                \"\\u1d76\": 6,\n                \"\\u01ee\": 6,\n                \"\\u01ef\": 6,\n                \"\\u1e9b\": 4,\n                \"\\ua73e\": 6,\n                \"\\ua73f\": 6,\n                \"\\u01e2\": 10,\n                \"\\u01e3\": 10,\n                \"\\u1d7a\": 9,\n                \"\\u1efb\": 7,\n                \"\\u1d02\": 10,\n                \"\\u1d14\": 10,\n                \"\\uab63\": 10,\n                \"\\u0238\": 10,\n                \"\\u02a3\": 10,\n                \"\\u02a5\": 10,\n                \"\\u02a4\": 10,\n                \"\\u02a9\": 10,\n                \"\\u02aa\": 8,\n                \"\\u02ab\": 8,\n                \"\\u0239\": 10,\n                \"\\u02a8\": 9,\n                \"\\u02a6\": 9,\n                \"\\u02a7\": 8,\n                \"\\uab50\": 6,\n                \"\\uab51\": 6,\n                \"\\u20a7\": 10,\n                \"\\u1efa\": 8,\n                \"\\ufb2e\": 6,\n                \"\\ufb2f\": 6,\n                \"\\u0180\": 7,\n                \"\\u0182\": 6,\n                \"\\u0183\": 6,\n                \"\\u0187\": 7,\n                \"\\u0188\": 7,\n                \"\\u018a\": 8,\n                \"\\u018b\": 6,\n                \"\\u018c\": 6,\n                \"\\u0193\": 7,\n                \"\\u01e4\": 7,\n                \"\\u01e5\": 7,\n                \"\\u0197\": 4,\n                \"\\u0196\": 4,\n                \"\\u0269\": 3,\n                \"\\u0198\": 6,\n                \"\\u0199\": 5,\n                \"\\u019d\": 7,\n                \"\\u01a4\": 8,\n                \"\\u01a5\": 6,\n                \"\\u027d\": 6,\n                \"\\u01a6\": 6,\n                \"\\u01ac\": 7,\n                \"\\u01ad\": 4,\n                \"\\u01ab\": 4,\n                \"\\u01ae\": 6,\n                \"\\u0217\": 6,\n                \"\\u01b1\": 6,\n                \"\\u019c\": 6,\n                \"\\u01b3\": 7,\n                \"\\u01b4\": 8,\n                \"\\u01b5\": 6,\n                \"\\u01b6\": 6,\n                \"\\u01a2\": 8,\n                \"\\u01a3\": 8,\n                \"\\u0222\": 6,\n                \"\\u0223\": 6,\n                \"\\u02ad\": 6,\n                \"\\u02ae\": 7,\n                \"\\u02af\": 8,\n                \"\\ufb14\": 10,\n                \"\\ufb15\": 10,\n                \"\\ufb17\": 10,\n                \"\\ufb16\": 10,\n                \"\\ufb13\": 10,\n                \"\\u04d0\": 6,\n                \"\\u04d1\": 6,\n                \"\\u04d2\": 6,\n                \"\\u04d3\": 6,\n                \"\\u04f6\": 6,\n                \"\\u04f7\": 5,\n                \"\\u0494\": 6,\n                \"\\u0495\": 5,\n                \"\\u04d6\": 6,\n                \"\\u04d7\": 6,\n                \"\\u04bc\": 8,\n                \"\\u04bd\": 8,\n                \"\\u04be\": 8,\n                \"\\u04bf\": 8,\n                \"\\u04da\": 6,\n                \"\\u04db\": 6,\n                \"\\u04dc\": 8,\n                \"\\u04dd\": 6,\n                \"\\u04c1\": 8,\n                \"\\u04c2\": 6,\n                \"\\u04de\": 6,\n                \"\\u04df\": 6,\n                \"\\u04e2\": 6,\n                \"\\u04e3\": 6,\n                \"\\u04e4\": 6,\n                \"\\u04e5\": 6,\n                \"\\u04e6\": 6,\n                \"\\u04e7\": 6,\n                \"\\u04ea\": 6,\n                \"\\u04eb\": 6,\n                \"\\u04f0\": 6,\n                \"\\u04f1\": 6,\n                \"\\u04ee\": 6,\n                \"\\u04ef\": 6,\n                \"\\u04f2\": 6,\n                \"\\u04f3\": 6,\n                \"\\u04f4\": 6,\n                \"\\u04f5\": 6,\n                \"\\u04f8\": 8,\n                \"\\u04f9\": 7,\n                \"\\u04ec\": 6,\n                \"\\u04ed\": 6,\n                \"\\u0476\": 7,\n                \"\\u0477\": 7,\n                \"\\u04d4\": 10,\n                \"\\u04fa\": 7,\n                \"\\u0502\": 9,\n                \"\\ua682\": 6,\n                \"\\ua680\": 7,\n                \"\\ua688\": 7,\n                \"\\u052a\": 10,\n                \"\\u052c\": 7,\n                \"\\ua684\": 10,\n                \"\\u0504\": 8,\n                \"\\u0510\": 6,\n                \"\\u04e0\": 6,\n                \"\\u0506\": 7,\n                \"\\u048a\": 7,\n                \"\\u04c3\": 6,\n                \"\\u049e\": 7,\n                \"\\u049c\": 6,\n                \"\\u051e\": 6,\n                \"\\u051a\": 6,\n                \"\\u04c5\": 7,\n                \"\\u052e\": 7,\n                \"\\u0512\": 6,\n                \"\\u0520\": 9,\n                \"\\u0508\": 9,\n                \"\\u0514\": 9,\n                \"\\u04cd\": 7,\n                \"\\u04c9\": 7,\n                \"\\u0528\": 7,\n                \"\\u04c7\": 6,\n                \"\\u04a4\": 7,\n                \"\\u0522\": 9,\n                \"\\u050a\": 9,\n                \"\\u04a8\": 7,\n                \"\\u0524\": 7,\n                \"\\u04a6\": 9,\n                \"\\u048e\": 6,\n                \"\\u0516\": 9,\n                \"\\u050c\": 6,\n                \"\\ua690\": 6,\n                \"\\u04ac\": 6,\n                \"\\ua68a\": 7,\n                \"\\ua68c\": 6,\n                \"\\u050e\": 7,\n                \"\\u04b2\": 7,\n                \"\\u04fc\": 6,\n                \"\\u04fe\": 6,\n                \"\\u0526\": 7,\n                \"\\ua694\": 6,\n                \"\\u04b4\": 8,\n                \"\\ua68e\": 7,\n                \"\\u04b6\": 7,\n                \"\\u04cb\": 6,\n                \"\\u04b8\": 6,\n                \"\\ua692\": 7,\n                \"\\ua696\": 9,\n                \"\\ua686\": 6,\n                \"\\u048c\": 7,\n                \"\\u0518\": 10,\n                \"\\u051c\": 6,\n                \"\\u04d5\": 10,\n                \"\\u04fb\": 6,\n                \"\\u0503\": 9,\n                \"\\ua683\": 6,\n                \"\\ua681\": 7,\n                \"\\ua689\": 7,\n                \"\\u052b\": 10,\n                \"\\u052d\": 7,\n                \"\\ua685\": 9,\n                \"\\u0505\": 8,\n                \"\\u0511\": 6,\n                \"\\u04e1\": 6,\n                \"\\u0507\": 7,\n                \"\\u048b\": 7,\n                \"\\u04c4\": 5,\n                \"\\u049f\": 6,\n                \"\\u049d\": 6,\n                \"\\u051f\": 6,\n                \"\\u051b\": 6,\n                \"\\u04c6\": 7,\n                \"\\u052f\": 7,\n                \"\\u0513\": 6,\n                \"\\u0521\": 9,\n                \"\\u0509\": 9,\n                \"\\u0515\": 9,\n                \"\\u04ce\": 7,\n                \"\\u04ca\": 7,\n                \"\\u0529\": 7,\n                \"\\u04c8\": 6,\n                \"\\u04a5\": 7,\n                \"\\u0523\": 9,\n                \"\\u050b\": 9,\n                \"\\u04a9\": 7,\n                \"\\u0525\": 7,\n                \"\\u04a7\": 9,\n                \"\\u048f\": 6,\n                \"\\u0517\": 9,\n                \"\\u050d\": 6,\n                \"\\ua691\": 6,\n                \"\\u04ad\": 6,\n                \"\\ua68b\": 7,\n                \"\\ua68d\": 6,\n                \"\\u050f\": 7,\n                \"\\u04b3\": 7,\n                \"\\u04fd\": 6,\n                \"\\u04ff\": 6,\n                \"\\u0527\": 7,\n                \"\\ua695\": 6,\n                \"\\u04b5\": 7,\n                \"\\ua68f\": 6,\n                \"\\u04b7\": 7,\n                \"\\u04cc\": 6,\n                \"\\u04b9\": 6,\n                \"\\ua693\": 7,\n                \"\\ua697\": 7,\n                \"\\ua687\": 6,\n                \"\\u048d\": 7,\n                \"\\u0519\": 10,\n                \"\\u051d\": 6,\n                \"\\u1f08\": 9,\n                \"\\u1f00\": 6,\n                \"\\u1f09\": 9,\n                \"\\u1f01\": 6,\n                \"\\u1f0a\": 10,\n                \"\\u1f02\": 6,\n                \"\\u1f0b\": 10,\n                \"\\u1f03\": 6,\n                \"\\u1f0c\": 10,\n                \"\\u1f04\": 6,\n                \"\\u1f0d\": 10,\n                \"\\u1f05\": 7,\n                \"\\u1f0e\": 9,\n                \"\\u1f06\": 6,\n                \"\\u1f0f\": 9,\n                \"\\u1f07\": 6,\n                \"\\u1fba\": 9,\n                \"\\u1f70\": 6,\n                \"\\u1fb8\": 6,\n                \"\\u1fb0\": 6,\n                \"\\u1fb9\": 6,\n                \"\\u1fb1\": 6,\n                \"\\u1fbb\": 9,\n                \"\\u1f71\": 6,\n                \"\\u1f88\": 9,\n                \"\\u1f80\": 6,\n                \"\\u1f89\": 9,\n                \"\\u1f81\": 6,\n                \"\\u1f8a\": 10,\n                \"\\u1f82\": 6,\n                \"\\u1f8b\": 10,\n                \"\\u1f83\": 6,\n                \"\\u1f8c\": 10,\n                \"\\u1f84\": 6,\n                \"\\u1f8d\": 10,\n                \"\\u1f85\": 6,\n                \"\\u1f8e\": 9,\n                \"\\u1f86\": 6,\n                \"\\u1f8f\": 9,\n                \"\\u1f87\": 6,\n                \"\\u1fbc\": 6,\n                \"\\u1fb4\": 6,\n                \"\\u1fb6\": 6,\n                \"\\u1fb7\": 6,\n                \"\\u1fb2\": 6,\n                \"\\u1fb3\": 6,\n                \"\\u1f18\": 9,\n                \"\\u1f10\": 6,\n                \"\\u1f19\": 9,\n                \"\\u1f11\": 6,\n                \"\\u1f1a\": 10,\n                \"\\u1f12\": 6,\n                \"\\u1f1b\": 10,\n                \"\\u1f13\": 6,\n                \"\\u1f1c\": 10,\n                \"\\u1f14\": 6,\n                \"\\u1f1d\": 10,\n                \"\\u1f15\": 6,\n                \"\\u1fc8\": 9,\n                \"\\u1fc9\": 9,\n                \"\\u1f72\": 6,\n                \"\\u1f73\": 6,\n                \"\\u1f28\": 9,\n                \"\\u1f20\": 6,\n                \"\\u1fca\": 9,\n                \"\\u1f74\": 6,\n                \"\\u1f29\": 9,\n                \"\\u1f21\": 6,\n                \"\\u1f2a\": 10,\n                \"\\u1f22\": 6,\n                \"\\u1f2b\": 10,\n                \"\\u1f23\": 6,\n                \"\\u1f2c\": 10,\n                \"\\u1f24\": 6,\n                \"\\u1f2d\": 10,\n                \"\\u1f25\": 6,\n                \"\\u1f2e\": 9,\n                \"\\u1f26\": 6,\n                \"\\u1f2f\": 9,\n                \"\\u1f27\": 6,\n                \"\\u1f98\": 9,\n                \"\\u1f90\": 6,\n                \"\\u1f99\": 9,\n                \"\\u1f91\": 6,\n                \"\\u1f9a\": 10,\n                \"\\u1f92\": 6,\n                \"\\u1f9b\": 10,\n                \"\\u1f93\": 6,\n                \"\\u1f9c\": 10,\n                \"\\u1f94\": 6,\n                \"\\u1f9d\": 10,\n                \"\\u1f95\": 6,\n                \"\\u1f9e\": 9,\n                \"\\u1f96\": 6,\n                \"\\u1f9f\": 9,\n                \"\\u1f97\": 6,\n                \"\\u1fcb\": 9,\n                \"\\u1f75\": 6,\n                \"\\u1fcc\": 6,\n                \"\\u1fc3\": 6,\n                \"\\u1fc2\": 6,\n                \"\\u1fc4\": 6,\n                \"\\u1fc6\": 6,\n                \"\\u1fc7\": 6,\n                \"\\u1fda\": 7,\n                \"\\u1f76\": 4,\n                \"\\u1fdb\": 7,\n                \"\\u1f77\": 3,\n                \"\\u1f38\": 7,\n                \"\\u1f30\": 4,\n                \"\\u1f39\": 10,\n                \"\\u1f31\": 3,\n                \"\\u1f3a\": 9,\n                \"\\u1f32\": 6,\n                \"\\u1f3b\": 8,\n                \"\\u1f33\": 6,\n                \"\\u1f3c\": 9,\n                \"\\u1f34\": 6,\n                \"\\u1f3d\": 8,\n                \"\\u1f35\": 6,\n                \"\\u1f3e\": 7,\n                \"\\u1f36\": 5,\n                \"\\u1f3f\": 7,\n                \"\\u1f37\": 5,\n                \"\\u1fd8\": 5,\n                \"\\u1fd0\": 5,\n                \"\\u1fd9\": 4,\n                \"\\u1fd1\": 4,\n                \"\\u1fd2\": 4,\n                \"\\u1fd3\": 4,\n                \"\\u1fd6\": 5,\n                \"\\u1fd7\": 5,\n                \"\\u1ff8\": 9,\n                \"\\u1f78\": 6,\n                \"\\u1ff9\": 9,\n                \"\\u1f79\": 6,\n                \"\\u1f48\": 9,\n                \"\\u1f40\": 6,\n                \"\\u1f49\": 9,\n                \"\\u1f41\": 6,\n                \"\\u1f4a\": 10,\n                \"\\u1f42\": 6,\n                \"\\u1f4b\": 10,\n                \"\\u1f43\": 6,\n                \"\\u1f4c\": 10,\n                \"\\u1f44\": 6,\n                \"\\u1f4d\": 10,\n                \"\\u1f45\": 6,\n                \"\\u1fec\": 9,\n                \"\\u1fe4\": 6,\n                \"\\u1fe5\": 6,\n                \"\\u1fea\": 9,\n                \"\\u1f7a\": 6,\n                \"\\u1feb\": 9,\n                \"\\u1f7b\": 6,\n                \"\\u1f59\": 9,\n                \"\\u1f51\": 6,\n                \"\\u1f5b\": 10,\n                \"\\u1f53\": 6,\n                \"\\u1f5d\": 10,\n                \"\\u1f55\": 6,\n                \"\\u1f5f\": 9,\n                \"\\u1f57\": 6,\n                \"\\u1fe8\": 6,\n                \"\\u1fe0\": 6,\n                \"\\u1fe9\": 6,\n                \"\\u1fe1\": 6,\n                \"\\u03d3\": 10,\n                \"\\u03d4\": 7,\n                \"\\u1fe2\": 6,\n                \"\\u1fe3\": 6,\n                \"\\u1fe7\": 6,\n                \"\\u1f50\": 6,\n                \"\\u1f52\": 6,\n                \"\\u1f54\": 6,\n                \"\\u1fe6\": 6,\n                \"\\u1f56\": 6,\n                \"\\u1ffa\": 9,\n                \"\\u1f7c\": 8,\n                \"\\u1ffb\": 9,\n                \"\\u1f7d\": 8,\n                \"\\u1f68\": 9,\n                \"\\u1f60\": 8,\n                \"\\u1f69\": 9,\n                \"\\u1f61\": 8,\n                \"\\u1f6a\": 10,\n                \"\\u1f62\": 8,\n                \"\\u1f6b\": 10,\n                \"\\u1f63\": 8,\n                \"\\u1f6c\": 10,\n                \"\\u1f64\": 8,\n                \"\\u1f6d\": 10,\n                \"\\u1f65\": 8,\n                \"\\u1f6e\": 9,\n                \"\\u1f66\": 8,\n                \"\\u1f6f\": 10,\n                \"\\u1f67\": 8,\n                \"\\u1fa8\": 9,\n                \"\\u1fa0\": 8,\n                \"\\u1fa9\": 9,\n                \"\\u1fa1\": 8,\n                \"\\u1faa\": 10,\n                \"\\u1fa2\": 8,\n                \"\\u1fab\": 10,\n                \"\\u1fa3\": 8,\n                \"\\u1fac\": 10,\n                \"\\u1fa4\": 8,\n                \"\\u1fad\": 10,\n                \"\\u1fa5\": 8,\n                \"\\u1fae\": 9,\n                \"\\u1fa6\": 8,\n                \"\\u1faf\": 10,\n                \"\\u1fa7\": 8,\n                \"\\u1ffc\": 6,\n                \"\\u1ff3\": 8,\n                \"\\u1ff2\": 8,\n                \"\\u1ff4\": 8,\n                \"\\u1ff6\": 8,\n                \"\\u1ff7\": 8,\n                \"\\u262f\": 10,\n                \"\\u2610\": 10,\n                \"\\u2611\": 10,\n                \"\\u2612\": 10,\n                \"\\u018d\": 6,\n                \"\\u01ba\": 6,\n                \"\\u2c7e\": 6,\n                \"\\u023f\": 6,\n                \"\\u2c7f\": 6,\n                \"\\u0240\": 6,\n                \"\\u1d80\": 6,\n                \"\\ua7c4\": 6,\n                \"\\ua794\": 6,\n                \"\\u1d81\": 7,\n                \"\\u1d82\": 5,\n                \"\\u1d83\": 7,\n                \"\\ua795\": 7,\n                \"\\u1d84\": 6,\n                \"\\u1d85\": 3,\n                \"\\u1d86\": 7,\n                \"\\u1d87\": 7,\n                \"\\u1d88\": 6,\n                \"\\u1d89\": 6,\n                \"\\u1d8a\": 6,\n                \"\\u1d8b\": 6,\n                \"\\u1d8c\": 6,\n                \"\\u1d8d\": 7,\n                \"\\ua7c6\": 7,\n                \"\\u1d8e\": 7,\n                \"\\u1d8f\": 7,\n                \"\\u1d90\": 7,\n                \"\\u1d92\": 7,\n                \"\\u1d93\": 7,\n                \"\\u1d94\": 6,\n                \"\\u1d95\": 7,\n                \"\\u1d96\": 3,\n                \"\\u1d97\": 7,\n                \"\\u1d98\": 6,\n                \"\\u1d99\": 7,\n                \"\\u1d9a\": 6,\n                \"\\u1e9a\": 6,\n                \"\\u2152\": 10,\n                \"\\u2158\": 10,\n                \"\\u20a8\": 10,\n                \"\\u20af\": 10,\n                \"\\u2030\": 8,\n                \"\\u20b4\": 8,\n                \"\\u2260\": 6,\n                \"\\u04bb\": 6,\n                \"\\u0391\": 6,\n                \"\\u0392\": 6,\n                \"\\u0393\": 6,\n                \"\\u0394\": 6,\n                \"\\u0395\": 6,\n                \"\\u0396\": 6,\n                \"\\u0397\": 6,\n                \"\\u0398\": 6,\n                \"\\u0399\": 4,\n                \"\\u039a\": 6,\n                \"\\u039b\": 6,\n                \"\\u039c\": 6,\n                \"\\u039d\": 6,\n                \"\\u039e\": 6,\n                \"\\u039f\": 6,\n                \"\\u03a0\": 6,\n                \"\\u03a1\": 6,\n                \"\\u03a3\": 6,\n                \"\\u03a4\": 6,\n                \"\\u03a5\": 6,\n                \"\\u03a6\": 6,\n                \"\\u03a7\": 6,\n                \"\\u03a8\": 6,\n                \"\\u03a9\": 6,\n                \"\\u03b1\": 6,\n                \"\\u03b2\": 6,\n                \"\\u03b3\": 6,\n                \"\\u03b4\": 6,\n                \"\\u03b5\": 6,\n                \"\\u03b6\": 6,\n                \"\\u03b7\": 6,\n                \"\\u03b8\": 6,\n                \"\\u03b9\": 3,\n                \"\\u03ba\": 5,\n                \"\\u03bb\": 6,\n                \"\\u03bc\": 6,\n                \"\\u03bd\": 6,\n                \"\\u03be\": 6,\n                \"\\u03bf\": 6,\n                \"\\u03c0\": 6,\n                \"\\u03c1\": 6,\n                \"\\u03c2\": 6,\n                \"\\u03c3\": 7,\n                \"\\u03c4\": 6,\n                \"\\u03c5\": 6,\n                \"\\u03c6\": 6,\n                \"\\u03c7\": 6,\n                \"\\u03c8\": 6,\n                \"\\u03c9\": 8,\n                \"\\u0402\": 8,\n                \"\\u0405\": 6,\n                \"\\u0406\": 4,\n                \"\\u0408\": 6,\n                \"\\u0409\": 8,\n                \"\\u040a\": 7,\n                \"\\u040b\": 7,\n                \"\\u0410\": 6,\n                \"\\u0411\": 6,\n                \"\\u0412\": 6,\n                \"\\u0413\": 6,\n                \"\\u0414\": 7,\n                \"\\u0415\": 6,\n                \"\\u0416\": 8,\n                \"\\u0417\": 6,\n                \"\\u0418\": 6,\n                \"\\u041a\": 6,\n                \"\\u041b\": 6,\n                \"\\u041c\": 6,\n                \"\\u041d\": 6,\n                \"\\u041e\": 6,\n                \"\\u041f\": 6,\n                \"\\u0420\": 6,\n                \"\\u0421\": 6,\n                \"\\u0422\": 6,\n                \"\\u0423\": 6,\n                \"\\u0424\": 8,\n                \"\\u0425\": 6,\n                \"\\u0426\": 7,\n                \"\\u0427\": 6,\n                \"\\u0428\": 8,\n                \"\\u0429\": 9,\n                \"\\u042a\": 7,\n                \"\\u042b\": 8,\n                \"\\u042c\": 6,\n                \"\\u042d\": 6,\n                \"\\u042e\": 8,\n                \"\\u042f\": 6,\n                \"\\u0430\": 6,\n                \"\\u0431\": 6,\n                \"\\u0432\": 6,\n                \"\\u0433\": 5,\n                \"\\u0434\": 7,\n                \"\\u0435\": 6,\n                \"\\u0436\": 6,\n                \"\\u0437\": 6,\n                \"\\u0438\": 6,\n                \"\\u043a\": 5,\n                \"\\u043b\": 6,\n                \"\\u043c\": 6,\n                \"\\u043d\": 6,\n                \"\\u043e\": 6,\n                \"\\u043f\": 6,\n                \"\\u0440\": 6,\n                \"\\u0441\": 6,\n                \"\\u0442\": 6,\n                \"\\u0443\": 6,\n                \"\\u0444\": 6,\n                \"\\u0445\": 6,\n                \"\\u0446\": 6,\n                \"\\u0447\": 6,\n                \"\\u0448\": 6,\n                \"\\u0449\": 7,\n                \"\\u044a\": 7,\n                \"\\u044b\": 7,\n                \"\\u044c\": 6,\n                \"\\u044d\": 6,\n                \"\\u044e\": 8,\n                \"\\u044f\": 6,\n                \"\\u0454\": 6,\n                \"\\u0455\": 6,\n                \"\\u0456\": 2,\n                \"\\u0458\": 6,\n                \"\\u0459\": 8,\n                \"\\u045a\": 7,\n                \"\\u2013\": 7,\n                \"\\u2014\": 9,\n                \"\\u2018\": 3,\n                \"\\u2019\": 3,\n                \"\\u201c\": 5,\n                \"\\u201d\": 5,\n                \"\\u201e\": 5,\n                \"\\u2026\": 8,\n                \"\\u204a\": 5,\n                \"\\u2190\": 8,\n                \"\\u2191\": 6,\n                \"\\u2192\": 8,\n                \"\\u2193\": 6,\n                \"\\u21c4\": 8,\n                \"\\uff0b\": 6,\n                \"\\u018f\": 6,\n                \"\\u0259\": 6,\n                \"\\u025b\": 6,\n                \"\\u026a\": 4,\n                \"\\u04ae\": 6,\n                \"\\u04af\": 6,\n                \"\\u04e8\": 6,\n                \"\\u04e9\": 6,\n                \"\\u02bb\": 2,\n                \"\\u02cc\": 2,\n                \"\\u037e\": 2,\n                \"\\u0138\": 5,\n                \"\\u1e9e\": 6,\n                \"\\u20bd\": 7,\n                \"\\u20ac\": 7,\n                \"\\u0462\": 7,\n                \"\\u0463\": 7,\n                \"\\u0474\": 7,\n                \"\\u0475\": 7,\n                \"\\u04c0\": 4,\n                \"\\u0472\": 6,\n                \"\\u0473\": 6,\n                \"\\u2070\": 5,\n                \"\\u2074\": 5,\n                \"\\u2075\": 5,\n                \"\\u2076\": 5,\n                \"\\u2077\": 5,\n                \"\\u2078\": 5,\n                \"\\u2079\": 5,\n                \"\\u207a\": 4,\n                \"\\u207b\": 4,\n                \"\\u207c\": 4,\n                \"\\u207d\": 3,\n                \"\\u207e\": 3,\n                \"\\u2071\": 2,\n                \"\\u2122\": 9,\n                \"\\u0294\": 6,\n                \"\\u0295\": 6,\n                \"\\u29c8\": 8,\n                \"\\u2694\": 8,\n                \"\\u2620\": 8,\n                \"\\u049a\": 7,\n                \"\\u049b\": 6,\n                \"\\u0492\": 7,\n                \"\\u0493\": 6,\n                \"\\u04b0\": 6,\n                \"\\u04b1\": 6,\n                \"\\u04d8\": 6,\n                \"\\u04d9\": 6,\n                \"\\u0496\": 9,\n                \"\\u0497\": 7,\n                \"\\u04a2\": 7,\n                \"\\u04a3\": 7,\n                \"\\u04ba\": 6,\n                \"\\u05d0\": 6,\n                \"\\u05d1\": 6,\n                \"\\u05d2\": 5,\n                \"\\u05d3\": 6,\n                \"\\u05d4\": 6,\n                \"\\u05d5\": 2,\n                \"\\u05d6\": 4,\n                \"\\u05d7\": 6,\n                \"\\u05d8\": 6,\n                \"\\u05d9\": 2,\n                \"\\u05db\": 6,\n                \"\\u05dc\": 6,\n                \"\\u05de\": 6,\n                \"\\u05dd\": 6,\n                \"\\u05e0\": 4,\n                \"\\u05df\": 2,\n                \"\\u05e1\": 6,\n                \"\\u05e2\": 6,\n                \"\\u05e4\": 6,\n                \"\\u05e3\": 6,\n                \"\\u05e6\": 6,\n                \"\\u05e5\": 6,\n                \"\\u05e7\": 6,\n                \"\\u05e8\": 6,\n                \"\\u0387\": 2,\n                \"\\u2010\": 4,\n                \"\\u201a\": 3,\n                \"\\u2020\": 6,\n                \"\\u2021\": 6,\n                \"\\u2022\": 3,\n                \"\\u2031\": 9,\n                \"\\u2032\": 3,\n                \"\\u2033\": 5,\n                \"\\u2034\": 7,\n                \"\\u2035\": 3,\n                \"\\u2036\": 5,\n                \"\\u2037\": 7,\n                \"\\u2039\": 4,\n                \"\\u203a\": 4,\n                \"\\u203b\": 8,\n                \"\\u203c\": 4,\n                \"\\u203d\": 6,\n                \"\\u2042\": 8,\n                \"\\u2048\": 8,\n                \"\\u2049\": 8,\n                \"\\u204b\": 7,\n                \"\\u204e\": 4,\n                \"\\u204f\": 2,\n                \"\\u2051\": 4,\n                \"\\u2052\": 4,\n                \"\\u2057\": 9,\n                \"\\u2117\": 8,\n                \"\\u2212\": 6,\n                \"\\u2213\": 6,\n                \"\\u221e\": 8,\n                \"\\u2600\": 9,\n                \"\\u2601\": 9,\n                \"\\u2608\": 8,\n                \"\\u0404\": 6,\n                \"\\u2632\": 6,\n                \"\\u2635\": 6,\n                \"\\u263d\": 9,\n                \"\\u2640\": 4,\n                \"\\u2642\": 6,\n                \"\\u26a5\": 6,\n                \"\\u2660\": 6,\n                \"\\u2663\": 6,\n                \"\\u2665\": 6,\n                \"\\u2666\": 6,\n                \"\\u2669\": 4,\n                \"\\u266a\": 6,\n                \"\\u266b\": 8,\n                \"\\u266c\": 8,\n                \"\\u266d\": 4,\n                \"\\u266e\": 4,\n                \"\\u266f\": 6,\n                \"\\u2680\": 8,\n                \"\\u2681\": 8,\n                \"\\u2682\": 8,\n                \"\\u2683\": 8,\n                \"\\u2684\": 8,\n                \"\\u2685\": 8,\n                \"\\u02ac\": 6,\n                \"\\u26a1\": 6,\n                \"\\u26cf\": 9,\n                \"\\u2714\": 7,\n                \"\\u2744\": 8,\n                \"\\u274c\": 7,\n                \"\\u2764\": 8,\n                \"\\u2b50\": 8,\n                \"\\u2e18\": 6,\n                \"\\u2e2e\": 6,\n                \"\\u2e35\": 2,\n                \"\\u2e38\": 6,\n                \"\\u2e41\": 2,\n                \"\\u2e4b\": 6,\n                \"\\u295d\": 6,\n                \"\\u1614\": 6,\n                \"\\u0190\": 6,\n                \"\\u07c8\": 6,\n                \"\\u03db\": 6,\n                \"\\u3125\": 6,\n                \"\\u2c6f\": 6,\n                \"\\u15fa\": 6,\n                \"\\u0186\": 6,\n                \"\\u15e1\": 6,\n                \"\\u018e\": 6,\n                \"\\u2132\": 6,\n                \"\\u2141\": 6,\n                \"\\ua7b0\": 6,\n                \"\\ua780\": 6,\n                \"\\u0500\": 6,\n                \"\\ua779\": 6,\n                \"\\u1d1a\": 6,\n                \"\\u27d8\": 6,\n                \"\\u2229\": 6,\n                \"\\u0245\": 6,\n                \"\\u2144\": 6,\n                \"\\u0250\": 6,\n                \"\\u0254\": 6,\n                \"\\u01dd\": 6,\n                \"\\u025f\": 5,\n                \"\\u1d77\": 6,\n                \"\\u0265\": 6,\n                \"\\u1d09\": 2,\n                \"\\u027e\": 6,\n                \"\\u029e\": 5,\n                \"\\ua781\": 3,\n                \"\\u026f\": 6,\n                \"\\u0279\": 6,\n                \"\\u0287\": 4,\n                \"\\u028c\": 6,\n                \"\\u028d\": 6,\n                \"\\u028e\": 6,\n                \"\\u0531\": 6,\n                \"\\u0532\": 6,\n                \"\\u0533\": 7,\n                \"\\u0534\": 7,\n                \"\\u0536\": 6,\n                \"\\u0537\": 6,\n                \"\\u0539\": 7,\n                \"\\u053a\": 7,\n                \"\\u053b\": 6,\n                \"\\u053c\": 5,\n                \"\\u053d\": 7,\n                \"\\u053e\": 6,\n                \"\\u053f\": 6,\n                \"\\u0540\": 6,\n                \"\\u0541\": 6,\n                \"\\u0542\": 7,\n                \"\\u0543\": 6,\n                \"\\u0544\": 7,\n                \"\\u0545\": 6,\n                \"\\u0546\": 6,\n                \"\\u0547\": 6,\n                \"\\u0548\": 6,\n                \"\\u0549\": 6,\n                \"\\u054b\": 6,\n                \"\\u054c\": 7,\n                \"\\u054d\": 6,\n                \"\\u054e\": 6,\n                \"\\u054f\": 6,\n                \"\\u0550\": 6,\n                \"\\u0551\": 6,\n                \"\\u0552\": 5,\n                \"\\u0553\": 6,\n                \"\\u0554\": 6,\n                \"\\u0555\": 6,\n                \"\\u0556\": 6,\n                \"\\u0559\": 3,\n                \"\\u0561\": 6,\n                \"\\u0562\": 6,\n                \"\\u0563\": 7,\n                \"\\u0564\": 7,\n                \"\\u0565\": 6,\n                \"\\u0566\": 7,\n                \"\\u0567\": 5,\n                \"\\u0568\": 6,\n                \"\\u0569\": 6,\n                \"\\u056a\": 7,\n                \"\\u056b\": 6,\n                \"\\u056c\": 3,\n                \"\\u056d\": 7,\n                \"\\u056e\": 6,\n                \"\\u056f\": 6,\n                \"\\u0570\": 6,\n                \"\\u0571\": 6,\n                \"\\u0572\": 7,\n                \"\\u0573\": 6,\n                \"\\u0574\": 7,\n                \"\\u0575\": 6,\n                \"\\u0576\": 7,\n                \"\\u0577\": 6,\n                \"\\u0578\": 6,\n                \"\\u0579\": 6,\n                \"\\u057a\": 6,\n                \"\\u057b\": 6,\n                \"\\u057c\": 6,\n                \"\\u057d\": 6,\n                \"\\u057e\": 7,\n                \"\\u057f\": 8,\n                \"\\u0580\": 6,\n                \"\\u0581\": 6,\n                \"\\u0582\": 5,\n                \"\\u0583\": 8,\n                \"\\u0584\": 7,\n                \"\\u0585\": 6,\n                \"\\u0586\": 6,\n                \"\\u0587\": 7,\n                \"\\u05e9\": 6,\n                \"\\u05ea\": 6,\n                \"\\u0538\": 6,\n                \"\\u055a\": 3,\n                \"\\u055b\": 3,\n                \"\\u055c\": 4,\n                \"\\u055d\": 3,\n                \"\\u055e\": 4,\n                \"\\u055f\": 6,\n                \"\\u0560\": 6,\n                \"\\u0588\": 7,\n                \"\\u058f\": 6,\n                \"\\u017f\": 4,\n                \"\\u01b7\": 6,\n                \"\\u0292\": 6,\n                \"\\u01f7\": 6,\n                \"\\u01bf\": 6,\n                \"\\u021c\": 6,\n                \"\\u021d\": 6,\n                \"\\u0224\": 6,\n                \"\\u0225\": 6,\n                \"\\u02d9\": 2,\n                \"\\ua75a\": 6,\n                \"\\ua75b\": 5,\n                \"\\u2011\": 4,\n                \"\\u214b\": 6,\n                \"\\u23cf\": 6,\n                \"\\u23e9\": 7,\n                \"\\u23ea\": 7,\n                \"\\u23ed\": 8,\n                \"\\u23ee\": 8,\n                \"\\u23ef\": 7,\n                \"\\u23f4\": 4,\n                \"\\u23f5\": 4,\n                \"\\u23f6\": 6,\n                \"\\u23f7\": 6,\n                \"\\u23f8\": 4,\n                \"\\u23f9\": 6,\n                \"\\u23fa\": 6,\n                \"\\u23fb\": 8,\n                \"\\u23fc\": 8,\n                \"\\u23fd\": 2,\n                \"\\u2b58\": 8,\n                \"\\u25b2\": 6,\n                \"\\u25b6\": 7,\n                \"\\u25bc\": 6,\n                \"\\u25c0\": 7,\n                \"\\u25cf\": 5,\n                \"\\u25e6\": 4,\n                \"\\u25d8\": 4,\n                \"\\u2693\": 8,\n                \"\\u26e8\": 8,\n                \"\\u0132\": 6,\n                \"\\u0133\": 5,\n                \"\\u01c9\": 8,\n                \"\\ua728\": 8,\n                \"\\ua729\": 7,\n                \"\\ua739\": 9,\n                \"\\ua73b\": 9,\n                \"\\ufb00\": 8,\n                \"\\ufb01\": 6,\n                \"\\ufb02\": 7,\n                \"\\ufb03\": 9,\n                \"\\ufb05\": 6,\n                \"\\ufffd\": 8,\n                \"\\u0535\": 6,\n                \"\\u054a\": 6,\n                \"\\u16a0\": 5,\n                \"\\u16a2\": 6,\n                \"\\u16a3\": 6,\n                \"\\u16a4\": 6,\n                \"\\u16a5\": 6,\n                \"\\u16a6\": 5,\n                \"\\u16a7\": 5,\n                \"\\u16a8\": 4,\n                \"\\u16a9\": 5,\n                \"\\u16aa\": 5,\n                \"\\u16ab\": 5,\n                \"\\u16ac\": 6,\n                \"\\u16ad\": 4,\n                \"\\u16ae\": 4,\n                \"\\u16af\": 6,\n                \"\\u16b0\": 6,\n                \"\\u16b1\": 5,\n                \"\\u16b2\": 4,\n                \"\\u16b3\": 5,\n                \"\\u16b4\": 5,\n                \"\\u16b6\": 6,\n                \"\\u16b7\": 6,\n                \"\\u16b8\": 6,\n                \"\\u16b9\": 5,\n                \"\\u16ba\": 6,\n                \"\\u16bb\": 6,\n                \"\\u16bc\": 6,\n                \"\\u16bd\": 4,\n                \"\\u16be\": 6,\n                \"\\u16bf\": 4,\n                \"\\u16c0\": 6,\n                \"\\u16c1\": 2,\n                \"\\u16c2\": 4,\n                \"\\u16c3\": 7,\n                \"\\u16c4\": 6,\n                \"\\u16c5\": 6,\n                \"\\u16c6\": 4,\n                \"\\u16c7\": 6,\n                \"\\u16c8\": 5,\n                \"\\u16c9\": 6,\n                \"\\u16ca\": 4,\n                \"\\u16cb\": 6,\n                \"\\u16cc\": 2,\n                \"\\u16cd\": 4,\n                \"\\u16ce\": 6,\n                \"\\u16cf\": 6,\n                \"\\u16d0\": 4,\n                \"\\u16d1\": 5,\n                \"\\u16d2\": 5,\n                \"\\u16d3\": 4,\n                \"\\u16d4\": 5,\n                \"\\u16d5\": 5,\n                \"\\u16d6\": 6,\n                \"\\u16d7\": 6,\n                \"\\u16d8\": 6,\n                \"\\u16d9\": 4,\n                \"\\u16da\": 4,\n                \"\\u16db\": 5,\n                \"\\u16dc\": 6,\n                \"\\u16dd\": 6,\n                \"\\u16de\": 6,\n                \"\\u16df\": 7,\n                \"\\u16e0\": 8,\n                \"\\u16e1\": 6,\n                \"\\u16e2\": 8,\n                \"\\u16e3\": 6,\n                \"\\u16e4\": 6,\n                \"\\u16e5\": 6,\n                \"\\u16e6\": 6,\n                \"\\u16e7\": 2,\n                \"\\u16e8\": 6,\n                \"\\u16e9\": 5,\n                \"\\u16ea\": 8,\n                \"\\u16eb\": 3,\n                \"\\u16ec\": 2,\n                \"\\u16ed\": 6,\n                \"\\u16ee\": 6,\n                \"\\u16ef\": 6,\n                \"\\u16f0\": 6,\n                \"\\u16f1\": 6,\n                \"\\u16f2\": 6,\n                \"\\u16f3\": 8,\n                \"\\u16f4\": 5,\n                \"\\u16f5\": 3,\n                \"\\u16f6\": 6,\n                \"\\u16f7\": 6,\n                \"\\u16f8\": 6,\n                \"\\u263a\": 6,\n                \"\\u263b\": 8,\n                \"\\u2639\": 6,\n                \"\\u05da\": 6,\n                \"\\u05f3\": 3,\n                \"\\u05f4\": 5,\n                \"\\u05f0\": 4,\n                \"\\u05f1\": 4,\n                \"\\u05f2\": 4,\n                \"\\u05be\": 6,\n                \"\\u05c3\": 2,\n                \"\\u05c6\": 4,\n                \"\\u1d00\": 6,\n                \"\\u0299\": 6,\n                \"\\u1d04\": 6,\n                \"\\u1d05\": 6,\n                \"\\u1d07\": 6,\n                \"\\ua730\": 6,\n                \"\\u0262\": 6,\n                \"\\u029c\": 6,\n                \"\\u1d0a\": 6,\n                \"\\u1d0b\": 6,\n                \"\\u029f\": 6,\n                \"\\u1d0d\": 6,\n                \"\\u0274\": 6,\n                \"\\u1d0f\": 6,\n                \"\\u1d18\": 6,\n                \"\\ua7af\": 6,\n                \"\\u0280\": 6,\n                \"\\ua731\": 6,\n                \"\\u1d1b\": 6,\n                \"\\u1d1c\": 6,\n                \"\\u1d20\": 6,\n                \"\\u1d21\": 6,\n                \"\\u028f\": 6,\n                \"\\u1d22\": 6,\n                \"\\u0271\": 6,\n                \"\\u0273\": 7,\n                \"\\u0272\": 7,\n                \"\\u0288\": 4,\n                \"\\u0256\": 7,\n                \"\\u0261\": 6,\n                \"\\u02a1\": 6,\n                \"\\u0255\": 6,\n                \"\\u0291\": 6,\n                \"\\u0278\": 6,\n                \"\\u029d\": 6,\n                \"\\u02a2\": 6,\n                \"\\u027b\": 7,\n                \"\\u0281\": 6,\n                \"\\u0266\": 6,\n                \"\\u028b\": 6,\n                \"\\u0270\": 6,\n                \"\\u026c\": 5,\n                \"\\u026e\": 6,\n                \"\\u0298\": 6,\n                \"\\u01c0\": 2,\n                \"\\u01c3\": 2,\n                \"\\u01c2\": 6,\n                \"\\u01c1\": 4,\n                \"\\u0253\": 6,\n                \"\\u0257\": 7,\n                \"\\u1d91\": 7,\n                \"\\u0284\": 7,\n                \"\\u0260\": 7,\n                \"\\u029b\": 7,\n                \"\\u0267\": 6,\n                \"\\u026b\": 6,\n                \"\\u0268\": 4,\n                \"\\u0289\": 8,\n                \"\\u028a\": 6,\n                \"\\u0258\": 6,\n                \"\\u0275\": 6,\n                \"\\u0264\": 6,\n                \"\\u025c\": 6,\n                \"\\u025e\": 6,\n                \"\\u0251\": 6,\n                \"\\u0252\": 6,\n                \"\\u025a\": 8,\n                \"\\u025d\": 8,\n                \"\\u0181\": 8,\n                \"\\u0189\": 7,\n                \"\\u0191\": 7,\n                \"\\u01a9\": 6,\n                \"\\u01b2\": 6,\n                \"\\u10a0\": 6,\n                \"\\u10a1\": 8,\n                \"\\u10a2\": 8,\n                \"\\u10a3\": 6,\n                \"\\u10a4\": 6,\n                \"\\u10a5\": 8,\n                \"\\u10a6\": 8,\n                \"\\u10a7\": 8,\n                \"\\u10a8\": 6,\n                \"\\u10a9\": 6,\n                \"\\u10aa\": 8,\n                \"\\u10ab\": 7,\n                \"\\u10ac\": 6,\n                \"\\u10ad\": 8,\n                \"\\u10ae\": 8,\n                \"\\u10af\": 7,\n                \"\\u10b0\": 8,\n                \"\\u10b1\": 6,\n                \"\\u10b2\": 6,\n                \"\\u10b3\": 8,\n                \"\\u10b4\": 6,\n                \"\\u10b5\": 6,\n                \"\\u10b6\": 6,\n                \"\\u10b7\": 6,\n                \"\\u10b8\": 6,\n                \"\\u10b9\": 6,\n                \"\\u10ba\": 6,\n                \"\\u10bb\": 8,\n                \"\\u10bc\": 6,\n                \"\\u10bd\": 6,\n                \"\\u10be\": 6,\n                \"\\u10bf\": 6,\n                \"\\u10c0\": 8,\n                \"\\u10c1\": 6,\n                \"\\u10c2\": 6,\n                \"\\u10c3\": 6,\n                \"\\u10c4\": 6,\n                \"\\u10c5\": 8,\n                \"\\u10c7\": 6,\n                \"\\u10cd\": 6,\n                \"\\u10d0\": 6,\n                \"\\u10d1\": 6,\n                \"\\u10d2\": 6,\n                \"\\u10d3\": 6,\n                \"\\u10d4\": 6,\n                \"\\u10d5\": 6,\n                \"\\u10d6\": 6,\n                \"\\u10d7\": 6,\n                \"\\u10d8\": 6,\n                \"\\u10d9\": 6,\n                \"\\u10da\": 8,\n                \"\\u10db\": 6,\n                \"\\u10dc\": 6,\n                \"\\u10dd\": 6,\n                \"\\u10de\": 6,\n                \"\\u10df\": 6,\n                \"\\u10e0\": 6,\n                \"\\u10e1\": 6,\n                \"\\u10e2\": 6,\n                \"\\u10e3\": 6,\n                \"\\u10e4\": 6,\n                \"\\u10e5\": 6,\n                \"\\u10e6\": 6,\n                \"\\u10e7\": 6,\n                \"\\u10e8\": 6,\n                \"\\u10e9\": 6,\n                \"\\u10ea\": 6,\n                \"\\u10eb\": 6,\n                \"\\u10ec\": 6,\n                \"\\u10ed\": 6,\n                \"\\u10ee\": 6,\n                \"\\u10ef\": 5,\n                \"\\u10f0\": 6,\n                \"\\u10f1\": 7,\n                \"\\u10f2\": 6,\n                \"\\u10f3\": 6,\n                \"\\u10f4\": 6,\n                \"\\u10f5\": 6,\n                \"\\u10f6\": 6,\n                \"\\u10f7\": 6,\n                \"\\u10f8\": 6,\n                \"\\u10f9\": 6,\n                \"\\u10fa\": 6,\n                \"\\u10fb\": 4,\n                \"\\u10fc\": 4,\n                \"\\u10fd\": 6,\n                \"\\u10fe\": 6,\n                \"\\u10ff\": 6,\n                \"\\ufb4a\": 6,\n                \"\\ufb2b\": 6,\n                \"\\ufb4e\": 6,\n                \"\\ufb44\": 6,\n                \"\\ufb3b\": 5,\n                \"\\ufb1f\": 4,\n                \"\\ufb1d\": 2,\n                \"\\ufb4b\": 3,\n                \"\\ufb35\": 4,\n                \"\\ufb4c\": 6,\n                \"\\ufb31\": 6,\n                \"\\ua727\": 6,\n                \"\\ua726\": 6,\n                \"\\u027a\": 6,\n                \"\\u2c71\": 8,\n                \"\\u02a0\": 7,\n                \"\\u0297\": 6,\n                \"\\u0296\": 6,\n                \"\\u026d\": 3,\n                \"\\u0277\": 8,\n                \"\\u027f\": 6,\n                \"\\u0285\": 6,\n                \"\\u0286\": 7,\n                \"\\u0293\": 6,\n                \"\\u029a\": 6,\n                \"\\u20aa\": 8,\n                \"\\u20be\": 7,\n                \"\\u058a\": 6,\n                \"\\u2d00\": 6,\n                \"\\u2d01\": 7,\n                \"\\u2d02\": 7,\n                \"\\u2d03\": 6,\n                \"\\u2d04\": 6,\n                \"\\u2d05\": 6,\n                \"\\u2d06\": 7,\n                \"\\u2d21\": 6,\n                \"\\u2d07\": 6,\n                \"\\u2d08\": 6,\n                \"\\u2d09\": 6,\n                \"\\u2d0a\": 6,\n                \"\\u2d0b\": 6,\n                \"\\u2d0c\": 6,\n                \"\\u2d22\": 6,\n                \"\\u2d0d\": 6,\n                \"\\u2d0e\": 7,\n                \"\\u2d0f\": 7,\n                \"\\u2d10\": 6,\n                \"\\u2d11\": 6,\n                \"\\u2d12\": 6,\n                \"\\u2d23\": 6,\n                \"\\u2d13\": 6,\n                \"\\u2d14\": 6,\n                \"\\u2d15\": 6,\n                \"\\u2d16\": 6,\n                \"\\u2d17\": 6,\n                \"\\u2d18\": 6,\n                \"\\u2d19\": 6,\n                \"\\u2d1a\": 6,\n                \"\\u2d1b\": 6,\n                \"\\u2d1c\": 6,\n                \"\\u2d1d\": 7,\n                \"\\u2d1e\": 6,\n                \"\\u2d24\": 6,\n                \"\\u2d1f\": 6,\n                \"\\u2d20\": 6,\n                \"\\u2d25\": 6,\n                \"\\u215b\": 9,\n                \"\\u215c\": 9,\n                \"\\u215d\": 9,\n                \"\\u215e\": 9,\n                \"\\u2153\": 9,\n                \"\\u2154\": 9,\n                \"\\u2709\": 8,\n                \"\\u2602\": 8,\n                \"\\u2614\": 8,\n                \"\\u2604\": 8,\n                \"\\u26c4\": 7,\n                \"\\u2603\": 8,\n                \"\\u231b\": 8,\n                \"\\u231a\": 8,\n                \"\\u2690\": 8,\n                \"\\u270e\": 8,\n                \"\\u2763\": 6,\n                \"\\u2664\": 6,\n                \"\\u2667\": 6,\n                \"\\u2661\": 6,\n                \"\\u2662\": 6,\n                \"\\u26c8\": 9,\n                \"\\u2630\": 6,\n                \"\\u2631\": 6,\n                \"\\u2633\": 6,\n                \"\\u2634\": 6,\n                \"\\u2636\": 6,\n                \"\\u2637\": 6,\n                \"\\u2194\": 9,\n                \"\\u21d2\": 9,\n                \"\\u21cf\": 9,\n                \"\\u21d4\": 9,\n                \"\\u21f5\": 7,\n                \"\\u2200\": 8,\n                \"\\u2203\": 6,\n                \"\\u2204\": 6,\n                \"\\u2209\": 6,\n                \"\\u220b\": 6,\n                \"\\u220c\": 6,\n                \"\\u2282\": 6,\n                \"\\u2283\": 6,\n                \"\\u2284\": 6,\n                \"\\u2285\": 6,\n                \"\\u2227\": 6,\n                \"\\u2228\": 6,\n                \"\\u22bb\": 6,\n                \"\\u22bc\": 6,\n                \"\\u22bd\": 6,\n                \"\\u2225\": 4,\n                \"\\u2262\": 7,\n                \"\\u22c6\": 4,\n                \"\\u2211\": 6,\n                \"\\u22a4\": 6,\n                \"\\u22a5\": 6,\n                \"\\u22a2\": 6,\n                \"\\u22a8\": 6,\n                \"\\u2254\": 8,\n                \"\\u2201\": 5,\n                \"\\u2234\": 6,\n                \"\\u2235\": 6,\n                \"\\u221b\": 8,\n                \"\\u221c\": 8,\n                \"\\u2202\": 6,\n                \"\\u22c3\": 6,\n                \"\\u2286\": 6,\n                \"\\u2287\": 6,\n                \"\\u25a1\": 6,\n                \"\\u25b3\": 6,\n                \"\\u25b7\": 7,\n                \"\\u25bd\": 6,\n                \"\\u25c1\": 7,\n                \"\\u25c6\": 6,\n                \"\\u25c7\": 6,\n                \"\\u25cb\": 6,\n                \"\\u25ce\": 8,\n                \"\\u2606\": 8,\n                \"\\u2605\": 8,\n                \"\\u2718\": 7,\n                \"\\u2080\": 5,\n                \"\\u2081\": 4,\n                \"\\u2082\": 5,\n                \"\\u2083\": 5,\n                \"\\u2084\": 5,\n                \"\\u2085\": 5,\n                \"\\u2086\": 5,\n                \"\\u2087\": 5,\n                \"\\u2088\": 5,\n                \"\\u2089\": 5,\n                \"\\u208a\": 4,\n                \"\\u208b\": 4,\n                \"\\u208c\": 4,\n                \"\\u208d\": 3,\n                \"\\u208e\": 3,\n                \"\\u222b\": 6,\n                \"\\u222e\": 6,\n                \"\\u221d\": 7,\n                \"\\u2300\": 8,\n                \"\\u2302\": 8,\n                \"\\u2318\": 8,\n                \"\\u3012\": 6,\n                \"\\u027c\": 6,\n                \"\\u0184\": 7,\n                \"\\u0185\": 7,\n                \"\\u1e9f\": 6,\n                \"\\u023d\": 7,\n                \"\\u019a\": 4,\n                \"\\u019b\": 6,\n                \"\\u0220\": 6,\n                \"\\u019e\": 6,\n                \"\\u019f\": 6,\n                \"\\u01a7\": 6,\n                \"\\u01a8\": 6,\n                \"\\u01aa\": 6,\n                \"\\u01b8\": 6,\n                \"\\u01b9\": 6,\n                \"\\u01bb\": 6,\n                \"\\u01bc\": 6,\n                \"\\u01bd\": 6,\n                \"\\u01be\": 6,\n                \"\\u0221\": 8,\n                \"\\u0234\": 4,\n                \"\\u0235\": 8,\n                \"\\u0236\": 5,\n                \"\\u023a\": 6,\n                \"\\u2c65\": 7,\n                \"\\u023b\": 6,\n                \"\\u023c\": 6,\n                \"\\u0246\": 6,\n                \"\\u0247\": 7,\n                \"\\u023e\": 6,\n                \"\\u2c66\": 6,\n                \"\\u0241\": 6,\n                \"\\u0242\": 6,\n                \"\\u0243\": 7,\n                \"\\u0244\": 8,\n                \"\\u0248\": 7,\n                \"\\u0249\": 7,\n                \"\\u024a\": 7,\n                \"\\u024b\": 7,\n                \"\\u024c\": 7,\n                \"\\u024d\": 7,\n                \"\\u024e\": 8,\n                \"\\u024f\": 8,\n                \"\\u1e9c\": 5,\n                \"\\u1e9d\": 5,\n                \"\\u1efc\": 6,\n                \"\\u1efd\": 5,\n                \"\\u1efe\": 6,\n                \"\\u1eff\": 7,\n                \"\\ua7a8\": 7,\n                \"\\ua7a9\": 6,\n                \"\\ud800\\udf30\": 6,\n                \"\\ud800\\udf31\": 6,\n                \"\\ud800\\udf32\": 6,\n                \"\\ud800\\udf33\": 6,\n                \"\\ud800\\udf34\": 6,\n                \"\\ud800\\udf35\": 6,\n                \"\\ud800\\udf36\": 6,\n                \"\\ud800\\udf37\": 6,\n                \"\\ud800\\udf38\": 6,\n                \"\\ud800\\udf39\": 2,\n                \"\\ud800\\udf3a\": 6,\n                \"\\ud800\\udf3b\": 6,\n                \"\\ud800\\udf3c\": 6,\n                \"\\ud800\\udf3d\": 6,\n                \"\\ud800\\udf3e\": 6,\n                \"\\ud800\\udf3f\": 6,\n                \"\\ud800\\udf40\": 6,\n                \"\\ud800\\udf41\": 6,\n                \"\\ud800\\udf42\": 6,\n                \"\\ud800\\udf43\": 6,\n                \"\\ud800\\udf44\": 6,\n                \"\\ud800\\udf45\": 6,\n                \"\\ud800\\udf46\": 6,\n                \"\\ud800\\udf47\": 6,\n                \"\\ud800\\udf48\": 6,\n                \"\\ud800\\udf49\": 6,\n                \"\\ud800\\udf4a\": 6,\n                \"\\ud83c\\udf27\": 9,\n                \"\\ud83d\\udd25\": 7,\n                \"\\ud83c\\udf0a\": 9,\n                \"\\u2150\": 9,\n                \"\\u2151\": 9,\n                \"\\u2155\": 9,\n                \"\\u2156\": 9,\n                \"\\u2157\": 9,\n                \"\\u2159\": 8,\n                \"\\u215a\": 8,\n                \"\\u215f\": 7,\n                \"\\u2189\": 9,\n                \"\\ud83d\\udde1\": 9,\n                \"\\ud83c\\udff9\": 9,\n                \"\\ud83e\\ude93\": 7,\n                \"\\ud83d\\udd31\": 9,\n                \"\\ud83c\\udfa3\": 9,\n                \"\\ud83e\\uddea\": 8,\n                \"\\u2697\": 8,\n                \"\\u2bea\": 8,\n                \"\\u2beb\": 8,\n                \"\\u2c6d\": 6,\n                \"\\ud83d\\udee1\": 8,\n                \"\\u2702\": 8,\n                \"\\ud83c\\udf56\": 9,\n                \"\\ud83e\\udea3\": 8,\n                \"\\ud83d\\udd14\": 8,\n                \"\\u23f3\": 8,\n                \"\\u2691\": 8,\n                \"\\u20a0\": 6,\n                \"\\u20a1\": 6,\n                \"\\u20a2\": 6,\n                \"\\u20a3\": 7,\n                \"\\u20a4\": 6,\n                \"\\u20a5\": 6,\n                \"\\u20a6\": 8,\n                \"\\u20a9\": 8,\n                \"\\u20ab\": 7,\n                \"\\u20ad\": 7,\n                \"\\u20ae\": 6,\n                \"\\u20b0\": 6,\n                \"\\u20b1\": 8,\n                \"\\u20b2\": 6,\n                \"\\u20b3\": 8,\n                \"\\u20b5\": 6,\n                \"\\u20b6\": 6,\n                \"\\u20b7\": 8,\n                \"\\u20b8\": 6,\n                \"\\u20b9\": 6,\n                \"\\u20ba\": 7,\n                \"\\u20bb\": 8,\n                \"\\u20bc\": 6,\n                \"\\u20bf\": 6\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "base/assets/gm4/lang/en_us.json",
    "content": "{\n    \"gm4.second\": \"%2$s\"\n}\n"
  },
  {
    "path": "base/assets/gm4/models/block/cube_with_plate.json",
    "content": "{\n  \"parent\": \"minecraft:block/cube\",\n  \"elements\": [\n    {\n      \"name\": \"plate\",\n      \"from\": [\n        1.0,\n        16.0,\n        1.0\n      ],\n      \"to\": [\n        15.0,\n        17.0,\n        15.0\n      ],\n      \"faces\": {\n        \"north\": {\n          \"texture\": \"#plate\",\n          \"uv\": [\n            1.0,\n            0.0,\n            15.0,\n            1.0\n          ]\n        },\n        \"east\": {\n          \"texture\": \"#plate\",\n          \"uv\": [\n            1.0,\n            0.0,\n            15.0,\n            1.0\n          ]\n        },\n        \"south\": {\n          \"texture\": \"#plate\",\n          \"uv\": [\n            1.0,\n            0.0,\n            15.0,\n            1.0\n          ]\n        },\n        \"west\": {\n          \"texture\": \"#plate\",\n          \"uv\": [\n            1.0,\n            0.0,\n            15.0,\n            1.0\n          ]\n        },\n        \"up\": {\n          \"texture\": \"#plate\",\n          \"uv\": [\n            1.0,\n            1.0,\n            15.0,\n            15.0\n          ]\n        },\n        \"down\": {\n          \"texture\": \"#plate\",\n          \"uv\": [\n            1.0,\n            1.0,\n            15.0,\n            15.0\n          ]\n        }\n      }\n    },\n    {\n      \"name\": \"cube\",\n      \"from\": [\n        0.0,\n        0.0,\n        0.0\n      ],\n      \"to\": [\n        16.0,\n        16.0,\n        16.0\n      ],\n      \"faces\": {\n        \"north\": {\n          \"texture\": \"#front\",\n          \"uv\": [\n            0.0,\n            0.0,\n            16.0,\n            16.0\n          ]\n        },\n        \"east\": {\n          \"texture\": \"#side\",\n          \"uv\": [\n            0.0,\n            0.0,\n            16.0,\n            16.0\n          ]\n        },\n        \"south\": {\n          \"texture\": \"#side\",\n          \"uv\": [\n            0.0,\n            0.0,\n            16.0,\n            16.0\n          ]\n        },\n        \"west\": {\n          \"texture\": \"#side\",\n          \"uv\": [\n            0.0,\n            0.0,\n            16.0,\n            16.0\n          ]\n        },\n        \"up\": {\n          \"texture\": \"#top\",\n          \"uv\": [\n            0.0,\n            0.0,\n            16.0,\n            16.0\n          ]\n        },\n        \"down\": {\n          \"texture\": \"#bottom\",\n          \"uv\": [\n            0.0,\n            0.0,\n            16.0,\n            16.0\n          ]\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "base/assets/gm4/models/block/plate.json",
    "content": "{\n  \"elements\": [\n    {\n      \"name\": \"plate\",\n      \"from\": [\n        1.0,\n        16.0,\n        1.0\n      ],\n      \"to\": [\n        15.0,\n        17.0,\n        15.0\n      ],\n      \"faces\": {\n        \"north\": {\n          \"texture\": \"#top\",\n          \"uv\": [\n            1.0,\n            0.0,\n            15.0,\n            1.0\n          ]\n        },\n        \"east\": {\n          \"texture\": \"#top\",\n          \"uv\": [\n            1.0,\n            0.0,\n            15.0,\n            1.0\n          ]\n        },\n        \"south\": {\n          \"texture\": \"#top\",\n          \"uv\": [\n            1.0,\n            0.0,\n            15.0,\n            1.0\n          ]\n        },\n        \"west\": {\n          \"texture\": \"#top\",\n          \"uv\": [\n            1.0,\n            0.0,\n            15.0,\n            1.0\n          ]\n        },\n        \"up\": {\n          \"texture\": \"#top\",\n          \"uv\": [\n            1.0,\n            1.0,\n            15.0,\n            15.0\n          ]\n        },\n        \"down\": {\n          \"texture\": \"#top\",\n          \"uv\": [\n            1.0,\n            1.0,\n            15.0,\n            15.0\n          ]\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "base/assets/minecraft/atlases/items.json",
    "content": "{\n    \"sources\": [\n        {\n            \"type\": \"directory\",\n            \"source\": \"gui\",\n            \"prefix\": \"gui/\"\n        },\n        {\n            \"type\": \"filter\",\n            \"pattern\":{\n                \"namespace\": \"^((?!gm4).)*$\",\n                \"path\": \"gui\"\n            }\n        },\n        {\n            \"type\": \"filter\",\n            \"pattern\": {\n                \"namespace\": \"gm4_*\",\n                \"path\": \"gui/container\"\n            }\n        },\n        {\n            \"type\": \"filter\",\n            \"pattern\": {\n                \"namespace\": \"gm4_guidebook\",\n                \"path\": \"gui/\"\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "base/assets/minecraft/optifine/emissive.properties",
    "content": "suffix.emissive=_e"
  },
  {
    "path": "base/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.root.title,Gamemode 4\nadvancement.gm4.root.description,Semi-funny blurb about GM4\n"
  },
  {
    "path": "base/beet.yaml",
    "content": "version: 1.9.0\nid: gm4\n\ndata_pack:\n  load:\n    data: data\n\nresource_pack:\n  load:\n    assets: assets\n\nrequire:\n  - gm4.plugins.resource_pack\n\npipeline:\n  - beet.contrib.babelbox\n  - gm4.plugins.resource_pack.build\n  - gm4.plugins.versioning.base\n\nmeta:\n  gm4:\n    versioning:\n      extra_version_injections:\n        advancements:\n          - 'gm4:intro_song/play_song'\n    model_data:\n      - item: command_block\n        reference: gm4:gui/advancement/root\n        template: generated\n  babelbox:\n    load: assets/translations.csv\n    namespace: gm4_translations\n    dialect: excel\n"
  },
  {
    "path": "base/data/gm4/advancement/intro_song/invisible_root.json",
    "content": "{\n    \"criteria\": {\n      \"requirement\": {\n        \"trigger\": \"minecraft:impossible\"\n      }\n    }\n  }\n"
  },
  {
    "path": "base/data/gm4/advancement/intro_song/play_song.json",
    "content": "{\n    \"criteria\": {\n      \"requirement\": {\n        \"trigger\": \"minecraft:location\",\n        \"conditions\": {\n          \"player\": [\n            {\n              \"condition\": \"minecraft:entity_scores\",\n              \"entity\": \"this\",\n              \"scores\": {\n                \"gm4_intro_walked\": {\n                  \"min\": 1,\n                  \"max\": 9999\n                }\n              }\n            },\n            {\n              \"condition\": \"minecraft:value_check\",\n              \"value\": {\n                \"type\": \"minecraft:score\",\n                \"target\": {\n                  \"type\": \"minecraft:fixed\",\n                  \"name\": \"$first_join\"\n                },\n                \"score\": \"gm4_intro_song\"\n              },\n              \"range\": 1\n            }\n          ]\n        }\n      }\n    },\n    \"rewards\": {\n      \"function\": \"gm4:intro_song/init_song\"\n    }\n  }\n"
  },
  {
    "path": "base/data/gm4/advancement/intro_song/welcome_toast.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:command_block\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\n          \"floats\": [\n            3420001\n          ]\n        }\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.welcome_toast.title\",\n      \"fallback\": \"This world is enhanced by Gamemode 4!\"\n    },\n    \"description\": {\n      \"text\": \"This should not be seen.\"\n    },\n    \"show_toast\": true,\n    \"announce_to_chat\": false\n  },\n  \"parent\": \"gm4:intro_song/invisible_root\",\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"gm4\"\n              },\n              \"score\": \"gm4_modules\"\n            },\n            \"range\": {\n              \"min\": 1\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "base/data/gm4/advancement/upgrade_paths/changed_dimension.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:changed_dimension\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:inverted\",\n                        \"term\": {\n                            \"condition\": \"minecraft:value_check\",\n                            \"value\": {\n                                \"type\": \"minecraft:score\",\n                                \"target\": {\n                                    \"type\": \"minecraft:fixed\",\n                                    \"name\": \"$disable_upgrade_paths\"\n                                },\n                                \"score\": \"gm4_data\"\n                            },\n                            \"range\": {\n                                \"min\": 1\n                            }\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4:upgrade_paths/changed_dimension\"\n    }\n}\n"
  },
  {
    "path": "base/data/gm4/advancement/upgrade_paths/join_game.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:tick\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:entity_scores\",\n                        \"entity\": \"this\",\n                        \"scores\": {\n                            \"gm4_up_leave_game\": {\n                                \"min\": 1\n                            }\n                        }\n                    },\n                    {\n                        \"condition\": \"minecraft:inverted\",\n                        \"term\": {\n                            \"condition\": \"minecraft:value_check\",\n                            \"value\": {\n                                \"type\": \"minecraft:score\",\n                                \"target\": {\n                                    \"type\": \"minecraft:fixed\",\n                                    \"name\": \"$disable_upgrade_paths\"\n                                },\n                                \"score\": \"gm4_data\"\n                            },\n                            \"range\": {\n                                \"min\": 1\n                            }\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4:upgrade_paths/join_game\"\n    }\n}\n"
  },
  {
    "path": "base/data/gm4/function/conflict_logs/traverse.mcfunction",
    "content": "execute store success score #not_match gm4_data run data modify storage gm4:log traverse_versions[0].id set from storage gm4:log log.require_id\nexecute if data storage gm4:log traverse_versions[0].from run data modify storage gm4:log temp set value [{\"text\":\" (packaged in \",\"color\":\"red\"},{\"nbt\":\"traverse_versions[0].from\",\"storage\":\"gm4:log\",\"color\":\"red\"},{\"text\":\")\",\"color\":\"red\"}]\n\nexecute if score #not_match gm4_data matches 0 run tellraw @a[tag=gm4_show_log] [{\"nbt\":\"log.module\",\"storage\":\"gm4:log\",\"color\":\"red\"},{\"text\":\" is disabled. It requires \",\"color\":\"red\"},{\"nbt\":\"log.require\",\"storage\":\"gm4:log\",\"color\":\"red\"},{\"text\":\" v\",\"color\":\"red\"},{\"nbt\":\"log.require_ver\",\"storage\":\"gm4:log\"},{\"text\":\" but \",\"color\":\"red\"},{\"nbt\":\"traverse_versions[0].module\",\"storage\":\"gm4:log\"},{\"text\":\" v\"},{\"nbt\":\"traverse_versions[0].version\",\"storage\":\"gm4:log\",\"color\":\"red\"},{\"text\":\" is installed instead\",\"color\":\"red\"},{\"nbt\":\"temp\",\"storage\":\"gm4:log\",\"interpret\":true}]\n\ndata remove storage gm4:log temp\nexecute if score #not_match gm4_data matches 1 run data remove storage gm4:log traverse_versions[0]\nexecute store result score #match_size gm4_data run data get storage gm4:log traverse_versions\nexecute if score #not_match gm4_data matches 1 if score #match_size gm4_data matches 1.. run function gm4:conflict_logs/traverse\n"
  },
  {
    "path": "base/data/gm4/function/conflict_logs/version_conflict_start.mcfunction",
    "content": "data modify storage gm4:log traverse_versions set from storage gm4:log versions\nfunction gm4:conflict_logs/traverse\n\nexecute if score #not_match gm4_data matches 1 run tellraw @a[tag=gm4_show_log] [{\"nbt\":\"log.module\",\"storage\":\"gm4:log\",\"color\":\"red\"},{\"text\":\" is disabled. It requires \",\"color\":\"red\"},{\"nbt\":\"log.require\",\"storage\":\"gm4:log\",\"color\":\"red\"},{\"text\":\" v\",\"color\":\"red\"},{\"nbt\":\"log.require_ver\",\"storage\":\"gm4:log\"},{\"text\":\" but ?Unknown Version? is installed instead\",\"color\":\"red\"}]\n\ndata remove storage gm4:log traverse_versions\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/init.mcfunction",
    "content": "# Scoreboard init, non-standard init so it is here instead of init\nscoreboard objectives add gm4_intro_song dummy\nscoreboard objectives add gm4_intro_song_t dummy\nscoreboard objectives add gm4_intro_walked minecraft.custom:walk_one_cm\n\n# to enable intro song on first join, run\n# /scoreboard players set $first_join gm4_intro_song 1\nexecute unless score $first_join gm4_intro_song matches 0.. run scoreboard players set $first_join gm4_intro_song 0\n\nadvancement grant @a only gm4:intro_song/play_song\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/init_song.mcfunction",
    "content": "# Setup all online players\n# run from base install function, gm4:load, or first join advancement, gm4:intro_song/play_song\n\ntag @s add gm4_intro_playing\nscoreboard players set @s gm4_intro_song -240\nscoreboard players set @s gm4_intro_song_t -1\n\nschedule function gm4:intro_song/main 1t\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/main.mcfunction",
    "content": "# plays the intro song to all players online during first install of Gamemode 4\n\nexecute as @a[tag=gm4_intro_playing] at @s run function gm4:intro_song/play\n\nexecute if score $song_playing gm4_intro_song matches 1.. run schedule function gm4:intro_song/main 1t\nscoreboard players reset $song_playing gm4_intro_song\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/0.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.749154 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 0.749154 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.63 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.70 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nscoreboard players set @s gm4_intro_song_t 0\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/10.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.122462 1\nscoreboard players set @s gm4_intro_song_t 10\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/12.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.122462 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.63 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.70 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nscoreboard players set @s gm4_intro_song_t 12\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/14.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.122462 1\nscoreboard players set @s gm4_intro_song_t 14\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/16.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.749154 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 0.749154 1\nscoreboard players set @s gm4_intro_song_t 16\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/20.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.498307 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.498307 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.63 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.70 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nscoreboard players set @s gm4_intro_song_t 20\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/23.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.017480 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.017480 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.017480 1\nscoreboard players set @s gm4_intro_song_t 23\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/24.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.059463 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.059463 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.059463 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.63 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.70 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nscoreboard players set @s gm4_intro_song_t 24\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/26.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.122462 1\nscoreboard players set @s gm4_intro_song_t 26\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/28.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.122462 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.63 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.70 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nscoreboard players set @s gm4_intro_song_t 28\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/30.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.122462 1\nscoreboard players set @s gm4_intro_song_t 30\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/32.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 0.749154 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.749154 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 0.749154 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.63 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.70 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.80 0.749154 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 0.749154 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.60 0.749154 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.60 1.498307 1\nplaysound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1\nscoreboard players set @s gm4_intro_song_t 32\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/35.mcfunction",
    "content": "playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 0.943874 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 0.943874 1\nscoreboard players set @s gm4_intro_song_t 35\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/36.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.498307 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.498307 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.498307 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.498307 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.498307 1\nscoreboard players set @s gm4_intro_song_t 36\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/38.mcfunction",
    "content": "playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.122462 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.122462 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.60 0.749154 1\nplaysound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1\nscoreboard players set @s gm4_intro_song_t 38\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/39.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.017480 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.017480 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.017480 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.334840 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.334840 1\nscoreboard players set @s gm4_intro_song_t 39\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/4.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.498307 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.498307 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.498307 1\nscoreboard players set @s gm4_intro_song_t 4\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/40.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.059463 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.059463 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.059463 1\nscoreboard players set @s gm4_intro_song_t 40\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/41.mcfunction",
    "content": "playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.50 0.529732 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 1.059463 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.059463 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 1.059463 1\nscoreboard players set @s gm4_intro_song_t 41\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/42.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.50 0.561231 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 1.122462 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.122462 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 1.122462 1\nscoreboard players set @s gm4_intro_song_t 42\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/43.mcfunction",
    "content": "playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.50 0.529732 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 1.059463 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.059463 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 1.059463 1\nscoreboard players set @s gm4_intro_song_t 43\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/44.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.72 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.80 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.50 0.561231 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 1.122462 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.122462 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 1.122462 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.60 1.498307 1\nplaysound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1\nscoreboard players set @s gm4_intro_song_t 44\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/45.mcfunction",
    "content": "playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.50 0.529732 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 1.059463 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.059463 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 1.059463 1\nscoreboard players set @s gm4_intro_song_t 45\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/46.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 0.943874 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 0.943874 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 0.943874 1\nscoreboard players set @s gm4_intro_song_t 46\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/47.mcfunction",
    "content": "playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 0.840896 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 0.840896 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 0.840896 1\nscoreboard players set @s gm4_intro_song_t 47\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/48.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 0.749154 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 0.749154 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 0.749154 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 0.749154 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.60 0.749154 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.60 1.498307 1\nplaysound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1\nscoreboard players set @s gm4_intro_song_t 48\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/51.mcfunction",
    "content": "playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 0.943874 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 1 0.943874 1\nscoreboard players set @s gm4_intro_song_t 51\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/52.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.498307 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.498307 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.498307 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 1 1.498307 1\nscoreboard players set @s gm4_intro_song_t 52\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/54.mcfunction",
    "content": "playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.122462 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.80 0.749154 1\nplaysound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1\nscoreboard players set @s gm4_intro_song_t 54\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/55.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.077982 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.017480 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.077982 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.334840 1\nscoreboard players set @s gm4_intro_song_t 55\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/56.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 1.122462 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.122462 1\nscoreboard players set @s gm4_intro_song_t 56\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/58.mcfunction",
    "content": "playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 1.259921 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.70 1.259921 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.259921 1\nscoreboard players set @s gm4_intro_song_t 58\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/60.mcfunction",
    "content": "playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 1.334840 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.70 1.334840 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.334840 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.80 1.498307 1\nplaysound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1\nscoreboard players set @s gm4_intro_song_t 60\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/62.mcfunction",
    "content": "playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 1.122462 1\nplaysound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.122462 1\nscoreboard players set @s gm4_intro_song_t 62\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/64.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.40 0.629961 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.40 0.629961 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.629961 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.60 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.40 0.629961 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.27 0.629961 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.40 0.629961 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.80 0.749154 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.80 1.498307 1\nplaysound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1\nscoreboard players set @s gm4_intro_song_t 64\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/65.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.50 0.667420 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.50 0.667420 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.667420 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.50 0.667420 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.36 0.667420 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.40 0.667420 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.50 0.749154 1\nscoreboard players set @s gm4_intro_song_t 65\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/66.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.60 0.707107 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.60 0.707107 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.707107 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.60 0.707107 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 0.707107 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.40 0.707107 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.749154 1\nscoreboard players set @s gm4_intro_song_t 66\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/67.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 0.749154 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 0.749154 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.749154 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.70 0.749154 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.54 0.749154 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.40 0.749154 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.30 0.749154 1\nscoreboard players set @s gm4_intro_song_t 67\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/68.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.80 0.793701 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.793701 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.793701 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.60 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.80 0.793701 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 0.793701 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.50 0.793701 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.20 0.749154 1\nscoreboard players set @s gm4_intro_song_t 68\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/69.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.80 0.840896 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.840896 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.50 0.840896 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.80 0.840896 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 0.840896 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.50 0.840896 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.10 0.749154 1\nscoreboard players set @s gm4_intro_song_t 69\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/7.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.017480 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.017480 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.017480 1\nscoreboard players set @s gm4_intro_song_t 7\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/70.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.80 0.890899 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.890899 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.50 0.890899 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.80 0.890899 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 0.890899 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.50 0.890899 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 1 1.498307 1\nplaysound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1\nscoreboard players set @s gm4_intro_song_t 70\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/71.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.80 0.943874 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.943874 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.50 0.943874 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.80 0.943874 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 0.943874 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.50 0.943874 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.50 0.749154 1\nscoreboard players set @s gm4_intro_song_t 71\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/72.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.90 1.000000 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.90 1.000000 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.60 1.000000 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.60 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.90 1.000000 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.72 1.000000 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.60 1.000000 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.749154 1\nscoreboard players set @s gm4_intro_song_t 72\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/73.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.90 1.059463 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.90 1.059463 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.60 1.059463 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.90 1.059463 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.72 1.059463 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.60 1.059463 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.30 0.749154 1\nscoreboard players set @s gm4_intro_song_t 73\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/74.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.90 1.122462 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.90 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.60 1.122462 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.90 1.122462 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.72 1.122462 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.60 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.20 0.749154 1\nscoreboard players set @s gm4_intro_song_t 74\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/75.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.90 1.189207 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.90 1.189207 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.60 1.189207 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.90 1.189207 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.72 1.189207 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.60 1.189207 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.10 0.749154 1\nscoreboard players set @s gm4_intro_song_t 75\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/76.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.259921 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 1 1.259921 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.259921 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.60 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.259921 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.81 1.259921 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.259921 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.snare record @s ^0 ^ ^ 1 1.498307 1\nplaysound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1\nscoreboard players set @s gm4_intro_song_t 76\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/77.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.334840 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 1 1.334840 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.334840 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.334840 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.81 1.334840 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.334840 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.50 0.749154 1\nscoreboard players set @s gm4_intro_song_t 77\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/78.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.259921 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 1 1.259921 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.259921 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.259921 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.81 1.259921 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.259921 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.749154 1\nscoreboard players set @s gm4_intro_song_t 78\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/79.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 1 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.122462 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.81 1.122462 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.122462 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.30 0.749154 1\nscoreboard players set @s gm4_intro_song_t 79\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/8.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.059463 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.059463 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.059463 1\nscoreboard players set @s gm4_intro_song_t 8\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/80.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 0.749154 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 0.749154 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.20 0.749154 1\nscoreboard players set @s gm4_intro_song_t 80\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/notes/84.mcfunction",
    "content": "playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.498307 1\nplaysound minecraft:block.note_block.bass record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.90 1.498307 1\nplaysound minecraft:block.note_block.bell record @s ^0 ^ ^ 1 1.511345 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.80 1.472567 1\nplaysound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.70 1.498307 1\nplaysound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.498307 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.90 1.498307 1\nplaysound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 1.498307 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.flute record @s ^0 ^ ^ 1 1.498307 1\nplaysound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 1 0.749154 1\nplaysound minecraft:block.note_block.pling record @s ^0 ^ ^ 0.90 0.749154 1\nfunction gm4:intro_song/stop\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/play.mcfunction",
    "content": "#execute store success score intro_listener gm4_intro_song run\nscoreboard players add @s gm4_intro_song 40\nfunction gm4:intro_song/tree/0_127\n\nscoreboard players set $song_playing gm4_intro_song 1\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/stop.mcfunction",
    "content": "tag @s remove gm4_intro_playing\nscoreboard players reset @s gm4_intro_song\nscoreboard players reset @s gm4_intro_song_t\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/0_1.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=0..120,gm4_intro_song_t=..-1}] run function gm4:intro_song/notes/0\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/0_127.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=0..5160}] run function gm4:intro_song/tree/0_63\nexecute if entity @s[scores={gm4_intro_song=5120..10360}] run function gm4:intro_song/tree/64_127\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/0_15.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=0..680}] run function gm4:intro_song/tree/0_7\nexecute if entity @s[scores={gm4_intro_song=640..1400}] run function gm4:intro_song/tree/8_15\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/0_3.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=0..200}] run function gm4:intro_song/tree/0_1\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/0_31.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=0..1320}] run function gm4:intro_song/tree/0_15\nexecute if entity @s[scores={gm4_intro_song=1280..2680}] run function gm4:intro_song/tree/16_31\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/0_63.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=0..2600}] run function gm4:intro_song/tree/0_31\nexecute if entity @s[scores={gm4_intro_song=2560..5240}] run function gm4:intro_song/tree/32_63\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/0_7.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=0..360}] run function gm4:intro_song/tree/0_3\nexecute if entity @s[scores={gm4_intro_song=320..760}] run function gm4:intro_song/tree/4_7\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/10_11.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=800..920,gm4_intro_song_t=..9}] run function gm4:intro_song/notes/10\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/12_13.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=960..1080,gm4_intro_song_t=..11}] run function gm4:intro_song/notes/12\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/12_15.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=960..1160}] run function gm4:intro_song/tree/12_13\nexecute if entity @s[scores={gm4_intro_song=1120..1400}] run function gm4:intro_song/tree/14_15\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/14_15.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=1120..1240,gm4_intro_song_t=..13}] run function gm4:intro_song/notes/14\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/16_17.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=1280..1400,gm4_intro_song_t=..15}] run function gm4:intro_song/notes/16\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/16_19.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=1280..1480}] run function gm4:intro_song/tree/16_17\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/16_23.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=1280..1640}] run function gm4:intro_song/tree/16_19\nexecute if entity @s[scores={gm4_intro_song=1600..2040}] run function gm4:intro_song/tree/20_23\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/16_31.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=1280..1960}] run function gm4:intro_song/tree/16_23\nexecute if entity @s[scores={gm4_intro_song=1920..2680}] run function gm4:intro_song/tree/24_31\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/20_21.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=1600..1720,gm4_intro_song_t=..19}] run function gm4:intro_song/notes/20\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/20_23.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=1600..1800}] run function gm4:intro_song/tree/20_21\nexecute if entity @s[scores={gm4_intro_song=1760..2040}] run function gm4:intro_song/tree/22_23\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/22_23.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=1840..1960,gm4_intro_song_t=..22}] run function gm4:intro_song/notes/23\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/24_25.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=1920..2040,gm4_intro_song_t=..23}] run function gm4:intro_song/notes/24\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/24_27.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=1920..2120}] run function gm4:intro_song/tree/24_25\nexecute if entity @s[scores={gm4_intro_song=2080..2360}] run function gm4:intro_song/tree/26_27\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/24_31.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=1920..2280}] run function gm4:intro_song/tree/24_27\nexecute if entity @s[scores={gm4_intro_song=2240..2680}] run function gm4:intro_song/tree/28_31\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/26_27.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=2080..2200,gm4_intro_song_t=..25}] run function gm4:intro_song/notes/26\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/28_29.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=2240..2360,gm4_intro_song_t=..27}] run function gm4:intro_song/notes/28\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/28_31.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=2240..2440}] run function gm4:intro_song/tree/28_29\nexecute if entity @s[scores={gm4_intro_song=2400..2680}] run function gm4:intro_song/tree/30_31\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/30_31.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=2400..2520,gm4_intro_song_t=..29}] run function gm4:intro_song/notes/30\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/32_33.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=2560..2680,gm4_intro_song_t=..31}] run function gm4:intro_song/notes/32\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/32_35.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=2560..2760}] run function gm4:intro_song/tree/32_33\nexecute if entity @s[scores={gm4_intro_song=2720..3000}] run function gm4:intro_song/tree/34_35\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/32_39.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=2560..2920}] run function gm4:intro_song/tree/32_35\nexecute if entity @s[scores={gm4_intro_song=2880..3320}] run function gm4:intro_song/tree/36_39\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/32_47.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=2560..3240}] run function gm4:intro_song/tree/32_39\nexecute if entity @s[scores={gm4_intro_song=3200..3960}] run function gm4:intro_song/tree/40_47\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/32_63.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=2560..3880}] run function gm4:intro_song/tree/32_47\nexecute if entity @s[scores={gm4_intro_song=3840..5240}] run function gm4:intro_song/tree/48_63\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/34_35.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=2800..2920,gm4_intro_song_t=..34}] run function gm4:intro_song/notes/35\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/36_37.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=2880..3000,gm4_intro_song_t=..35}] run function gm4:intro_song/notes/36\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/36_39.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=2880..3080}] run function gm4:intro_song/tree/36_37\nexecute if entity @s[scores={gm4_intro_song=3040..3320}] run function gm4:intro_song/tree/38_39\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/38_39.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=3040..3160,gm4_intro_song_t=..37}] run function gm4:intro_song/notes/38\nexecute if entity @s[scores={gm4_intro_song=3120..3240,gm4_intro_song_t=..38}] run function gm4:intro_song/notes/39\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/40_41.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=3200..3320,gm4_intro_song_t=..39}] run function gm4:intro_song/notes/40\nexecute if entity @s[scores={gm4_intro_song=3280..3400,gm4_intro_song_t=..40}] run function gm4:intro_song/notes/41\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/40_43.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=3200..3400}] run function gm4:intro_song/tree/40_41\nexecute if entity @s[scores={gm4_intro_song=3360..3640}] run function gm4:intro_song/tree/42_43\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/40_47.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=3200..3560}] run function gm4:intro_song/tree/40_43\nexecute if entity @s[scores={gm4_intro_song=3520..3960}] run function gm4:intro_song/tree/44_47\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/42_43.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=3360..3480,gm4_intro_song_t=..41}] run function gm4:intro_song/notes/42\nexecute if entity @s[scores={gm4_intro_song=3440..3560,gm4_intro_song_t=..42}] run function gm4:intro_song/notes/43\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/44_45.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=3520..3640,gm4_intro_song_t=..43}] run function gm4:intro_song/notes/44\nexecute if entity @s[scores={gm4_intro_song=3600..3720,gm4_intro_song_t=..44}] run function gm4:intro_song/notes/45\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/44_47.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=3520..3720}] run function gm4:intro_song/tree/44_45\nexecute if entity @s[scores={gm4_intro_song=3680..3960}] run function gm4:intro_song/tree/46_47\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/46_47.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=3680..3800,gm4_intro_song_t=..45}] run function gm4:intro_song/notes/46\nexecute if entity @s[scores={gm4_intro_song=3760..3880,gm4_intro_song_t=..46}] run function gm4:intro_song/notes/47\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/48_49.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=3840..3960,gm4_intro_song_t=..47}] run function gm4:intro_song/notes/48\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/48_51.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=3840..4040}] run function gm4:intro_song/tree/48_49\nexecute if entity @s[scores={gm4_intro_song=4000..4280}] run function gm4:intro_song/tree/50_51\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/48_55.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=3840..4200}] run function gm4:intro_song/tree/48_51\nexecute if entity @s[scores={gm4_intro_song=4160..4600}] run function gm4:intro_song/tree/52_55\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/48_63.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=3840..4520}] run function gm4:intro_song/tree/48_55\nexecute if entity @s[scores={gm4_intro_song=4480..5240}] run function gm4:intro_song/tree/56_63\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/4_5.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=320..440,gm4_intro_song_t=..3}] run function gm4:intro_song/notes/4\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/4_7.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=320..520}] run function gm4:intro_song/tree/4_5\nexecute if entity @s[scores={gm4_intro_song=480..760}] run function gm4:intro_song/tree/6_7\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/50_51.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=4080..4200,gm4_intro_song_t=..50}] run function gm4:intro_song/notes/51\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/52_53.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=4160..4280,gm4_intro_song_t=..51}] run function gm4:intro_song/notes/52\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/52_55.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=4160..4360}] run function gm4:intro_song/tree/52_53\nexecute if entity @s[scores={gm4_intro_song=4320..4600}] run function gm4:intro_song/tree/54_55\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/54_55.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=4320..4440,gm4_intro_song_t=..53}] run function gm4:intro_song/notes/54\nexecute if entity @s[scores={gm4_intro_song=4400..4520,gm4_intro_song_t=..54}] run function gm4:intro_song/notes/55\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/56_57.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=4480..4600,gm4_intro_song_t=..55}] run function gm4:intro_song/notes/56\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/56_59.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=4480..4680}] run function gm4:intro_song/tree/56_57\nexecute if entity @s[scores={gm4_intro_song=4640..4920}] run function gm4:intro_song/tree/58_59\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/56_63.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=4480..4840}] run function gm4:intro_song/tree/56_59\nexecute if entity @s[scores={gm4_intro_song=4800..5240}] run function gm4:intro_song/tree/60_63\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/58_59.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=4640..4760,gm4_intro_song_t=..57}] run function gm4:intro_song/notes/58\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/60_61.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=4800..4920,gm4_intro_song_t=..59}] run function gm4:intro_song/notes/60\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/60_63.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=4800..5000}] run function gm4:intro_song/tree/60_61\nexecute if entity @s[scores={gm4_intro_song=4960..5240}] run function gm4:intro_song/tree/62_63\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/62_63.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=4960..5080,gm4_intro_song_t=..61}] run function gm4:intro_song/notes/62\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/64_127.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5120..7720}] run function gm4:intro_song/tree/64_95\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/64_65.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5120..5240,gm4_intro_song_t=..63}] run function gm4:intro_song/notes/64\nexecute if entity @s[scores={gm4_intro_song=5200..5320,gm4_intro_song_t=..64}] run function gm4:intro_song/notes/65\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/64_67.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5120..5320}] run function gm4:intro_song/tree/64_65\nexecute if entity @s[scores={gm4_intro_song=5280..5560}] run function gm4:intro_song/tree/66_67\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/64_71.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5120..5480}] run function gm4:intro_song/tree/64_67\nexecute if entity @s[scores={gm4_intro_song=5440..5880}] run function gm4:intro_song/tree/68_71\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/64_79.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5120..5800}] run function gm4:intro_song/tree/64_71\nexecute if entity @s[scores={gm4_intro_song=5760..6520}] run function gm4:intro_song/tree/72_79\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/64_95.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5120..6440}] run function gm4:intro_song/tree/64_79\nexecute if entity @s[scores={gm4_intro_song=6400..7800}] run function gm4:intro_song/tree/80_95\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/66_67.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5280..5400,gm4_intro_song_t=..65}] run function gm4:intro_song/notes/66\nexecute if entity @s[scores={gm4_intro_song=5360..5480,gm4_intro_song_t=..66}] run function gm4:intro_song/notes/67\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/68_69.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5440..5560,gm4_intro_song_t=..67}] run function gm4:intro_song/notes/68\nexecute if entity @s[scores={gm4_intro_song=5520..5640,gm4_intro_song_t=..68}] run function gm4:intro_song/notes/69\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/68_71.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5440..5640}] run function gm4:intro_song/tree/68_69\nexecute if entity @s[scores={gm4_intro_song=5600..5880}] run function gm4:intro_song/tree/70_71\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/6_7.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=560..680,gm4_intro_song_t=..6}] run function gm4:intro_song/notes/7\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/70_71.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5600..5720,gm4_intro_song_t=..69}] run function gm4:intro_song/notes/70\nexecute if entity @s[scores={gm4_intro_song=5680..5800,gm4_intro_song_t=..70}] run function gm4:intro_song/notes/71\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/72_73.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5760..5880,gm4_intro_song_t=..71}] run function gm4:intro_song/notes/72\nexecute if entity @s[scores={gm4_intro_song=5840..5960,gm4_intro_song_t=..72}] run function gm4:intro_song/notes/73\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/72_75.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5760..5960}] run function gm4:intro_song/tree/72_73\nexecute if entity @s[scores={gm4_intro_song=5920..6200}] run function gm4:intro_song/tree/74_75\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/72_79.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5760..6120}] run function gm4:intro_song/tree/72_75\nexecute if entity @s[scores={gm4_intro_song=6080..6520}] run function gm4:intro_song/tree/76_79\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/74_75.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=5920..6040,gm4_intro_song_t=..73}] run function gm4:intro_song/notes/74\nexecute if entity @s[scores={gm4_intro_song=6000..6120,gm4_intro_song_t=..74}] run function gm4:intro_song/notes/75\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/76_77.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=6080..6200,gm4_intro_song_t=..75}] run function gm4:intro_song/notes/76\nexecute if entity @s[scores={gm4_intro_song=6160..6280,gm4_intro_song_t=..76}] run function gm4:intro_song/notes/77\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/76_79.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=6080..6280}] run function gm4:intro_song/tree/76_77\nexecute if entity @s[scores={gm4_intro_song=6240..6520}] run function gm4:intro_song/tree/78_79\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/78_79.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=6240..6360,gm4_intro_song_t=..77}] run function gm4:intro_song/notes/78\nexecute if entity @s[scores={gm4_intro_song=6320..6440,gm4_intro_song_t=..78}] run function gm4:intro_song/notes/79\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/80_81.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=6400..6520,gm4_intro_song_t=..79}] run function gm4:intro_song/notes/80\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/80_83.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=6400..6600}] run function gm4:intro_song/tree/80_81\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/80_87.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=6400..6760}] run function gm4:intro_song/tree/80_83\nexecute if entity @s[scores={gm4_intro_song=6720..7160}] run function gm4:intro_song/tree/84_87\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/80_95.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=6400..7080}] run function gm4:intro_song/tree/80_87\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/84_85.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=6720..6840,gm4_intro_song_t=..83}] run function gm4:intro_song/notes/84\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/84_87.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=6720..6920}] run function gm4:intro_song/tree/84_85\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/8_11.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=640..840}] run function gm4:intro_song/tree/8_9\nexecute if entity @s[scores={gm4_intro_song=800..1080}] run function gm4:intro_song/tree/10_11\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/8_15.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=640..1000}] run function gm4:intro_song/tree/8_11\nexecute if entity @s[scores={gm4_intro_song=960..1400}] run function gm4:intro_song/tree/12_15\n"
  },
  {
    "path": "base/data/gm4/function/intro_song/tree/8_9.mcfunction",
    "content": "execute if entity @s[scores={gm4_intro_song=640..760,gm4_intro_song_t=..7}] run function gm4:intro_song/notes/8\n"
  },
  {
    "path": "base/data/gm4/function/load.mcfunction",
    "content": "data merge storage gm4:log {queue:[],versions:[]}\ndata modify storage gm4:log queue append value {type:\"text\",message:{\"text\":\"[GM4]: Checking for updates...\",\"color\":\"#4AA0C7\"}}\n\nscoreboard objectives add gm4_modules dummy\nscoreboard objectives add gm4_data dummy\nfunction gm4:upgrade_paths/load\n\n# Counts the number of consecutive reloads the player has not been seen in creative\nscoreboard objectives add gm4_creative dummy\n# Counts the number of consecutive reloads that no creative player has been seen\nexecute unless score $global gm4_creative matches 0.. run scoreboard players set $global gm4_creative 10\n# Controls how long a player can keep seeing logs after they're no longer in creative\nexecute unless score $cooldown gm4_creative matches 0.. run scoreboard players set $cooldown gm4_creative 10\n# Controls how long after no creative players were seen it will show logs to all players\n# Setting this to 0 will always show logs to all players\nexecute unless score $global_cooldown gm4_creative matches 0.. run scoreboard players set $global_cooldown gm4_creative 10\n\nexecute unless score gm4 gm4_modules matches 1.. run data modify storage gm4:log queue append value {type:\"text\",message:{\"text\":\"[GM4]: Welcome to Gamemode 4. Initialising...\",\"color\":\"green\"}}\nexecute unless score gm4 gm4_modules matches 1.. run schedule function gm4:intro_song/init 2s\nexecute unless score gm4 gm4_modules matches 1.. run scoreboard players set gm4 gm4_modules 1\n"
  },
  {
    "path": "base/data/gm4/function/log.mcfunction",
    "content": "data modify storage gm4:log log set from storage gm4:log queue[0]\nexecute if data storage gm4:log log{type:\"text\"} run tellraw @a[tag=gm4_show_log] {\"nbt\":\"log.message\",\"storage\":\"gm4:log\",\"interpret\":true}\nexecute if data storage gm4:log log{type:\"install\"} run tellraw @a[tag=gm4_show_log] [{\"nbt\":\"log.module\",\"storage\":\"gm4:log\"},{\"text\":\" Installed!\",\"color\":\"white\"}]\nexecute if data storage gm4:log log{type:\"missing\"} run tellraw @a[tag=gm4_show_log] [{\"nbt\":\"log.module\",\"storage\":\"gm4:log\",\"color\":\"red\"},{\"text\":\" is disabled because \",\"color\":\"red\"},{\"nbt\":\"log.require\",\"storage\":\"gm4:log\",\"color\":\"red\"},{\"text\":\" is not installed.\"}]\nexecute if data storage gm4:log log{type:\"outdated\"} run function gm4:outdated_logs/outdated_start\nexecute if data storage gm4:log log{type:\"version_conflict\"} run function gm4:conflict_logs/version_conflict_start\n\ndata remove storage gm4:log queue[0]\nexecute store result score #log_size gm4_data run data get storage gm4:log queue\nexecute if score #log_size gm4_data matches 1.. run function gm4:log\n"
  },
  {
    "path": "base/data/gm4/function/log_start.mcfunction",
    "content": "scoreboard players set @a[gamemode=creative] gm4_creative 0\nexecute as @a[gamemode=!creative] unless score @s gm4_creative matches 0.. run scoreboard players operation @s gm4_creative = $cooldown gm4_creative\nscoreboard players add @a[gamemode=!creative] gm4_creative 1\n\nexecute if entity @a[gamemode=creative] run scoreboard players set $global gm4_creative 0\nexecute unless entity @a[gamemode=creative] run scoreboard players add $global gm4_creative 1\n\ntag @a remove gm4_show_log\nexecute as @a if score @s gm4_creative < $cooldown gm4_creative run tag @s add gm4_show_log\nexecute if score $global gm4_creative >= $global_cooldown gm4_creative run tag @a add gm4_show_log\nfunction gm4:log\n"
  },
  {
    "path": "base/data/gm4/function/log_wait.mcfunction",
    "content": "execute if entity @a[limit=1] run function gm4:log_start\nexecute unless entity @a[limit=1] run schedule function gm4:log_wait 2t replace\n"
  },
  {
    "path": "base/data/gm4/function/outdated_logs/outdated_start.mcfunction",
    "content": "tellraw @a[tag=gm4_show_log] [{\"text\":\"The following modules are outdated! Click here to download the latest versions.\",\"color\":\"gold\",\"click_event\":{\"action\":\"open_url\",\"url\":\"https://www.gm4.co/modules\"},\"hover_event\":{\"action\":\"show_text\",\"value\":{\"text\":\"Click to visit gm4.co/modules\",\"color\":\"#4AA0C7\"}}}]\n\ndata modify storage gm4:log outdated_list set from storage gm4:log queue\ndata remove storage gm4:log outdated_list[{type:\"text\"}]\ndata remove storage gm4:log outdated_list[{type:\"install\"}]\ndata remove storage gm4:log outdated_list[{type:\"missing\"}]\ndata remove storage gm4:log outdated_list[{type:\"version_conflict\"}]\nfunction gm4:outdated_logs/traverse\n\ndata remove storage gm4:log outdated_list\ndata remove storage gm4:log queue[{type:\"outdated\"}]\ndata modify storage gm4:log queue prepend value {type:\"outdated\",module:\"log_placeholder\"}\n"
  },
  {
    "path": "base/data/gm4/function/outdated_logs/traverse.mcfunction",
    "content": "tellraw @a[tag=gm4_show_log] [{\"text\":\"  - \",\"color\":\"gold\"},{\"nbt\":\"outdated_list[0].render\",\"storage\":\"gm4:log\",\"color\":\"gold\",\"interpret\":true}]\n\ndata remove storage gm4:log outdated_list[0]\nexecute store result score #list_size gm4_data run data get storage gm4:log outdated_list\nexecute if score #list_size gm4_data matches 1.. run function gm4:outdated_logs/traverse\n"
  },
  {
    "path": "base/data/gm4/function/post_load.mcfunction",
    "content": "execute unless data storage gm4:log queue[{type:\"install\"}] run data modify storage gm4:log queue append value {type:\"text\",message:{\"text\":\"[GM4]: No updates found.\",\"color\":\"#4AA0C7\"}}\nexecute if data storage gm4:log queue[{type:\"install\"}] run data modify storage gm4:log queue append value {type:\"text\",message:{\"text\":\"[GM4]: Updates completed.\",\"color\":\"#4AA0C7\"}}\n\nfunction gm4:log_wait\n"
  },
  {
    "path": "base/data/gm4/function/upgrade_paths/changed_dimension.mcfunction",
    "content": "# @s = player who just changed dimension\n# at @s\n# run from gm4:upgrade_paths/changed_dimension advancement\nadvancement revoke @s only gm4:upgrade_paths/changed_dimension\ntag @s add gm4_running_upgrade_path\nfunction gm4:upgrade_paths/run_when_loaded\n"
  },
  {
    "path": "base/data/gm4/function/upgrade_paths/join_game.mcfunction",
    "content": "# @s =  runs as a player who has just rejoined the world\n# at @s\n# run from gm4:upgrade_paths/join_game advancement\nadvancement revoke @s only gm4:upgrade_paths/join_game\nscoreboard players reset @s gm4_up_leave_game\ntag @s add gm4_running_upgrade_path\nfunction gm4:upgrade_paths/run_when_loaded\n"
  },
  {
    "path": "base/data/gm4/function/upgrade_paths/load.mcfunction",
    "content": "scoreboard objectives add gm4_earliest_version dummy\nscoreboard objectives add gm4_up_leave_game minecraft.custom:minecraft.leave_game\n# if upgrade paths auto-disabled, let it reevaluate any new modules\nexecute if score $disable_upgrade_paths gm4_data matches 2 run scoreboard players reset $disable_upgrade_paths gm4_data\nfunction gm4:upgrade_paths/main\n"
  },
  {
    "path": "base/data/gm4/function/upgrade_paths/main.mcfunction",
    "content": "\nscoreboard players set $active_upgrade_paths gm4_data 0\nexecute as @a[limit=1] at @s run function #gm4_upgrade_paths:run\n# if no paths run, disable further checks until next reload\nexecute if entity @a unless score $disable_upgrade_paths gm4_data matches 1 unless score $active_upgrade_paths gm4_data matches 1.. run scoreboard players set $disable_upgrade_paths gm4_data 2\nexecute unless score $disable_upgrade_paths gm4_data matches 1.. run schedule function gm4:upgrade_paths/main 300s\n"
  },
  {
    "path": "base/data/gm4/function/upgrade_paths/run_when_loaded.mcfunction",
    "content": "# @s = server\n# at world spawn\n# scheduled from self and advancement triggers\n\nscoreboard players set $success gm4_data 0\nexecute store success score $success gm4_data as @a[tag=gm4_running_upgrade_path] at @s if loaded ~ ~ ~\nexecute as @a[tag=gm4_running_upgrade_path] at @s if loaded ~ ~ ~ run function #gm4_upgrade_paths:run\nexecute if score $success gm4_data matches 0 if entity @a[tag=gm4_running_upgrade_path] run schedule function gm4:upgrade_paths/run_when_loaded 1t\nscoreboard players reset $success gm4_data\n"
  },
  {
    "path": "base/data/gm4/loot_table/air.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:stick\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": 0\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "base/data/gm4/loot_table/empty.json",
    "content": "{\n  \"pools\": []\n}\n"
  },
  {
    "path": "base/data/gm4/tags/block/foliage.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:small_flowers\",\n    \"minecraft:sunflower\",\n    \"minecraft:lilac\",\n    \"minecraft:peony\",\n    \"minecraft:rose_bush\",\n    \"minecraft:pitcher_plant\",\n    \"minecraft:azalea\",\n    \"minecraft:flowering_azalea\",\n    \"minecraft:big_dripleaf\",\n    \"minecraft:big_dripleaf_stem\",\n    \"minecraft:brown_mushroom\",\n    \"minecraft:bush\",\n    \"minecraft:cactus_flower\",\n    \"minecraft:cave_vines\",\n    \"minecraft:cave_vines_plant\",\n    \"minecraft:crimson_fungus\",\n    \"minecraft:crimson_roots\",\n    \"minecraft:dead_bush\",\n    \"minecraft:fern\",\n    \"minecraft:firefly_bush\",\n    \"minecraft:glow_lichen\",\n    \"minecraft:short_dry_grass\",\n    \"minecraft:short_grass\",\n    \"minecraft:hanging_roots\",\n    \"minecraft:large_fern\",\n    \"minecraft:leaf_litter\",\n    \"minecraft:mangrove_propagule\",\n    \"minecraft:moss_carpet\",\n    \"minecraft:nether_sprouts\",\n    \"minecraft:pale_hanging_moss\",\n    \"minecraft:pale_moss_carpet\",\n    \"minecraft:pink_petals\",\n    \"minecraft:red_mushroom\",\n    \"minecraft:small_dripleaf\",\n    \"minecraft:spore_blossom\",\n    \"minecraft:sweet_berry_bush\",\n    \"minecraft:tall_dry_grass\",\n    \"minecraft:tall_grass\",\n    \"minecraft:twisting_vines\",\n    \"minecraft:twisting_vines_plant\",\n    \"minecraft:vine\",\n    \"minecraft:warped_fungus\",\n    \"minecraft:warped_roots\",\n    \"minecraft:weeping_vines\",\n    \"minecraft:weeping_vines_plant\",\n    \"minecraft:wildflowers\"\n  ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/block/full_collision.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:substrate_overworld\",\n        \"#minecraft:leaves\",\n        \"#minecraft:logs\",\n        \"#minecraft:planks\",\n        \"#minecraft:shulker_boxes\",\n        \"#minecraft:wool\",\n        \"minecraft:amethyst_block\",\n        \"minecraft:ancient_debris\",\n        \"minecraft:andesite\",\n        \"minecraft:bamboo_block\",\n        \"minecraft:bamboo_mosaic\",\n        \"minecraft:barrel\",\n        \"minecraft:barrier\",\n        \"minecraft:basalt\",\n        \"minecraft:beacon\",\n        \"minecraft:bedrock\",\n        \"minecraft:bee_nest\",\n        \"minecraft:beehive\",\n        \"minecraft:black_concrete_powder\",\n        \"minecraft:black_concrete\",\n        \"minecraft:black_glazed_terracotta\",\n        \"minecraft:black_stained_glass\",\n        \"minecraft:black_terracotta\",\n        \"minecraft:blackstone\",\n        \"minecraft:blast_furnace\",\n        \"minecraft:blue_concrete_powder\",\n        \"minecraft:blue_concrete\",\n        \"minecraft:blue_glazed_terracotta\",\n        \"minecraft:blue_ice\",\n        \"minecraft:blue_stained_glass\",\n        \"minecraft:blue_terracotta\",\n        \"minecraft:bone_block\",\n        \"minecraft:bookshelf\",\n        \"minecraft:brain_coral_block\",\n        \"minecraft:bricks\",\n        \"minecraft:brown_concrete_powder\",\n        \"minecraft:brown_concrete\",\n        \"minecraft:brown_glazed_terracotta\",\n        \"minecraft:brown_mushroom_block\",\n        \"minecraft:brown_stained_glass\",\n        \"minecraft:brown_terracotta\",\n        \"minecraft:bubble_coral_block\",\n        \"minecraft:budding_amethyst\",\n        \"minecraft:calcite\",\n        \"minecraft:cartography_table\",\n        \"minecraft:carved_pumpkin\",\n        \"minecraft:chain_command_block\",\n        \"minecraft:chiseled_bookshelf\",\n        \"minecraft:chiseled_copper\",\n        \"minecraft:chiseled_deepslate\",\n        \"minecraft:chiseled_nether_bricks\",\n        \"minecraft:chiseled_polished_blackstone\",\n        \"minecraft:chiseled_quartz_block\",\n        \"minecraft:chiseled_red_sandstone\",\n        \"minecraft:chiseled_resin_bricks\",\n        \"minecraft:chiseled_sandstone\",\n        \"minecraft:chiseled_stone_bricks\",\n        \"minecraft:chiseled_tuff\",\n        \"minecraft:clay\",\n        \"minecraft:coal_block\",\n        \"minecraft:coal_ore\",\n        \"minecraft:cobbled_deepslate\",\n        \"minecraft:cobblestone\",\n        \"minecraft:command_block\",\n        \"minecraft:copper_block\",\n        \"minecraft:copper_bulb\",\n        \"minecraft:copper_grate\",\n        \"minecraft:copper_ore\",\n        \"minecraft:cracked_deepslate_bricks\",\n        \"minecraft:cracked_deepslate_tiles\",\n        \"minecraft:cracked_nether_bricks\",\n        \"minecraft:cracked_polished_blackstone_bricks\",\n        \"minecraft:cracked_stone_bricks\",\n        \"minecraft:crafter\",\n        \"minecraft:crafting_table\",\n        \"minecraft:creaking_heart\",\n        \"minecraft:crimson_nylium\",\n        \"minecraft:crying_obsidian\",\n        \"minecraft:cut_copper\",\n        \"minecraft:cut_red_sandstone\",\n        \"minecraft:cut_sandstone\",\n        \"minecraft:cyan_concrete_powder\",\n        \"minecraft:cyan_concrete\",\n        \"minecraft:cyan_glazed_terracotta\",\n        \"minecraft:cyan_stained_glass\",\n        \"minecraft:cyan_terracotta\",\n        \"minecraft:dark_prismarine\",\n        \"minecraft:dead_brain_coral_block\",\n        \"minecraft:dead_bubble_coral_block\",\n        \"minecraft:dead_fire_coral_block\",\n        \"minecraft:dead_horn_coral_block\",\n        \"minecraft:dead_tube_coral_block\",\n        \"minecraft:deepslate_bricks\",\n        \"minecraft:deepslate_coal_ore\",\n        \"minecraft:deepslate_copper_ore\",\n        \"minecraft:deepslate_diamond_ore\",\n        \"minecraft:deepslate_emerald_ore\",\n        \"minecraft:deepslate_gold_ore\",\n        \"minecraft:deepslate_iron_ore\",\n        \"minecraft:deepslate_lapis_ore\",\n        \"minecraft:deepslate_redstone_ore\",\n        \"minecraft:deepslate_tiles\",\n        \"minecraft:deepslate\",\n        \"minecraft:diamond_block\",\n        \"minecraft:diamond_ore\",\n        \"minecraft:diorite\",\n        \"minecraft:dispenser\",\n        \"minecraft:dried_kelp_block\",\n        \"minecraft:dripstone_block\",\n        \"minecraft:dropper\",\n        \"minecraft:emerald_block\",\n        \"minecraft:emerald_ore\",\n        \"minecraft:end_stone_bricks\",\n        \"minecraft:end_stone\",\n        \"minecraft:exposed_chiseled_copper\",\n        \"minecraft:exposed_copper_bulb\",\n        \"minecraft:exposed_copper_grate\",\n        \"minecraft:exposed_copper\",\n        \"minecraft:exposed_cut_copper\",\n        \"minecraft:fire_coral_block\",\n        \"minecraft:fletching_table\",\n        \"minecraft:frosted_ice\",\n        \"minecraft:furnace\",\n        \"minecraft:gilded_blackstone\",\n        \"minecraft:glass\",\n        \"minecraft:glowstone\",\n        \"minecraft:gold_block\",\n        \"minecraft:gold_ore\",\n        \"minecraft:granite\",\n        \"minecraft:grass_block\",\n        \"minecraft:gravel\",\n        \"minecraft:gray_concrete_powder\",\n        \"minecraft:gray_concrete\",\n        \"minecraft:gray_glazed_terracotta\",\n        \"minecraft:gray_stained_glass\",\n        \"minecraft:gray_terracotta\",\n        \"minecraft:green_concrete_powder\",\n        \"minecraft:green_concrete\",\n        \"minecraft:green_glazed_terracotta\",\n        \"minecraft:green_stained_glass\",\n        \"minecraft:green_terracotta\",\n        \"minecraft:hay_block\",\n        \"minecraft:honeycomb_block\",\n        \"minecraft:horn_coral_block\",\n        \"minecraft:ice\",\n        \"minecraft:infested_chiseled_stone_bricks\",\n        \"minecraft:infested_cobblestone\",\n        \"minecraft:infested_cracked_stone_bricks\",\n        \"minecraft:infested_deepslate\",\n        \"minecraft:infested_mossy_stone_bricks\",\n        \"minecraft:infested_stone_bricks\",\n        \"minecraft:infested_stone\",\n        \"minecraft:iron_block\",\n        \"minecraft:iron_ore\",\n        \"minecraft:jack_o_lantern\",\n        \"minecraft:jigsaw\",\n        \"minecraft:jukebox\",\n        \"minecraft:lapis_block\",\n        \"minecraft:lapis_ore\",\n        \"minecraft:light_blue_concrete_powder\",\n        \"minecraft:light_blue_concrete\",\n        \"minecraft:light_blue_glazed_terracotta\",\n        \"minecraft:light_blue_stained_glass\",\n        \"minecraft:light_blue_terracotta\",\n        \"minecraft:light_gray_concrete_powder\",\n        \"minecraft:light_gray_concrete\",\n        \"minecraft:light_gray_glazed_terracotta\",\n        \"minecraft:light_gray_stained_glass\",\n        \"minecraft:light_gray_terracotta\",\n        \"minecraft:light_gray_wool\",\n        \"minecraft:lime_concrete_powder\",\n        \"minecraft:lime_concrete\",\n        \"minecraft:lime_glazed_terracotta\",\n        \"minecraft:lime_stained_glass\",\n        \"minecraft:lime_terracotta\",\n        \"minecraft:lodestone\",\n        \"minecraft:loom\",\n        \"minecraft:magenta_concrete_powder\",\n        \"minecraft:magenta_concrete\",\n        \"minecraft:magenta_glazed_terracotta\",\n        \"minecraft:magenta_stained_glass\",\n        \"minecraft:magenta_terracotta\",\n        \"minecraft:magma_block\",\n        \"minecraft:mangrove_roots\",\n        \"minecraft:melon\",\n        \"minecraft:moss_block\",\n        \"minecraft:mossy_cobblestone\",\n        \"minecraft:mossy_stone_bricks\",\n        \"minecraft:mud_bricks\",\n        \"minecraft:muddy_mangrove_roots\",\n        \"minecraft:mushroom_stem\",\n        \"minecraft:nether_bricks\",\n        \"minecraft:nether_gold_ore\",\n        \"minecraft:nether_quartz_ore\",\n        \"minecraft:nether_wart_block\",\n        \"minecraft:netherite_block\",\n        \"minecraft:netherrack\",\n        \"minecraft:note_block\",\n        \"minecraft:observer\",\n        \"minecraft:obsidian\",\n        \"minecraft:ochre_froglight\",\n        \"minecraft:orange_concrete_powder\",\n        \"minecraft:orange_concrete\",\n        \"minecraft:orange_glazed_terracotta\",\n        \"minecraft:orange_stained_glass\",\n        \"minecraft:orange_terracotta\",\n        \"minecraft:oxidized_chiseled_copper\",\n        \"minecraft:oxidized_copper_bulb\",\n        \"minecraft:oxidized_copper_grate\",\n        \"minecraft:oxidized_copper\",\n        \"minecraft:oxidized_cut_copper\",\n        \"minecraft:packed_ice\",\n        \"minecraft:packed_mud\",\n        \"minecraft:pearlescent_froglight\",\n        \"minecraft:pink_concrete_powder\",\n        \"minecraft:pink_concrete\",\n        \"minecraft:pink_glazed_terracotta\",\n        \"minecraft:pink_stained_glass\",\n        \"minecraft:pink_terracotta\",\n        \"minecraft:polished_andesite\",\n        \"minecraft:polished_basalt\",\n        \"minecraft:polished_blackstone_bricks\",\n        \"minecraft:polished_blackstone\",\n        \"minecraft:polished_deepslate\",\n        \"minecraft:polished_diorite\",\n        \"minecraft:polished_granite\",\n        \"minecraft:polished_tuff\",\n        \"minecraft:prismarine_bricks\",\n        \"minecraft:prismarine\",\n        \"minecraft:pumpkin\",\n        \"minecraft:purple_concrete_powder\",\n        \"minecraft:purple_concrete\",\n        \"minecraft:purple_glazed_terracotta\",\n        \"minecraft:purple_stained_glass\",\n        \"minecraft:purple_terracotta\",\n        \"minecraft:purpur_block\",\n        \"minecraft:purpur_pillar\",\n        \"minecraft:quartz_block\",\n        \"minecraft:quartz_bricks\",\n        \"minecraft:quartz_pillar\",\n        \"minecraft:raw_copper_block\",\n        \"minecraft:raw_gold_block\",\n        \"minecraft:raw_iron_block\",\n        \"minecraft:red_concrete_powder\",\n        \"minecraft:red_concrete\",\n        \"minecraft:red_glazed_terracotta\",\n        \"minecraft:red_mushroom_block\",\n        \"minecraft:red_nether_bricks\",\n        \"minecraft:red_sand\",\n        \"minecraft:red_sandstone\",\n        \"minecraft:red_stained_glass\",\n        \"minecraft:red_terracotta\",\n        \"minecraft:redstone_block\",\n        \"minecraft:redstone_lamp\",\n        \"minecraft:redstone_ore\",\n        \"minecraft:reinforced_deepslate\",\n        \"minecraft:repeating_command_block\",\n        \"minecraft:resin_block\",\n        \"minecraft:resin_bricks\",\n        \"minecraft:respawn_anchor\",\n        \"minecraft:sand\",\n        \"minecraft:sandstone\",\n        \"minecraft:sculk_catalyst\",\n        \"minecraft:sculk\",\n        \"minecraft:sea_lantern\",\n        \"minecraft:shroomlight\",\n        \"minecraft:slime_block\",\n        \"minecraft:smithing_table\",\n        \"minecraft:smoker\",\n        \"minecraft:smooth_basalt\",\n        \"minecraft:smooth_quartz\",\n        \"minecraft:smooth_red_sandstone\",\n        \"minecraft:smooth_sandstone\",\n        \"minecraft:smooth_stone\",\n        \"minecraft:snow_block\",\n        \"minecraft:soul_soil\",\n        \"minecraft:spawner\",\n        \"minecraft:sponge\",\n        \"minecraft:stone_bricks\",\n        \"minecraft:stone\",\n        \"minecraft:structure_block\",\n        \"minecraft:suspicious_gravel\",\n        \"minecraft:suspicious_sand\",\n        \"minecraft:target\",\n        \"minecraft:terracotta\",\n        \"minecraft:test_block\",\n        \"minecraft:test_instance_block\",\n        \"minecraft:tinted_glass\",\n        \"minecraft:tnt\",\n        \"minecraft:trial_spawner\",\n        \"minecraft:tube_coral_block\",\n        \"minecraft:tuff_bricks\",\n        \"minecraft:tuff\",\n        \"minecraft:vault\",\n        \"minecraft:verdant_froglight\",\n        \"minecraft:warped_nylium\",\n        \"minecraft:warped_wart_block\",\n        \"minecraft:waxed_chiseled_copper\",\n        \"minecraft:waxed_copper_block\",\n        \"minecraft:waxed_copper_bulb\",\n        \"minecraft:waxed_copper_grate\",\n        \"minecraft:waxed_cut_copper\",\n        \"minecraft:waxed_exposed_chiseled_copper\",\n        \"minecraft:waxed_exposed_copper_bulb\",\n        \"minecraft:waxed_exposed_copper_grate\",\n        \"minecraft:waxed_exposed_copper\",\n        \"minecraft:waxed_exposed_cut_copper\",\n        \"minecraft:waxed_oxidized_chiseled_copper\",\n        \"minecraft:waxed_oxidized_copper_bulb\",\n        \"minecraft:waxed_oxidized_copper_grate\",\n        \"minecraft:waxed_oxidized_copper\",\n        \"minecraft:waxed_oxidized_cut_copper\",\n        \"minecraft:waxed_weathered_chiseled_copper\",\n        \"minecraft:waxed_weathered_copper_bulb\",\n        \"minecraft:waxed_weathered_copper_grate\",\n        \"minecraft:waxed_weathered_copper\",\n        \"minecraft:waxed_weathered_cut_copper\",\n        \"minecraft:weathered_chiseled_copper\",\n        \"minecraft:weathered_copper_bulb\",\n        \"minecraft:weathered_copper_grate\",\n        \"minecraft:weathered_copper\",\n        \"minecraft:weathered_cut_copper\",\n        \"minecraft:wet_sponge\",\n        \"minecraft:white_concrete_powder\",\n        \"minecraft:white_concrete\",\n        \"minecraft:white_glazed_terracotta\",\n        \"minecraft:white_stained_glass\",\n        \"minecraft:white_terracotta\",\n        \"minecraft:yellow_concrete_powder\",\n        \"minecraft:yellow_concrete\",\n        \"minecraft:yellow_glazed_terracotta\",\n        \"minecraft:yellow_stained_glass\",\n        \"minecraft:yellow_terracotta\"\n    ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/block/no_collision.json",
    "content": "{\n  \"values\": [\n    \"#gm4:water\",\n    \"#minecraft:air\",\n    \"#minecraft:banners\",\n    \"#minecraft:buttons\",\n    \"#minecraft:ceiling_hanging_signs\",\n    \"#minecraft:corals\",\n    \"#minecraft:crops\",\n    \"#minecraft:fire\",\n    \"#minecraft:portals\",\n    \"#minecraft:pressure_plates\",\n    \"#minecraft:rails\",\n    \"#minecraft:signs\",\n    \"#minecraft:small_flowers\",\n    \"#minecraft:wall_corals\",\n    \"minecraft:acacia_sapling\",\n    \"minecraft:attached_melon_stem\",\n    \"minecraft:attached_pumpkin_stem\",\n    \"minecraft:bamboo_sapling\",\n    \"minecraft:big_dripleaf_stem\",\n    \"minecraft:birch_sapling\",\n    \"minecraft:brown_mushroom\",\n    \"minecraft:bush\",\n    \"minecraft:cactus_flower\",\n    \"minecraft:cave_vines\",\n    \"minecraft:cave_vines_plant\",\n    \"minecraft:cherry_sapling\",\n    \"minecraft:cobweb\",\n    \"minecraft:copper_torch\",\n    \"minecraft:crimson_fungus\",\n    \"minecraft:crimson_roots\",\n    \"minecraft:dark_oak_sapling\",\n    \"minecraft:dead_brain_coral_fan\",\n    \"minecraft:dead_brain_coral_wall_fan\",\n    \"minecraft:dead_brain_coral\",\n    \"minecraft:dead_bubble_coral_fan\",\n    \"minecraft:dead_bubble_coral_wall_fan\",\n    \"minecraft:dead_bubble_coral\",\n    \"minecraft:dead_bush\",\n    \"minecraft:dead_fire_coral_fan\",\n    \"minecraft:dead_fire_coral_wall_fan\",\n    \"minecraft:dead_fire_coral\",\n    \"minecraft:dead_horn_coral_fan\",\n    \"minecraft:dead_horn_coral_wall_fan\",\n    \"minecraft:dead_horn_coral\",\n    \"minecraft:dead_tube_coral_fan\",\n    \"minecraft:dead_tube_coral_wall_fan\",\n    \"minecraft:dead_tube_coral\",\n    \"minecraft:fern\",\n    \"minecraft:firefly_bush\",\n    \"minecraft:frogspawn\",\n    \"minecraft:glow_lichen\",\n    \"minecraft:short_dry_grass\",\n    \"minecraft:short_grass\",\n    \"minecraft:sunflower\",\n    \"minecraft:hanging_roots\",\n    \"minecraft:jungle_sapling\",\n    \"minecraft:ladder\",\n    \"minecraft:large_fern\",\n    \"minecraft:lava\",\n    \"minecraft:leaf_litter\",\n    \"minecraft:lever\",\n    \"minecraft:light\",\n    \"minecraft:lilac\",\n    \"minecraft:mangrove_propagule\",\n    \"minecraft:nether_sprouts\",\n    \"minecraft:nether_wart\",\n    \"minecraft:oak_sapling\",\n    \"minecraft:pale_hanging_moss\",\n    \"minecraft:pale_oak_sapling\",\n    \"minecraft:peony\",\n    \"minecraft:pink_petals\",\n    \"minecraft:pitcher_plant\",\n    \"minecraft:powder_snow\",\n    \"minecraft:red_mushroom\",\n    \"minecraft:redstone_torch\",\n    \"minecraft:redstone_wall_torch\",\n    \"minecraft:redstone_wire\",\n    \"minecraft:rose_bush\",\n    \"minecraft:scaffolding\",\n    \"minecraft:sculk_vein\",\n    \"minecraft:small_dripleaf\",\n    \"minecraft:soul_torch\",\n    \"minecraft:soul_wall_torch\",\n    \"minecraft:spore_blossom\",\n    \"minecraft:spruce_sapling\",\n    \"minecraft:structure_void\",\n    \"minecraft:sugar_cane\",\n    \"minecraft:sweet_berry_bush\",\n    \"minecraft:tall_dry_grass\",\n    \"minecraft:tall_grass\",\n    \"minecraft:torch\",\n    \"minecraft:tripwire_hook\",\n    \"minecraft:tripwire\",\n    \"minecraft:twisting_vines\",\n    \"minecraft:twisting_vines_plant\",\n    \"minecraft:vine\",\n    \"minecraft:wall_torch\",\n    \"minecraft:warped_fungus\",\n    \"minecraft:warped_roots\",\n    \"minecraft:weeping_vines\",\n    \"minecraft:weeping_vines_plant\",\n    \"minecraft:wildflowers\"\n  ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/block/replaceable.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:replaceable\",\n    \"minecraft:sculk_vein\"\n  ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/block/water.json",
    "content": "{\n  \"values\": [\n    \"minecraft:water\",\n    \"minecraft:kelp\",\n    \"minecraft:kelp_plant\",\n    \"minecraft:seagrass\",\n    \"minecraft:tall_seagrass\",\n    \"minecraft:bubble_column\"\n  ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/block/waterloggable.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:all_signs\",\n    \"#minecraft:bars\",\n    \"#minecraft:campfires\",\n    \"#minecraft:candles\",\n    \"#minecraft:chains\",\n    \"#minecraft:copper_chests\",\n    \"#minecraft:copper_golem_statues\",\n    \"#minecraft:corals\",\n    \"#minecraft:fences\",\n    \"#minecraft:lanterns\",\n    \"#minecraft:leaves\",\n    \"#minecraft:lightning_rods\",\n    \"#minecraft:rails\",\n    \"#minecraft:slabs\",\n    \"#minecraft:stairs\",\n    \"#minecraft:trapdoors\",\n    \"#minecraft:wall_corals\",\n    \"#minecraft:wall_signs\",\n    \"#minecraft:walls\",\n    \"#minecraft:wooden_shelves\",\n    \"minecraft:amethyst_cluster\",\n    \"minecraft:big_dripleaf\",\n    \"minecraft:big_dripleaf_stem\",\n    \"minecraft:black_stained_glass_pane\",\n    \"minecraft:blue_stained_glass_pane\",\n    \"minecraft:brown_stained_glass_pane\",\n    \"minecraft:calibrated_sculk_sensor\",\n    \"minecraft:chest\",\n    \"minecraft:conduit\",\n    \"minecraft:cyan_stained_glass_pane\",\n    \"minecraft:dead_brain_coral_fan\",\n    \"minecraft:dead_brain_coral\",\n    \"minecraft:dead_bubble_coral_fan\",\n    \"minecraft:dead_bubble_coral\",\n    \"minecraft:dead_fire_coral_fan\",\n    \"minecraft:dead_fire_coral\",\n    \"minecraft:dead_horn_coral_fan\",\n    \"minecraft:dead_horn_coral\",\n    \"minecraft:dead_tube_coral_fan\",\n    \"minecraft:dead_tube_coral\",\n    \"minecraft:decorated_pot\",\n    \"minecraft:dried_ghast\",\n    \"minecraft:ender_chest\",\n    \"minecraft:glass_pane\",\n    \"minecraft:glow_lichen\",\n    \"minecraft:gray_stained_glass_pane\",\n    \"minecraft:green_stained_glass_pane\",\n    \"minecraft:hanging_roots\",\n    \"minecraft:iron_bars\",\n    \"minecraft:ladder\",\n    \"minecraft:lantern\",\n    \"minecraft:large_amethyst_bud\",\n    \"minecraft:light\",\n    \"minecraft:lightning_rod\",\n    \"minecraft:light_blue_stained_glass_pane\",\n    \"minecraft:light_gray_stained_glass_pane\",\n    \"minecraft:lime_stained_glass_pane\",\n    \"minecraft:magenta_stained_glass_pane\",\n    \"minecraft:mangrove_propagule\",\n    \"minecraft:mangrove_roots\",\n    \"minecraft:medium_amethyst_bud\",\n    \"minecraft:orange_stained_glass_pane\",\n    \"minecraft:pink_stained_glass_pane\",\n    \"minecraft:pointed_dripstone\",\n    \"minecraft:purple_stained_glass_pane\",\n    \"minecraft:red_stained_glass_pane\",\n    \"minecraft:resin_clump\",\n    \"minecraft:scaffolding\",\n    \"minecraft:sculk_sensor\",\n    \"minecraft:sculk_vein\",\n    \"minecraft:sea_pickle\",\n    \"minecraft:small_dripleaf\",\n    \"minecraft:soul_lantern\",\n    \"minecraft:trapped_chest\",\n    \"minecraft:white_stained_glass_pane\",\n    \"minecraft:yellow_stained_glass_pane\"\n  ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/entity_type/boss.json",
    "content": "{\n    \"values\": [\n        \"minecraft:ender_dragon\",\n        \"minecraft:wither\"\n    ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/entity_type/chest_boats.json",
    "content": "{\n  \"values\": [\n    \"minecraft:oak_chest_boat\",\n    \"minecraft:spruce_chest_boat\",\n    \"minecraft:birch_chest_boat\",\n    \"minecraft:jungle_chest_boat\",\n    \"minecraft:acacia_chest_boat\",\n    \"minecraft:cherry_chest_boat\",\n    \"minecraft:dark_oak_chest_boat\",\n    \"minecraft:mangrove_chest_boat\",\n    \"minecraft:bamboo_chest_raft\",\n    \"minecraft:pale_oak_chest_boat\"\n  ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/entity_type/hostile.json",
    "content": "{\n    \"values\": [\n        \"#gm4:boss\",\n        \"minecraft:blaze\",\n        \"minecraft:bogged\",\n        \"minecraft:breeze\",\n        \"minecraft:creeper\",\n        \"minecraft:elder_guardian\",\n        \"minecraft:endermite\",\n        \"minecraft:evoker\",\n        \"minecraft:ghast\",\n        \"minecraft:guardian\",\n        \"minecraft:hoglin\",\n        \"minecraft:husk\",\n        \"minecraft:magma_cube\",\n        \"minecraft:parched\",\n        \"minecraft:phantom\",\n        \"minecraft:piglin_brute\",\n        \"minecraft:pillager\",\n        \"minecraft:ravager\",\n        \"minecraft:shulker\",\n        \"minecraft:silverfish\",\n        \"minecraft:skeleton\",\n        \"minecraft:slime\",\n        \"minecraft:stray\",\n        \"minecraft:vex\",\n        \"minecraft:vindicator\",\n        \"minecraft:warden\",\n        \"minecraft:witch\",\n        \"minecraft:wither_skeleton\",\n        \"minecraft:zoglin\",\n        \"minecraft:zombie\",\n        \"minecraft:zombie_villager\"\n    ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/entity_type/minecarts.json",
    "content": "{\n  \"values\": [\n    \"minecraft:minecart\",\n    \"minecraft:chest_minecart\",\n    \"minecraft:hopper_minecart\",\n    \"minecraft:furnace_minecart\",\n    \"minecraft:spawner_minecart\",\n    \"minecraft:tnt_minecart\",\n    \"minecraft:command_block_minecart\"\n  ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/entity_type/neutral.json",
    "content": "{\n    \"values\": [\n        \"#gm4:neutral_hostile\",\n        \"#gm4:neutral_passive\"\n    ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/entity_type/neutral_hostile.json",
    "content": "{\n    \"values\": [\n        \"minecraft:camel_husk\",\n        \"minecraft:cave_spider\",\n        \"minecraft:creaking\",\n        \"minecraft:drowned\",\n        \"minecraft:enderman\",\n        \"minecraft:piglin\",\n        \"minecraft:spider\",\n        \"minecraft:zombie_nautilus\",\n        \"minecraft:zombified_piglin\"\n    ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/entity_type/neutral_passive.json",
    "content": "{\n    \"values\": [\n        \"minecraft:bee\",\n        \"minecraft:dolphin\",\n        \"minecraft:fox\",\n        \"minecraft:goat\",\n        \"minecraft:iron_golem\",\n        \"minecraft:llama\",\n        \"minecraft:panda\",\n        \"minecraft:polar_bear\",\n        \"minecraft:trader_llama\",\n        \"minecraft:wolf\"\n    ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/entity_type/non_living.json",
    "content": "{\n    \"values\": [\n        \"minecraft:area_effect_cloud\",\n        \"minecraft:arrow\",\n        \"minecraft:block_display\",\n        \"#minecraft:boat\",\n        \"minecraft:breeze_wind_charge\",\n        \"#gm4:chest_boats\",\n        \"minecraft:chest_minecart\",\n        \"minecraft:command_block_minecart\",\n        \"minecraft:dragon_fireball\",\n        \"minecraft:egg\",\n        \"minecraft:end_crystal\",\n        \"minecraft:ender_pearl\",\n        \"minecraft:evoker_fangs\",\n        \"minecraft:experience_bottle\",\n        \"minecraft:experience_orb\",\n        \"minecraft:eye_of_ender\",\n        \"minecraft:falling_block\",\n        \"minecraft:fireball\",\n        \"minecraft:firework_rocket\",\n        \"minecraft:fishing_bobber\",\n        \"minecraft:furnace_minecart\",\n        \"minecraft:glow_item_frame\",\n        \"minecraft:hopper_minecart\",\n        \"minecraft:interaction\",\n        \"minecraft:item\",\n        \"minecraft:item_display\",\n        \"minecraft:item_frame\",\n        \"minecraft:leash_knot\",\n        \"minecraft:lightning_bolt\",\n        \"minecraft:lingering_potion\",\n        \"minecraft:llama_spit\",\n        \"minecraft:marker\",\n        \"minecraft:minecart\",\n        \"minecraft:ominous_item_spawner\",\n        \"minecraft:painting\",\n        \"minecraft:shulker_bullet\",\n        \"minecraft:small_fireball\",\n        \"minecraft:snowball\",\n        \"minecraft:spawner_minecart\",\n        \"minecraft:spectral_arrow\",\n        \"minecraft:splash_potion\",\n        \"minecraft:text_display\",\n        \"minecraft:tnt\",\n        \"minecraft:tnt_minecart\",\n        \"minecraft:trident\",\n        \"minecraft:wind_charge\",\n        \"minecraft:wither_skull\"\n    ]\n}\n"
  },
  {
    "path": "base/data/gm4/tags/entity_type/passive.json",
    "content": "{\n    \"values\": [\n        \"minecraft:allay\",\n        \"minecraft:armadillo\",\n        \"minecraft:axolotl\",\n        \"minecraft:bat\",\n        \"minecraft:camel\",\n        \"minecraft:cat\",\n        \"minecraft:chicken\",\n        \"minecraft:cod\",\n        \"minecraft:copper_golem\",\n        \"minecraft:cow\",\n        \"minecraft:donkey\",\n        \"minecraft:frog\",\n        \"minecraft:glow_squid\",\n        \"minecraft:happy_ghast\",\n        \"minecraft:horse\",\n        \"minecraft:mooshroom\",\n        \"minecraft:mule\",\n        \"minecraft:nautilus\",\n        \"minecraft:ocelot\",\n        \"minecraft:parrot\",\n        \"minecraft:pig\",\n        \"minecraft:pufferfish\",\n        \"minecraft:rabbit\",\n        \"minecraft:salmon\",\n        \"minecraft:sheep\",\n        \"minecraft:skeleton_horse\",\n        \"minecraft:sniffer\",\n        \"minecraft:snow_golem\",\n        \"minecraft:squid\",\n        \"minecraft:strider\",\n        \"minecraft:tadpole\",\n        \"minecraft:tropical_fish\",\n        \"minecraft:turtle\",\n        \"minecraft:villager\",\n        \"minecraft:wandering_trader\"\n    ]\n}\n"
  },
  {
    "path": "base/data/load/function/_private/init.mcfunction",
    "content": "# Reset scoreboards so packs can set values accurate for current load.\nscoreboard objectives add load.status dummy\nscoreboard players reset * load.status\n"
  },
  {
    "path": "base/data/load/tags/function/_private/init.json",
    "content": "{\n    \"values\": [\n        \"load:_private/init\"\n    ]\n}\n"
  },
  {
    "path": "base/data/load/tags/function/_private/load.json",
    "content": "{\n  \"values\": [\n      \"#load:_private/init\",\n      {\"id\": \"#load:pre_load\", \"required\": false},\n      {\"id\": \"#load:load\", \"required\": false},\n      {\"id\": \"#load:post_load\", \"required\": false}\n  ]\n}\n"
  },
  {
    "path": "base/data/load/tags/function/gm4/enumerate.json",
    "content": "{\n    \"values\": [\n        \"gm4:enumerate\"\n    ]\n}\n"
  },
  {
    "path": "base/data/load/tags/function/gm4/resolve_load.json",
    "content": "{\n    \"values\": [\n        \"gm4:resolve_load\"\n    ]\n}\n"
  },
  {
    "path": "base/data/load/tags/function/gm4/resolve_post_load.json",
    "content": "{\n    \"values\": [\n        \"gm4:resolve_post_load\"\n    ]\n}\n"
  },
  {
    "path": "base/data/load/tags/function/gm4.json",
    "content": "{\n    \"values\": [\n        \"#load:gm4/enumerate\",\n        \"#load:gm4/resolve_load\"\n    ]\n}\n"
  },
  {
    "path": "base/data/load/tags/function/post_load.json",
    "content": "{\n    \"values\": [\n        \"#load:gm4/resolve_post_load\"\n    ]\n}\n"
  },
  {
    "path": "base/data/load/tags/function/pre_load.json",
    "content": "{\n    \"values\": [\n        \"#load:gm4\"\n    ]\n}\n"
  },
  {
    "path": "base/data/minecraft/loot_table/blocks/player_head.json",
    "content": "{\n  \"type\": \"minecraft:block\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"bonus_rolls\": 0,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:copy_components\",\n              \"source\": \"block_entity\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"random_sequence\": \"minecraft:blocks/player_head\"\n}\n"
  },
  {
    "path": "base/data/minecraft/loot_table/empty.json",
    "content": "{\n  \"pools\": []\n}\n"
  },
  {
    "path": "base/data/minecraft/tags/function/load.json",
    "content": "{\n    \"values\": [\n        \"#load:_private/load\"\n    ]\n}\n"
  },
  {
    "path": "base/mod.mcdoc",
    "content": "use ::java::util::text::Text\n\ndispatch minecraft:storage[gm4:log] to struct Gm4Log {\n  versions?: [LogVersion],\n  traverse_versions?: [LogVersion],\n  log?: struct {\n    require_id?: string\n  },\n  outdated_list?: [LogEntry],\n  queue?: [LogEntry],\n  temp?: Text,\n}\n\nstruct LogVersion {\n  id: string,\n  module: string,\n  version: string,\n  from?: string,\n}\n\nstruct LogEntry {\n  type: (\"text\" | \"install\" | \"outdated\" | \"missing\" | \"version_conflict\"),\n  ...gm4:log_entry[[type]],\n}\n\ndispatch gm4:log_entry[text] to struct {\n  /// The text component message to display.\n  message: Text,\n}\n\ndispatch gm4:log_entry[install] to struct {\n  /// The name of the module that was just installed.\n  module: string,\n}\n\ndispatch gm4:log_entry[outdated] to struct {\n  module: string,\n  download: #[url] string,\n  render: Text,\n}\n\ndispatch gm4:log_entry[missing] to struct MissingLog {\n  /// The name of the module.\n  module: string,\n  /// The ID of the module.\n  id: string,\n  /// The name of the dependency.\n  require: string,\n  /// The ID of the dependency.\n  require_id: string,\n}\n\ndispatch gm4:log_entry[version_conflict] to struct {\n  ...MissingLog,\n  /// The required version of the dependency.\n  require_ver: string,\n}\n"
  },
  {
    "path": "beet-dev.yaml",
    "content": "pipeline:\n  - gm4.plugins.manifest.create\n  - gm4.plugins.resource_pack.setup\n  - broadcast: null\n    extend: beet.yaml\n    require: \n      - gm4.plugins.output\n      - gm4.plugins.player_heads\n      - gm4.plugins.resource_pack\n      - gm4.plugins.backwards\n      - beet.contrib.optifine\n      - beet.contrib.babelbox\n      - gm4_guidebook.generate_guidebooks.load_page_data\n      - gm4.plugins.test.load_tests\n    pipeline:\n      - gm4.plugins.write_mcmeta\n    meta:\n      gm4_dev: True\n      mecha:\n        formatting:\n          layout: preserve\n          nbt_compact: True\n          cmd_compact: True\n      babelbox:\n        load: \n          - assets/translations.csv\n          - translations.csv\n        namespace: gm4_translations\n        unicode_escape: True\n        dialect: excel\n  - extend: beet.yaml\n    directory: resource_pack\n    pipeline:\n      - resource_pack.dev_description\n  - gm4.plugins.resource_pack.link_resource_pack\n  - gm4.plugins.output.resource_pack\n  - gm4.plugins.finished\n\nmeta:\n  autosave:\n    link: false\n  gm4_dev: True\n\nignore: \n - gm4/skin_cache.json\n - gm4/modeldata_registry.json\n"
  },
  {
    "path": "beet-release.yaml",
    "content": "pipeline:\n  - gm4.plugins.annotations\n  - gm4.plugins.manifest.create\n  - gm4.plugins.output.clear_release\n  - gm4.plugins.resource_pack.setup\n\n  - broadcast: 'lib_*'\n    extend: 'beet.yaml'\n    require:\n      - gm4.plugins.annotations.add_module_dir_to_diagnostics\n      - gm4.plugins.output.release\n      - gm4.plugins.manifest.update_patch\n      - gm4.plugins.versioning.isolated_library\n    pipeline:\n      - beet.contrib.lantern_load.base_data_pack\n      - gm4.plugins.manifest.write_credits\n      - gm4.plugins.test.strip_tests\n      - require: [beet.contrib.copy_files]\n        meta:\n          copy_files:\n            data_pack:\n              LICENSE.md: \"LICENSE.md\"\n              README.md: \"README.md\"\n              pack.png: \"pack.png\"\n      - gm4.plugins.module.default_pack_icon\n      - gm4.plugins.readme_generator.libraries\n    meta:\n      mecha:\n        formatting:\n          layout: preserve\n          nbt_compact: True\n\n  - broadcast: 'gm4_*'\n    extend: 'beet.yaml'\n    require:\n      - gm4.plugins.worker.clear_on_exit\n      - gm4.plugins.worker.store_project\n      - gm4.plugins.worker.freeze_last_stored\n      - gm4.plugins.manifest.update_patch\n      - gm4.plugins.player_heads\n      - gm4.plugins.resource_pack\n      - gm4.plugins.backwards\n      - beet.contrib.optifine\n      - beet.contrib.babelbox\n      - gm4_guidebook.generate_guidebooks.load_page_data\n    pipeline:\n      - gm4.plugins.manifest.write_credits\n      - gm4.plugins.test.strip_tests\n      - require: [beet.contrib.copy_files]\n        meta: {copy_files: {data_pack: {LICENSE.md: \"../LICENSE.md\"}}}\n      - gm4.plugins.readme_generator\n    meta:\n      mecha:\n        formatting:\n          layout: preserve\n          nbt_compact: True\n      babelbox:\n        load: \n          - assets/translations.csv\n          - translations.csv\n        namespace: gm4_translations\n        unicode_escape: True\n        dialect: excel\n  \n  - pipeline:\n    - gm4.plugins.worker.retrieve_and_run\n    meta:\n      plugins:\n      - gm4.plugins.output.release\n      - gm4.plugins.manifest.write_updates\n      - gm4.plugins.write_mcmeta\n      - gm4.plugins.worker.store_project\n\n  - extend: beet.yaml\n    directory: resource_pack\n    require:\n      - gm4.plugins.worker.retrieve_and_merge\n      - gm4.plugins.output.release_resource_pack\n      - gm4.plugins.write_mcmeta\n      - gm4.plugins.manifest.update_patch\n    meta:\n      pack_scan: resource_pack\n\n  - gm4.plugins.manifest.write_meta\n\nmeta:\n  autosave:\n    link: false\n"
  },
  {
    "path": "beet-test.yaml",
    "content": "pipeline:\n  - gm4.plugins.manifest.create\n  - gm4.plugins.output.clear_release\n  - gm4.plugins.resource_pack.setup\n  - gm4.plugins.manifest.write_meta\n  - broadcast: 'gm4_*'\n    extend: 'beet.yaml'\n    require:\n      - gm4.plugins.output.test\n      - gm4.plugins.player_heads\n      - gm4.plugins.resource_pack\n      - gm4.plugins.backwards\n      - gm4_guidebook.generate_guidebooks.load_page_data\n      - gm4.plugins.test.load_tests\n      - gm4.plugins.test.skip_mecha_lint\n    pipeline:\n      - gm4.plugins.write_mcmeta\n    meta:\n      mecha:\n        formatting:\n          layout: preserve\n          nbt_compact: True\n\nmeta:\n  autosave:\n    link: false\n"
  },
  {
    "path": "commands.json",
    "content": "{\n  \"type\": \"root\",\n  \"children\": {\n    \"assert\": {\n      \"type\": \"literal\",\n      \"children\": {\n        \"block\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"pos\": {\n              \"type\": \"argument\",\n              \"parser\": \"minecraft:block_pos\",\n              \"children\": {\n                \"block\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:block_predicate\",\n                  \"executable\": true\n                }\n              }\n            }\n          }\n        },\n        \"chat\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"pattern\": {\n              \"type\": \"argument\",\n              \"parser\": \"brigadier:string\",\n              \"properties\": {\n                \"type\": \"phrase\"\n              },\n              \"executable\": true,\n              \"children\": {\n                \"receivers\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:entity\",\n                  \"properties\": {\n                    \"type\": \"players\",\n                    \"amount\": \"multiple\"\n                  },\n                  \"executable\": true\n                }\n              }\n            }\n          }\n        },\n        \"data\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"block\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"sourcePos\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:block_pos\",\n                  \"children\": {\n                    \"path\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:nbt_path\",\n                      \"executable\": true\n                    }\n                  }\n                }\n              }\n            },\n            \"entity\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"source\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:entity\",\n                  \"properties\": {\n                    \"type\": \"entities\",\n                    \"amount\": \"single\"\n                  },\n                  \"children\": {\n                    \"path\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:nbt_path\",\n                      \"executable\": true\n                    }\n                  }\n                }\n              }\n            },\n            \"storage\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"source\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:resource_location\",\n                  \"children\": {\n                    \"path\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:nbt_path\",\n                      \"executable\": true\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"entity\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"entities\": {\n              \"type\": \"argument\",\n              \"parser\": \"minecraft:entity\",\n              \"properties\": {\n                \"type\": \"entities\",\n                \"amount\": \"multiple\"\n              },\n              \"executable\": true,\n              \"children\": {\n                \"inside\": {\n                  \"type\": \"literal\",\n                  \"executable\": true\n                }\n              }\n            }\n          }\n        },\n        \"items\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"block\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"pos\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:block_pos\",\n                  \"children\": {\n                    \"slots\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:item_slots\",\n                      \"children\": {\n                        \"item_predicate\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:item_predicate\",\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            },\n            \"entity\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"entities\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:entity\",\n                  \"properties\": {\n                    \"type\": \"entities\",\n                    \"amount\": \"multiple\"\n                  },\n                  \"children\": {\n                    \"slots\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:item_slots\",\n                      \"children\": {\n                        \"item_predicate\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:item_predicate\",\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"not\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"block\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"pos\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:block_pos\",\n                  \"children\": {\n                    \"block\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:block_predicate\",\n                      \"executable\": true\n                    }\n                  }\n                }\n              }\n            },\n            \"chat\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"pattern\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"brigadier:string\",\n                  \"properties\": {\n                    \"type\": \"phrase\"\n                  },\n                  \"executable\": true,\n                  \"children\": {\n                    \"receivers\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:entity\",\n                      \"properties\": {\n                        \"type\": \"players\",\n                        \"amount\": \"multiple\"\n                      },\n                      \"executable\": true\n                    }\n                  }\n                }\n              }\n            },\n            \"data\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"block\": {\n                  \"type\": \"literal\",\n                  \"children\": {\n                    \"sourcePos\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:block_pos\",\n                      \"children\": {\n                        \"path\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:nbt_path\",\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                },\n                \"entity\": {\n                  \"type\": \"literal\",\n                  \"children\": {\n                    \"source\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:entity\",\n                      \"properties\": {\n                        \"type\": \"entities\",\n                        \"amount\": \"single\"\n                      },\n                      \"children\": {\n                        \"path\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:nbt_path\",\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                },\n                \"storage\": {\n                  \"type\": \"literal\",\n                  \"children\": {\n                    \"source\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:resource_location\",\n                      \"children\": {\n                        \"path\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:nbt_path\",\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            },\n            \"entity\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"entities\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:entity\",\n                  \"properties\": {\n                    \"type\": \"entities\",\n                    \"amount\": \"multiple\"\n                  },\n                  \"executable\": true,\n                  \"children\": {\n                    \"inside\": {\n                      \"type\": \"literal\",\n                      \"executable\": true\n                    }\n                  }\n                }\n              }\n            },\n            \"items\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"block\": {\n                  \"type\": \"literal\",\n                  \"children\": {\n                    \"pos\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:block_pos\",\n                      \"children\": {\n                        \"slots\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:item_slots\",\n                          \"children\": {\n                            \"item_predicate\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:item_predicate\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"entity\": {\n                  \"type\": \"literal\",\n                  \"children\": {\n                    \"entities\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:entity\",\n                      \"properties\": {\n                        \"type\": \"entities\",\n                        \"amount\": \"multiple\"\n                      },\n                      \"children\": {\n                        \"slots\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:item_slots\",\n                          \"children\": {\n                            \"item_predicate\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:item_predicate\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            },\n            \"predicate\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"predicate\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:loot_predicate\",\n                  \"executable\": true\n                }\n              }\n            },\n            \"score\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"target\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:score_holder\",\n                  \"properties\": {\n                    \"amount\": \"single\"\n                  },\n                  \"children\": {\n                    \"targetObjective\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:objective\",\n                      \"children\": {\n                        \"<\": {\n                          \"type\": \"literal\",\n                          \"children\": {\n                            \"source\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:score_holder\",\n                              \"properties\": {\n                                \"amount\": \"single\"\n                              },\n                              \"children\": {\n                                \"sourceObjective\": {\n                                  \"type\": \"argument\",\n                                  \"parser\": \"minecraft:objective\",\n                                  \"executable\": true\n                                }\n                              }\n                            }\n                          }\n                        },\n                        \"<=\": {\n                          \"type\": \"literal\",\n                          \"children\": {\n                            \"source\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:score_holder\",\n                              \"properties\": {\n                                \"amount\": \"single\"\n                              },\n                              \"children\": {\n                                \"sourceObjective\": {\n                                  \"type\": \"argument\",\n                                  \"parser\": \"minecraft:objective\",\n                                  \"executable\": true\n                                }\n                              }\n                            }\n                          }\n                        },\n                        \"=\": {\n                          \"type\": \"literal\",\n                          \"children\": {\n                            \"source\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:score_holder\",\n                              \"properties\": {\n                                \"amount\": \"single\"\n                              },\n                              \"children\": {\n                                \"sourceObjective\": {\n                                  \"type\": \"argument\",\n                                  \"parser\": \"minecraft:objective\",\n                                  \"executable\": true\n                                }\n                              }\n                            }\n                          }\n                        },\n                        \">\": {\n                          \"type\": \"literal\",\n                          \"children\": {\n                            \"source\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:score_holder\",\n                              \"properties\": {\n                                \"amount\": \"single\"\n                              },\n                              \"children\": {\n                                \"sourceObjective\": {\n                                  \"type\": \"argument\",\n                                  \"parser\": \"minecraft:objective\",\n                                  \"executable\": true\n                                }\n                              }\n                            }\n                          }\n                        },\n                        \"matches\": {\n                          \"type\": \"literal\",\n                          \"children\": {\n                            \"range\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:int_range\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"predicate\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"predicate\": {\n              \"type\": \"argument\",\n              \"parser\": \"minecraft:loot_predicate\",\n              \"executable\": true\n            }\n          }\n        },\n        \"score\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"target\": {\n              \"type\": \"argument\",\n              \"parser\": \"minecraft:score_holder\",\n              \"properties\": {\n                \"amount\": \"single\"\n              },\n              \"children\": {\n                \"targetObjective\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:objective\",\n                  \"children\": {\n                    \"<\": {\n                      \"type\": \"literal\",\n                      \"children\": {\n                        \"source\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:score_holder\",\n                          \"properties\": {\n                            \"amount\": \"single\"\n                          },\n                          \"children\": {\n                            \"sourceObjective\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:objective\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    },\n                    \"<=\": {\n                      \"type\": \"literal\",\n                      \"children\": {\n                        \"source\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:score_holder\",\n                          \"properties\": {\n                            \"amount\": \"single\"\n                          },\n                          \"children\": {\n                            \"sourceObjective\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:objective\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    },\n                    \"=\": {\n                      \"type\": \"literal\",\n                      \"children\": {\n                        \"source\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:score_holder\",\n                          \"properties\": {\n                            \"amount\": \"single\"\n                          },\n                          \"children\": {\n                            \"sourceObjective\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:objective\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    },\n                    \">\": {\n                      \"type\": \"literal\",\n                      \"children\": {\n                        \"source\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:score_holder\",\n                          \"properties\": {\n                            \"amount\": \"single\"\n                          },\n                          \"children\": {\n                            \"sourceObjective\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:objective\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    },\n                    \"matches\": {\n                      \"type\": \"literal\",\n                      \"children\": {\n                        \"range\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:int_range\",\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"await\": {\n      \"type\": \"literal\",\n      \"children\": {\n        \"block\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"pos\": {\n              \"type\": \"argument\",\n              \"parser\": \"minecraft:block_pos\",\n              \"children\": {\n                \"block\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:block_predicate\",\n                  \"executable\": true\n                }\n              }\n            }\n          }\n        },\n        \"chat\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"pattern\": {\n              \"type\": \"argument\",\n              \"parser\": \"brigadier:string\",\n              \"properties\": {\n                \"type\": \"phrase\"\n              },\n              \"executable\": true,\n              \"children\": {\n                \"receivers\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:entity\",\n                  \"properties\": {\n                    \"type\": \"players\",\n                    \"amount\": \"multiple\"\n                  },\n                  \"executable\": true\n                }\n              }\n            }\n          }\n        },\n        \"data\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"block\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"sourcePos\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:block_pos\",\n                  \"children\": {\n                    \"path\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:nbt_path\",\n                      \"executable\": true\n                    }\n                  }\n                }\n              }\n            },\n            \"entity\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"source\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:entity\",\n                  \"properties\": {\n                    \"type\": \"entities\",\n                    \"amount\": \"single\"\n                  },\n                  \"children\": {\n                    \"path\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:nbt_path\",\n                      \"executable\": true\n                    }\n                  }\n                }\n              }\n            },\n            \"storage\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"source\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:resource_location\",\n                  \"children\": {\n                    \"path\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:nbt_path\",\n                      \"executable\": true\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"delay\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"time\": {\n              \"type\": \"argument\",\n              \"parser\": \"minecraft:time\",\n              \"properties\": {\n                \"min\": 0\n              },\n              \"executable\": true\n            }\n          }\n        },\n        \"entity\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"entities\": {\n              \"type\": \"argument\",\n              \"parser\": \"minecraft:entity\",\n              \"properties\": {\n                \"type\": \"entities\",\n                \"amount\": \"multiple\"\n              },\n              \"executable\": true,\n              \"children\": {\n                \"inside\": {\n                  \"type\": \"literal\",\n                  \"executable\": true\n                }\n              }\n            }\n          }\n        },\n        \"items\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"block\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"pos\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:block_pos\",\n                  \"children\": {\n                    \"slots\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:item_slots\",\n                      \"children\": {\n                        \"item_predicate\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:item_predicate\",\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            },\n            \"entity\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"entities\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:entity\",\n                  \"properties\": {\n                    \"type\": \"entities\",\n                    \"amount\": \"multiple\"\n                  },\n                  \"children\": {\n                    \"slots\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:item_slots\",\n                      \"children\": {\n                        \"item_predicate\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:item_predicate\",\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"not\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"block\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"pos\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:block_pos\",\n                  \"children\": {\n                    \"block\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:block_predicate\",\n                      \"executable\": true\n                    }\n                  }\n                }\n              }\n            },\n            \"chat\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"pattern\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"brigadier:string\",\n                  \"properties\": {\n                    \"type\": \"phrase\"\n                  },\n                  \"executable\": true,\n                  \"children\": {\n                    \"receivers\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:entity\",\n                      \"properties\": {\n                        \"type\": \"players\",\n                        \"amount\": \"multiple\"\n                      },\n                      \"executable\": true\n                    }\n                  }\n                }\n              }\n            },\n            \"data\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"block\": {\n                  \"type\": \"literal\",\n                  \"children\": {\n                    \"sourcePos\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:block_pos\",\n                      \"children\": {\n                        \"path\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:nbt_path\",\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                },\n                \"entity\": {\n                  \"type\": \"literal\",\n                  \"children\": {\n                    \"source\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:entity\",\n                      \"properties\": {\n                        \"type\": \"entities\",\n                        \"amount\": \"single\"\n                      },\n                      \"children\": {\n                        \"path\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:nbt_path\",\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                },\n                \"storage\": {\n                  \"type\": \"literal\",\n                  \"children\": {\n                    \"source\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:resource_location\",\n                      \"children\": {\n                        \"path\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:nbt_path\",\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            },\n            \"delay\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"time\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:time\",\n                  \"properties\": {\n                    \"min\": 0\n                  },\n                  \"executable\": true\n                }\n              }\n            },\n            \"entity\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"entities\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:entity\",\n                  \"properties\": {\n                    \"type\": \"entities\",\n                    \"amount\": \"multiple\"\n                  },\n                  \"executable\": true,\n                  \"children\": {\n                    \"inside\": {\n                      \"type\": \"literal\",\n                      \"executable\": true\n                    }\n                  }\n                }\n              }\n            },\n            \"items\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"block\": {\n                  \"type\": \"literal\",\n                  \"children\": {\n                    \"pos\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:block_pos\",\n                      \"children\": {\n                        \"slots\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:item_slots\",\n                          \"children\": {\n                            \"item_predicate\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:item_predicate\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                },\n                \"entity\": {\n                  \"type\": \"literal\",\n                  \"children\": {\n                    \"entities\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:entity\",\n                      \"properties\": {\n                        \"type\": \"entities\",\n                        \"amount\": \"multiple\"\n                      },\n                      \"children\": {\n                        \"slots\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:item_slots\",\n                          \"children\": {\n                            \"item_predicate\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:item_predicate\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            },\n            \"predicate\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"predicate\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:loot_predicate\",\n                  \"executable\": true\n                }\n              }\n            },\n            \"score\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"target\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:score_holder\",\n                  \"properties\": {\n                    \"amount\": \"single\"\n                  },\n                  \"children\": {\n                    \"targetObjective\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:objective\",\n                      \"children\": {\n                        \"<\": {\n                          \"type\": \"literal\",\n                          \"children\": {\n                            \"source\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:score_holder\",\n                              \"properties\": {\n                                \"amount\": \"single\"\n                              },\n                              \"children\": {\n                                \"sourceObjective\": {\n                                  \"type\": \"argument\",\n                                  \"parser\": \"minecraft:objective\",\n                                  \"executable\": true\n                                }\n                              }\n                            }\n                          }\n                        },\n                        \"<=\": {\n                          \"type\": \"literal\",\n                          \"children\": {\n                            \"source\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:score_holder\",\n                              \"properties\": {\n                                \"amount\": \"single\"\n                              },\n                              \"children\": {\n                                \"sourceObjective\": {\n                                  \"type\": \"argument\",\n                                  \"parser\": \"minecraft:objective\",\n                                  \"executable\": true\n                                }\n                              }\n                            }\n                          }\n                        },\n                        \"=\": {\n                          \"type\": \"literal\",\n                          \"children\": {\n                            \"source\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:score_holder\",\n                              \"properties\": {\n                                \"amount\": \"single\"\n                              },\n                              \"children\": {\n                                \"sourceObjective\": {\n                                  \"type\": \"argument\",\n                                  \"parser\": \"minecraft:objective\",\n                                  \"executable\": true\n                                }\n                              }\n                            }\n                          }\n                        },\n                        \">\": {\n                          \"type\": \"literal\",\n                          \"children\": {\n                            \"source\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:score_holder\",\n                              \"properties\": {\n                                \"amount\": \"single\"\n                              },\n                              \"children\": {\n                                \"sourceObjective\": {\n                                  \"type\": \"argument\",\n                                  \"parser\": \"minecraft:objective\",\n                                  \"executable\": true\n                                }\n                              }\n                            }\n                          }\n                        },\n                        \"matches\": {\n                          \"type\": \"literal\",\n                          \"children\": {\n                            \"range\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:int_range\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"predicate\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"predicate\": {\n              \"type\": \"argument\",\n              \"parser\": \"minecraft:loot_predicate\",\n              \"executable\": true\n            }\n          }\n        },\n        \"score\": {\n          \"type\": \"literal\",\n          \"children\": {\n            \"target\": {\n              \"type\": \"argument\",\n              \"parser\": \"minecraft:score_holder\",\n              \"properties\": {\n                \"amount\": \"single\"\n              },\n              \"children\": {\n                \"targetObjective\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:objective\",\n                  \"children\": {\n                    \"<\": {\n                      \"type\": \"literal\",\n                      \"children\": {\n                        \"source\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:score_holder\",\n                          \"properties\": {\n                            \"amount\": \"single\"\n                          },\n                          \"children\": {\n                            \"sourceObjective\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:objective\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    },\n                    \"<=\": {\n                      \"type\": \"literal\",\n                      \"children\": {\n                        \"source\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:score_holder\",\n                          \"properties\": {\n                            \"amount\": \"single\"\n                          },\n                          \"children\": {\n                            \"sourceObjective\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:objective\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    },\n                    \"=\": {\n                      \"type\": \"literal\",\n                      \"children\": {\n                        \"source\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:score_holder\",\n                          \"properties\": {\n                            \"amount\": \"single\"\n                          },\n                          \"children\": {\n                            \"sourceObjective\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:objective\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    },\n                    \">\": {\n                      \"type\": \"literal\",\n                      \"children\": {\n                        \"source\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:score_holder\",\n                          \"properties\": {\n                            \"amount\": \"single\"\n                          },\n                          \"children\": {\n                            \"sourceObjective\": {\n                              \"type\": \"argument\",\n                              \"parser\": \"minecraft:objective\",\n                              \"executable\": true\n                            }\n                          }\n                        }\n                      }\n                    },\n                    \"matches\": {\n                      \"type\": \"literal\",\n                      \"children\": {\n                        \"range\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:int_range\",\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"dummy\": {\n      \"type\": \"literal\",\n      \"children\": {\n        \"dummy\": {\n          \"type\": \"argument\",\n          \"parser\": \"minecraft:entity\",\n          \"properties\": {\n            \"type\": \"entities\",\n            \"amount\": \"single\"\n          },\n          \"children\": {\n            \"attack\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"entity\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:entity\",\n                  \"properties\": {\n                    \"type\": \"entities\",\n                    \"amount\": \"single\"\n                  },\n                  \"executable\": true\n                }\n              }\n            },\n            \"drop\": {\n              \"type\": \"literal\",\n              \"executable\": true,\n              \"children\": {\n                \"all\": {\n                  \"type\": \"literal\",\n                  \"executable\": true\n                }\n              }\n            },\n            \"jump\": {\n              \"type\": \"literal\",\n              \"executable\": true\n            },\n            \"leave\": {\n              \"type\": \"literal\",\n              \"executable\": true\n            },\n            \"mine\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"pos\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"minecraft:block_pos\",\n                  \"executable\": true\n                }\n              }\n            },\n            \"respawn\": {\n              \"type\": \"literal\",\n              \"executable\": true\n            },\n            \"selectslot\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"slot\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"brigadier:integer\",\n                  \"properties\": {\n                    \"max\": 9,\n                    \"min\": 1\n                  },\n                  \"executable\": true\n                }\n              }\n            },\n            \"sneak\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"active\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"brigadier:bool\",\n                  \"executable\": true\n                }\n              }\n            },\n            \"spawn\": {\n              \"type\": \"literal\",\n              \"executable\": true\n            },\n            \"sprint\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"active\": {\n                  \"type\": \"argument\",\n                  \"parser\": \"brigadier:bool\",\n                  \"executable\": true\n                }\n              }\n            },\n            \"swap\": {\n              \"type\": \"literal\",\n              \"executable\": true\n            },\n            \"use\": {\n              \"type\": \"literal\",\n              \"children\": {\n                \"block\": {\n                  \"type\": \"literal\",\n                  \"children\": {\n                    \"pos\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:vec3\",\n                      \"executable\": true,\n                      \"children\": {\n                        \"direction\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"brigadier:string\",\n                          \"properties\": {\n                            \"type\": \"word\"\n                          },\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                },\n                \"entity\": {\n                  \"type\": \"literal\",\n                  \"children\": {\n                    \"entity\": {\n                      \"type\": \"argument\",\n                      \"parser\": \"minecraft:entity\",\n                      \"properties\": {\n                        \"type\": \"entities\",\n                        \"amount\": \"single\"\n                      },\n                      \"executable\": true,\n                      \"children\": {\n                        \"pos\": {\n                          \"type\": \"argument\",\n                          \"parser\": \"minecraft:vec3\",\n                          \"executable\": true\n                        }\n                      }\n                    }\n                  }\n                },\n                \"item\": {\n                  \"type\": \"literal\",\n                  \"executable\": true\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"fail\": {\n      \"type\": \"literal\",\n      \"children\": {\n        \"message\": {\n          \"type\": \"argument\",\n          \"parser\": \"minecraft:component\",\n          \"executable\": true\n        }\n      }\n    },\n    \"succeed\": {\n      \"type\": \"literal\",\n      \"executable\": true\n    }\n  }\n}\n"
  },
  {
    "path": "docs/code-conventions.md",
    "content": "# Code Conventions\n\n## Table of contents\n* [Naming](#naming)\n* [Comments](#comments)\n  * [Function headers](#function-headers)\n  * [Inline comments](#inline-comments)\n* [Smithed conventions](#smithed-conventions)\n  * [Tag specification](#tag-specification)\n\n## Naming\n- Names should be as clear and relevant as possible to avoid confusion or two modules sharing the same name by mistake.\n- Any name, scoreboard name or tag should be formatted as `lowercase_with_underscores`.\n- Scoreboards and tags should begin with the `gm4_` prefix.\n- Fake players used to store numbers for scoreboard operations should prefixed by \"#\" followed by the number, e.g. `scoreboard players set #100 gm4_some_scoreboard 100`.\n- Fake players that aren't constants should be prefixed by \"$\", e.g. `$has_soul_fire_heatsource`.\n- Entities that aren't visible to the player (markers) should have custom names beginning with `gm4_` if this does not interfere with functionality.\n- Lore on items should have the first word capitalized and no fullstop at the end of the sentence if there is only one sentence. Other punctuation (?!) can be added. Descriptions should be `\"color\":\"gray\",\"italic\":false` whilst flavor text or commands (such as \"Throw to use\") should be `\"color\":\"dark_gray\",\"italic\":true`.\n- Names on items should follow Minecraft's rarity colorscheme and should be `\"italic\":false`.\n\n## Comments\n\n### Function headers\nAll functions should start with a header comment to make review and debugging easier. Such a header comment could look like:\n```mcfunction\n# Demonstrates how header comments work.\n# @s = Player in survival, while tabbed-out\n# at @s align xyz rotated as @r\n# run from gm4:load\n# scheduled from gm4:main\n# with $id = Id of the player who's tabbed out\n# with $timestamp = Timestamp at which the player tabbed out in seconds\n```\nSome of the shown lines are optional, in which case the line can be omitted completely; do not replace the line with whitespace.\n\nThe first three lines are positional:\n  - **Line 1** [Optional]: `<description>` A human-readable description of what this function does and, if needed, in which context it runs. Don't be too literal.\n  - **Line 2** [Required]: `@s = <description or pseudocode>` A human-readable or pseudocode description of the executing entity. May also be \"unspecified\" in case no executor was set intentionally.\n  - **Line 3** [Required]: `at <description or pseudocode>` A human-readable or pseudocode description of the location this function is run at. May also be \"unspecified\" in case no location was set intentionally.\n\nAdditional lines may be present to indicate the context of the function. Each of the following may be specified multiple times, do **not** use a single line to specify multiple entries.\n  - `run from <locator>` The resource locator of a function that calls this function. Use of wildcards, e.g. `run from gm4:boats/*` is permitted. The namespace of the resource locator may be omitted, in which case the namespace of the current function is assumed.\n  - `run from self` Indicate that a function calls itself.\n  - `scheduled from <locator>` The full resource locator of a function that schedules this function. Use of wildcards, e.g. `run from gm4:boats/*` is permitted.\n  - `rewarded from <locator>` The full resource locator of an advancement that rewards this function. Use of wildcards, e.g. `run from gm4:join/*` is permitted.\n  - `run from <function|dialog|command block|chat|...> <descriptor>` A description or location of any other source that triggers this function.\n  - `with $<key>: <description>` The key of an nb tag used for the macro call of this function, as well as a description of the value the key holds. Do not specify this unless this function is a macro. Use of wildcards, e.g. `with $id_*: Set of 16 ids used to track runcows.` is permitted.\n\n### Inline comments\nInline comments should be placed to partition code into logical sections and `#` should be followed by a space, e.g.\n```mcfunction\n# spawns items and kills player\nsummon Item ~ ~ ~ {Item:{id:\"minecraft:bone\",count:1}}\nkill @s\n```\n\n## Smithed conventions\nWe follow the Smithed conventions in our data pack. For the full documentation, see the [Smithed Wiki](https://wiki.smithed.dev/conventions/).\n\n### Tag specification\nSmithed defines a set of standard entity `/tag`s to ensure compatibility between different packs:\n* Custom entities need to get the `smithed.entity` tag\n* If the entity is a technical marker, also give it the `smithed.strict` tag\n* If the entity is a custom block marker, give it the `smithed.block` tag\n\nThese tags can then be used in checks:\n* When you want to target all vanilla skeletons, use `@e[type=skeleton,tag=!smithed.entity]`\n* When you want to teleport nearby mobs, use `@e[tag=!smithed.strict]`\n* When you want to detect a vanilla block, use `align xyz if block ~ ~ ~ obsidian unless entity @e[tag=smithed.block,dx=0]`\n"
  },
  {
    "path": "docs/getting-started.md",
    "content": "# Getting Started\nThis guide will show how to setup a local development environment to build, test, and contribute to our modules.\n\n## Table of contents\n* [Installation](#installation)\n* [Building modules](#building-modules)\n* [Common issues](#common-issues)\n* [Submitting changes](#submitting-changes)\n\n## Installation\nTo contribute to our project you need to install [Git](https://git-scm.com/downloads) and a text editor. We recommend [VSCode](https://code.visualstudio.com/).\n\nOur modules are built using [beet](https://github.com/mcbeet/beet), which is a Python framework that allows us to automatically validate and generate part of our data packs and resource packs.\n\nYou will need to install [uv](https://docs.astral.sh/uv/) as project manager. If you don't already have Python installed, uv will do that automatically. We currently use Python 3.14.\n```sh\n# MacOS, Linux, or Git Bash (recommended)\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n\n# Powershell on Windows\npowershell -ExecutionPolicy ByPass -c \"irm https://astral.sh/uv/install.ps1 | iex\"\n```\n\nCreate your own fork of this repository.\n![Forking the repository on GitHub](images/create-fork.png)\n\nClone your fork locally:\n```\ngit clone https://github.com/<username>/GM4_Datapacks.git\n```\n\nOpen the `GM4_Datapacks` folder in VScode. Then run `uv sync`. This will install beet and all our other dependencies.\n\nYou are now ready to build our modules and make changes!\n\n## Building modules\nThe source of each module is stored in each `gm4_*` folder. To convert them to a valid data pack, you need to use Beet:\n\n```\nuv run beet dev --link <world_name> --watch metallurgy *_shamir\n```\n* `uv run` makes sure that the command uses the correct Python dependencies\n* `beet dev` builds the data packs to the `out` folder\n* `--link <world_name>` copies the packs to a local world (filepath to the world's directory)\n* `--watch` watches for file changes and then rebuilds\n* `metallurgy *_shamir` specifies the list of module IDs to build\n\nBuilding the release version of all modules is also possible. It will output the zipped data packs in the `release/<version>` folder. Running this could take a few minutes!\n```\nuv run beet -p beet-release.yaml build\n```\n\n## Common issues\nWhen building the modules, sometimes you will encounter odd errors.\n\nIf you get an error about a beet plugin exception, many times it can be resolved simply by refreshing the beet cache.\n```\nuv run beet cache --clear\n```\n\n## Submitting changes\nTo submit changes to our modules, start by creating a branch. This allows us to review every change separately and allows you to make other changes in the future. Make sure you are on the `master` branch when you do this.\n\n![Creating a new branch in VSCode](images/create-branch.png)\n\nAlternatively, to create a branch, you can run:\n```\ngit checkout -b <branch_name>\n```\n\nWhile making changes, test the data packs in a local world:\n\n```\nuv run beet dev --link <world_name> --watch <module_id>\n```\n\nWhen you are happy with the changes, create a commit on the branch.\n![Creating a commit in VSCode](images/create-commit.png)\n\nAlternatively, to create a commit, you can run:\n```\ngit add .\ngit commit -m \"<commit_message>\"\n```\n\nAfter committing the changes locally, push them to your fork. Click on \"Publish Branch\".\n![Pushing a commit in VSCode](images/push.png)\n\nAlternatively, to push to the fork, you can run:\n```\ngit push -u origin <branch_name>\n```\n\nOn GitHub, create a pull request for this new branch. Click on \"Compare & pull request\".\n![Compare & pull request on GitHub](images/compare-and-pull-request.png)\n\nThen, write a short description of the changes you made, whether it fixes a bug or changes behavior of a module. Click on \"Create pull request\" when you're done.\n![Writing the description of the pull request on GitHub](images/write-pull-request.png)\n\nYour changes are now ready to be reviewed by our contributors. Thank you!\n"
  },
  {
    "path": "docs/making-a-module.md",
    "content": "# Making a Module\nBefore making a module, follow the \n[Getting Started](./getting-started.md) guide to setup development.\n\n## Table of contents\n* [Module setup](#module-setup)\n  * [Beet config](#beet-config)\n  * [Load](#load)\n* [Writing the module](#writing-the-module)\n  * [Guidebook pages](#guidebook-pages)\n  * [Tests](#tests)\n* [Submitting a pull request](#submitting-a-pull-request)\n* [Finishing up for release](#finishing-up-for-release)\n  * [Credits](#credits)\n  * [Readme](#readme)\n  * [Icon](#icon)\n  * [Images](#images)\n  * [Readme](#readme)\n  * [Wiki page](#wiki-page)\n\n## Module setup\nAs with any changes to the repository, create a new branch:\n```\ngit checkout -b my-new-module\n```\n\nStart by copying the `gm4_bat_grenades` folder to the new module ID. It is by far the smallest module so it's easy to use as a template.\n* Rename the folder `gm4_bat_grenades/data/gm4_bat_grenades` to `gm4_<module_id>/data/gm4_<module_id>`.\n* In the `functions` folder, find and replace all instances of `bat_grenades` with `<module_id>`.\n\n### Beet config\nEach module has a `beet.yaml` file that contains information on how to build the pack and some metadata used on the website.\n```yaml\n# The ID and name of this module. The ID should always be the same as the current directory name\nid: gm4_disassemblers\nname: Disassemblers\n# Version \"patch\" value is managed by a github action. Leave it as 'X'\nversion: '1.3.X'\n\n# Load the current directory\ndata_pack:\n  load: .\n\n# The build pipeline for this module\npipeline:\n  # First run any plugins to generate extra files or make changes programatically\n  - gm4_disassemblers.generate_disassembly\n\n  # Extend the default config for modules. This adds the base library and other boilerplate\n  - gm4.plugins.extend.modules\n\n  # Include any libraries\n  - gm4.plugins.include.lib_machines\n\n# Metadata for the build and publishing on the website\nmeta:\n  gm4:\n    versioning:\n      # A list of minimum-required versions for libraries or other modules\n      required:\n        - lib_machines: 1.5.0\n        - gm4_bat_grenades: 1.7.0\n\n      # A list of any functions that create \"schedule loop clocks\". Necessary to turn off the module in case of a load failure\n      schedule_loops:\n        - main # namespace assumed to be the module id\n        - gm4_bat_grenades:tick # but one can be manually specified\n\n    website:\n      # A description. This should be a good summary of what this module adds or achieves, to get someone interested in this module\n      description: Break apart gold and iron tools and weapons for materials. Attach this to a mobfarm to finally make use of those extra armour sets!\n      # Any recommended modules\n      recommended:\n        - gm4_resource_pack\n        - gm4_bat_grenades\n      # Important notes for people when they download the module. This can be empty\n      notes: []\n      # Keywords used by gm4.co's search feature, may be omitted\n      search_keywords:\n        - shamir\n        - enderpuff\n\n    # Either null or a link to the YouTube video. Not needed if there is no video\n    video: null\n    # Either null or a link to the wiki page\n    wiki: https://wiki.gm4.co/wiki/Disassemblers\n    # The credits section. Can have different titles each being a list of names\n    credits:\n      Creator:\n        - Sparks\n      Textures by:\n        - Kyrius\n\n  modrinth: # This section is only necessary when publishing to Modrinth\n    project_id: itk6Zfe2\n  smithed: # This section is only necessary when publiching to Smithed\n    pack_id: gm4_disassemblers\n```\n\n### Load\nGamemode 4 uses [LanternMC Load](https://github.com/LanternMC/Load) so modules work nicely with other data packs. This allows modules to check which version of the gm4 base is loaded and prevents conflicts. It also allows checking whether reliant modules are installed.\n\nThe required files to interact with LanternMC Load are generated automatically by a beet plugin included in the `extend.module` config, based on the metadata specified in `meta.gm4.versioning` of the `beet.yaml`.\n\nIf all required dependencies are present, Lantern Load will call `init.mcfunction`. This function is written by the developer, and is responsible for adding necessary scoreboards and `/schedule`-ing any clocked functions, specified in `meta.gm4.versioning.schedule_loops`.\n\n#### Logging\nMessages can be logged during the load process. This can be done by appending to the `queue` field in the `gm4:log` storage. Here are a few examples:\n```mcfunction\ndata modify storage gm4:log queue append value {type:\"text\",message:{text:\"We've been attempting to contact you about your car's extended warranty\"}}\ndata modify storage gm4:log queue append value {type:\"install\",module:\"Bat Grenades\"}\n```\n\n#### Ticking\nGamemode 4 modules use `/schedule` to run functions every few ticks. There are 2 standard clock speeds. Both functions schedule itself. You are free to add a different clock speed, however these are the standards:\n- `tick.mcfunction` runs every tick.\n- `main.mcfunction` runs every 16 ticks.\n\n## Writing the module\nWhen writing the data pack, make sure to follow our [Code Conventions](./code-conventions.md).\n\n### Translatable text\nAll text visible to survival players (names, lore, actionbar, advancements) should use translation fallbacks like this:\n```json\n{\n  \"translate\": \"advancement.gm4.block_compressors.title\",\n  \"fallback\": \"Clever Crushing\"\n}\n```\nAdditionally, every translation key defined by your data pack should be listed in the `translations.csv` babelbox file, along with its fallback as the `en_us` translation.\n\n### Custom model data\nGamemode 4 uses a custom beet plugin that enables the use of string references instead of hard-to-remember integers when dealing with custom model data. After configuring the custom model data values your data pack will use in the `beet.yaml` or `model_data`.yaml files, the plugin will auto-assign the unique integer values and substitute them into the data pack output by the beet build process. \n\nAs a simple example:\n```yaml\n# beet.yaml\nmeta:\n  gm4:\n    model_data:\n      - item: rabbit_hide\n        reference: gm4_bat_grenades:item/bat_leather\n```\n```mcfunction\ngive @s rabbit_hide[custom_model_data=\"gm4_bat_grenades:item/bat_leather\"]\n```\n\nThis plugin also has infrastructure to auto-generate most parts of the resource pack. For more advanced usage, refer to [Resource Pack Management](./resource-pack-management.md)\n\n### Guidebook pages\nEach Gamemode 4 module must include guidebook pages to aid in the explaination and progression of the module. Details on how to add a section to the guidebook can be found in [`gm4_guidebook/CONTRIBUTING.md`](https://github.com/Gamemode4Dev/GM4_Datapacks/blob/master/gm4_guidebook/CONTRIBUTING.md).\n\n### Tests\nAutomated tests for modules should be added in the `data/gm4_module_id/test` folder. The tests will automatically run in GitHub Actions when you submit a PR. For local development and for the full documentation, see the [PackTest](https://github.com/misode/packtest) project.\n\n## Submitting a pull request\nAt any point when you feel the module is ready to recieve feedback or testing, you can create a pull request. You can still make changes afterwards.\n\n*See also: [Getting Started § Submitting changes](./getting-started.md#submitting-changes)*\n\n## Finishing up for release\n\n### Credits\nMake sure to credit all relevant people in `beet.yaml`. Most modules credit the creator (`Creator`), updaters (`Updated by`) and the icon designer (`Icon Design`), however, you may add credits for any work relevant to the module. Each credits section consists of an array of strings, which hold the names of the contributors.\n\nIf you also want a link to a social profile, add an entry to `gm4/contributors.json`:\n```jsonc\n[\n    // ...\n    {\n        \"name\": \"YourName\",\n        \"links\": [\"https://github.com/yourname\"]\n    },\n    // ...\n]\n```\n\n### Icon\nIf the module already has an icon, replace the `pack.png` and `pack.svg`. Otherwise, remove these files so the module will use the placeholder icon.\n\n<!-- TODO: Describe icon formats and creation process -->\n\n### Images\nAdd promotional assets to an `images` folder. These can be gifs or pictures which showcase some of the module's features.\n\n<!-- TODO: Describe image formats and creation process -->\n\n### Readme\nCreate a `README.md` file in the root of the module directory. The contents of this file will be used on distribution platforms like Modrinth and Smithed.\n\n### Wiki page\nAfter a module has been accepted, a wiki page may be created on [wiki.gm4.co](https://wiki.gm4.co/Main_Page).\n\n<!-- TODO: Describe wiki creation process, either on the wiki or here -->\n"
  },
  {
    "path": "docs/releasing-a-module.md",
    "content": "# Releasing a Module\nThis guide is for maintainers that want to publish a new module on Modrinth and Smithed. Unlike our own website, this does require some manual setup.\n\n## Table of contents\n* [Creating promo material](#creating-promo-material)\n* [Initial project setup](#initial-project-setup)\n* [Configuring the repo](#configuring-the-repo)\n* [Finishing the release](#finishing-the-release)\n\n## Creating promo material\nBefore a module is able to be released on Modrinth and Smithed, some promo material needs to be created:\n* Readme\n* Module icon\n* Short demo video\n\n## Initial project setup\n\n### Modrinth\n1. Log in to your own account, go to the Gamemode 4 [organization settings](https://modrinth.com/organization/gamemode4/settings/projects) and click on \"Create a project\"\n2. Set **Name** to the module name, for example `Holographic Tags`\n3. Set **URL** to the module ID joined with dashes, for example `gm4-holographic-tags`\n4. Set **Summary** to the website description, for example `Set up floating messages with a simple name tag!`\n5. Upload the project **Icon** using the source `pack.png`\n6. Set the **License** to `GNU General Public License v3`\n7. Set the **External links** to github repo, wiki page, discord invite, and patreon link\n8. If it exists, add a **Featured gallery image** from the gm4.co repo, preferably in `webp` format\n\n### Smithed\n1. Log in to the shared Gamemode 4 account and [create a new pack](https://smithed.net/edit?new=true)\n2. Set **Project id** to the module ID, for example `gm4_holographic_tags`\n3. Set **Project name** to the module name, combined with \"Gamemode 4\", for example `Holographic Tags | Gamemode 4`\n4. Set **Short project description** to the website description, for example `Set up floating messages with a simple name tag!`\n5. Set **Project website** to the module on gm4.co, for example `https://gm4.co/modules/holographic-tags`\n6. On the **Versions** tab, add a dummy version using tag `0.0.1`, this will need to be removed later\n7. Set the **Datapack URL** to the zip on the release branch, for example `https://raw.githubusercontent.com/Gamemode4Dev/GM4_Datapacks/release/1.20/gm4_holographic_tags_1_20.zip`\n8. Set **Supported Versions** to the latest release\n\n## Configuring the repo\nAdd the Modrinth and Smithed project IDs to the module's `beet.yaml` file. Commit or PR this change to the default branch and let the workflow run.\n\nFor example:\n```yaml\n# ...\nmeta:\n  gm4:\n  # ...\n    modrinth:\n      project_id: AzpWemXn\n    smithed:\n      pack_id: gm4_holographic_tags\n```\n\n## Finishing the release\n\n### Modrinth\n1. After the first version has been uploaded by the github action, add accurate **Tags** in settings\n2. Submit the data pack for review\n\n### Smithed\n1. Remove the temporary `0.0.1` version\n"
  },
  {
    "path": "docs/resource-pack-management.md",
    "content": "# Resource Pack Management\nThis document explains Gamemode 4's Resource Pack management tools, which use custom beet plugins to remove lots of redundancy in the source code.\n\n## Table of Contents\n* [Getting Started](#getting-started)\n    * [Building the Resource Pack](#building-the-resource-pack)\n* [Language Support](#language-support)\n* [Custom Model Data](#custom-model-data)\n* [Model Templates](#model-templates)\n* [Model Transforms](#model-transforms)\n* [Advanced Usage](#advanced-usage)\n    * [`model_data` Config](#model_data-config)\n    * [`gui_fonts` Config](#gui_fonts-config)\n    * [`translation_linter_ignores` Config](#translation_linter_ignores-config)\n    * [Custom Model Data Allocations](#custom-model-data-allocations)\n    * [Extending `TemplateOptions`](#extending-templateoptions)\n    * [Extending `TransformOptions`](#extending-transformoptions)\n    * [Extending `ContainerGuiOptions`](#extending-containerguioptions)\n    * [Extending `ItemModelOptions`](#extending-itemmodeloptions)\n\n## Getting Started\nJust like how data pack resources are stored in a `data` directory, resource pack assets are stored in an `assets` directory for each module, and follow the same structure as an ordinary minecraft resource pack. \n\nBeet must be configured to load these files by adding to the `beet.yaml`:\n```yaml\nresource_pack:\n  load: .\n```\n\n### Building the Resource Pack\nWhen building a single or list of modules with `beet dev`, a combined resource pack containing assets for the specified modules is built in the `out` directory. If the beet `--link` option is set, the pack will also be sent to Minecraft's resource packs folder.\n\nSince Gamemode 4 publishes a single resource pack that contains textures for all our modules combined, building a complete copy of the resource pack locally requires building every module. Since this often takes a while, developers are encouraged to only build the packs they are currently working on to save time.\n\n## Language Support\nSupport for additional languages is managed through babelbox, which uses a spreadsheet of translation keys and their corresponding values in multiple languages, which can be located at either `gm4_module_name/translations.csv` or `gm4_module_name/assets/translations.csv`. Individual language `.json` files are then generated by the build process.\n\nEnglish (`en_us`) translation values are required for every translation key used in the pack. Other languages are optional and entries can be left empty if no translation is available.\n\nExample translations.csv:\n```csv\nkey,en_us,de_de\nitem.gm4.bat_leather,Bat Leather,Fledermausleder\ntext.gm4.bat_leather.1,\"Would make for a very strange,\",\"Würde eine ziemlich merkwürde,\"\ntext.gm4.bat_leather.2,very tiny jacket,ziemlich kleine Jacke ergeben\n```\n\nWhich if opened as a spreadsheet like excel or libreoffice is structured as\n\n|key|en_us|de_de|\n| - | --- | --- |\n|item.gm4.bat_leather|Bat Leather|Fledermausleder|\n|text.gm4.bat_leather.1|Would make for a very strange,|Würde eine ziemlich merkwürde,|\n|text.gm4.bat_leather.2|very tiny jacket|ziemlich kleine Jacke ergeben|\n\nEnglish translations can also be auto-filled from text component fallbacks in other project files by setting `babelbox_backfill` to True in the build options. This is especially useful when adding guidebook translations, normally defined in `guidebook.json` to the `translations.csv`. \n\n```\nbeet -s meta.gm4.babelbox_backfill=True dev bat_grenades\n```\n\n## Custom Model Data\nThe `model_data` field in `beet.yaml` can be used to generate models and item definitions in the resource pack.\n\n```yaml\nmodel_data:\n  - item: rabbit_hide\n    reference: gm4_bat_grenades:item/bat_leather\n    template: generated\n```\n```mcfunction\ngive @s rabbit_hide[custom_model_data={strings:[\"gm4_bat_grenades:item/bat_leather\"]}]\nsummon item ~ ~ ~ {Item:{id:\"rabbit_hide\",count:1,components:{\"minecraft:custom_model_data\":{strings:[\"gm4_bat_grenades:item/bat_leather\"]}}}}\n```\n\nMake sure to include the namespace in the custom model data string. Starting in 26.1 this is no longer implicitly added by the resource pack plugin! \n\nFor full details about the `model_data` config see [`model_data` Config](#model_data-config)\n\n## Model Templates\nTemplates allow for easy generation of common model file structures. Uses the `textures` field (or its default value of `reference`) to find the texture file(s). Available default templates are:\n\n- `custom`: does not generate a model file(s).\n- `generated`: generates a model of the minecraft:item/generated parent. Often used to turn a single texture image into a flat held item in-game. e.g.\n```yaml\n- item: firework_star\n  reference: item/everstone\n  template: generated\n```\n- `generated_overlay`: generates a model with two layers, where the second texture is the same as the first, followed by `_overlay`. Intended for potions and other similar items\n- `handheld`: generates a mode of the `minecraft:item/handheld` parent. Used for turning single textures into a tool item in-game.\n- `vanilla`: use the vanilla item model. Often used when no textures exist yet but a CMD value should still be reserved.\n- `block`: generates a model of the minecraft:block/cube parent. Textures are specified in the order [top, bottom, front, side], or by mapping to their names. e.g.\n```yaml\n- item: piston\n  template: block\n  reference: block/forming_press\n  textures:\n      front: block/forming_press_side\n      side: block/forming_press_side\n      top: block/forming_press_top_out\n      bottom: block/forming_press_bottom\n - item: enchanting_table\n   template: block\n   reference: block/enchantment_extractor\n   textures:\n      - block/enchantment_extractor_top_out\n      - minecraft:block/furnace_top\n      - block/enchantment_extractor_side\n      - block/enchantment_extractor_side\n```\n- `advancement`: generates a model to be used in an advancement icon. This is a different CMD from the actual item to facilitate retexturing just the advancement and not the whole item. Redirects to a specified forward model file. This template ignores the model config field.\n```yaml\n- item: gunpowder\n  reference: gui/advancement/bat_grenades\n  template:\n    name: advancement\n    forward: item/bat_leather\n```\n- `legacy_machine_block`: generates a model following the block template, but with a set of transformations that scale and translate the model to match the position/scale of the \"block on the head of a small armor stand\" that is used in so many of our machine blocks.\n\nIndividual modules can also create their own templates (see [here](#extending-templateoptions)) that may be imported and used. The most common of these is metallurgy's `shamir`, which generates models for a shamir band, and tool/armor models with the shamir applied. Has the following sub-config:\n\n- `textures_path`: directory of textures to use when the shamir is on a tool. Textures from metallurgy will be substituted for any missing textures. Unless the shamir has unique textures, its recommended to just use the metallurgy folder corresponding to the metal type.\n- `metal`: which metal this shamir is\nThis template also overrides the item field of the config to allow more broad item groups, such as `armor`, `tools`, `weapons`, `axes`, `helmets` ect...\n```yaml\n- item: swords\n    reference: shamir/corripio\n    template:\n      name: shamir\n      metal: bismuth\n      textures_path: gm4_metallurgy:item/shamir/bismuth\n```\n\n## Model Transforms\nThe `transforms` field of model config is used to apply transformations (rotation/translation/scale) to a template-generated (or custom provided) model. \nThe plugin only defines one available transform: \n\n- `item_display`. This transform does the convenience calculations for an item model that will be displayed by an item display entity. By first setting up the display entity without the resource pack, and providing the entite's display parameters, the specified model will be modified to a 1-block scale, aligned with the block grid.\nAccepts the required parameters `origin`, `scale`, and the optional parameters `translation=[0,0,0]`, `rotation=[0,0,0]`, `display=head`\n\n```yaml\n- item: glass\n  template: custom\n  reference: block/liquid_tank\n  transforms:\n    - name: item_display\n      origin: [0.5,0.9,0.5]\n      scale: [0.438,0.438,0.438]\n      translation: [0,0,0]\n      display: head\n```\n\n## Advanced Usage\nThe following sections of this guide describes more advanced features of the resource pack plugin, that may be required for developers wishing to add additional templates or interact with special fonts.\n\n### `model_data` Config\nAll custom model data and model template config information is stored either in `meta.gm4.model_data` field of `beet.yaml`, or in the `model_data` field of the separate config file `assets/model_data.yaml`. This is a list of compounds, each of which accepts the following fields: \n\n- `item`: (required) item name, or list of item names this custom model data will be applied to.\n- `reference`: (required) the unique string reference to be used in source files e.g. item/bat_leather. If no namespace is specified, the module's namespace will be assumed.\nIt is recommended to format references according to the type of item it applies to. e.g. `item/...`, `block/...`, `gui/...` ect, and especially recommended to use the model/texture file path where possible.\n- `model`: (optional) the model file(s) to display on items with this custom model data. If not specified, will default to the same value as `reference`.\nAccepts a string or list of strings, one for each item present in item. May be formatted as a dictionary mapping items to models e.g.\n```yaml\nitem: [apple, potato]\nmodel:\n  apple: item/my_model_apple\n  potato: item/my_model_potato\n```\nMore complex model styles, like for items with multiple vanilla models (e.g. elytra & broken elytra, clock ect) are handled through a special-case syntax. Currently only broken elytra are supported, so packs utlizing conditions in item model definitions will need to provide handlers.\n```yaml\nitem: elytra\nmodel:\n  type: condition_broken\n  unbroken: item/elytra/captains_wings\n  broken: item/elytra/broken_captains_wings\n```\n\nItems who have multiple vanilla models, like clocks, who do not utilize special-case providers in the model config will have the same provided model file applied to all variants.\n\n- `template` (optional), a model-file generating template to apply. Accepts a string name of a template, or a compound containing template configuration values. Defaults to `custom`, which generates no Model files. See [here](#model-templates) for details on available templates.\n- `transforms` (optional), a list of model transforms to apply. Accepts a compound of configuration data. See [here](#model-transforms) for details on available transforms.\n- `textures` (optional), a string, list of strings, or mapping of texture files to supply to the template.\n- `broadcast` (optional*), a list of sub-configs which will inherit the current config values. This reduces redundancy when defining many similar references. Due to the inheritance, each config need not contain every required field, so long as after the broadcast is carried out all required fields have a value. e.g.\n\n```yaml\nmodel_data:\n  - item: player_head\n    template: generated\n    broadcast:\n      - textures: item/band/mundane_band\n        reference: item/mundane_band\n      - reference: item/lump/baryte\n      - reference: item/lump/bauxite\n      - reference: item/lump/bismutite\n      - reference: item/lump/thorianite\n```\n\n- `base_model` (optional), a json (or yaml) object that will be merged into the base model's custom model data definition. This used when specific control over the minecraft base item model is required (e.g. adding a tints field for leather armor). The `base_model` json object will be merged into the `model` json object, overwriting existing fields.\nE.g. to acheive the following custom model data:\n```json\n{\n  \"threshold\": 3420002,\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"gm4_scuba_gear:item/flippers\",\n    \"tints\": [\n      {\n        \"type\": \"minecraft:dye\",\n        \"default\": -14455863\n      }\n    ]\n  }\n}\n```\nThe following `base_model` config can be used:\n```yaml\nmodel_data:\n  - item: leather_boots\n    reference: item/flippers\n    template: generated_overlay\n    base_model: \n      tints: \n        - type: minecraft:dye\n          default: -14455863\n```\n\n### `gui_fonts` Config\nCustom textured GUIs using fonts can easily be setup using the `meta.gm4.gui_fonts` entry of `beet.yaml` or the `gui_fonts` entry of `model_data.yaml`. These will create a translation that displays a given image texture inside a container, like a dropper or hopper. Empty images of the correct size are available in the `base` to use as a starting point for custom GUIs. \n\nAvailable options are: \n\n- `translation`: the translation key that will become the texture. Recommended to follow the format `gui.gm4.my_container`.\n- `texture`: the image texture to display\n- `container`: the type of container the gui will display inside. Currently accepts `dropper`, and `hopper`. Additional containers formats can be added by [extending the ContainerGuiOptions class](#extending-containerguioptions).\n\n```yaml\ngui_fonts:\n  - translation: gui.gm4.auto_crafter\n    container: dropper\n    texture: gm4:gui/container/empty_dropper\n```\n### `translation_linter_ignores` Config\nIndividual translation keys can be excluded from the mecha linting process by adding them to the `meta.gm4.translation_linter_ignores` config in `beet.yaml`. This should only be used in unusual situations where translations are being used in other ways than displaying text. \n\n### Extending TemplateOptions\nIndividual modules may create and configure their own model templates by extending the `TemplateOptions` class in a beet plugin. The subclass must define its name as a class variable, and a `process` method which creates the models, mounts them to the pack, and returns them in a list. Additional instance attributes can be defined, and their values will be filled by any values provided in the `model_data` config under `template`.\n\nHas the following class attributes and methods that may be overridden:\n#### Properties\n- `name`: (required) A unique string that identifies this template and is set in the `template` field of `model_data`.\n- `default_transforms`: (optional) A list of `TransformOptions` instances. Used to give a template transformations that are applied by default, such as for a series of custom weapons with special offsets in the hand slots. \n- `texture_map`: (optional) A list of strings that defines the ordering of textures when configured in list form. Allows the model creation to access `config.textures` by key instead of index, which may be more robust. \n\n#### Methods\n- `process(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]:`: Creates the required model(s) instances defined by the `config`, mounts them to the pack `models_container` at the proper location, and returns the models for further transformation processing. \n- `add_namespace(self, namespace: str)`: Adds the pack namespace to any additional attributes added by this subclass, and returns a new instance of this `TemplateOptions` with that namespace applied.\n- `mutate_config(self, config: ModelData)`: Allows this template to mutate/mangle root level fields of the parent `ModelData`, such as `model` or `reference`. Used for unusual models like metallurgy's `shamir` that allow item groups in the `item` field for convenience. \n\n### Extending TransformOptions\nIndividual modules may create their own transformations by extending the `TransformOptions` class in a beet plugin. The subclass must define its name as a class variable, an `apply_transform` method that modifies a given model with the appropriate offsets, and any additional instance attributes required for that particular transform. \n\n#### Methods\n- `apply_transform(self, model: Model) -> None`: Modifies the given `Model` instance in-place with the desired display offset settings. \n\n### Extending ContainerGuiOptions\nIndividual modules may add containers to `gui_fonts` as needed by extending the `ContainerGuiOptions` class in a beet plugin. The subclass is responsible for requisitioning unicode characters from a central counter and returning the appropriate translation value and font providers. \n\nThe inherited method `next_unicode(counter_cache: Cache)` can be used to easily get a unique unicode character.\n\nAdditionally, there are two extendable subclasses already available for containers whose name is centered (like a dropper) and right-aligned (like a hopper). They are `CenteredContainerGui` and `RightAlignedGui` respectively.\n`\n#### Methods\n- `process(self, config: GuiFont, counter_cache: Cache) -> tuple[str, list[dict[str, Any]]]`: Requisitions unique characters and returns the translation value (usually made of these characters), and a list of font providers, which usually reference `config.texture`.\n\n### Extending ItemModelOptions\nIndividual modules may add additional handlers for special-case item model definitions by extending `ItemModelOptions` in a beet plugin. This subclass defines the additional config fields and a method that generates the model compound used in the item model definition. \n\n#### Methods\n- 'generate_json(self) -> dict[str,Any]`: Returns the model object used in the item model defintion. e.g. ```{\"type\": \"minecraft:condition\"...}```\n"
  },
  {
    "path": "gm4/commands.py",
    "content": "import json\nimport logging\nimport os\nimport shutil\nimport re\nimport glob\nfrom collections import defaultdict\nfrom pathlib import Path\nfrom tempfile import NamedTemporaryFile\nfrom typing import Any\n\nimport beet.toolchain.commands as commands\nimport click\nimport yaml\nfrom beet import Project\nfrom beet.toolchain.cli import beet\n\n# NOTE pydantic does not allow reloading models with custom validators, which beet watch will do normally.\n# Importing them here prevents their reload on each watch cycle.\nfrom gm4.utils import MapOption  # type: ignore\nfrom gm4.plugins.resource_pack import ModelData  # type: ignore\n\n# import worker plugin to prevent 'worker reload' warnings\nimport gm4.plugins.worker # type: ignore\n\npass_project = click.make_pass_decorator(Project) # type: ignore\n\n@beet.command()\n@pass_project\n@click.pass_context\n@click.argument(\"modules\", nargs=-1)\n@click.option(\"-w\", \"--watch\", is_flag=True, help=\"Watch the project directory and build on file changes.\")\n@click.option(\"-r\", \"--reload\", is_flag=True, help=\"Enable live data pack reloading.\")\n@click.option(\"-l\", \"--link\", metavar=\"WORLD\", help=\"Link the project before watching.\")\n@click.option(\"-c\", \"--clean\", is_flag=True, help=\"Clean the output folder.\")\n@click.option(\"--log\", default=\"INFO\", type=str, help=\"Set the logger level.\")\n@click.option(\"-nl\", \"--no-lint\", is_flag=True, help=\"Skips the mecha linting step.\")\ndef dev(ctx: click.Context, project: Project, modules: tuple[str, ...], watch: bool, reload: bool, link: str | None, clean: bool, log: int | str, no_lint: bool):\n\t\"\"\"Build or watch modules for development.\"\"\"\n\n\tmodule_folders = sorted(glob.glob(\"gm4_*\"))\n\tmodule_aliases: defaultdict[str, list[str]] = defaultdict(list)\n\tfor full_id in module_folders:\n\t\talias = \"\".join(p[0] for p in full_id.removeprefix(\"gm4_\").split(\"_\"))\n\t\tmodule_aliases[alias].append(full_id)\n\n\tselected_modules: list[str] = []\n\tfor m in modules:\n\t\talias = re.sub(\"\\\\d+$\", \"\", m)\n\t\tif alias in module_aliases:\n\t\t\tif len(module_aliases[alias]) > 1:\n\t\t\t\tindex = re.sub(\"^[a-z]+\", \"\", m)\n\t\t\t\tif index.isdecimal() and 1 <= int(index) <= len(module_aliases):\n\t\t\t\t\tm = module_aliases[alias][int(index) - 1]\n\t\t\t\telse:\n\t\t\t\t\tclick.echo(f\"[GM4] Alias {alias} is ambiguous, add a number suffix ({', '.join(f'{i+1}: {a}' for i, a in enumerate(module_aliases[alias]))})\")\n\t\t\t\t\treturn\n\t\t\telse:\n\t\t\t\tm = module_aliases[alias][0]\n\t\tif not m.startswith(\"gm4_\"):\n\t\t\tm = f\"gm4_{m}\"\n\t\tselected_modules.append(m)\n\n\tif len(selected_modules) == 0:\n\t\tclick.echo(\"[GM4] You need at least one module\")\n\t\treturn\n\n\tif clean:\n\t\tclick.echo(f\"[GM4] Cleaning output folder...\")\n\t\tshutil.rmtree(\"out\", ignore_errors=True)\n\n\tclick.echo(f\"[GM4] Building {len(selected_modules)} module{'' if len(selected_modules) == 1 else 's'}: {', '.join(selected_modules)}\")\n\n\tlogger = logging.getLogger()\n\tlogger.setLevel(log)\n\t# logger.addHandler(LogHandler()) # TODO configure the log handler to GM4's preferred formatting\n\n\tconfig = yaml.safe_load(Path(\"beet-dev.yaml\").read_text())\n\n\t# command-determined config options\n\tbroadcast_config: dict[str, Any] = next((p for p in config[\"pipeline\"] if isinstance(p, dict))) # type: ignore\n\tbroadcast_config[\"broadcast\"] = selected_modules\n\tif no_lint:\n\t\tbroadcast_config[\"require\"].insert(0, \"gm4.plugins.test.skip_mecha_lint\")\n\tif reload:\n\t\tbroadcast_config[\"require\"].insert(0, \"beet.contrib.livereload\")\n\n\tbuild_dynamic_config(config, ctx, project, watch, link) # start the project build\n\n\n@beet.command()\ndef clean():\n\t\"\"\"Cleans the output folder.\"\"\"\n\tshutil.rmtree(\"out\", ignore_errors=True)\n\tshutil.rmtree(\"release\", ignore_errors=True)\n\tclick.echo(f\"[GM4] Cleaned output and release folder!\")\n\n\n@beet.command()\n@pass_project\n@click.pass_context\n@click.argument(\"modules\", nargs=-1)\n@click.option(\"-w\", \"--watch\", is_flag=True, help=\"Watch the project directory and build on file changes.\")\n@click.option(\"-c\", \"--clean\", is_flag=True, help=\"Clean the output folder.\")\ndef readme_gen(ctx: click.Context, project: Project, modules: tuple[str, ...], watch: bool, clean: bool):\n\t\"\"\"Generates all README files for manual uplaoad\"\"\"\n\n\tmodules = tuple(m if m.startswith(\"gm4_\") else f\"gm4_{m}\" for m in modules)\n\tif len(modules) == 0:\n\t\tclick.echo(\"[GM4] You need at least one module\")\n\t\treturn\n\n\tif clean:\n\t\tclick.echo(f\"[GM4] Cleaning output folder...\")\n\t\tshutil.rmtree(\"out\", ignore_errors=True)\n\n\tclick.echo(f\"[GM4] Generating READMEs for: {', '.join(modules)}\")\n\n\t# we want to only read in the metadata from each project fo make a readme, not run the whole build pipeline\n\t\t# so we have to manually expand the broadcast instead of relying on beet's broadcast option.\n\tsubprojects: list[dict[str,Any]] = []\n\tfor module in modules:\n\t\tmodule_config = yaml.safe_load(Path(f\"{module}/beet.yaml\").read_text())\n\t\tfor key in [\"data_pack\", \"resource_pack\", \"pipeline\", \"require\"]: # remove pack resources\n\t\t\tmodule_config.pop(key, None)\n\t\tmodule_config[\"pipeline\"] = [\n\t\t\t\"gm4.plugins.manifest.write_credits\",\n\t\t\t\"gm4.plugins.readme_generator\",\n\t\t\t\"gm4.plugins.output.readmes\"\n\t\t]\n\t\tsubprojects.append(module_config)\n\n\tconfig = {\n\t\t\"pipeline\": [\n\t\t\t*subprojects,\n\t\t\t\"gm4.plugins.finished\"\n\t\t],\n\t\t\"meta\": {\n\t\t\t\"autosave\": {\n\t\t\t\t\"link\": False\n\t\t\t}\n\t\t}\n\t}\n\n\tbuild_dynamic_config(config, ctx, project, watch, link=None)\n\n\ndef build_dynamic_config(config: dict[str,Any], ctx: click.Context, project: Project, watch: bool, link: str|None):\n\t\"\"\"Creates a tempfile on disk to pass to beet. Enables runtime dynamic setup of the build process that is compatiable with `beet watch`\"\"\"\n\n\tconfig[\"directory\"] = str(project.directory) # set working directory to where CLI was invoked\n\n\twith NamedTemporaryFile(mode=\"wt\", delete=False, suffix=\".json\") as f:\n\t\tproject.config_path = f.name\n\t\tjson.dump(config, f, indent=1)\n\n\tproject.reset() # delete previously resolved config\n\tctx.invoke(commands.watch if watch else commands.build, link=link)\n\tos.remove(f.name) # delete tempfile\n"
  },
  {
    "path": "gm4/contributors.json",
    "content": "[\n    {\n        \"name\": \"15Redstones\",\n        \"links\": [\"https://twitter.com/15Redstones\"]\n    },\n    {\n        \"name\": \"dvitski\",\n        \"links\": [\"https://bsky.app/profile/dvitski.cc\"]\n    },\n    {\n        \"name\": \"Bloo\",\n        \"links\": [\"https://bsky.app/profile/bloo.boo\"]\n    },\n    {\n        \"name\": \"BPR\",\n        \"links\": [\"https://bsky.app/profile/bpr02.com\"]\n    },\n    {\n        \"name\": \"Bunnygamers\",\n        \"links\": [\"https://bsky.app/profile/bunnygamers.bsky.social\"]\n    },\n    {\n        \"name\": \"catter1\",\n        \"links\": [\"https://bsky.app/profile/catter.dev\"]\n    },\n    {\n        \"name\": \"Chopper2112\",\n        \"links\": [\"https://twitter.com/TheChopper2112\"]\n    },\n    {\n        \"name\": \"Denniss\",\n        \"links\": [\"https://github.com/Dennis-0\"]\n    },\n    {\n        \"name\": \"Dinoguin_Jess\",\n        \"links\": [\"https://github.com/Dinoguin-Jess\"]\n    },\n    {\n        \"name\": \"Djones\",\n        \"links\": [\"https://bsky.app/profile/thanathor.bsky.social\"]\n    },\n    {\n        \"name\": \"DuckJr\",\n        \"links\": [\"https://twitter.com/DuckJr94\"]\n    },\n    {\n        \"name\": \"Energyxxer\",\n        \"links\": [\"https://youtube.com/user/Energyxxer\"]\n    },\n    {\n        \"name\":\"foodiebonus\",\n        \"links\":[]\n    },\n    {\n        \"name\": \"Fyid\",\n        \"links\": [\"https://twitter.com/FyidRants\"]\n    },\n    {\n        \"name\":\"Hozz\",\n        \"links\":[]\n    },\n    {\n        \"name\": \"JP12\",\n        \"links\": [\"https://github.com/jpeterik12\"]\n    },\n    {\n        \"name\": \"kindabland\",\n        \"links\": [\"https://github.com/kindabland\"]\n    },\n    {\n        \"name\": \"Kroppeb\",\n        \"links\": [\"https://tech.lgbt/@Kroppeb\"]\n    },\n    {\n        \"name\": \"Kruthers\",\n        \"links\": [\"https://twitter.com/Pandakruthers\"]\n    },\n    {\n        \"name\": \"Kyrius\",\n        \"links\": [\"https://bsky.app/profile/kyriuspixels.bsky.social\"]\n    },\n    {\n        \"name\": \"Lue\",\n        \"links\": [\"https://github.com/Luexa\"]\n    },\n    {\n        \"name\": \"Lune6\",\n        \"links\": [\"https://bsky.app/profile/lune6.bsky.social\"]\n    },\n    {\n        \"name\": \"Modulorium\",\n        \"links\": [\"https://www.modulorium.dev\"]\n    },\n    {\n        \"name\": \"Misode\",\n        \"links\": [\"https://bsky.app/profile/misode.dev\"]\n    },\n    {\n        \"name\": \"Memo\",\n        \"links\": [\"https://linktr.ee/miraku_memo\"]\n    },\n    {\n        \"name\": \"Nik3141\",\n        \"links\": [\"https://youtube.com/channel/UCgKd6elt0L3w-d7ryLw-7HQ\"]\n    },\n    {\n        \"name\": \"runcows\",\n        \"links\": [\"https://bsky.app/profile/runcows.bsky.social\"]\n    },\n    {\n        \"name\": \"Scommander\",\n        \"links\": [\"https://github.com/Scommander\"]\n    },\n    {\n        \"name\": \"SethBling\",\n        \"links\": [\"https://youtube.com/user/SethBling\"]\n    },\n    {\n        \"name\": \"SiberianHat\",\n        \"links\": [\"https://twitter.com/SiberianHat\"]\n    },\n    {\n        \"name\": \"SirSheepe\",\n        \"links\": [\"https://bsky.app/profile/sirsheepe.bsky.social\"]\n    },\n    {\n        \"name\": \"Sparks\",\n        \"links\": [\"https://bsky.app/profile/selcouthsparks.bsky.social\"]\n    },\n    {\n        \"name\": \"SpecialBuilder32\",\n        \"links\": [\"https://bsky.app/profile/specialbuilder32.bsky.social\"]\n    },\n    {\n        \"name\": \"The8BitMonkey\",\n        \"links\": [\"https://youtube.com/the8bitmonkey\"]\n    },\n    {\n        \"name\": \"torbray\",\n        \"links\": [\"https://twitter.com/torbray00\"]\n    },\n    {\n        \"name\": \"Wumpacraft\",\n        \"links\": [\"https://twitter.com/wumpacraft\"]\n    },\n    {\n        \"name\": \"Venomousbirds\",\n        \"links\": [\"https://venomousbirds.artstation.com/\"]\n    },\n    {\n        \"name\": \"MulverineX\",\n        \"links\": [\"https://modrinth.com/user/MulverineX\"]\n    }\n]\n"
  },
  {
    "path": "gm4/plugins/annotations.py",
    "content": "import logging\nimport logging.handlers\nimport os\nimport re\nfrom functools import partial\nfrom pathlib import Path\nfrom typing import Any\n\nfrom beet import Context, ProjectCache\n\nfrom gm4.plugins.manifest import ManifestCacheModel, ManifestFileModel\n\n\ndef beet_default(ctx: Context):\n    \"\"\"Sets up a logging handlers to emit build log entries with the github action annotation format,\n        and create a summary with useful build information.\"\"\"\n    root_logger = logging.getLogger(None) # get root logger\n\n    # annotation handler emits throughout build to stderr\n    ann_handler = logging.StreamHandler()\n    ann_handler.setFormatter(AnnotationFormatter())\n\n    def filter(record: logging.LogRecord):\n        if record.name == \"time\":\n            return False # disable annotations for time - is spammy in debug mode\n        return True\n    ann_handler.addFilter(filter)\n\n    root_logger.handlers.clear() # clear the handler set by beet CLI toolchain\n    root_logger.addHandler(ann_handler)\n\n    # summary handler holds onto certain records until the exit phase when it emits to a markdown summary\n    sum_handler = SummaryHandler(1000, ctx.cache)\n    logging.getLogger(\"gm4.output\").addHandler(sum_handler)\n    logging.getLogger(\"gm4.manifest.update_patch\").addHandler(sum_handler)\n\n    # after the whole build, flush the stored records and form the markdown summary\n    yield\n    sum_handler.flush()\n\nLEVEL_CONVERSION = {\n    logging.DEBUG: \"debug\",\n    logging.INFO: \"notice\",\n    logging.WARNING: \"warning\",\n    logging.ERROR: \"error\",\n    logging.CRITICAL: \"error\"\n}\n\nclass AnnotationFormatter(logging.Formatter):\n\n    def format(self, record: logging.LogRecord) -> str:\n\n        expl = record.getMessage().replace(\"\\n\", \"%0A\")\n            # use urlencoded newline\n\n        level = LEVEL_CONVERSION.get(record.levelno, LEVEL_CONVERSION[logging.INFO])\n\n        filename = None\n        line = None\n        col = None\n\n        if getattr(record, \"gh_annotate_skip\", False): # disable annotations for any gm4 log events flagged manually\n            return f\"{level.capitalize()}: {record.name} {expl}\" # formatted to resemble annotated entry\n\n        match = re.match(r\"(.+):(\\d+):(\\d+)\", getattr(record, \"annotate\", \"\")) # extract filename and location from mecha annotation\n        if match:\n            filename, line, col = match.groups()\n            return f\"::{level} file={filename},line={line},col={col},title={record.name}::{record.name} {expl}\"\n\n        return f\"::{level} title={record.name}::{record.name} {expl}\"\n\nclass SummaryHandler(logging.handlers.BufferingHandler):\n    def __init__(self, capacity: int, beet_cache: ProjectCache):\n        super().__init__(capacity)\n        self.beet_cache = beet_cache\n        self.summary_created = False\n\n    def flush(self):\n        summary_entries: dict[str, Any] = {}\n\n        this_manifest = ManifestCacheModel.model_validate(self.beet_cache[\"gm4_manifest\"].json)\n        last_manifest = ManifestFileModel.model_validate(self.beet_cache[\"previous_manifest\"].json)\n\n        this_versions = {id: entry.version for id, entry in (this_manifest.modules | this_manifest.libraries).items()}\n        last_versions = {id: entry.version for id, entry in ({e.id: e for e in last_manifest.modules} | last_manifest.libraries).items()}\n\n        library_ids = [e.id for e in this_manifest.libraries.values()]\n\n        for record in self.buffer:\n            if record.name.startswith(\"gm4.output\"):\n                _, _, service, module_id = record.name.split('.')\n            elif record.name.startswith(\"gm4.manifest.update_patch\"):\n                module_id = getattr(record, \"project_id\")\n                service = \"gamemode4\"\n            else:\n                continue\n\n            if module_id in library_ids: # manifests store with \"lib_\" prefix\n                module_id = module_id.replace(\"gm4_\", \"lib_\")\n\n            # init row\n            if module_id not in summary_entries:\n                last_version_num = last_versions.get(module_id, '?.?.?')\n                this_version_num = this_versions.get((\"gm4_resource_pack\" if module_id==\"resource_pack\" else module_id), '?.?.?')\n                summary_entries[module_id] = {\n                    \"name\": module_id,\n                    \"ver_update\": f\"{last_version_num} → {this_version_num}\",\n                    \"logs\": [] # list of tuples (\"smithed\", log_message)\n                }\n\n            # append to logs\n            summary_entries[module_id][\"logs\"].append((service, record.getMessage()))\n\n        # form table entries from entries\n        table = \"Module | Version Update | Logs \\n |-|:-:|-|\"\n        for entry in dict(sorted(summary_entries.items())).values():\n            nested_table = \"<details><table>\"\n            for service, message in entry['logs']:\n                nested_table += f\"<tr><td>{service}<td>{message}</tr>\"\n            nested_table += \"</table></details>\"\n\n            table += f\"\\n {entry['name']} | {entry['ver_update']} | {nested_table}\"\n\n        summary = \"# :rocket: Build Deployment Summary :rocket:\\n\"+table\n\n        if not self.summary_created:\n            env_file = os.getenv(\"GITHUB_STEP_SUMMARY\")\n            if env_file:\n                with open(env_file, \"a\") as f:\n                    f.write(summary) # python normally has no access to env variables, so we go direct to the action env file.\n                self.summary_created = True\n        self.buffer.clear()\n\n\n\ndef add_module_dir_to_diagnostics(ctx: Context):\n    \"\"\"Sets up a logging record filter that prepends the proper module folder to mecha diagnostics\"\"\"\n    local_filter = partial(add_mecha_subproject_dir, subproject_dir=ctx.directory.stem)\n    mc_logger = logging.getLogger(\"mecha\")\n    mc_logger.addFilter(local_filter)\n\n    yield\n    mc_logger.removeFilter(local_filter) # clear the filter once done (after mecha)\n\n\ndef add_mecha_subproject_dir(record: logging.LogRecord, subproject_dir: str|Path = \"\"):\n    if d:=getattr(record, \"annotate\"):\n        record.annotate = f\"{subproject_dir}/{d}\" # modify record in place\n    return True\n"
  },
  {
    "path": "gm4/plugins/autoload.py",
    "content": "from beet import Context\n\ndef beet_default(ctx: Context):\n    \"\"\"Loads plugins auto-added to every beet subproject. Configured in pyproject.toml\n    Used primarily to load custom-merge-rules that will apply between broadcast packs, at least until a better option is available in beet\"\"\"\n    ctx.require(\n        \"beet.contrib.default\",\n        \"gm4.plugins.resource_pack.merge_policy\",\n        \"gm4_metallurgy.shamir_model_template.merge_policy\"\n    )\n"
  },
  {
    "path": "gm4/plugins/backwards.py",
    "content": "import logging\nfrom typing import Any, Tuple, Callable\nfrom beet import Context, Pack, NamespaceFile\n\nlogger = logging.getLogger(\"gm4.backwards\")\n\n# Generates overlays to support older versions\ndef beet_default(ctx: Context):\n  yield\n\n\ndef backport(pack: Pack[Any], format: int, run: Callable[[str, NamespaceFile], NamespaceFile | None]):\n  resources: dict[Tuple[type[NamespaceFile], str], NamespaceFile] = dict()\n\n  for file_type in pack.resolve_scope_map().values():\n    proxy = pack[file_type]\n    for path in proxy.keys():\n      resources[(file_type, path)] = proxy[path]\n\n  for overlay in pack.overlays.values():\n    if check_formats(overlay, format):\n      for file_type in overlay.resolve_scope_map().values():\n        proxy = overlay[file_type]\n        for path in proxy.keys():\n          resources[(file_type, path)] = proxy[path]\n\n  for (file_type, path), resource in resources.items():\n    try:\n      new_resource = run(path, resource)\n    except BaseException as e:\n      e.add_note(f\"Failed to backport[{run.__name__}] {file_type.snake_name} {path}\")\n      raise e\n    if new_resource:\n      overlay = pack.overlays[f\"backport_{format}\"]\n      overlay.supported_formats = { \"min_inclusive\": 1, \"max_inclusive\": format }\n      overlay.min_format = 1\n      overlay.max_format = format\n      overlay[path] = new_resource\n\n\ndef check_formats(overlay: Pack[Any], format: int):\n  if overlay.min_format and overlay.max_format:\n    return get_major(overlay.min_format) <= format <= get_major(overlay.max_format)\n  if overlay.supported_formats:\n    match overlay.supported_formats:\n      case int(value):\n        return value == format\n      case [min, max]:\n        return min <= format <= max\n      case { \"min_inclusive\": min, \"max_inclusive\": max }:\n        return min <= format <= max\n      case _:\n        raise ValueError(f\"Unknown supported_formats structure {overlay.supported_formats}\")\n  if overlay.pack_format:\n    return overlay.pack_format == format\n  return False\n\n\ndef get_major(format: int | tuple[int] | tuple[int, int]):\n  return format if isinstance(format, int) else format[0]\n"
  },
  {
    "path": "gm4/plugins/extend.py",
    "content": "from beet import Context, subproject\nfrom pathlib import Path\nimport yaml\n\ndef _generate_extend_plugin(name: str):\n    def plugin(ctx: Context):\n        \"\"\"Extends the specified project config within a pipeline without losing necessary parent context\n            - necessary to run \"boilerplate\" plugins in the middle of a build pipeline\"\"\"\n        with open(Path(name)) as f:\n            conf = yaml.safe_load(f)\n        with ctx.override(**conf.get('meta', {})):\n            for process in conf['pipeline']: # manually call each pipeline entry as if it were in the parent config\n                if type(process) is dict: \n                    process = subproject({\"pipeline\": [process], \"meta\": conf.get('meta', {})})\n                # else, it's a plugin name str\n                ctx.require(process)\n    return plugin\n\nlibrary = _generate_extend_plugin('library.yaml')\nmodule = _generate_extend_plugin('module.yaml')\n"
  },
  {
    "path": "gm4/plugins/finished.py",
    "content": "from beet import Context\nimport logging\n\nlogger = logging.getLogger(\"gm4\")\n\ndef beet_default(ctx: Context):\n\tlogger.info(\"Finished!\")\n"
  },
  {
    "path": "gm4/plugins/include.py",
    "content": "from beet import Context, subproject\nfrom functools import cache\n\n# for importing libraries into a module, with logic to prevent double imports\n\n__path__ = \"\"\n\n@cache\ndef __getattr__(name: str): # redirect plugin calls to the right library dynamically\n    def plugin(ctx: Context):\n        # load subproject, if not already present\n        added_libs = ctx.cache['currently_building'].json['added_libs']\n        if name not in added_libs:\n            ctx.require(subproject({'directory': f'../{name}', 'extend': 'beet.yaml'}))\n            added_libs.append(name)\n    return plugin\n"
  },
  {
    "path": "gm4/plugins/manifest.py",
    "content": "import datetime\nimport hashlib\nimport json\nimport logging\nimport os\nimport sys\nfrom gzip import GzipFile\nfrom io import BytesIO\nfrom pathlib import Path\nfrom typing import Any, Optional\n\nimport yaml\nfrom beet import Context, InvalidProjectConfig, PluginOptions, TextFile, load_config, Function\nfrom beet.library.base import _dump_files  # type: ignore ; private method used to deterministicify pack dumping\nfrom nbtlib.contrib.minecraft import StructureFileData, StructureFile  # type: ignore ; no stub\nfrom pydantic import BaseModel\nfrom repro_zipfile import ReproducibleZipFile  # type: ignore ; no stub\n\nfrom gm4.plugins.versioning import VersioningConfig\nfrom gm4.utils import Version, run\n\nparent_logger = logging.getLogger(\"gm4.manifest\")\n\nSUPPORTED_GAME_VERSIONS = [\"26.1\"]\n\n# config models for beet.yaml metas\nCreditsModel = dict[str, list[str]]\n\nclass WebsiteConfig(PluginOptions):\n\tdescription: str\n\trecommended: list[str] = []\n\tnotes: list[str] = []\n\tsearch_keywords: list[str] = []\n\nclass ModrinthConfig(PluginOptions):\n\tproject_id: str\n\nclass SmithedConfig(PluginOptions):\n\tpack_id: str\n\nclass PMCConfig(PluginOptions):\n\tuid: int\n\nclass ManifestConfig(PluginOptions, extra=\"ignore\"):\n\tminecraft: list[str] = SUPPORTED_GAME_VERSIONS\n\tversioning: Optional[VersioningConfig] = None\n\t# distribution\n\twebsite: Optional[WebsiteConfig] = None\n\tmodrinth: Optional[ModrinthConfig] = None\n\tsmithed: Optional[SmithedConfig] = None\n\tpmc: Optional[PMCConfig] = None\n\t# promo\n\tvideo: str|None = None\n\twiki: str|None = None\n\tcredits: CreditsModel\n\n# models for meta.json and cached manifest\nclass ManifestModuleModel(BaseModel):\n\t\"\"\"Single module's entry in manifest\"\"\"\n\tid: str\n\tname: str\n\tversion: str\n\thash: str\n\tvideo_link: str = \"\"\n\twiki_link: str = \"\"\n\tcredits: CreditsModel\n\trequires: list[str] = []\n\tdescription: str\n\trecommends: list[str] = []\n\tminecraft: list[str] = []\n\thidden: bool = False\n\timportant_note: Optional[str]\n\tsearch_keywords: list[str] = []\n\tpublish_date: Optional[str]\n\tmodrinth_id: Optional[str]\n\tsmithed_link: Optional[str]\n\tpmc_link: Optional[int]\n\n\nclass ManifestCacheModel(BaseModel):\n\t\"\"\"describes the structure of the cached manifest\"\"\"\n\tlast_commit: str\n\tmodules: dict[str, ManifestModuleModel]\n\tlibraries: dict[str, ManifestModuleModel]\n\tbase: Any\n\tcontributors: Any\n\nclass ManifestFileModel(BaseModel):\n\t\"\"\"describes the structure of the meta.json saved to disk\"\"\"\n\tlast_commit: str\n\tmodules: list[ManifestModuleModel] # straight list for website backward compat\n\tlibraries: dict[str, ManifestModuleModel]\n\tcontributors: Any\n\n\ndef create(ctx: Context):\n\t\"\"\"Collect a manifest for all modules from respective beet.yaml files.\"\"\"\n\tmanifest = ManifestCacheModel(last_commit=run([\"git\", \"rev-parse\", \"HEAD\"]), modules={}, libraries={}, base={}, contributors=None)\n\tlogger = parent_logger.getChild(\"create\")\n\n\tfor glob, manifest_section in [(\"gm4_*\", manifest.modules), (\"lib_*\", manifest.libraries), (\"resource_pack\", manifest.modules)]:\n\t\tfor pack_id in [p.name for p in sorted(ctx.directory.glob(glob))]:\n\t\t\ttry:\n\t\t\t\tconfig = load_config(Path(pack_id) / \"beet.yaml\")\n\t\t\t\tgm4_meta = ctx.validate(\"gm4\", validator=ManifestConfig, options=config.meta[\"gm4\"]) # manually parse config into models\n\n\t\t\t\tmanifest_section[pack_id] = ManifestModuleModel(\n\t\t\t\t\tid = config.id,\n\t\t\t\t\tname = config.name,\n\t\t\t\t\tversion = config.version,\n\t\t\t\t\thash = \"\",\n\t\t\t\t\tvideo_link = gm4_meta.video or \"\",\n\t\t\t\t\twiki_link = gm4_meta.wiki or \"\",\n\t\t\t\t\tcredits = gm4_meta.credits,\n\t\t\t\t\trequires = [e for e in gm4_meta.versioning.required.keys() if not e.startswith(\"lib\")] if gm4_meta.versioning else [],\n\t\t\t\t\tdescription = gm4_meta.website.description if gm4_meta.website else \"\",\n\t\t\t\t\trecommends = gm4_meta.website.recommended if gm4_meta.website else [],\n\t\t\t\t\timportant_note = gm4_meta.website.notes[0] if gm4_meta.website and len(gm4_meta.website.notes) > 0 else None,\n\t\t\t\t\tminecraft = gm4_meta.minecraft,\n\t\t\t\t\thidden = len(gm4_meta.minecraft) == 0 or gm4_meta.website is None,\n\t\t\t\t\tpublish_date = None,\n\t\t\t\t\tsearch_keywords = gm4_meta.website.search_keywords if gm4_meta.website else [],\n\t\t\t\t\tmodrinth_id = gm4_meta.modrinth.project_id if gm4_meta.modrinth else None,\n\t\t\t\t\tsmithed_link = gm4_meta.smithed.pack_id if gm4_meta.smithed else None,\n\t\t\t\t\tpmc_link = gm4_meta.pmc.uid if gm4_meta.pmc else None,\n\t\t\t\t)\n\t\t\texcept InvalidProjectConfig as exc:\n\t\t\t\tlogger.debug(exc.explanation)\n\n\t# Read the contributors metadata\n\tcontributors_file = Path(\"gm4/contributors.json\")\n\tif contributors_file.exists():\n\t\tcontributors_list = json.loads(contributors_file.read_text())\n\t\tmanifest.contributors = {c[\"name\"]: c for c in contributors_list}\n\telse:\n\t\tlogger.debug(\"No contributors.json found\")\n\t\tmanifest.contributors = []\n\n\t# Read the gm4 base module metadata\n\tbase_file = Path(\"base/beet.yaml\")\n\tbase_config = yaml.safe_load(base_file.read_text())\n\tmanifest.base = {\"version\": base_config[\"version\"]}\n\n\t# Cache the new manifest, so sub-pipelines can access it\n\tctx.cache[\"gm4_manifest\"].json = manifest.model_dump()\n\n\t# Read in the previous manifest, if found\n\tversion = os.getenv(\"VERSION\", \"26.1\")\n\trelease_dir = Path('release') / version\n\tmanifest_file = release_dir / \"meta.json\"\n\n\tif manifest_file.exists():\n\t\tctx.cache[\"previous_manifest\"].json = json.loads(manifest_file.read_text())\n\telse:\n\t\tif not ctx.meta.get(\"gm4_dev\"):\n\t\t\tif os.getenv(\"MASTER_BUILD\"): # gh actions is building - forgetting to add a meta.json breaks things\n\t\t\t\tlogger.error(\"No existing meta.json manifest file was located. Build was cancelled to avoid faulty releases.\")\n\t\t\t\tsys.exit(1) # quit the build and mark the github action as failed\n\t\t\telse:\n\t\t\t\tlogger.warning(\"No existing meta.json manifest file was located\")\n\t\tctx.cache[\"previous_manifest\"].json = ManifestFileModel(last_commit=\"\",modules=[],libraries={},contributors=[]).model_dump()\n\n\n\ndef update_patch(ctx: Context):\n    \"\"\"Checks the datapack files for changes from last build, and increments patch number\"\"\"\n    yield\n    logger = parent_logger.getChild(\"update_patch\")\n\n    # load current manifest from cache\n    this_manifest = ManifestCacheModel.model_validate(ctx.cache[\"gm4_manifest\"].json)\n    pack = ({e.id:e for e in (this_manifest.libraries|this_manifest.modules).values()})[ctx.project_id]\n\n    # attempt to load prior meta.json manifest\n    last_manifest = ManifestFileModel.model_validate(ctx.cache[\"previous_manifest\"].json)\n    released_modules: dict[str, ManifestModuleModel] = {m.id:m for m in last_manifest.modules if m.version}|{l.id:l for l in last_manifest.libraries.values()}\n\n    # determine this modules status\n    released = released_modules.get(ctx.project_id, None)\n    last_ver = Version(released.version) if released else Version(\"0.0.0\")\n    this_ver = Version(ctx.project_version)\n    publish_date = released.publish_date if released else None\n    pack.publish_date = publish_date or datetime.datetime.now().date().isoformat()\n    old_hash = released.hash if released else \"\"\n\n    # watch for output file changes\n    fileobj = BytesIO()\n    scanned_pack = ctx.packs[0 if ctx.meta.get(\"pack_scan\")==\"resource_pack\" else 1]\n    with ReproducibleZipFile(fileobj, mode='w') as zf:\n        _dump_files(zf, sorted(scanned_pack.list_files())) # write datapack to temporary memory\n            # beet's default dump depends on file load order, which is nondeterministic\n            # here we recreate the ctx.data.dump(zf) behavior but by sorting the files first\n\n    new_hash = hashlib.sha1(fileobj.getvalue()).hexdigest()\n    pack.hash = new_hash\n\n    # first release of a module\n    if not released:\n        pack.version = pack.version.replace(\"X\", \"0\")\n        logger.debug(f\"First release of {ctx.project_id}\", extra={\"project_id\": ctx.project_id})\n\n    # otherwise check for changes\n    else:\n        if (this_ver != last_ver.replace(patch=None)) or (new_hash != old_hash): # changes were made, bump the patch\n            if this_ver.minor > last_ver.minor or this_ver.major > last_ver.major: # type: ignore\n                this_ver.patch = 0\n                logger.info(f\"Feature update for {ctx.project_id}, setting version to {this_ver}\", extra={\"gh_annotate_skip\": True, \"project_id\": ctx.project_id})\n            else:\n                this_ver.patch = last_ver.patch + 1 # type: ignore\n                logger.info(f\"Patch update for {ctx.project_id}, incrementing to {this_ver}\", extra={\"gh_annotate_skip\": True, \"project_id\": ctx.project_id})\n\n            pack.version = str(this_ver)\n\n        else: # no changes, keep the patch\n             pack.version = released.version\n\n    ctx.cache[\"gm4_manifest\"].json = this_manifest.model_dump()\n\n\ndef write_meta(ctx: Context):\n\t\"\"\"Write the updated meta.json file.\"\"\"\n\tversion = os.getenv(\"VERSION\", \"26.1\")\n\trelease_dir = Path('release') / version\n\tos.makedirs(release_dir, exist_ok=True)\n\n\tmanifest_file = release_dir / \"meta.json\"\n\tmanifest = ctx.cache[\"gm4_manifest\"].json.copy()\n\tmanifest[\"modules\"] = list(manifest[\"modules\"].values()) # convert modules dict down to list for backwards compatability\n\tmanifest.pop(\"base\")\n\tmanifest_file.write_text(json.dumps(manifest, indent=2))\n\n\ndef write_credits(ctx: Context):\n\t\"\"\"Writes the credits metadata to CREDITS.md. and collects for README.md\"\"\"\n\tmanifest = ManifestCacheModel.model_validate(ctx.cache[\"gm4_manifest\"].json)\n\tcontributors = manifest.contributors\n\tmodule = manifest.modules.get(ctx.project_id)\n\tcredits = module.credits if module else {}\n\tif len(credits) == 0:\n\t\treturn\n\n\t# traverses contributors and associates name with links for printing\n\tlinked_credits: CreditsModel = {}\n\tfor title in credits:\n\t\tpeople = credits[title]\n\t\tif len(people) == 0:\n\t\t\tcontinue\n\t\tlinked_credits[title] = []\n\t\tfor p in people:\n\t\t\tcontributor = contributors.get(p, { \"name\": p })\n\t\t\tname = contributor.get(\"name\", p)\n\t\t\tlinks: list[str] | str = contributor.get(\"links\", [])\n\t\t\tif isinstance(links, list) and len(links) >= 1:\n\t\t\t\tlinked_credits[title].append(f\"[{name}]({links[0]})\")\n\t\t\telse:\n\t\t\t\tlinked_credits[title].append(f\"{name}\")\n\n\t# format credits for CREDITS.md\n\ttext = \"# Credits\\n\"\n\tfor title in linked_credits:\n\t\ttext += f\"\\n## {title}\\n\"\n\t\tfor link in linked_credits[title]:\n\t\t\ttext += f'- {link}\\n'\n\n\tctx.data.extra[\"CREDITS.md\"] = TextFile(text)\n\tctx.meta['linked_credits'] = linked_credits # pass data to README portion of pipeline\n\n\ndef write_updates(ctx: Context):\n\t\"\"\"Writes the module update commands to this module's init function.\"\"\"\n\tfor overlay in ctx.data.overlays.values():\n\t\twrite_update_function(overlay.functions.get(f\"{ctx.project_id}:init\"), ctx)\n\twrite_update_function(ctx.data.functions.get(f\"{ctx.project_id}:init\"), ctx)\n\n\ndef write_update_function(init: Optional[Function], ctx: Context):\n\tif not init:\n\t\treturn\n\n\tmanifest = ManifestCacheModel.model_validate(ctx.cache[\"gm4_manifest\"].json)\n\tmodules = manifest.modules\n\n\tscore = f\"{ctx.project_id.removeprefix('gm4_')} gm4_modules\"\n\tversion = Version(modules[ctx.project_id].version)\n\n\t# Update score setter for this module, and add version to gm4:log\n\tlast_i=-1\n\tfor i, line in enumerate(init.lines):\n\t\tif \"gm4_modules\" in line:\n\t\t\tinit.lines[i] = line.replace(f\"{score} 1\", f\"{score} {version.int_rep()}\").replace(f\"{score} matches 1\", f\"{score} matches {version.int_rep()}\")\n\t\t\tlast_i = i\n\n\tinit.lines.insert(last_i+1, f\"data modify storage gm4:log versions append value {{id:\\\"{ctx.project_id}\\\",module:\\\"{ctx.project_name}\\\",version:\\\"{version}\\\"}}\")\n\n\t# Remove the marker if it exists\n\tif \"#$moduleUpdateList\" in init.lines:\n\t\tinit.lines.remove(\"#$moduleUpdateList\")\n\n\t# Append the module update list regardless if the marker existed\n\tinit.lines.append(\"# Module update list\")\n\tinit.lines.append(\"data remove storage gm4:log queue[{type:'outdated'}]\")\n\tfor i, m in modules.items():\n\t\tif not i.startswith(\"gm4_\"):\n\t\t\tcontinue # not a datapack (ie the rp) and has score to print\n\t\tversion = Version(m.version).int_rep()\n\t\twebsite = f\"https://gm4.co/modules/{m.id[4:].replace('_','-')}\"\n\t\tinit.lines.append(f\"execute if score {m.id} load.status matches -1.. if score {m.id.removeprefix('gm4_')} gm4_modules matches ..{version - 1} run data modify storage gm4:log queue append value {{type:'outdated',module:'{m.name}',download:'{website}',render:{{'text':'{m.name}','click_event':{{'action':'open_url','url':'{website}'}},'hover_event':{{'action':'show_text','value':{{'text':'Click to visit {website}','color':'#4AA0C7'}}}}}}}}\")\n\n\ndef repro_structure_to_bytes(content: StructureFileData) -> bytes:\n    \"\"\"a modified Structure.to_bytes from beet, which ensures the GZip does not add\n       the current time.time to the nbt file header.\n       Used for deterministic pack builds and auto-patch detection\"\"\"\n    dst = BytesIO()\n    with GzipFile(fileobj=dst, mode=\"wb\", mtime=0) as fileobj:\n        StructureFile(content).write(fileobj) # type: ignore ; nbtlib has no type annotations\n    return dst.getvalue()\n"
  },
  {
    "path": "gm4/plugins/module.py",
    "content": "from beet import Context, PngFile, Advancement\nfrom pathlib import Path\n\ndef default_pack_icon(ctx: Context):\n    \"\"\"Adds the default pack.png from base to the build, if one does not already exist\"\"\"\n    if \"pack.png\" not in ctx.data.extra:\n        ctx.data.extra[\"pack.png\"] = PngFile(source_path=Path(\"base/pack.png\"))\n\ndef gm4_root_advancement(ctx: Context):\n    \"\"\"Adds the root display advancement gm4:root, if the module has any display advancements\"\"\"\n    if len(ctx.data[\"gm4\"].advancements.keys()) > 0:\n        ctx.data.advancements[\"gm4:root\"] = Advancement(\n            {\n                \"display\": {\n                    \"icon\": {\n                        \"id\": \"command_block\",\n                        \"components\": {\n                            \"minecraft:custom_model_data\": {\n                                \"strings\": [\n                                    \"gm4:gui/advancement/root\"\n                                ]\n                            }\n                        }\n                    },\n                    \"title\": {\n                        \"translate\": \"advancement.gm4.root.title\",\n                        \"fallback\": \"Gamemode 4\"\n                    },\n                    \"description\": {\n                        \"translate\": \"advancement.gm4.root.description\",\n                        \"fallback\": \"Semi-funny blurb about GM4\",\n                        \"color\": \"gray\"\n                    },\n                    \"background\": \"block/light_blue_concrete_powder\",\n                    \"announce_to_chat\": False\n                },\n                \"criteria\": {\n                    \"automatic\": {\n                        \"trigger\": \"minecraft:tick\"\n                    }\n                }\n            }\n        )\n"
  },
  {
    "path": "gm4/plugins/output.py",
    "content": "from beet import Context\nfrom pathlib import Path\nimport os\nimport json\nimport re\nimport requests\nimport shutil\nimport logging\nfrom gm4.utils import run, Version, NoneAttribute\nfrom gm4.plugins.manifest import ManifestConfig, ManifestCacheModel\n\nparent_logger = logging.getLogger(\"gm4.output\")\n\nMODRINTH_API = \"https://api.modrinth.com/v2\"\nMODRINTH_AUTH_KEY = \"BEET_MODRINTH_TOKEN\"\nSMITHED_API = \"https://api.smithed.dev/v2\"\nSMITHED_AUTH_KEY = \"BEET_SMITHED_TOKEN\"\nUSER_AGENT = \"Gamemode4Dev/GM4_Datapacks/release-pipeline (gamemode4official@gmail.com)\"\n\n\ndef beet_default(ctx: Context):\n\t\"\"\"Saves the datapack to the ./out folder in it's exit phase.\n\t \tShould be first in pipeline to properly wrap all other plugins cleanup phases\"\"\"\n\tversion = os.getenv(\"VERSION\", \"26.1\")\n\tout_dir = Path(\"out\")\n\n\tyield # wait for exit phase, after other plugins cleanup\n\n\tctx.data.save(\n\t\tpath=out_dir / f\"{ctx.project_id}_{version.replace('.', '_')}\",\n\t\toverwrite=True,\n\t)\n\ndef resource_pack(ctx: Context):\n\t\"\"\"Saves the resourcepack to the ./out folder.\"\"\"\n\tversion = os.getenv(\"VERSION\", \"26.1\")\n\tout_dir = Path(\"out\")\n\n\tctx.assets.save(\n\t\tpath=out_dir / f\"gm4_resource_pack_{version.replace('.', '_')}\",\n\t\toverwrite=True\n\t)\n\ndef release_resource_pack(ctx: Context):\n\t\"\"\"Saves the resourcepack to the ./out folder.\"\"\"\n\tversion = os.getenv(\"VERSION\", \"26.1\")\n\trelease_dir = Path(\"release\") / version\n\n\tyield\n\n\tctx.assets.save(\n\t\tpath=release_dir / f\"gm4_resource_pack_{version.replace('.', '_')}.zip\",\n\t\toverwrite=True,\n\t\tzipped=True\n\t)\n\n\ndef test(ctx: Context):\n\t\"\"\"Saves the zipped datapack to the ./out folder in it's exit phase.\n\t \tShould be first in pipeline to properly wrap all other plugins cleanup phases\"\"\"\n\tout_dir = Path(\"out\")\n\n\tyield # wait for exit phase, after other plugins cleanup\n\n\tctx.data.save(\n\t\tpath=out_dir / ctx.project_id,\n\t\toverwrite=True,\n\t\tzipped=True,\n\t)\n\n\ndef release(ctx: Context):\n\t\"\"\"\n\tSaves the zipped datapack and metadata to the ./release/{version} folder.\n\t\tShould be first in pipeline to properly wrap all other plugins cleanup phases\n\n\tIf the module has the `version` and `meta.modrinth.project_id` fields, and\n\t`BEET_MODRINTH_TOKEN` environment variable is set, will try to publish a\n\tnew version to Modrinth if it doesn't already exist.\n\n\tSimilarly, if the module has the `version` and `meta.smithed.pack_id` fields, and\n\t`BEET_SMITHED_TOKEN` environment variable is set, will try to publish a\n\tnew version to Smithed if it doesn't already exist.\n\t\"\"\"\n\tversion_dir = os.getenv(\"VERSION\", \"26.1\")\n\trelease_dir = Path(\"release\") / version_dir\n\n\tcorrected_project_id = stem if (stem:=ctx.directory.stem).startswith(\"lib\") else ctx.project_id\n\n\tfile_name = f\"{corrected_project_id}_{version_dir.replace('.', '_')}.zip\"\n\n\tyield # wait for exit phase, after other plugins cleanup\n\n\tctx.data.save(\n\t\tpath=release_dir / file_name,\n\t\toverwrite=True,\n\t\tzipped=True,\n\t)\n\n\tgenerated_dir = release_dir / \"generated\"\n\n\tpack_icon_dir = generated_dir / \"pack_icons\"\n\tos.makedirs(pack_icon_dir, exist_ok=True)\n\tif \"pack.png\" in ctx.data.extra:\n\t\tctx.data.extra[\"pack.png\"].dump(pack_icon_dir, f\"{corrected_project_id}.png\")\n\n\tsmithed_readme_dir = generated_dir / \"smithed_readmes\"\n\tos.makedirs(smithed_readme_dir, exist_ok=True)\n\tif \"smithed_readme\" in ctx.meta:\n\t\tctx.meta['smithed_readme'].dump(smithed_readme_dir, f\"{corrected_project_id}.md\")\n\n\tconfig = ctx.validate(\"gm4\", ManifestConfig)\n\n\t# publish to download platforms\n\tpublish_modrinth(ctx, config, release_dir, file_name)\n\tpublish_smithed(ctx, config, file_name)\n\n\ndef publish_modrinth(ctx: Context, config: ManifestConfig, release_dir: Path, file_name: str):\n\t'''Attempts to publish pack to modrinth'''\n\tauth_token = os.getenv(MODRINTH_AUTH_KEY, None)\n\tlogger = parent_logger.getChild(f\"modrinth.{ctx.project_id}\")\n\tif config.modrinth and auth_token:\n\t\t# update page description\n\t\tres = requests.get(f\"{MODRINTH_API}/project/{config.modrinth.project_id}\", headers={'Authorization': auth_token, 'User-Agent': USER_AGENT})\n\t\tif not (200 <= res.status_code < 300):\n\t\t\tif res.status_code == 404:\n\t\t\t\tlogger.warning(f\"Cannot edit description of modrinth project {config.modrinth.project_id} as it doesn't exist.\")\n\t\t\telse:\n\t\t\t\tlogger.warning(f\"Failed to get project: {res.status_code} {res.text}\")\n\t\t\treturn\n\t\texisting_readme = res.json()[\"body\"]\n\t\tif existing_readme != (d:=ctx.meta['modrinth_readme'].text):\n\t\t\tlogger.debug(\"Readme and modrinth-page content differ. Updating webpage body\")\n\t\t\tres = requests.patch(f\"{MODRINTH_API}/project/{config.modrinth.project_id}\", headers={'Authorization': auth_token, 'User-Agent': USER_AGENT}, json={\"body\": d})\n\t\t\tif not (200 <= res.status_code < 300):\n\t\t\t\tlogger.warning(f\"Failed to update description: {res.status_code} {res.text}\")\n\t\t\tlogger.info(f\"Successfully updated description of {ctx.project_name}\", extra={\"gh_annotate_skip\": True})\n\n\t\t# upload datapack zip\n\t\tif ctx.project_version:\n\t\t\tversion = ctx.cache[\"gm4_manifest\"].json[\"modules\"].get(ctx.project_id, {}).get(\"version\", None)\n\t\t\tif version is None:\n\t\t\t\tlogger.warning(\"Full version number not available in ctx.meta. Skipping publishing\")\n\t\t\t\treturn\n\n\t\t\tres = requests.get(f\"{MODRINTH_API}/project/{config.modrinth.project_id}/version\", headers={'Authorization': auth_token, 'User-Agent': USER_AGENT})\n\t\t\tif not (200 <= res.status_code < 300):\n\t\t\t\tif res.status_code == 404:\n\t\t\t\t\tlogger.warning(f\"Cannot publish to modrinth project {config.modrinth.project_id} as it doesn't exist.\")\n\t\t\t\telse:\n\t\t\t\t\tlogger.warning(f\"Failed to get project versions: {res.status_code} {res.text}\")\n\t\t\t\treturn\n\t\t\tproject_data = res.json()\n\n\t\t\tmatching_version = next((v for v in project_data if v[\"version_number\"] == str(version)), None)\n\t\t\tif matching_version is not None: # patch version already exists\n\t\t\t\t# update mc versions if necessary\n\t\t\t\tif len(config.minecraft) > 0 and not set(matching_version[\"game_versions\"]) == set(config.minecraft):\n\t\t\t\t\t# supported versions has changed and is not empty\n\t\t\t\t\tlogger.debug(\"Additional MC version support has been added to an existing patch version. Updating existing modrinth version data\")\n\t\t\t\t\tres = requests.patch(f\"{MODRINTH_API}/version/{matching_version['id']}\", headers={'Authorization': auth_token, 'User-Agent': USER_AGENT}, json={\n\t\t\t\t\t\t\"game_versions\": config.minecraft\n\t\t\t\t\t})\n\t\t\t\t\tif not (200 <= res.status_code < 300):\n\t\t\t\t\t\tlogger.warning(f\"Failed to patch project versions: {res.status_code} {res.text}\")\n\t\t\t\treturn\n\n\t\t\tif len(config.minecraft) > 0:\n\t\t\t\t# supported versions is not empty, post new version\n\t\t\t\twith open(release_dir / file_name, \"rb\") as f:\n\t\t\t\t\tfile_bytes = f.read()\n\n\t\t\t\tchangelog = run([\"git\", \"log\", \"-1\", \"--format=%s\"])\n\t\t\t\tchangelog = re.sub(r\"\\(#(\\d+)\\)\", \"([#\\\\1](https://github.com/Gamemode4Dev/GM4_Datapacks/pull/\\\\1))\", changelog)\n\n\t\t\t\tres = requests.post(f\"{MODRINTH_API}/version\", headers={'Authorization': auth_token, 'User-Agent': USER_AGENT}, files={\n\t\t\t\t\t\"data\": json.dumps({\n\t\t\t\t\t\t\"name\": f\"{ctx.project_name} v{version}\",\n\t\t\t\t\t\t\"version_number\": version,\n\t\t\t\t\t\t\"changelog\": changelog,\n\t\t\t\t\t\t\"dependencies\": [],\n\t\t\t\t\t\t\"game_versions\": config.minecraft,\n\t\t\t\t\t\t\"version_type\": \"release\",\n\t\t\t\t\t\t\"loaders\": [\"datapack\"],\n\t\t\t\t\t\t\"featured\": False,\n\t\t\t\t\t\t\"project_id\": config.modrinth.project_id,\n\t\t\t\t\t\t\"file_parts\": [file_name],\n\t\t\t\t\t}),\n\t\t\t\t\tfile_name: file_bytes,\n\t\t\t\t})\n\t\t\t\tif not (200 <= res.status_code < 300):\n\t\t\t\t\tlogger.warning(f\"Failed to publish new version version: {res.status_code} {res.text}\")\n\t\t\t\t\treturn\n\t\t\t\tlogger.info(f\"Successfully published {res.json()['name']}\", extra={\"gh_annotate_skip\": True})\n\n\ndef publish_smithed(ctx: Context, config: ManifestConfig, file_name: str):\n\t\"\"\"Attempts to publish pack to smithed\"\"\"\n\tauth_token = os.getenv(SMITHED_AUTH_KEY, None)\n\tlogger = parent_logger.getChild(f\"smithed.{ctx.project_id}\")\n\tmc_version_dir = os.getenv(\"VERSION\", \"26.1\")\n\tmanifest = ManifestCacheModel.model_validate(ctx.cache[\"gm4_manifest\"].json)\n\tproject_id = stem if (stem:=ctx.directory.stem).startswith(\"lib\") else ctx.project_id\n\n\tif config.smithed and auth_token:\n\t\tversion = (manifest.modules|manifest.libraries).get(project_id, NoneAttribute()).version or \"\"\n\n\t\t# get project data and existing versions\n\t\tres = requests.get(f\"{SMITHED_API}/packs/{config.smithed.pack_id}\")\n\t\tif not (200 <= res.status_code < 300):\n\t\t\tif res.status_code == 404:\n\t\t\t\tlogger.warning(f\"Cannot publish to smithed project {config.smithed.pack_id} as it doesn't exist.\")\n\t\t\telse:\n\t\t\t\tlogger.warning(f\"Failed to get project: {res.status_code} {res.text}\")\n\t\t\treturn\n\n\t\tproject_data = res.json()\n\n\t\t# update description and pack image\n\t\t\t# ensures they point to the most up-to-date mc version branch\n\t\tproject_versions = project_data[\"versions\"]\n\t\tnewest_version = sorted([Version(v[\"name\"]) for v in project_versions])[-1]\n\t\tif Version(version) > newest_version: # only update the description if we're not patching an old version\n\t\t\tproject_display = project_data[\"display\"]\n\t\t\tcurrent_icon = f\"https://raw.githubusercontent.com/Gamemode4Dev/GM4_Datapacks/release/{mc_version_dir}/generated/pack_icons/{project_id}.png\"\n\t\t\tcurrent_readme = f\"https://raw.githubusercontent.com/Gamemode4Dev/GM4_Datapacks/release/{mc_version_dir}/generated/smithed_readmes/{project_id}.md\"\n\n\t\t\tif project_display[\"icon\"] != current_icon or project_display[\"webPage\"] != current_readme:\n\t\t\t\tlogger.debug(\"Pack Icon or Readme hyperlink is incorrect. Updating project\")\n\t\t\t\tres = requests.patch(f\"{SMITHED_API}/packs/{config.smithed.pack_id}\", params={'token': auth_token},\n\t\t\t\t\tjson={\"data\": {\n\t\t\t\t\t\t\t\"display\": {\n\t\t\t\t\t\t\t\t\"icon\": current_icon,\n\t\t\t\t\t\t\t\t\"webPage\": current_readme,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t}})\n\t\t\t\tif not (200 <= res.status_code < 300):\n\t\t\t\t\tlogger.warning(f\"Failed to update descripion: {res.status_code} {res.text}\")\n\t\t\t\tlogger.info(f\"{ctx.project_name} {res.text}\", extra={\"gh_annotate_skip\": True})\n\n\t\tmatching_version = next((v for v in project_versions if v[\"name\"] == str(version)), None)\n\t\tif matching_version is not None: # patch version already exists\n\t\t\t# update MC version if necessary\n\t\t\tif len(config.minecraft) > 0 and not set(matching_version[\"supports\"]) == set(config.minecraft):\n\t\t\t\t# supported versions has changed and is not empty\n\t\t\t\tlogger.debug(\"Additional MC version support has been added to an existing patch version. Updating existing smithed version data\")\n\t\t\t\tres = requests.patch(f\"{SMITHED_API}/packs/{config.smithed.pack_id}/versions/{matching_version['name']}\", params={'token': auth_token}, json={\n\t\t\t\t\t\"data\": {\n\t\t\t\t\t\t\"supports\": config.minecraft\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif not (200 <= res.status_code < 300):\n\t\t\t\t\tlogger.warning(f\"Failed to patch project versions: {res.status_code} {res.text}\")\n\t\t\treturn\n\n\t\t# permalink previous version (in that MC version) to the git history\n\t\tcommit_hash = run(\"cd release && git log -1 --format=%H\")\n\t\tmatching_mc_versions = sorted((Version(v[\"name\"]) for v in project_versions if set(v['supports']) & set(config.minecraft)))\n\t\tprior_version_in_mc_version = matching_mc_versions[-1] if len(matching_mc_versions) > 0 else None # newest version number, with any MC overlap\n\t\tprior_url: str = next((v[\"downloads\"][\"datapack\"] for v in project_versions if Version(v[\"name\"]) == prior_version_in_mc_version), \"\")\n\t\tif \"https://github.com/Gamemode4Dev/GM4_Datapacks/blob/\" not in prior_url and prior_version_in_mc_version:\n\t\t\tres = requests.patch(f\"{SMITHED_API}/packs/{config.smithed.pack_id}/versions/{prior_version_in_mc_version}\", params={'token': auth_token}, json={\n\t\t\t\t\"data\":{\n\t\t\t\t\t\"downloads\": {\n\t\t\t\t\t\"datapack\": f\"https://github.com/Gamemode4Dev/GM4_Datapacks/blob/{commit_hash}/{mc_version_dir}/{file_name}?raw=true\",\n\t\t\t\t\t\"resourcepack\": \"\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\tif not (200 <= res.status_code < 300):\n\t\t\t\tlogger.warning(f\"Failed to permalink {project_id} version {prior_version_in_mc_version}: {res.status_code} {res.text}\")\n\t\t\telse:\n\t\t\t\tlogger.info(f\"Permalinked {project_id} {prior_version_in_mc_version} to git history: {res.text}\", extra={\"gh_annotate_skip\": True})\n\n\t\tif len(config.minecraft) > 0:\n\t\t\t# supported versions is not empty, post new version\n\t\t\tres = requests.post(f\"{SMITHED_API}/packs/{config.smithed.pack_id}/versions\",\n\t\t\t\t\tparams={'token': auth_token, 'version': version},\n\t\t\t\tjson={\"data\":{\n\t\t\t\t\t\"downloads\":{\n\t\t\t\t\t\t\"datapack\": f\"https://raw.githubusercontent.com/Gamemode4Dev/GM4_Datapacks/release/{mc_version_dir}/{file_name}\",\n\t\t\t\t\t\t\"resourcepack\": \"\"\n\t\t\t\t\t},\n\t\t\t\t\t\"name\": version,\n\t\t\t\t\t\"supports\": config.minecraft,\n\t\t\t\t\t\"dependencies\": []\n\t\t\t\t}}\n\t\t\t)\n\t\t\tif not (200 <= res.status_code < 300):\n\t\t\t\tlogger.warning(f\"Failed to publish new version of {ctx.project_name}: {res.status_code} {res.text}\")\n\t\t\t\treturn\n\t\t\tlogger.info(f\"{ctx.project_name} {res.text}\", extra={\"gh_annotate_skip\": True})\n\n\ndef clear_release(ctx: Context):\n\t\"\"\"\n\tEmpties the release folder preparing it to be overwritten. This makes sure that\n\t1. Deleted modules no longer stick around in the current version\n\t2. Changes to the build system (such as renamed files/folders) are properly reflected\n\t\"\"\"\n\tversion = os.getenv(\"VERSION\", \"26.1\")\n\trelease_dir = Path(\"release\") / version\n\tshutil.rmtree(release_dir, ignore_errors=True)\n\tos.makedirs(release_dir, exist_ok=True)\n\n\ndef readmes(ctx: Context):\n\t\"\"\"Saves all READMEs intended for download sites to the ./out/readmes folder.\"\"\"\n\n\treadme_dir = Path(\"out/readmes\")\n\tbase_path = readme_dir / ctx.project_id\n\n\tif \"README.md\" in ctx.data.extra:\n\t\tos.makedirs(base_path, exist_ok=True)\n\t\tctx.data.extra[\"README.md\"].dump(base_path, \"GM4_README.md\")\n\telse:\n\t\tparent_logger.info(f\"[GM4] {ctx.project_id} has no README.md\")\n\n\tfor file, ext in {\"modrinth_readme\":\"md\", \"smithed_readme\":\"md\", \"pmc_readme\":\"txt\"}.items():\n\t\tif file in ctx.meta:\n\t\t\tctx.meta[file].dump(base_path, f\"{file.upper()}.{ext}\")\n"
  },
  {
    "path": "gm4/plugins/player_heads.py",
    "content": "import base64\nimport hashlib\nimport json\nimport logging\nimport os\nimport sys\nimport time\nfrom dataclasses import replace\nfrom io import BytesIO\nfrom typing import Any, Callable, ClassVar\n\nimport requests\nfrom beet import Context, FileDeserialize, JsonFile, PngFile, NamespaceFileScope\nfrom mecha import Diagnostic, Mecha, MutatingReducer, rule\nfrom mecha.ast import (\n    AstJsonObject,\n    AstJsonObjectEntry,\n    AstJsonObjectKey,\n    AstNbtCompound,\n    AstNbtCompoundEntry,\n    AstNbtCompoundKey,\n    AstNbtValue,\n)\nfrom nbtlib import String # type: ignore\nfrom PIL.Image import Image\n\nparent_logger = logging.getLogger(\"gm4.player_heads\")\n\nUSER_AGENT = \"Gamemode4Dev/GM4_Datapacks/player_head_management (gamemode4official@gmail.com)\"\nMISSING_TEXTURE_SKIN = \"eyJ0ZXh0dXJlcyIgOiB7ICJTS0lOIiA6IHsgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9kYWUyOTA0YTI4NmI5NTNmYWI4ZWNlNTFkNjJiZmNjYjMyY2IwMjc0OGY0NjdjMDBiYzMxODg1NTk4MDUwNThiIn19fQ==\"\n\ndef beet_default(ctx: Context):\n    ctx.data.extend_namespace.append(Skin) # register new filetype to datapack\n    tf = ctx.inject(SkinNbtTransformer)\n    ctx.inject(Mecha).transform.extend(tf) # register new ruleset to mecha\n    ctx.require(\"mecha.contrib.json_files\")\n\n    yield\n    tf.cache_nonnative_references()\n    tf.log_unused_textures()\n    tf.output_skin_cache()\n    ctx.data[Skin].clear() # cleanup skin files from output pack\n\nclass Skin(PngFile):\n    \"\"\"Class representing a skin texture file.\"\"\"\n    scope: ClassVar[NamespaceFileScope] = (\"skins\",)\n    extension: ClassVar[str] = \".png\"\n    image: ClassVar[FileDeserialize[Image]] = FileDeserialize() # purely here to solve type-warnings on PIL images\n    \n\nclass SkinNbtTransformer(MutatingReducer):\n    \"\"\"Reducer class defining custom mecha parsing rules for skin texture data, and storing needed data for those operations\"\"\"\n    def __init__(self, ctx: Context):\n        self.ctx: Context = ctx\n        self.skin_cache = JsonFile(source_path=\"gm4/skin_cache.json\").data\n        self.used_textures: list[str] = []\n        super().__init__()\n\n    @rule(AstJsonObjectEntry, key=AstJsonObjectKey(value='minecraft:profile'))\n    def json_substitutions(self, node: AstJsonObjectEntry, **kwargs: Any):\n        reference = node.value.evaluate()\n        if isinstance(reference, str) and reference.startswith(\"$\"):\n            skin_val, uuid, d = self.retrieve_texture(reference, **kwargs)\n            if d:\n                yield d\n            node = replace(node, value=AstJsonObject.from_value({\n                \"id\": uuid,\n                \"properties\": [\n                    {\n                        \"name\": \"textures\",\n                        \"value\": skin_val,\n                    }\n                ]\n            }))\n        return node\n\n    @rule(AstNbtCompoundEntry, key=AstNbtCompoundKey(value='minecraft:profile'))\n    def cmd_substitutions_nbt(self, node: AstNbtCompoundEntry, **kwargs: Any):\n        if isinstance(node.value, AstNbtValue) and isinstance(node.value.value, String) and node.value.value.startswith(\"$\"):\n            skin_val, uuid, d = self.retrieve_texture(node.value.value, **kwargs)\n            if d:\n                yield d\n            node = replace(node, value=AstNbtCompound.from_value({\n                \"id\": uuid,\n                \"properties\": [\n                    {\n                        \"name\": \"textures\",\n                        \"value\": skin_val,\n                    }\n                ]\n            }))\n        return node\n\n\n    def retrieve_texture(self, skin_name: str, **kwargs: Any) -> tuple[str, list[int], Diagnostic|None]:\n        skin_name = skin_name.lstrip(\"$\")\n        if \":\" not in skin_name:\n            skin_name = f\"{self.ctx.project_id}:{skin_name}\"\n        self.used_textures.append(skin_name)\n        cached_data = self.skin_cache[\"skins\"].get(skin_name, {\"hash\": None, \"parent_module\": self.ctx.project_id})\n\n        if cached_data[\"parent_module\"] == self.ctx.project_id: # if the skin belongs to another module, just trust the cache to be right. The skin.png file isn't available to check\n            try:\n                skin_file: Skin = self.ctx.data[Skin][skin_name]\n            except KeyError:\n                d = Diagnostic(\"error\", f\"Unknown skin \\'{skin_name}\\'\",\n                                filename=kwargs.get(\"filename\"),\n                                file=kwargs.get(\"file\")\n                                )\n                return MISSING_TEXTURE_SKIN, [0,0,0,0], d\n            else:\n                skin_hash = hashlib.sha1(skin_file.image.tobytes()).hexdigest() #type: ignore\n\n                if skin_hash != cached_data[\"hash\"]:\n                    # the image file contents have changed - upload the new image\n                    value, uuid = self.mineskin_upload(skin_file, f\"{skin_name.split(':')[-1]}.png\")\n                    if value is None or uuid is None:\n                        return MISSING_TEXTURE_SKIN, [0,0,0,0], None # skin upload failed, don't cache the result and return missing texture\n                    self.skin_cache[\"skins\"][skin_name] = {\n                        \"uuid\": uuid,\n                        \"value\": value,\n                        \"hash\": skin_hash,\n                        \"parent_module\": self.ctx.project_id\n                    }\n                    return value, uuid, None\n        return cached_data[\"value\"], cached_data[\"uuid\"], None\n\n    def mineskin_upload(self, skin: Skin, filename: str) -> tuple[str|None, list[int]|None]:\n        logger = parent_logger.getChild(f\"mineskin_upload.{self.ctx.project_id}\")\n        if os.getenv(\"GITHUB_ACTIONS\"):\n            logger.error(f\"Failed to upload {filename}. Github Actions cannot upload skins via the mineskin api\")\n            sys.exit(1) # quit the build and mark the github action as failed\n\n        token = self.ctx.inject(MineskinAuthManager).token\n\n        buf = BytesIO()\n        skin.image.save(buf, format=\"PNG\") # type: ignore\n        res = requests.post(   \n            url='https://api.mineskin.org/generate/upload',\n            data={\"name\":\"GM4_Skin\", \"visibility\":0},\n            files={\"file\":(filename, buf.getvalue(), 'text/x-spam')},\n            headers={\"User-Agent\": USER_AGENT, \"Authorization\": \"Bearer \"+token}\n        )\n        if res.status_code == 429:\n            logger.info(f\"Mineskin request ratelimited! Waiting and trying again\")\n            next_request_time = res.json()[\"nextRequest\"]\n            wait_time = max(next_request_time - time.time(), 0)\n            time.sleep(wait_time)\n            return self.mineskin_upload(skin, filename)\n        elif res.status_code != 200:\n            logger.error(f\"Mineskin upload failed: {res.status_code} {res.text}\")\n            return None, None\n        logger.info(f\"New skin texture \\'{filename}\\' successfully uploaded via Mineskin\")\n        \n        # strip out unnecessary fields encoded within texture value\n        value = res.json()[\"data\"][\"texture\"][\"value\"]\n        decoded_value = json.loads(base64.b64decode(value).decode('utf-8'))\n        trimmed_decoded_value = {\"textures\": {\"SKIN\": {\"url\": decoded_value[\"textures\"][\"SKIN\"][\"url\"]}}}\n        trimmed_value = str(base64.b64encode(str(trimmed_decoded_value).encode('utf-8')), 'utf-8')\n\n        # split hex uuid into 4 ints\n        uuid = res.json()[\"uuid\"]\n        i = range(0,33,8)\n        segmented_uuid = [uuid[a:b] for a,b in zip(i, i[1:])]\n        signed_int: Callable[[str], int] = lambda s: int.from_bytes(bytes.fromhex(s), byteorder=\"big\", signed=True)\n        uuid_arr = list(map(signed_int, segmented_uuid))\n        return trimmed_value, uuid_arr\n    \n    def log_unused_textures(self):\n        logger = parent_logger.getChild(self.ctx.project_id)\n        cached_member_textures = [e for e in self.skin_cache[\"skins\"].keys() if e.split(\":\")[0] == self.ctx.project_id]\n        for tex in set(cached_member_textures) - set(self.used_textures):\n            logger.info(f\"Cached skin texture {tex} is not referenced. Consider manually cleaning up skin_cache.json\")\n    \n    def cache_nonnative_references(self):\n        \"\"\"Adds any skin references from another module into skin_cache.json, so changes can trigger patch increments\"\"\"\n        if (nonnative_refs := set(self.used_textures) - set(self.ctx.data[Skin])):\n            self.skin_cache[\"nonnative_references\"][self.ctx.project_id] = sorted(nonnative_refs)\n        else:\n            self.skin_cache[\"nonnative_references\"].pop(self.ctx.project_id, None)\n\n    def output_skin_cache(self):\n        JsonFile(self.skin_cache).dump(origin=\"\", path=\"gm4/skin_cache.json\")\n\nclass MineskinAuthManager():\n    \"\"\"A process for managing mineskin access credentials, prompting the user if needed\"\"\"\n    def __init__(self, ctx: Context):\n        token_cache = ctx.cache.get(\"mineskin\").json.get(\"token\") # type: ignore , cache.get ensures cache exists\n\n        if token_cache is None:\n            # request token from user\n            print((\"\\033[93mThis build has detected a changed skin file, but no Mineskin API key is available locally.\\n\\t\"\n                  \"Visit mineskin.org/account, login or create an account with google, and create an API key.\\n\\t\"\n                  \"Beet will cache your token locally, but save the api key and key secret in a secure location in case the cache resets.\\n\\t\"\n                  \"You do not need to provide mineskin with your Minecraft account details unless you wish to\\033[0m.\"))\n            self.token = input(\"API Key >>\")\n            ctx.cache[\"mineskin\"].json = {\"token\": self.token}\n            return\n        self.token = token_cache\n"
  },
  {
    "path": "gm4/plugins/prefabs.py",
    "content": "from beet import Context, PluginOptions, configurable\nfrom beet.contrib.find_replace import find_replace\nfrom beet.contrib.rename_files import rename_files\nimport nbtlib # type: ignore ; no stub file\nimport re\nfrom gm4.plugins.manifest import repro_structure_to_bytes\n\n\nclass PrefabConfig(PluginOptions, extra=\"ignore\"):\n    prefabs: list[str]\n\ndef beet_default(ctx: Context):\n    \"\"\"Handles renaming of prefab assets as they merge into a for modules use\"\"\"\n    prefab_namespace = ctx.project_id\n    module_namsepace = ctx.cache[\"currently_building\"].json[\"id\"]\n\n    structure_deep_rename(ctx, prefab_namespace, module_namsepace)\n\n@configurable(\"gm4\", validator=PrefabConfig)\ndef module_asset_rename(ctx: Context, opts: PrefabConfig):\n    \"\"\"Handles renaming of prefab assets already present in module folder\"\"\"\n    for prefab in opts.prefabs:\n        structure_deep_rename(ctx, prefab, ctx.project_id)\n\ndef structure_deep_rename(ctx: Context, find_namespace: str, repl_namespace: str):\n    \"\"\"Renames and updates file references, including those contained within structure block data such as loot tables and structure pools\"\"\"\n    # rename files\n    ctx.require(rename_files(data_pack={\n        \"match\": \"*\",\n        \"find\": f\"{find_namespace}:([a-z0-9_/]+)\",\n        \"replace\": f\"{repl_namespace}:\\\\1\"\n    }))\n\n    # rename text-file references\n    ctx.require(find_replace(data_pack={\"match\": \"*\"}, substitute={\n        \"find\": f\"{find_namespace}:([a-z0-9_/]+)\",\n        \"replace\": f\"{repl_namespace}:\\\\1\"\n    }))\n\n    # rename structure-file references\n    for s in ctx.data.structures:\n        blocks = ctx.data.structures[s].data[\"blocks\"].snbt() # type: ignore ; nbtlib typing missing\n        updated_blocks_data = re.sub(f\"{find_namespace}:([a-z0-9_/]+)\", f\"{repl_namespace}:\\\\1\", blocks) # type: ignore ; nbtlib typing missing\n        ctx.data.structures[s].serializer = repro_structure_to_bytes\n        ctx.data.structures[s].data[\"blocks\"] = nbtlib.parse_nbt(updated_blocks_data) # type: ignore ; nbtlib typing missing\n"
  },
  {
    "path": "gm4/plugins/readme_generator.py",
    "content": "from beet import Context, TextFile, configurable\nimport re\nfrom pathlib import Path\nfrom typing import Any\nfrom gm4.plugins.manifest import write_credits, ManifestConfig\n\n@configurable(\"gm4\", validator=ManifestConfig)\ndef beet_default(ctx: Context, opts: ManifestConfig):\n    \"\"\"Loads the README.md and modifies:\n        - converts local images to URLs pointed at the repo\n        - download links for respective download sites\n        - pulls credits from beet.yaml and contributors.json\n        - pulls YT link from beet.yaml\n        - performs some site-specific replacements\n        - generates a BBCode translation of the markdown file\"\"\"\n    readme_path = Path(ctx.project_id) / \"README.md\"\n    if not readme_path.exists():\n        return\n    global_readme = TextFile(source_path=readme_path)\n    global_contents = global_readme.text\n    running_readme_gen = ctx.meta.get(\"readme-gen\", False) # used to disable pmc replacements on normal release\n    global_replacements: dict[str, str] = {}\n\n    # Append standard footer content\n    footer = \"\\n### More Info\\n\"\n        # Youtube Info\n    if opts.video is not None:\n        footer += (\n            f\"[<img src=\\\"https://raw.githubusercontent.com/Gamemode4Dev/GM4_Datapacks/master/base/images/youtube_logo.png\\\" \"\n            f\"alt=\\\"Youtube Logo\\\" width=\\\"40\\\" align=\\\"center\\\"/> \"\n            f\"**Watch on Youtube**]({opts.video})\"\n            \"\\n\\n\"\n        )\n\n        # Wiki Info\n    footer += (\n        f\"[<img src=\\\"https://raw.githubusercontent.com/Gamemode4Dev/GM4_Datapacks/master/base/images/gm4_wiki_logo.png\\\" \"\n        f\"alt=\\\"Gamemode 4 Wiki Logo\\\" width=\\\"40\\\" align=\\\"center\\\"/> \"\n        f\"**Read the Wiki**]({opts.wiki})\"\n        \"\\n\\n\"\n    )\n\n    footer += \"### Credits\\n\"\n\n        # Credits\n    ctx.require(write_credits) # requires data from traversing credits files\n    linked_credits = ctx.meta['linked_credits']\n    credits_text = \"\"\n    for title in linked_credits:\n        credits_text += f\"- {title}: {', '.join(linked_credits[title])}\\n\"\n    footer += credits_text\n\n        # Info Blurb\n    footer += (\n        \"\\n---\\n\"\n        \"## About Gamemode 4 <img src=\\\"https://raw.githubusercontent.com/Gamemode4Dev/GM4_Datapacks/master/base/images/gm4_logo.png\\\"\"\n            \" alt=\\\"Gamemode 4 Logo\\\" width=\\\"20\\\"/>\\n\"\n        \"Gamemode 4 is a series of command-powered creations that are designed to change and enhance the survival experience. \"\n        \"All of our modules are designed to work together flawlessly, and are balanced for usage in a survival setting. \"\n        \"Pick and choose your favorites from our [website](https://gm4.co), or wherever you get datapacks.\"\n    )\n\n    global_contents += footer\n    \n    # Local Images to raw.githubusercontent URLs\n    global_replacements.update({\n        r\"([!<].*?[\\\"(])(.*?)([\\\")].*) *<!-- *\\$localAssetToURL[ -]+?>\":\n            f\"\\\\1https://raw.githubusercontent.com/Gamemode4Dev/GM4_Datapacks/master/{ctx.project_id}/\\\\2\\\\3\"\n    })\n\n    # Header Title\n    global_replacements.update({\n        r'#? *(.+?) *<!-- *\\$headerTitle.+?>' : (\n            \"# <img src=\\\"https://raw.githubusercontent.com/Gamemode4Dev/GM4_Datapacks/master/base/images/gm4_logo.png\\\"\"\n                \" alt=\\\"GM4 Logo\\\" width=\\\"32\\\" />\"\n            r\" \\1 by Gamemode 4\"\n        )\n    })\n\n    # Recommended modules dynamic linking; to gm4.co, serves as fallback link if modrinth post does not exist\n    rec_modules = re.findall(r\"\\[(.+)\\]\\(\\$dynamicLink:(\\w+)\\)\", global_contents)\n    for m in [m for _, m in rec_modules]:\n        global_replacements.update({\n            f\"\\\\[(.+)\\\\]\\\\((\\\\$dynamicLink:{m})\\\\)\": f\"[\\\\1](https://gm4.co/modules/{m[4:].replace('_','-')})<!--$dynamicLink:{m}-->\"\n        })\n\n    # Perform global replacements\n    for pattern, repl in global_replacements.items():\n        global_contents = re.sub(pattern, repl, global_contents)\n\n    # download-site specific edits\n    site_replacements: dict[str, dict[str, str]] = {\n        \"gm4\": {},\n        \"modrinth\": {},\n        \"smithed\": {},\n        \"pmc\": {}\n    }\n\n    # Remove lingering comments in main readme\n    site_replacements[\"gm4\"].update({r\"\\n?<!--.+?-->\": \"\"})\n\n    # Recommended modules dynamic linking; from gm4.co to modrinth/smithed/pmc\n    manifest = ctx.cache[\"gm4_manifest\"].json\n    rec_modules = re.findall(r\"\\(.+\\)<!--\\$dynamicLink:(.+)-->\", global_contents)\n        # TODO relative links, if they are better\n    for m in rec_modules:\n        manifest_m_entry: dict[str, Any] = manifest[\"modules\"].get(m, {})\n        if (v:=manifest_m_entry.get('modrinth_id')):\n            site_replacements[\"modrinth\"].update({\n                f\"\\\\(.+\\\\)<!--\\\\$dynamicLink:{m}-->\": f\"(https://modrinth.com/datapack/{v})\"\n        })\n        if (v:=manifest_m_entry.get('smithed_link')):\n            site_replacements[\"smithed\"].update({\n                f\"\\\\(.+\\\\)<!--\\\\$dynamicLink:{m}-->\": f\"(https://beta.smithed.dev/packs/{v})\" # NOTE links to in-beta browser smithed access\n        })\n        if running_readme_gen and (v:=manifest_m_entry.get('pmc_link')):\n            site_replacements[\"pmc\"].update({\n                f\"\\\\(.+\\\\)<!--\\\\$dynamicLink:{m}-->\": f\"(https://planetminecraft.com/data-pack/{v})\"\n        })\n\n    # Modrinth Youtube Video Embed\n    if 'video' in ctx.meta['gm4'] and ctx.meta['gm4']['video'] is not None:\n        embed_url = re.sub(r'https:\\/\\/www.youtube.com\\/watch\\?v=(\\w+)', r'https://www.youtube.com/embed/\\1', ctx.meta['gm4']['video'])\n\n        site_replacements[\"modrinth\"].update({\n            r\"(.+)<!-- *\\$modrinth:replaceWithVideo[ -]+?>\" : (\n                \"<iframe\\n\"\n                \"width=\\\"640\\\"\\n\"\n                \"height=\\\"480\\\"\\n\"\n                f\"src=\\\"{embed_url}\\\"\\n\"\n                \"frameborder=\\\"0\\\"\\n\"\n                \"allow=\\\"autoplay; encrypted-media\\\"\\n\"\n                \"allowfullscreen\\n\"\n                \"></iframe>\"\n            )\n        })\n\n    if running_readme_gen:\n        # PMC Element Deletion\n        site_replacements['pmc'].update({\n            r\".+<!--\\$pmc:delete.+>\\n\\n\": \"\"\n        })\n\n        # Table BBCode conversion\n            # tables are gross to autodetect and capture, so we'll cheat with helper tags\n        tables = re.findall(r'<!-- *\\$pmc:startTable ?-->\\n((?:.+\\n)+)<!-- *\\$pmc:endTable ?-->', global_contents)\n        for table in tables:\n            repl = \"[table]\\n\"\n            for line in table.strip('\\n').split('\\n'):\n                if set(line).issubset(set(\"| -:\")):\n                    continue\n                repl += \"[tr]\\n\"\n                for value in [v for v in line.split('|') if v != \"\"]:\n                    repl += f\"\\t[td]{value.strip()}[/td]\\n\"\n                repl += \"[/tr]\"\n            repl += \"[/table]\"\n\n            site_replacements['pmc'].update({\n                f'<!-- *\\\\$pmc:startTable ?-->\\n{re.escape(table)}<!-- *\\\\$pmc:endTable ?-->':\n                    repl\n            })\n\n        # static BBCode translations\n        site_replacements['pmc'].update({\n            r\"(.+)<!-- *\\$pmc:headerSize.+>\": r\"[size=14px]\\1[/size]\",\n            r\"#{2,3} (.+)\": r\"[style b size=14px]\\1[/style]\",\n            r\"!\\[(?!size|style|img|url)(.+)\\]\\((.+)\\)\": r\"[img=\\1]\\2[/img]\",\n            r\"\\[(?!size|style|img|url)(.+?)\\]\\((.+?)\\)\": r\"[url=\\2]\\1[/url]\",\n            r\"<img src=\\\"(.+?)\\\" alt=(\\\".+?\\\") width=\\\"(.+?)\\\".+>\": r\"[img title=\\2 width=\\3]\\1[/img]\",\n            r\"\\*\\*(.+)\\*\\*\": r\"[b]\\1[/b]\",\n            r\"\\*(.+)\\*\": r\"[i]\\1[/i]\",\n            r\"_((?:https[^_\\n])+?)_(?![\\w])\": r\"[i]\\1[/i]\",\n            r\"__(.+)__\": r\"[u]\\1[/u]\",\n            r\"~~(.+)~~\": r\"[s]\\1[/s]\",\n            r\"`(.+)`\": r\"\\1\", # BBCode has no inline code blocks\n            r\"```(.+)```\": r\"[code]\\1[/code]\",\n            r\"---*\\n\": r\"[hr]\",\n            r\"\\n?<!--.+?-->\": \"\"\n        })\n\n    # Apply site-specific edits\n    for site, replacements in site_replacements.items():\n        site_contents = global_contents\n        for pattern, repl in replacements.items():\n            site_contents = re.sub(pattern, repl, site_contents)\n\n        if site == \"gm4\":\n            ctx.data.extra[\"README.md\"] = TextFile(site_contents)\n        else:\n            ctx.meta[f'{site}_readme'] = TextFile(site_contents)\n\n\ndef libraries(ctx: Context):\n    \"\"\"Dumps the README (library docs) to the \"smithed_readme\" meta, so it ends up in the generated folder. No edits are made\"\"\"\n    ctx.meta['smithed_readme'] = ctx.data.extra[\"README.md\"] # relies on copy_files to load into datapack container. \n"
  },
  {
    "path": "gm4/plugins/resource_pack.py",
    "content": "import csv\nimport glob\nimport logging\nfrom copy import deepcopy\nfrom functools import cache\nfrom itertools import cycle\nfrom typing import Annotated, Any, ClassVar, Literal, Optional, Union\n\nimport numpy as np\nfrom beet import (\n    Cache,\n    Context,\n    Font,\n    ItemModel,\n    InvalidOptions,\n    Language,\n    ListOption,\n    Model,\n    NamespaceProxy,\n    PluginOptions,\n    YamlFile,\n    ResourcePack\n)\nfrom beet.contrib.link import LinkManager\nfrom beet.contrib.vanilla import Vanilla, ClientJar\nfrom beet.core.utils import format_validation_error\nfrom mecha import (\n    AstJsonObject,\n    AstNbtCompound,\n    Diagnostic,\n    Mecha,\n    Reducer,\n    rule,\n)\nfrom nbtlib import String  # type: ignore ; nbtlib missing stubfile\nfrom pydantic import BaseModel, Field, TypeAdapter, ValidationError, ValidationInfo, field_validator\nfrom tokenstream import set_location\n\nfrom gm4.utils import (\n    MapOption,\n    add_namespace,\n)\n\nJsonType = dict[str,Any]\n\nMINECRAFT_REFERENCE_VERSION = \"26.1\"\n\nparent_logger = logging.getLogger(\"gm4.resource_pack\")\n\n#== Pydantic Plugin Config Models ==#\nclass ModelData(BaseModel):\n    \"\"\"A complete config for a single model\"\"\"\n    item: ListOption[str]\n    reference: str\n    model: 'MapOption[str]' = Field(default=\"\", validate_default=True)\n    template: TemplateOptions = Field(default=\"custom\", validate_default=True)\n    transforms: list[TransformOptions] = Field(default_factory=list, validate_default=True)\n    textures: MapOption[str] = Field(default_factory=list, validate_default=True)\n    base_model: Optional[JsonType] = None\n\n    @field_validator('model', mode=\"before\")\n    @classmethod\n    def default_model(cls, model: Any, info: ValidationInfo) -> dict[str, str]:\n        if isinstance(model, str) or (isinstance(model, dict) and \"type\" in model):\n            model = [model] # so we can check len for number of items\n        if not model and \"reference\" in info.data: # no reference set, default to reference string\n            return {item: info.data[\"reference\"] for item in info.data['item'].entries()}\n        if len(model)!=len(info.data[\"item\"].entries()) and len(model)>1 and \"type\" not in model: # a single model name may be broadcast to all items, but otherwise lengths match       # type: ignore ; 'model' inherits list[Unknown] from previous isinstance check\n            raise ValueError(\"length of 'item' and 'model' do not match\")\n        if isinstance(model, list): # apply item->model map data\n            model = dict(zip(info.data['item'].entries(), cycle(model))) # type: ignore\n        if isinstance(model, dict) and set(model.keys())!=set(info.data['item'].entries()): # make sure the map keys match the item types       # type: ignore ; model is Unknown type\n            raise ValueError(\"dict keys do not match values in 'item'\")\n        return model # model is already a mapped dict, of the same length as item      # type: ignore\n\n    @field_validator(\"template\", mode=\"before\")\n    @classmethod\n    def template_validator(cls, template: Any) -> TemplateOptions:\n        return downcast(TemplateOptions, \"name\", template)\n\n    @field_validator(\"transforms\", mode=\"before\")\n    @classmethod\n    def transforms_validator(cls, transforms: Any) -> list[TransformOptions]:\n        if not transforms:\n            return []\n        return [\n            downcast(TransformOptions, \"name\", transform)\n            for transform in transforms\n        ]\n\n    @field_validator('textures', mode=\"before\")\n    @classmethod\n    def default_texture(cls, textures: MapOption[str], info: ValidationInfo) -> MapOption[str]:\n        empty_list = False\n        if textures is None: # type: ignore\n            empty_list = True\n        elif isinstance(textures, (list,dict)):\n            empty_list = len(textures)==0\n        elif isinstance(textures, MapOption): # type: ignore\n            empty_list = len(textures.entries())==0\n        if empty_list and isinstance(v:=info.data.get(\"reference\"), str):\n            return MapOption([v])\n        return textures\n\n    def add_namespace(self, namespace: str) -> 'ModelData':\n        \"\"\"Returns a new ModelData with the given given namespace applied to any fields\"\"\"\n        ret_dict = self.model_dump(serialize_as_any=True)\n        ret_dict[\"reference\"] = add_namespace(self.reference, namespace)\n        ret_model = deepcopy(self.model.entries())\n        for i, model_name in enumerate(ret_model):\n            ret_model[i] = add_namespace(model_name, namespace) # accessed by index to overwrite original\n        ret_dict[\"model\"] = ret_model\n        if self.textures:\n            if isinstance(self.textures.root, list):\n                ret_dict[\"textures\"] = [add_namespace(t, namespace) for t in self.textures.entries()]\n            else: # isinstance(self.textures.root, dict):\n                ret_dict[\"textures\"] = {k: add_namespace(v, namespace) for k, v in self.textures.items()}\n        ret_dict[\"template\"] = self.template.add_namespace(namespace)\n        return ModelData.model_validate(ret_dict)\n\nclass NestedModelData(BaseModel):\n    \"\"\"A potentially incomplete config, allowing for nested inheritance of fields\"\"\"\n    item: Optional[ListOption[str]] = None\n    reference: Optional[str] = None\n    model: Optional[MapOption[str]] = None # defalts to reference\n    template: Optional[str | TemplateOptions] = \"custom\"\n    transforms: Optional[list[str | TransformOptions]] = None\n    textures: Optional[MapOption[str]] = None\n    base_model: Optional[JsonType] = None\n    broadcast: Optional[list['NestedModelData']] = []\n\n    def collapse_broadcast(self) -> list['NestedModelData']:\n        \"\"\"Recursively collapses broadcast fields into a list of NestedModelData\"\"\"\n        if not self.broadcast:\n            return [self]\n        ret_list: list[NestedModelData] = []\n        for child in self.broadcast:\n            m = NestedModelData.model_validate(self.model_dump(exclude_unset=True,exclude={\"broadcast\"}, serialize_as_any=True) | child.model_dump(exclude_unset=True, serialize_as_any=True))\n            if m.broadcast:\n                m = m.collapse_broadcast()\n                ret_list.extend(m)\n            else:\n                ret_list.append(m)\n        return ret_list\n\nclass GuiFont(BaseModel):\n    \"\"\"config for a single container gui using custom fonts\"\"\"\n    translation: str\n    container: ContainerGuiOptions = Field(validate_default=True)\n    texture: str\n\n    @field_validator(\"container\", mode=\"before\")\n    @classmethod\n    def container_validator(cls, container: Any) -> ContainerGuiOptions:\n        return downcast(ContainerGuiOptions, \"container\", container)\n\n    def add_namespace(self, namespace: str) -> 'GuiFont':\n        \"\"\"returns a new GuiFont with the texture field namespaced\"\"\"\n        return GuiFont(\n            translation=self.translation,\n            container=self.container,\n            texture=add_namespace(self.texture, namespace)\n        )\n\nclass FlatResourcePackOptions(BaseModel):\n    \"\"\"Contains a flat list of complete rp config objects\"\"\"\n    model_data: list[ModelData]\n    gui_fonts: list[GuiFont]\n\n    def add_namespace(self, namespace:str):\n        self.model_data=[m.add_namespace(namespace) for m in self.model_data]\n        self.gui_fonts=[g.add_namespace(namespace) for g in self.gui_fonts]\n\n    def template_mutations(self):\n        for m in self.model_data:\n            m.template.mutate_config(m)\n\nclass ResourcePackOptions(PluginOptions, extra=\"ignore\"):\n    model_data: list[NestedModelData] = []\n    gui_fonts: list[GuiFont] = []\n\n    def process_inheritance(self) -> FlatResourcePackOptions:\n        \"\"\"Collapses and returns any broadcast fields into processed flat list\"\"\"\n        ret: list[ModelData] = []\n        errors: list[tuple[int, ValidationError]] = []\n        for i, model in enumerate(self.model_data):\n            try:\n                ret.extend([ModelData.model_validate(m.model_dump(serialize_as_any=True)) for m in model.collapse_broadcast()])\n            except ValidationError as exc:\n                errors.append((i, exc))\n\n        if errors:\n            # Only show the first error for now\n            raise InvalidOptions(\"gm4\", format_validation_error(\"gm4\", errors[0][1]))\n\n        return FlatResourcePackOptions(model_data=ret, gui_fonts=self.gui_fonts)\n\n\nclass TranslationLinterOptions(PluginOptions, extra=\"ignore\"):\n    translation_linter_ignores: list[str] = []\n\n#== Configurable Base Classes ==#\ndef downcast[T](base: type[T], discriminator: str, x: Any) -> Any:\n    \"\"\"Looks up and returns the proper subclass for config resolution\n    i.e. TemplateOptions converts to BlankTemplate/VanillaTemplate ect... based upon its name id\"\"\"\n    subclasses = {cls.__name__: cls for cls in base.__subclasses__()}\n    return TypeAdapter[T](\n        Annotated[Union[*subclasses.values()], Field(discriminator=discriminator)]\n    ).validate_python({discriminator: x} if isinstance(x, str) else x)\n\nclass TemplateOptions(BaseModel, extra=\"allow\"):\n    \"\"\"A pydantic model to extend for configured model templates, which generate model files for common\"\"\"\n    default_transforms: ClassVar[list['TransformOptions']] = []\n    texture_map: ClassVar[list[str]|None] = None\n\n    def __init_subclass__(cls) -> None:\n        cls.model_config[\"extra\"] = \"ignore\" # prevent subclasses from inheriting \"allow\"\n\n    def generate_model(self, config: ModelData, models_container: NamespaceProxy[Model]) -> None:\n        \"\"\"Processes the template, and applies transforms\"\"\"\n        if self.texture_map and config.textures and isinstance(config.textures.root, list):\n            config = ModelData(**config.model_dump(serialize_as_any=True) | {\"textures\": dict(zip(self.texture_map, config.textures.entries()))})\n        for output_model in self.create_models(config, models_container):\n            # for each returned pointer, add transforms as needed\n            for transform in self.default_transforms:\n                transform.apply_transform(output_model)\n            for transform in config.transforms:\n                transform.apply_transform(output_model)\n\n    def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]:\n        \"\"\"Overridden to create and mount the model object, and return pointers to them\"\"\"\n        raise NotImplementedError()\n\n    def get_item_def_entry(self, config: ModelData, item: str) -> None|JsonType:\n        \"\"\"Overridden to return the entry for the item-model-definition, or None to point to ModelData.model string\"\"\"\n        return None\n\n    def add_namespace(self, namespace: str):\n        \"\"\"Overridden to add namespace data to sub-config fields added by a template\"\"\"\n        return self.model_dump(serialize_as_any=True)\n\n    def mutate_config(self, config: ModelData):\n        \"\"\"Overridden to let a template mutate/mangle root level fields of ModelData\"\"\"\n        pass\n\nclass TransformOptions(BaseModel, extra=\"allow\"):\n    \"\"\"A pydantic model to extend for configured model transformers, which add model offset/scale ect.. to model files\"\"\"\n\n    def __init_subclass__(cls) -> None:\n        cls.model_config[\"extra\"] = \"ignore\" # prevent subclasses from inheriting \"allow\"\n\n    def apply_transform(self, model: Model) -> None:\n        \"\"\"Modifies the given model, applying transformation data to the display compound\"\"\"\n        raise NotImplementedError()\n\nclass ContainerGuiOptions(BaseModel, extra=\"allow\"):\n    \"\"\"a pydantic model to extend for container gui fonts\"\"\"\n\n    def __init_subclass__(cls) -> None:\n        cls.model_config[\"extra\"] = \"ignore\" # prevent subclasses from inheriting \"allow\"\n\n    def process(self, config: GuiFont, counter_cache: Cache) -> tuple[str, list[JsonType]]:\n        \"\"\"requisitions unicode characters and returns the translation and font providers that make it up\"\"\"\n        raise NotImplementedError()\n\n    def next_unicode(self, counter_cache: Cache) -> str:\n        ret = counter_cache.json[\"__next__\"]\n        counter_cache.json[\"__next__\"] += 1\n        return chr(ret)\n\n\nNestedModelData.model_rebuild()\nModelData.model_rebuild()\nGuiFont.model_rebuild()\n\n#== Beet Plugins ==#\ndef beet_default(ctx: Context):\n    rp = ctx.inject(GM4ResourcePack)\n    tl = ctx.inject(TranslationLinter)\n    ctx.require(\"mecha.contrib.json_files\")\n    # mecha register\n    ctx.inject(Mecha).lint.extend(tl)\n\n    logging.getLogger(\"beet.contrib.babelbox\").addFilter(block_incomplete_translation)\n    logging.getLogger(\"mecha\").addFilter(limit_mecha_diagnostics)\n\n    # attach context to template classes\n    VanillaTemplate.vanilla = Vanilla(ctx)\n    VanillaTemplate.vanilla.minecraft_version = MINECRAFT_REFERENCE_VERSION\n    VanillaTemplate.vanilla_jar = VanillaTemplate.vanilla.mount(\"assets/minecraft/items\")\n\n    yield\n    tl.warn_unused_translations()\n    tl.apply_babelbox_backfill()\n    rp.lint_model_textures()\n\ndef build(ctx: Context):\n    rp = ctx.inject(GM4ResourcePack)\n    rp.resolve_config()\n    rp.generate_gui_fonts()\n    rp.generate_model_files()\n    rp.generate_item_definitions()\n\n    if not ctx.assets.extra.get(\"pack.png\") and ctx.data.extra.get(\"pack.png\"):\n        ctx.assets.icon = ctx.data.icon\n\ndef setup(ctx: Context):\n    # init font counter\n    ctx.cache[\"gui_font_counter\"].json = {\n        \"__next__\": ord(\"\\u9000\")\n    }\n\n    # check for CLI meta-variable for backfilling the translations.csv\n    ## beet -s meta.gm4.babelbox_backfill=True dev bat_grenades\n    babelbox_backfill: bool = ctx.meta.get(\"gm4\",{}).get(\"babelbox_backfill\", False)\n\n    # clear and compile cross-module translation key list\n    ctx.cache[\"translations\"].clear()\n    keys: list[str] = []\n    for path in glob.glob(\"*/assets/translations.csv\"):\n        with open(path) as f:\n            reader = csv.DictReader(f)\n            if reader.fieldnames and reader.fieldnames[0] != \"key\":\n                raise KeyError(f\"{path} must contain a column named 'key'\")\n            keys.extend([row['key'] for row in reader]) # type: ignore ; csv only contains strings\n    ctx.cache[\"translations\"].json = {\"keys\": list(set(keys)), \"backfill\": babelbox_backfill}\n\ndef merge_policy(ctx: Context):\n    ctx.assets.merge_policy.extend_namespace(ItemModel, item_definition_merging)\n\ndef link_resource_pack(ctx: Context):\n    \"\"\"manually links the combined resource pack to minecraft's RP folder when using 'beet dev'\"\"\"\n    ctx.assets.name = \"DEV gm4_resource_pack\"\n    lm = ctx.inject(LinkManager)\n\n    # clear DP link, we only want to send a RP to minecraft\n    dp_dir = lm.data_pack\n    lm.data_pack = None\n\n    lm.autosave_handler(ctx) # send RP to minecraft\n\n    lm.data_pack = dp_dir # restore the DP link\n\nclass GM4ResourcePack:\n    \"\"\"Service Object handling custom_model_data and generated item models\"\"\"\n\n    def __init__(self, ctx: Context):\n        self.ctx = ctx\n        self.logger = parent_logger.getChild(ctx.project_id)\n        self._opts = FlatResourcePackOptions(model_data=[], gui_fonts=[]) # unloaded config\n        super().__init__()\n\n    @property\n    def opts(self) -> FlatResourcePackOptions:\n        return self._opts\n\n    def resolve_config(self):\n        if (p:=self.ctx.directory/\"assets/model_data.yaml\").exists():\n            addtl_config = YamlFile(source_path=p).data.get(\"model_data\")\n            self.ctx.meta[\"gm4\"].setdefault(\"model_data\",[]).extend(addtl_config)\n        self._opts = self.ctx.validate(\"gm4\", validator=ResourcePackOptions).process_inheritance()\n        self._opts.add_namespace(self.ctx.project_id)\n        self._opts.template_mutations()\n\n    def generate_item_definitions(self):\n        \"\"\"Generates item-model-definition files in the 'minecraft' namespace, adding select cases for each custom_model_data value\"\"\"\n        vanilla = self.ctx.inject(Vanilla)\n        vanilla.minecraft_version = MINECRAFT_REFERENCE_VERSION\n        vanilla_item_defs_jar = vanilla.mount(\"assets/minecraft/items\")\n        # group models by item id\n        for item_id in {i for m in self.opts.model_data for i in m.item.entries()}:\n            models = filter(lambda m: item_id in m.item.entries(), self.opts.model_data) # with this item_id\n\n            vanilla_itemdef = vanilla_item_defs_jar.assets.item_models[f\"minecraft:{item_id}\"].data[\"model\"]\n\n            new_itemdef: dict[str, Any] = {\n                \"model\": {\n                    \"type\": \"minecraft:select\",\n                    \"property\": \"minecraft:custom_model_data\",\n                    \"cases\": [],\n                    \"fallback\": vanilla_itemdef\n                }\n            }\n\n            for model in models:\n                if not (m:=model.template.get_item_def_entry(model, item_id)):\n                    # no special handling, just point to model file by name\n                    m = model.model[item_id] # model string for this particular item id\n                    model_json: JsonType = {\n                        \"type\": \"minecraft:model\",\n                        \"model\": m\n                    }\n                else:\n                    model_json = m\n                \n                if model.base_model:\n                    model_json.update(model.base_model)\n            \n                new_itemdef[\"model\"][\"cases\"].append({\n                    \"when\": model.reference,\n                    \"model\": model_json\n                })\n\n            self.ctx.assets.item_models[f\"minecraft:{item_id}\"] = ItemModel(new_itemdef)\n\n    #== Model file generation ==#\n    def generate_model_files(self):\n        \"\"\"Create individual models for each item/block according to its config\"\"\"\n        for model in self.opts.model_data:\n            # generate model and mount to the pack\n            model.template.generate_model(model, self.ctx.assets.models)\n\n    def lint_model_textures(self):\n        \"\"\"Checks model files to ensure referenced textures exist\"\"\"\n        for name, model in list(self.ctx.assets.models.items()):\n            if name.startswith(\"minecraft:\"):\n                continue # vanilla model - will have vanilla textures so do not check\n            for tex in model.data.get(\"textures\", {}).values():\n                if not tex.startswith(\"minecraft:\") and tex not in self.ctx.assets.textures:\n                    self.logger.warning(f\"Missing texture '{tex}' in {name}\")\n\n    #== Font-Gui file generation ==#\n    def generate_gui_fonts(self):\n        for gui in self.opts.gui_fonts:\n            translation, providers = gui.container.process(gui, self.ctx.cache[\"gui_font_counter\"])\n            self.ctx.generate(\"gm4:en_us\", merge=Language({\n                gui.translation: translation\n            }))\n            self.ctx.generate(\"gm4:container_gui\", merge=Font({\n                \"providers\": providers\n            }))\n\ndef item_definition_merging(pack: ResourcePack, path: str, current: ItemModel, conflict: ItemModel) -> bool:\n    \"\"\"ItemModel beet merge rule for combining select properly\"\"\"\n    if current.data[\"model\"].get(\"type\") != \"minecraft:select\" or conflict.data[\"model\"].get(\"type\") != \"minecraft:select\":\n        parent_logger.warning(f\"item model {path} was sent to merging but only one file uses 'select'\")\n        return False\n\n    merged_cases: list[Any] = current.data[\"model\"][\"cases\"]\n    merged_cases.extend(conflict.data[\"model\"][\"cases\"])\n\n    # remove duplicate cases - relying on each CMD to be unique already\n    seen_values: set[int] = set()\n    for entry in merged_cases.copy():\n        if (v:=entry[\"when\"]) not in seen_values:\n            seen_values.add(v)\n        else: # otherwise its a duplicate\n            merged_cases.remove(entry)\n\n    return True\n\n\nclass TranslationLinter(Reducer):\n    \"\"\"Mecha linter ensuring all translation keys are registered in translations.csv\"\"\"\n    def __init__(self, ctx: Context):\n        self.ctx = ctx\n        self.mecha_database = ctx.inject(Mecha).database\n        vanilla = ctx.inject(Vanilla)\n        vanilla.minecraft_version = MINECRAFT_REFERENCE_VERSION\n        vanilla_lang = vanilla.mount(\"assets/minecraft/lang/en_us.json\")\n        self.vanilla_keys = set(vanilla_lang.assets.languages[\"minecraft:en_us\"].data.keys())\n        self.total_keys: set[str] = set()\n        self.local_keys: set[str] = set()\n        self.used_keys: set[str] = set()\n        self.logger = parent_logger.getChild(ctx.project_id)\n        self.backfill_enable: bool = ctx.cache[\"translations\"].json[\"backfill\"]\n        self.backfill_values: dict[str, str] = {}\n        self.ignored_keys: set[str] = set(ctx.validate(\"gm4\", TranslationLinterOptions).translation_linter_ignores)\n        super().__init__()\n\n    @rule(AstNbtCompound)\n    @rule(AstJsonObject)\n    def missing_en_us_translations(self, node: Union[AstNbtCompound, AstJsonObject]):\n        self.setup_translation_lookups()\n\n        # manually skip gm4 root advancement, which contains globally defined translations\n        resource_location = self.mecha_database[self.mecha_database.current].resource_location or \"null:null\"\n        if resource_location == \"gm4:root\":\n            return\n\n        # check node fallback contents against babelbox translations\n        translate_entry = next((e for e in node.entries if e.key.value == \"translate\"), None)\n        if not translate_entry:\n            return\n        transl_key = str(translate_entry.value.evaluate())\n        fallback_extry = next((e for e in node.entries if e.key.value == \"fallback\"), None)\n        if fallback_extry:\n            fallback = str(fallback_extry.value.evaluate())\n            if transl_key.startswith(\"gui.gm4\") or transl_key==\"gm4.second\":\n                # gui-texture translations from other modules are defined in their gui_fonts segment of beet.yaml, so they won't be\n                # known to the linter easily. For now, we just ignore their warnings\n                return\n            if self.babelbox_lang.get(transl_key) != fallback:\n                if transl_key in self.babelbox_lang and not self.backfill_enable:\n                    yield set_location(Diagnostic(\"info\", f\"Fallback for {transl_key} does not match that provided in 'translations.csv'\"), node)\n                elif self.backfill_enable and transl_key not in self.backfill_values and transl_key not in self.foreign_keys:\n                    self.logger.info(f\"Backfilling the fallback for {transl_key} into 'translations.csv'\")\n                    self.backfill_values[transl_key] = fallback\n            yield self.check_key(transl_key, node)\n        else:\n            if self.babelbox_lang.get(transl_key):\n                yield set_location(Diagnostic(\"warn\", f\"No translation fallback specified for {transl_key}\"), node)\n            yield self.check_key(transl_key, node)\n\n    def check_key(self, transl_key: str, node: Any):\n        self.used_keys.add(transl_key)\n        if transl_key not in self.total_keys and not self.backfill_enable:\n            return set_location(Diagnostic(\"warn\", f\"Translation key not defined in en_us: {transl_key}\"), node)\n        return\n\n    def setup_translation_lookups(self):\n        # setup lookup list if first invocation\n        if not self.total_keys:\n            self.babelbox_lang = self.ctx.assets.languages.get(\"gm4_translations:en_us\", Language()).data\n            self.local_keys = (\n                set(self.babelbox_lang.keys()) |\n                set(self.ctx.assets.languages.get(\"gm4:en_us\", Language()).data.keys())\n            )\n            self.total_keys = (\n                self.vanilla_keys |\n                self.local_keys |\n                self.ignored_keys |\n                set(Language(source_path=\"base/assets/gm4/lang/en_us.json\").data.keys()) |\n                self.get_guidebook_translations() |\n                set(self.ctx.cache[\"translations\"].json[\"keys\"]) |\n                {\"%1$s%3427655$s\", \"%1$s%3427656$s\"} # manual old keys\n            )\n            self.foreign_keys = self.total_keys - self.local_keys\n\n    @cache\n    def get_guidebook_translations(self) -> set[str]:\n        # internally loads keys in guidebook translations.csv, cached for each subproject build\n        with open(\"gm4_guidebook/assets/translations.csv\", 'r') as csvfile:\n            reader = csv.DictReader(csvfile)\n            return {row[\"key\"] for row in reader}\n\n    def warn_unused_translations(self):\n        for key in self.ctx.assets.languages.get(\"gm4_translations:en_us\", Language()).data:\n            if key not in self.used_keys and key not in self.ignored_keys and key in self.local_keys:\n                self.logger.warning(f\"Translation '{key}' is defined but not used\")\n\n    def apply_babelbox_backfill(self):\n        \"\"\"Takes found out-of-date fallbacks and saves them to the translations.csv table\"\"\"\n        if not self.backfill_enable:\n            return\n\n        if (c:=self.ctx.directory / \"assets\" / \"translations.csv\").exists():\n            babelbox_path = c\n        elif (c:=self.ctx.directory / \"translations.csv\").exists():\n            babelbox_path = c\n        else:\n            if self.backfill_values:\n                self.logger.warning(\"Babelbox backfill was enabled but no 'translations.csv' file was found\")\n            return # no file to update\n\n        with open(babelbox_path, 'r', encoding='utf-8', newline='') as csvfile:\n            reader = csv.DictReader(csvfile)\n            fieldnames = reader.fieldnames\n            if not fieldnames:\n                self.logger.warning(\"Babelbox backfill failed - fieldnames could not be automatically detected\")\n                return\n            translations = list([row for row in reader])\n\n        with open(babelbox_path, 'w', encoding='utf-8', newline='') as csvfile:\n            writer = csv.DictWriter(csvfile, fieldnames, extrasaction='ignore')\n            writer.writeheader()\n            for row in translations:\n                new_fallback = {\"en_us\": fbk.replace(\"\\n\", \"\\\\n\")} if (fbk:=self.backfill_values.pop(row[\"key\"], None)) else {}\n                writer.writerow(row | new_fallback)\n            for key, fbk in self.backfill_values.items(): # any remaining new entries not already in file\n                writer.writerow({\"key\": key, \"en_us\": fbk.replace(\"\\n\", \"\\\\n\")})\n\n\n#== Logging Filters ==#\ndef block_incomplete_translation(record: logging.LogRecord):\n    \"\"\"logger filter to hide missing translations for anything but default english\"\"\"\n    locale: str = record.args[0] # type: ignore ; babelbox only issues one logger event, this will be a string\n    return locale == 'en_us'\n\ndef limit_mecha_diagnostics(record: logging.LogRecord):\n    \"\"\"hard limits the printed length of a mecha diagnostic line\"\"\"\n    TRUNCATION_LENGTH = 1_000\n    truncated: list[str] = []\n    for line in record.args[0].splitlines(): # type: ignore ; arg 0 is a paragraph of diagnostic text\n        truncated.append(line if len(line) < TRUNCATION_LENGTH else line[:TRUNCATION_LENGTH-3] + \"...\") # type: ignore ; line is a str\n    record.args = (\"\\n\".join(truncated),)\n    return True\n\n#== Default Templates, Transforms and Item Model Special Cases ==#\ndef ensure_single_model_config(template_name: str, config: ModelData) -> str:\n    \"\"\"Does common error checking for templates that only work when creating a single model file\"\"\"\n    if len(config.model.entries()) > 1:\n        raise InvalidOptions(\"gm4.model_data\", f\"{config.reference}; Template '{template_name}' only supports single entry 'model' fields.\")\n    return config.model.entries()[0]\n\nclass BlankTemplate(TemplateOptions):\n    name: Literal[\"custom\"] = \"custom\"\n\n    def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]:\n        \"\"\"A model file will be provided in source - do not generate a model.\n            Will process any specified transforms and add them to the model file\"\"\"\n        if config.transforms:\n            ret_list: list[Model] = []\n            for m in config.model.entries():\n                try:\n                    ret_list.append(models_container[m])\n                except:\n                    parent_logger.warning(f\"Custom specified model {m} does not exist, but was configured to recieve transforms.\")\n            return ret_list\n        return []\n\nclass GeneratedTemplate(TemplateOptions):\n    name: Literal[\"generated\"] = \"generated\"\n\n    def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]:\n        if len(config.textures.entries()) > 1:\n            raise InvalidOptions(\"gm4.model_data\", f\"{config.reference}; Template 'generated' currently only supports a single texture.\")\n            # NOTE in the future, `generated` could accept a map for textures to provide a different texture for each model. But packs may be better served by simply creating those models themselves\n\n        ret_list: list[Model] = []\n        for model_name in config.model.entries():\n            m = models_container[model_name] = Model({\n                \"parent\": \"minecraft:item/generated\",\n                \"textures\": {\n                    \"layer0\": f\"{config.textures.entries()[0]}\"\n                }\n            })\n            ret_list.append(m)\n        return ret_list\n\nclass GeneratedOverlayTemplate(TemplateOptions):\n    name: Literal[\"generated_overlay\"] = \"generated_overlay\"\n\n    def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]:\n        \"\"\"A special-case 'generated' template, where an 'overlay' texture is specified by appending '_overlay' to its filename\"\"\"\n        model_name = ensure_single_model_config(self.name, config)\n        m = models_container[model_name] = Model({\n            \"parent\": \"minecraft:item/generated\",\n            \"textures\": {\n                \"layer0\": f\"{config.textures.entries()[0]}\",\n                \"layer1\": f\"{config.textures.entries()[0]}_overlay\"\n            }\n        })\n        return [m]\n\nclass HandheldTemplate(TemplateOptions):\n    name: Literal[\"handheld\"] = \"handheld\"\n\n    def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]):\n        model_name = ensure_single_model_config(self.name, config)\n        m = models_container[model_name] = Model({\n            \"parent\": \"minecraft:item/handheld\",\n            \"textures\": {\n                \"layer0\": f\"{config.textures.entries()[0]}\"\n            }\n        })\n        return [m]\n\nclass VanillaTemplate(TemplateOptions):\n    name: Literal[\"vanilla\"] = \"vanilla\"\n    vanilla: ClassVar[Vanilla] # mounted to by beet plugin since it requires context access\n    vanilla_jar: ClassVar[ClientJar]\n    _item_def_map: dict[str, JsonType] = {}\n\n    def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]):\n        model_names = config.model.entries()\n        if len(set(model_names)) == 1 and len(config.item.entries()) > 1:\n            model_names = [f\"{model_names[0]}_{item}\" for item in config.item.entries()] # if only one model name given, make one model per item id\n\n        model_def_map: dict[str,JsonType] = {}\n\n        ret_list: list[Model] = []\n        for item, model_name in zip(config.item.entries(), model_names):\n            model_compound = self.vanilla_jar.assets.item_models[add_namespace(item, \"minecraft\")].data.get(\"model\", {})\n            if model_compound[\"type\"] == \"minecraft:select\": # template off the fallback model, (e.g. non-festive chest)\n                model_compound = model_compound[\"fallback\"]\n\n            if model_compound[\"type\"] == \"minecraft:special\": # uses some special handling\n                vanilla_model_path: str = model_compound[\"base\"] # covers player_head use case. Others may not be handled properly yet.\n                special_model = True\n            else:\n                vanilla_model_path = model_compound.get(\"model\", \"\")\n                special_model = False\n            m = models_container[model_name] = Model({\n                \"parent\": vanilla_model_path\n            })\n            ret_list.append(m)\n            model_def_map[item] = {\n                \"type\": \"minecraft:special\" if special_model else \"minecraft:model\",\n                \"model\": model_compound[\"model\"] if special_model else model_name,\n            } | (\n                {\"base\": model_name} if special_model else {}\n            ) | (\n                {\"tints\": t} if (t:=model_compound.get(\"tints\")) else {}\n            )\n        self._item_def_map.update(model_def_map)\n        return ret_list\n\n    def get_item_def_entry(self, config: ModelData, item: str):\n        return self._item_def_map.get(item)\n\nclass AdvancementIconTemplate(VanillaTemplate, TemplateOptions): # TODO make this inheritance work properly. Treat as single-vanilla forward or create new where needed\n    \"\"\"Creates a model for advancement icons, either pointing to the vanilla model, or to a specified other item model\"\"\"\n    name: Literal[\"advancement\"] = \"advancement\"  # type: ignore\n    forward: Optional[str] = None\n    tints: Optional[ListOption[int|tuple[float,float,float]]] = None # optional constant tints to apply to the item model\n\n    # NOTE since advancements are all in the gm4 namespace, so are these models. This template ignores the 'model' field of ModelData\n    def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]:\n        advancement_name = config.reference.split(\"/\")[-1]\n        item = config.item.entries()[0]\n\n        if not self.forward:\n            # then we use the vanilla item's model and settings - inheriting from VanillaTemplate for this\n            config_copy = config.model_copy(update={\"model\": MapOption({item: f\"gm4:gui/advancement/{advancement_name}\"})})\n            m = VanillaTemplate.create_models(self, config_copy, models_container)[0]\n\n        else:\n            m = models_container[f\"gm4:gui/advancement/{advancement_name}\"] = Model({\n                \"parent\": self.forward\n            })\n        config.model = MapOption({item: f\"gm4:gui/advancement/{advancement_name}\"})\n        return [m]\n\n    def get_item_def_entry(self, config: ModelData, item: str):\n        if not self.forward: # use item def from VanillaTemplate\n            return VanillaTemplate.get_item_def_entry(self, config, item)\n        else:\n            if self.tints:\n                return {\n                    \"type\": \"model\",\n                    \"model\": config.model.entries()[0],\n                    \"tints\": [\n                        {\n                            \"type\": \"minecraft:constant\",\n                            \"value\": tint\n                        }\n                        for tint in self.tints.entries()\n                    ]\n                }\n        return None\n\n    def add_namespace(self, namespace: str):\n        return self.model_dump(serialize_as_any=True) | ({\"forward\": add_namespace(self.forward, namespace)} if self.forward else {})\n\nclass BlockTemplate(TemplateOptions):\n    name: Literal[\"block\"] = \"block\"\n    texture_map = [\"top\", \"bottom\", \"front\", \"side\"]\n\n    def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]):\n        model_name = ensure_single_model_config(self.name, config)\n        m = models_container[model_name] = Model({\n            \"parent\": \"minecraft:block/cube\",\n            \"textures\": {\n                \"particle\": config.textures['side'],\n                \"down\":     config.textures['bottom'],\n                \"up\":       config.textures['top'],\n                \"north\":    config.textures['front'],\n                \"south\":    config.textures['side'],\n                \"west\":     config.textures['side'],\n                \"east\":     config.textures['side']\n            }\n        })\n        return [m]\n\nclass ConditionTemplate(BlankTemplate, TemplateOptions):\n    \"\"\"Custom models using boolean condition variants (ie. broken/repaired elytra, cast/uncast fishing rods...)\"\"\"\n    name: Literal[\"condition\"] = \"condition\"  # type: ignore\n    property: str\n    on_true: str\n    on_false: str\n\n    def get_item_def_entry(self, config: ModelData, item: str) -> JsonType:\n        return {\n            \"type\": \"minecraft:condition\",\n            \"property\": self.property,\n            \"on_false\": {\n                \"type\": \"minecraft:model\",\n                \"model\": self.on_false\n            },\n            \"on_true\": {\n                \"type\": \"minecraft:model\",\n                \"model\": self.on_true\n            }\n        }\n\n    def add_namespace(self, namespace: str):\n        return self.model_dump(serialize_as_any=True) | {\"on_true\": add_namespace(self.on_true, namespace),\n                              \"on_false\": add_namespace(self.on_false, namespace)}\n\nclass ItemDisplayModel(TransformOptions):\n    \"\"\"Calculates the model transform for an item_display entity, located at the specified origin, facing south, for the model to align with the block-grid\"\"\"\n    origin: list[float] = Field(max_length=3, min_length=3)\n    scale: list[float] = Field(max_length=3, min_length=3)\n    translation: list[float] = Field(default=[0,0,0], max_length=3, min_length=3)\n    rotation: list[float] = Field(default=[0.,0.,0.], max_length=3, min_length=3) # euler angle form of total rotation. NOTE only accounts for simple angles (90,180 ect...)\n    display: Literal[\"none\", \"thirdperson_lefthand\", \"thirdperson_righthand\", \"firstperson_lefthand\", \"firstperson_righthand\", \"head\", \"gui\", \"ground\", \"fixed\"] = \"head\"\n    name: Literal[\"item_display\"] = \"item_display\"\n\n    def apply_transform(self, model: Model):\n        model.data.setdefault(\"display\", {})[self.display] = {\n            \"rotation\": list(-1*np.array(self.rotation)),\n            \"translation\": list(16 * (np.array([-0.5,0.5,-0.5])+(np.array(self.origin)*np.array([1,-1,1]))-np.array(self.translation)) / np.array(self.scale)),\n            \"scale\": list(1/np.array(self.scale)*1.006)\n        }\n\n#== Convience Template/Transform Presets ==#\nclass LegacyMachineArmorStand(BlockTemplate, TemplateOptions):\n    \"\"\"An 'block' template preset with the 'item_display' transformer for the legacy small-armor-stand-head-slot of some machines\"\"\"\n    default_transforms = [\n        ItemDisplayModel(\n            origin=[0.5, 1, 0.5],\n            scale=[0.438, 0.438, 0.438],\n            translation=[0, 0, 0],\n            display='head'\n        )\n    ]\n    name: Literal[\"legacy_machine_block\"] = \"legacy_machine_block\"  # type: ignore\n\n\n#== Default Gui-Font Generators ==#\nclass CenteredContainerGui(ContainerGuiOptions):\n    container: Literal[\"_centered\"] = \"_centered\"\n\n    def process(self, config: GuiFont, counter_cache: Cache) -> tuple[str, list[dict[str, Any]]]:\n        u1 = self.next_unicode(counter_cache)\n        u2 = self.next_unicode(counter_cache)\n        return u2+u1+u2, [\n            {\n                \"type\": \"bitmap\",\n                \"file\": config.texture+\".png\",\n                \"ascent\": 13,\n                \"height\": 166,\n                \"chars\": [u1]\n            },\n            {\n                \"type\": \"bitmap\",\n                \"file\": config.texture+\".png\",\n                \"ascent\": -32768,\n                \"height\": -83,\n                \"chars\": [u2]\n            }\n        ]\n\nclass LeftAlignContainerGui(ContainerGuiOptions):\n    container: Literal[\"_left_align\"] = \"_left_align\"\n\n    def process(self, config: GuiFont, counter_cache: Cache) -> tuple[str, list[dict[str, Any]]]:\n        u1 = self.next_unicode(counter_cache)\n        u2 = self.next_unicode(counter_cache)\n        return \"\\uf808\"+u1+u2+\"\\uf824\", [\n            {\n                \"type\": \"bitmap\",\n                \"file\": config.texture+\".png\",\n                \"ascent\": 13,\n                \"height\": 133,\n                \"chars\": [u1]\n            },\n            {\n                \"type\": \"bitmap\",\n                \"file\": config.texture+\".png\",\n                \"ascent\": -32768,\n                \"height\": -133,\n                \"chars\": [u2]\n            },\n        ]\n\nclass HopperContainerGui(LeftAlignContainerGui, ContainerGuiOptions):\n    container: Literal[\"hopper\"] = \"hopper\"  # type: ignore\n\nclass DropperContainerGui(CenteredContainerGui, ContainerGuiOptions):\n    container: Literal[\"dropper\"] = \"dropper\"  # type: ignore\n"
  },
  {
    "path": "gm4/plugins/test.py",
    "content": "from beet import Context, TextFile, NamespaceFileScope\nfrom typing import ClassVar\nfrom mecha import Mecha\n\n\ndef load_tests(ctx: Context):\n    ctx.data.extend_namespace += [TestFile]\n\n\nclass TestFile(TextFile):\n    \"\"\"Class representing an test function.\"\"\"\n\n    scope: ClassVar[NamespaceFileScope] = (\"test\",)\n    extension: ClassVar[str] = \".mcfunction\"\n\n\ndef strip_tests(ctx: Context):\n    for structure in ctx.data.structures.match(\"*:test_*\", \"*:test/*\"):\n        del ctx.data.structures[structure]\n    for predicate in ctx.data.predicates.match(\"*:test_*\", \"*:test/*\"):\n        del ctx.data.predicates[predicate]\n\n\ndef skip_mecha_lint(ctx: Context):\n    \"\"\"Disables the mecha linting step. Linting errors will be reported by the main project build\"\"\"\n    mc = ctx.inject(Mecha)\n    mc.steps.remove(mc.lint)\n"
  },
  {
    "path": "gm4/plugins/upgrade_paths.py",
    "content": "from beet import Context, Function, configurable, PluginOptions\nfrom gm4.plugins.manifest import ManifestCacheModel\nfrom gm4.utils import Version, NoneAttribute\n\nclass UpgradePathsConfig(PluginOptions, extra=\"ignore\"):\n    upgrade_paths: list[str] = [] # additional upgrade paths to process\n\n@configurable(\"gm4\", validator=UpgradePathsConfig)\ndef beet_default(ctx: Context, opts: UpgradePathsConfig):\n    '''Processes upgrade paths for module data that persists in the world\n    between minecraft / module versions, such as the type of\n    technical entity used to mark a place.'''\n\n    run_func = Function([], tags=[\"gm4_upgrade_paths:run\"])\n\n    upgrade_paths_dirs = [f'{ctx.project_id}:upgrade_paths'] # gm4_bat_grenades:upgrade_paths/... is processed by default\n    upgrade_paths_dirs.extend(opts.upgrade_paths)\n\n    # module:upgrade_paths/run\n        # handles checking which paths should be run\n    score_holder = ctx.project_id.removeprefix('gm4_')\n    newest_version_with_upgrades = 0.0\n    for ns, direc in map(lambda a: a.split(':'), upgrade_paths_dirs):\n        upgrade_paths_tree = ctx.data[ns].functions.generate_tree(direc)\n        if upgrade_paths_tree:\n            newest_version_with_upgrades = max(newest_version_with_upgrades, max(map(float, upgrade_paths_tree.keys())))\n        for path in upgrade_paths_tree.keys():\n            run_func.append(f'execute if score {score_holder} gm4_earliest_version matches ..{Version(path+\".0\").int_rep() -1} run function {ns}:{direc}/{path}')\n\n    if len(run_func.lines) > 0:\n        run_func.append(f'execute if score {score_holder} gm4_earliest_version matches ..{Version(str(newest_version_with_upgrades)+\".0\").int_rep() -1} run scoreboard players add $active_upgrade_paths gm4_data 1')\n        run_func.append(f'tag @s remove gm4_running_upgrade_path')\n        ctx.data[f'{ctx.project_id}:upgrade_paths/run'] = run_func\n\ndef lib(ctx: Context):\n    \"\"\"Runs additional processing to assign libraries a psudo gm4_modules score for comparison\"\"\"\n    score_holder = ctx.project_id.removeprefix('gm4_')\n    manifest = ManifestCacheModel.model_validate(ctx.cache[\"gm4_manifest\"].json)\n    ver_str = manifest.libraries.get(ctx.project_id.replace(\"gm4_\", \"lib_\"), NoneAttribute()).version or \"0.0.0\"\n    ver = Version(ver_str)\n    if ver.patch is None:\n        ver.patch = 0 #  when beet-dev is run, pipeline has no patch number record, but dev builds should still allow int conversion\n    ver_int = ver.int_rep()\n    ctx.data.functions[f'{ctx.project_id}:load'].append(f'execute unless score {score_holder} gm4_earliest_version matches ..{ver_int} run scoreboard players set {score_holder} gm4_earliest_version {ver_int}')\n\n    beet_default(ctx)\n"
  },
  {
    "path": "gm4/plugins/versioning.py",
    "content": "from beet import Context, Function, FunctionTag, PluginOptions, configurable\nfrom beet.contrib.rename_files import rename_files\nfrom beet.contrib.find_replace import find_replace\nfrom pydantic import Field\nimport warnings\nfrom gm4.utils import Version, NoneAttribute\nimport gm4.plugins.manifest # for ManifestCacheModel; a runtime circular dependency\n\nclass VersionInjectionConfig(PluginOptions):\n    functions: list[str] = []\n    advancements: list[str] = []\n\nclass VersioningConfig(PluginOptions, extra=\"ignore\"):\n    schedule_loops: list[str] = []\n    required: dict[str, str] = {}\n    extra_version_injections: VersionInjectionConfig = Field(default=VersionInjectionConfig())\n\n@configurable(\"gm4.versioning\", validator=VersioningConfig)\ndef modules(ctx: Context, opts: VersioningConfig):\n    \"\"\"Assembles version-functions for modules from dependency information:\n        - load:{module_name}.json\n        - {module_name}:load.mcfunction\n        - load:load.json\"\"\"\n    ctx.cache[\"currently_building\"].json = {\"name\": ctx.project_name, \"id\": ctx.project_id, \"added_libs\": []} # cache module's project id for access within library pipelines\n    dependencies = opts.required\n    manifest = gm4.plugins.manifest.ManifestCacheModel.model_validate(ctx.cache[\"gm4_manifest\"].json)\n    lines = [\"execute \", \"\"]\n\n    # {{module_name}}.json tag\n    load_tag = dependency_load_tags(ctx, dependencies)\n    load_tag.add(f\"{ctx.project_id}:load\")\n    ctx.data.function_tags[f\"load:{ctx.project_id}\"] = load_tag\n\n    # load.mcfunction\n    base_ver = manifest.base[\"version\"]\n    dependencies = {\"gm4\":base_ver}|dependencies # manually insert base version as dependency, assumed to be current base version\n\n    for dep_id, ver_str in dependencies.items():\n        dep_ver = Version(ver_str)\n        warn_on_future_version(ctx, dep_id, dep_ver)\n\n        name_default_dict = {\"name\":\"Gamemode 4 Base\"} if dep_id == \"gm4\" else {\"name\":dep_id}\n        manifest_entry = manifest.modules.get(dep_id)\n        dep_name = manifest_entry.name if manifest_entry else name_default_dict[\"name\"]\n\n        if dep_id not in manifest.modules and dep_id != \"gm4\":\n            dep_id = manifest.libraries.get(dep_id, NoneAttribute()).id\n\n        # append to startup check\n        lines[0] += f\"if score {dep_id} load.status matches {dep_ver.major} if score {dep_id}_minor load.status matches {dep_ver.minor}.. \"\n\n        # failure logs\n        lines.append(f\"execute unless score {dep_id} load.status matches 1.. run data modify storage gm4:log queue append value {{type:\\\"missing\\\",module:\\\"{ctx.project_name}\\\",id:\\\"{ctx.project_id}\\\",require:\\\"{dep_name}\\\",require_id:\\\"{dep_id}\\\"}}\")\n\n        log_data = f\"{{type:\\\"version_conflict\\\",module:\\\"{ctx.project_name}\\\",id:\\\"{ctx.project_id}\\\",require:\\\"{dep_name}\\\",require_id:\\\"{dep_id}\\\",require_ver:\\\"{dep_ver}\\\"}}\"\n        lines.append(f\"execute if score {dep_id} load.status matches 1.. unless score {dep_id} load.status matches {dep_ver.major} run data modify storage gm4:log queue append value {log_data}\")\n        lines.append(f\"execute if score {dep_id} load.status matches {dep_ver.major} unless score {dep_id}_minor load.status matches {dep_ver.minor}.. run data modify storage gm4:log queue append value {log_data}\")\n\n    # finalize startup check\n    module_ver = Version(ctx.project_version)\n    lines[1] = lines[0] + f\"run scoreboard players set {ctx.project_id}_minor load.status {module_ver.minor}\"\n    lines[0] += f\"run scoreboard players set {ctx.project_id} load.status {module_ver.major}\"\n\n    # otherwise, log failed startup with -1 load.status\n    lines.append(f\"execute unless score {ctx.project_id} load.status matches 1.. run scoreboard players set {ctx.project_id} load.status -1\")\n\n    lines.append('')\n    # start module clocks\n    lines.append(f\"execute if score {ctx.project_id} load.status matches {module_ver.major} run function {ctx.project_id}:init\")\n\n    # unschedule clocks\n    for function in opts.schedule_loops:\n        namespaced_function = f\"{ctx.project_id}:{function}\" if \":\" not in function else function\n        lines.append(f\"execute unless score {ctx.project_id} load.status matches {module_ver.major} run schedule clear {namespaced_function}\")\n\n    ctx.data.functions[f\"{ctx.project_id}:load\"] = Function(lines)\n\n    # load.json tag\n    ctx.data.function_tags[\"load:load\"] = FunctionTag({\n        \"values\": [\n            f\"#load:{ctx.project_id}\"\n        ]\n    })\n\n    # inject module load success checks (load.status 1..) into technical and display advancements\n        # advancements get score checks injected into every criteria\n    versioned_advancements(ctx, Version(\"X.X.X\"), [a for a in ctx.data.advancements.keys() if not a==\"gm4:root\"], False)\n\n@configurable(\"gm4.versioning\", validator=VersioningConfig)\ndef libraries(ctx: Context, opts: VersioningConfig):\n    \"\"\"Assembles version-functions for libraries from dependency information:\n        - {lib_name}:enumerate.mcfunction\n        - {lib_name}:resolve_load.mcfunction\n        - load:{lib_name}.json\n        - load:{lib_name}/enumerate.json\n        - load:{lib_name}/resolve_load.json\n        - load:{lib_name}/dependencies.json\"\"\"\n    dependencies = opts.required\n    manifest = gm4.plugins.manifest.ManifestCacheModel.model_validate(ctx.cache[\"gm4_manifest\"].json)\n    lib_ver = Version(ctx.project_version)\n\n    # enumerate.mcfunction\n    lines = [\n        f\"execute if score {ctx.project_id} load.status matches {lib_ver.major} unless score {ctx.project_id}_minor load.status matches {lib_ver.minor}.. run scoreboard players set {ctx.project_id}_minor load.status {lib_ver.minor}\",\n        \"\",\n    ]\n\n    dep_check_line = \"execute \"\n    for dep_id, ver_str in dependencies.items():\n        dep_ver = Version(ver_str)\n        warn_on_future_version(ctx, dep_id, dep_ver)\n\n        if dep_id not in manifest.modules:\n            dep_id = manifest.libraries.get(dep_id, NoneAttribute()).id\n\n        dep_check_line += f\"if score {dep_id} load.status matches {dep_ver.major} if score {dep_id}_minor load.status matches {dep_ver.minor}.. \"\n\n    dep_check_line += f\"unless score {ctx.project_id} load.status matches {lib_ver.major}.. run scoreboard players set \"\n\n    lines.append(dep_check_line + f\"{ctx.project_id}_minor load.status {lib_ver.minor}\")\n    lines.append(dep_check_line + f\"{ctx.project_id} load.status {lib_ver.major}\")\n\n    ctx.data.functions[f\"{ctx.project_id}:enumerate\"] = Function(lines)\n\n    # resolve_load.mcfunction\n    lines = [f\"execute if score {ctx.project_id} load.status matches {lib_ver.major} if score {ctx.project_id}_minor load.status matches {lib_ver.minor} run function {ctx.project_id}:load\"]\n\n    for func in opts.schedule_loops:\n        lines.append(f\"execute unless score {ctx.project_id} load.status matches {lib_ver.major} run schedule clear {ctx.project_id}:{func}\")\n        lines.append(f\"execute unless score {ctx.project_id}_minor load.status matches {lib_ver.minor} run schedule clear {ctx.project_id}:{func}\")\n\n    ctx.data.functions[f\"{ctx.project_id}:resolve_load\"] = Function(lines)\n\n    # load/tags {{ lib name }}.json\n    ctx.data.function_tags[f\"load:{ctx.project_id}\"] = FunctionTag({\n        \"values\": [\n            f\"#load:{ctx.project_id}/enumerate\",\n            f\"#load:{ctx.project_id}/resolve_load\"\n        ]\n    })\n\n    # load/tags enumerate.json\n    ctx.data.function_tags[f\"load:{ctx.project_id}/enumerate\"] = FunctionTag({\n        \"values\": [\n            f\"{ctx.project_id}:enumerate\"\n        ]\n    })\n\n    # load/tags resolve_load.json\n    ctx.data.function_tags[f\"load:{ctx.project_id}/resolve_load\"] = FunctionTag({\n        \"values\": [\n            f\"{ctx.project_id}:resolve_load\"\n        ]\n    })\n\n    # load/tags dependencies.json\n    if len(dependencies) > 0:\n        dep_tag = dependency_load_tags(ctx, dependencies)\n        ctx.data.function_tags[f\"load:{ctx.project_id}/dependencies\"] = dep_tag\n        ctx.data.function_tags[f\"load:{ctx.project_id}\"].prepend(FunctionTag({\n            \"values\": [\n                f\"#load:{ctx.project_id}/dependencies\"\n            ]\n        }))\n\n    # additional version injections\n    # NOTE functions get version checks replaced onto `load.status` checks\n    ctx.require(find_replace(data_pack={\"match\": {\n        \"functions\": [f if ':' in f else f\"{ctx.project_id}:{f}\" for f in opts.extra_version_injections.functions]}\n        },\n        substitute={\n            \"find\": f\"{ctx.project_id} load\\\\.status matches \\\\d(?: if score {ctx.project_id}_minor load\\\\.status matches \\\\d)?\",\n            \"replace\": f\"{ctx.project_id} load.status matches {lib_ver.major} if score {ctx.project_id}_minor load.status matches {lib_ver.minor}\"\n        }\n    ))\n\n        # stamp version number and module bring packaged into into load.mcfunction\n    handle = ctx.data.functions[f\"{ctx.project_id}:load\"]\n    handle.append([\n        \"\\n\",\n        f\"data modify storage gm4:log versions append value {{id:\\\"{ctx.project_id}\\\",module:\\\"{ctx.project_id.replace('gm4', 'lib')}\\\",version:\\\"{ctx.project_version}\\\",from:\\\"{ctx.cache['currently_building'].json.get('name', 'standalone')}\\\"}}\"\n    ])\n\n    # strict version checks on advancements\n    versioned_advancements(ctx, lib_ver, opts.extra_version_injections.advancements, strict=True)\n    # NOTE it may be possible/desirable to just automatically inject version checks into *all* library advancements\n\n    # put library version number in namespace\n    versioned_namespace(ctx, lib_ver)\n\n@configurable(\"gm4.versioning\", validator=VersioningConfig)\ndef base(ctx: Context, opts: VersioningConfig):\n    \"\"\"Fills in version information to the base functions from the beet.yaml\"\"\"\n    ver = Version(ctx.project_version)\n    # enumerate.mcfunction\n    lines = [\n        f\"execute if score gm4 load.status matches {ver.major} unless score gm4_minor load.status matches {ver.minor}.. run scoreboard players set gm4_minor load.status {ver.minor}\",\n        \"\",\n        f\"execute unless score gm4 load.status matches {ver.major}.. run scoreboard players set gm4_minor load.status {ver.minor}\",\n        f\"execute unless score gm4 load.status matches {ver.major}.. run scoreboard players set gm4 load.status {ver.major}\"\n    ]\n    ctx.data.functions[f\"gm4:enumerate\"] = Function(lines)\n\n    # resolve_load.mcfunction\n    lines = f\"execute if score gm4 load.status matches {ver.major} if score gm4_minor load.status matches {ver.minor} run function gm4:load\"\n    ctx.data.functions[f\"gm4:resolve_load\"] = Function(lines)\n\n    # resolve_post_load.mcfunction\n    lines = f\"execute if score gm4 load.status matches {ver.major} if score gm4_minor load.status matches {ver.minor} run function gm4:post_load\"\n    ctx.data.functions[f\"gm4:resolve_post_load\"] = Function(lines)\n\n    versioned_advancements(ctx, ver, opts.extra_version_injections.advancements, strict=True) #type:ignore\n\n    versioned_namespace(ctx, ver)\n\ndef versioned_namespace(ctx: Context, version: Version):\n    \"\"\"Puts the project version into the namespace, and renames all references to match\n    Used for libraries that may have multiple versions exist in a world at once without\n    file overwrites\"\"\"\n    namespace = ctx.project_id if ctx.project_id != 'base' else 'gm4'\n    versioned_namespace = f\"{namespace}-{version.major}.{version.minor}\"\n    ctx.require(rename_files(data_pack={\n        \"match\": {\"functions\": \"*\", \"advancements\": \"*\", \"loot_tables\": \"*\", \"predicates\": \"*\"} if namespace != 'gm4' else {\"functions\": \"*\", \"advancements\": \"*\"},\n        \"find\": f\"{namespace}:([a-z_/]+)\",\n        \"replace\": f\"{versioned_namespace}:\\\\1\"\n    }))\n    ctx.require(find_replace(data_pack={\"match\": \"*\"}, substitute={\n        \"find\": f\"(?<![#$])(?<!storage )(?<!storage\\\":\\\"){namespace}:([a-z0-9_/]+)\", # NOTE because re module requires fixed-length look behind, storage-referencing json *must* use no spaces between \"storage\":\"ns:loc\"\n        \"replace\": f\"{versioned_namespace}:\\\\1\"\n    }))\n\n\ndef dependency_load_tags(ctx: Context, dependencies: dict[str, str]) -> FunctionTag:\n    \"\"\"Assembles dependency information into tag format. Ensures a pack's dependencies\n    get processed by lantern load before the primary startup checks for the module itself\"\"\"\n    dep_tag = FunctionTag()\n    manifest = gm4.plugins.manifest.ManifestCacheModel.model_validate(ctx.cache[\"gm4_manifest\"].json)\n    for dep_id in dependencies.keys():\n        if dep_id not in manifest.modules: # retrieve \"gm4_\" prefixed id for libraries, which are named \"lib_\"\n            lib = manifest.libraries.get(dep_id)\n            if lib is None:\n                raise ValueError(f\"{dep_id} is not a valid library id\")\n            dep_id = lib.id\n        dep_tag.append(FunctionTag(\n            {\"values\":[\n                {\"id\": f\"#load:{dep_id}\", \"required\": False}\n            ]}\n        ))\n    return dep_tag\n\ndef versioned_advancements(ctx: Context, ver: Version, targets: list[str], strict:bool=False):\n    \"\"\"Adds versioning to advancements, either strict checks for libraries or load checks for most modules\"\"\"\n    # NOTE advancements get score checks injected into every criteria\n    assemble_value_check = lambda name_field, range_field: { # type:ignore\n        \"condition\": \"minecraft:value_check\",\n        \"value\": {\n            \"type\": \"minecraft:score\",\n            \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": name_field\n            },\n            \"score\": \"load.status\"\n        },\n        \"range\": range_field\n    }\n\n    for entry in targets:\n        if \":\" in entry:\n            handle = ctx.data.advancements[entry]\n        else:\n            handle = ctx.data.advancements[f\"{ctx.project_id}:{entry}\"]\n        for criteria in handle.data[\"criteria\"].values():\n            player_conditions = criteria.setdefault(\"conditions\", {}).setdefault(\"player\", [])\n            if type(player_conditions) is dict:\n                raise ValueError(f\"{entry} is using legacy player conditions, which does not support load.status injections.\")\n            if strict:\n                player_conditions.append(assemble_value_check(ctx.project_id, ver.major))\n                player_conditions.append(assemble_value_check(f\"{ctx.project_id}_minor\", ver.minor))\n            else:\n                player_conditions.append(assemble_value_check(ctx.project_id, {\"min\": 1}))\n\ndef warn_on_future_version(ctx: Context, dep_id: str, ver: Version):\n    \"\"\"Issues a console warning if the dependancy version a module requires is greater than the current version of that dependancy\"\"\"\n    if dep_id == \"gm4\":\n        return # the base version is not in the manifest, tis a special case\n    if \"lib\" in dep_id:\n        cache_compound = ctx.cache[\"gm4_manifest\"].json[\"libraries\"]\n    else:\n        cache_compound = ctx.cache[\"gm4_manifest\"].json[\"modules\"]\n    latest_dep_ver = Version(cache_compound.get(dep_id, {}).get(\"version\", '0.0.0'))\n\n    if (latest_dep_ver.major == ver.major and latest_dep_ver.minor < ver.minor) or (latest_dep_ver.major < ver.major): # type: ignore\n        message = f\"{ctx.project_id} depends on a future version {dep_id} v{ver}, but the latest available is {latest_dep_ver}\"\n        warnings.warn(message)\n\ndef isolated_library(ctx: Context):\n    \"\"\"Generates the #load:load function tag when building libraries in isloation\"\"\"\n    ctx.cache[\"currently_building\"].json = {\"name\": ctx.project_name, \"id\": ctx.project_id, \"added_libs\": []}\n    # load.json tag\n    ctx.data.function_tags[\"load:load\"] = FunctionTag({\n        \"values\": [\n            f\"#load:{ctx.project_id}\"\n        ]\n    })\n"
  },
  {
    "path": "gm4/plugins/worker.py",
    "content": "from beet import Connection, Context, Pipeline, ResourcePack, DataPack\nfrom typing import Any\n\nRETRIEVE_ALL_PROJECTS = 0\nRETRIEVE_LAST_PROJECT = 1\nProjectPacket = tuple[ResourcePack, DataPack, dict[str, Any]]\n\ndef store_project(ctx: Context):\n    \"\"\"Stores the current project object in a beet worker\"\"\"\n    with ctx.worker(bridge) as channel:\n        rp, dp = ctx.packs\n        ctx_params = {k:getattr(ctx, k) for k in (\"project_id\",\n                                                  \"project_name\",\n                                                  \"project_description\",\n                                                  \"project_author\",\n                                                  \"project_version\",\n                                                  \"project_root\",\n                                                  \"minecraft_version\",\n                                                  \"directory\",\n                                                  \"output_directory\",\n                                                  \"meta\",\n                                                  \"cache\",\n                                                  \"worker\",\n                                                  \"template\")}\n\n        channel.send((rp, dp, ctx_params))\n\ndef freeze_last_stored(ctx: Context):\n    \"\"\"'Freezes' the state of the last stored project by making it a shallow copy, allowing the original to be cleared\"\"\"\n    yield # wait for exit phase\n    with ctx.worker(bridge) as channel:\n        channel.send(RETRIEVE_LAST_PROJECT)\n    for last_project in channel:\n        rp, dp, params = last_project[0] # only one project is passed in list\n        frozen_rp = rp.copy(shallow=True)\n        frozen_dp = dp.copy(shallow=True)\n\n        # send back the frozen packs\n        with ctx.worker(bridge) as channel:\n            channel.send((frozen_rp, frozen_dp, params))\n\ndef clear_on_exit(ctx: Context):\n    \"\"\"Clears the packs on the exit phase - prevents faulty race condition merges into the parent subproject in a pipeline\"\"\"\n    yield\n    ctx.data.clear()\n    ctx.assets.clear()\n\ndef retrieve_and_run(ctx: Context):\n    \"\"\"Retrieves projects stored by the worker, reconstructs a Context() and runs the specified plugins on each one\"\"\"\n    plugins = ctx.meta.get(\"plugins\",[])\n    with ctx.worker(bridge) as channel:\n        channel.send(RETRIEVE_ALL_PROJECTS)\n    for stored_project in channel:\n        for rp, dp, ctx_params in stored_project:\n            c = Context(**ctx_params, assets=rp, data=dp)\n            c.activate()\n            c.require(*plugins)\n            c.inject(Pipeline).run() # manually run plugin's exit phases as this context is \"headless\"\n\ndef retrieve_and_merge(ctx: Context):\n    \"\"\"Retrieves stored contexts and merges their packs into the current/parent context\"\"\"\n    with ctx.worker(bridge) as channel:\n        channel.send(RETRIEVE_ALL_PROJECTS)\n    for stored_project in channel:\n        for rp, dp, _ in stored_project:\n            \n            #NOTE build hangs when fonts are merged from one ResourcePack to another... why is unknown\n            # this is a manual work around to merge the font files without causing the strange hang\n            for f, font in rp.fonts.items():\n                ctx.generate(f, merge=font)\n            rp.fonts.clear()\n\n            # clear mcmeta entries to the current context can properly make its own\n            del dp.mcmeta\n            del rp.mcmeta\n\n            ctx.data.merge(dp)\n            ctx.assets.merge(rp)\n\ndef bridge(connection: Connection[ProjectPacket|int, list[ProjectPacket]]):\n    # incoming types `ProjectPacket|int` and outgoing types `list[ProjectPacket]`\n    project_storage: list[tuple[ResourcePack, DataPack, dict[str, Any]]] = []\n\n    for client in connection: # iterable is kept open throughout the life of the build\n        # each `channel.send` causes a new element immediately processed here\n        for request in client:\n            # request is the actual payload - here the Context object\n            if isinstance(request, tuple):\n                project_storage.append(request)\n            if request == RETRIEVE_ALL_PROJECTS:\n                client.send(project_storage)\n                project_storage = []\n            if request == RETRIEVE_LAST_PROJECT:\n                client.send([project_storage.pop(-1)])\n"
  },
  {
    "path": "gm4/plugins/write_mcmeta.py",
    "content": "from beet import Context\nfrom gm4.utils import run, NoneAttribute\nfrom gm4.plugins.manifest import ManifestCacheModel\n\ndef beet_default(ctx: Context):\n\t\"\"\"Writes the pack.mcmeta based on the module name and version.\"\"\"\n\tyield # wait for exit phase\n\n\tmanifest = ManifestCacheModel.model_validate(ctx.cache[\"gm4_manifest\"].json)\n\tmanifest_entry = {v.id:v for v in (manifest.modules|manifest.libraries).values()}.get(ctx.project_id, NoneAttribute())\n\n\tctx.data.min_format = 101\n\tctx.data.max_format = 101\n\n\tctx.assets.min_format = 84\n\tctx.assets.max_format = 84\n\n\tfor pack in ctx.packs:\n\t\tpack.description = [\n\t\t\tctx.project_name,\n\t\t\t\"\\n\",\n\t\t\t{\n\t\t\t\t\"text\": f\"Gamemode 4 for 26.1\",\n\t\t\t\t\"color\": \"#4AA0C7\"\n\t\t\t}\n\t\t]\n\t\tpack.mcmeta.data.update({\n\t\t\t\"version\":manifest_entry.version,\n\t\t\t\"commit_hash\": run([\"git\", \"log\", \"-1\", \"--format=%h\"])\n\t\t})\n"
  },
  {
    "path": "gm4/skin_cache.json",
    "content": "{\n  \"skins\": {\n    \"gm4_metallurgy:band/curies_bismium\": {\n      \"uuid\": [\n        -1332644679,\n        659216762,\n        2108439484,\n        664728976\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYyODAyOTI2NzM2NiwKICAicHJvZmlsZUlkIiA6ICI3ZmIyOGQ1N2FhZmQ0MmQ1YTcwNWNlZjE4YWI1MzEzZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJjaXJjdWl0MTAiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2MzMTBmZDk3YjFhN2Q3MDkwOGExODc2N2FjZmRjYzYwZDJhMTU1NTY5Zjk0YThmYjZhZWUxYTMzMWE5MjM4IgogICAgfQogIH0KfQ==\",\n      \"hash\": \"9ed097b3f89227e8c37120243968e5bccaf7d228\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_metallurgy:band/barium\": {\n      \"uuid\": [\n        -758190455,\n        118414880,\n        1677653096,\n        2076204799\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYyODg4MzkzODA4MiwKICAicHJvZmlsZUlkIiA6ICJmNThkZWJkNTlmNTA0MjIyOGY2MDIyMjExZDRjMTQwYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ1bnZlbnRpdmV0YWxlbnQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGMxMzcwMGVlMGViYzgwOTU2N2IxYTNjOTFhYzhjMWFhMmJiNWNlYjQ4YWRlNzZlOGJkN2QzMWE5Y2EzYjdkIgogICAgfQogIH0KfQ==\",\n      \"hash\": \"14cd3ff955967271ebdf82b44d3f3844dc837f41\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_auto_crafting:auto_crafter\": {\n      \"uuid\": [\n        925477182,\n        1548502938,\n        -926454109,\n        -774539107\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY1NjM4MTc3MTIyMywKICAicHJvZmlsZUlkIiA6ICJjMTNkYzkxZjg1YjA0ZWM4OGU2NDk5YzdjZDc4Zjk3MSIsCiAgInByb2ZpbGVOYW1lIiA6ICJjYXNzdGhlY3J5cHRpZCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9jZjI4NWUwYjc1NGNhMDU3NDllODYzMjA0MmZkZmEyZGRkYjIyMjNhYWVmNGU3NjczOTdlNzg5Y2ZjYTYzYjFhIiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0=\",\n      \"hash\": \"122bb193187f87d87f97abb6b83b7b02a7349912\",\n      \"parent_module\": \"gm4_auto_crafting\"\n    },\n    \"gm4_block_compressors:block_compressor\": {\n      \"uuid\": [\n        788137431,\n        1839549415,\n        -1633195690,\n        -1508391925\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1MzYzMTM1MiwKICAicHJvZmlsZUlkIiA6ICI0ZWQ4MjMzNzFhMmU0YmI3YTVlYWJmY2ZmZGE4NDk1NyIsCiAgInByb2ZpbGVOYW1lIiA6ICJGaXJlYnlyZDg4IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzZmYTkzMjMxZjZmNjVkNjc1NDI2NjgyMzE3NWIwOWFmNGNhN2E1NzQ1NDQzYjMyNjFlZGE3OGUzNTk5NTgyYmYiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==\",\n      \"hash\": \"4550bb57cbcacc21036cbb3be9dfb3429df74d26\",\n      \"parent_module\": \"gm4_block_compressors\"\n    },\n    \"gm4_metallurgy:band/aluminium\": {\n      \"uuid\": [\n        1961294324,\n        1560605478,\n        885901402,\n        915511979\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYyODc4ODAzNjY3NCwKICAicHJvZmlsZUlkIiA6ICI2MjM5ZWRhM2ExY2Y0YjJiYWMyODk2NGQ0NmNlOWVhOSIsCiAgInByb2ZpbGVOYW1lIiA6ICJGYXRGYXRHb2QiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGQ3MTQ5OTY0MDNlMTNhNGE4ZTc4OTQ0OWNjN2I5OGRhMmI4NDc1NTRjNDgwZGUyMDUxOTcwYjIxODIzZGJkOSIKICAgIH0KICB9Cn0=\",\n      \"hash\": \"d9c35bd3db598c7748165543b54b2a9a23e7e76c\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_disassemblers:disassembler\": {\n      \"uuid\": [\n        -1561282646,\n        -258324274,\n        -1153094374,\n        -693854673\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1NDAzMTQ2MywKICAicHJvZmlsZUlkIiA6ICJjNDM5NDI3Y2U1NGQ0NDMwYTYzOGU5OTdlYzc2YTBhOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaGVNYXN0ZXJHb2xkZW4iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODFjNzQ2NzEwZjQ3ODZiYzgxZTI1ZWVmOTM5ODI3ZjNiNDMzMjFhODQ1ZmYyNmU4N2E3MjVmZDBkMzU2Y2Y5MCIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\",\n      \"hash\": \"78c3082f5e32d9545c7ea81734776ce28eaefac1\",\n      \"parent_module\": \"gm4_disassemblers\"\n    },\n    \"gm4_enchantment_extractors:enchantment_extractor\": {\n      \"uuid\": [\n        -395669705,\n        959204555,\n        -1473222203,\n        -686353911\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1NDA4MzE3NiwKICAicHJvZmlsZUlkIiA6ICIxYTc1ZTNiYmI1NTk0MTc2OTVjMmY4NTY1YzNlMDAzZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJUZXJvZmFyIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzIyZTRiMWM2ODExYjhkOTgyNTg3NTNmZWNkNGYyOWUzY2Y2MjJmODFhN2FlZTEyNTIwMTc1MmM0NGVkM2EyNDEiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==\",\n      \"hash\": \"356988a3785fc31cf1f15f833aa1d71ca5cb6c2a\",\n      \"parent_module\": \"gm4_enchantment_extractors\"\n    },\n    \"gm4_ender_hoppers:ender_hopper_display\": {\n      \"uuid\": [\n        -1738045610,\n        -1151472894,\n        -1829437163,\n        677674665\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0NDM1MTIwMTExNywKICAicHJvZmlsZUlkIiA6ICI5NTE3OTkxNjljYzE0MGY1OGM2MmRjOGZmZTU3NjBiZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJPcmRpbmFsQ2FyZGluYWwiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTI4NzVlODdmNzBkODMzNjcxYTEzMWJjZjE2OGI2Y2VjYWQ4YmIwNjlhYTkwM2ZiOTFiOGVhMWYwOWRhZDQ1NyIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\",\n      \"hash\": \"6bb95eece3cb1ee8ec0265aa12620ebc88c6f9e9\",\n      \"parent_module\": \"gm4_ender_hoppers\"\n    },\n    \"gm4_ender_hoppers:ender_hopper\": {\n      \"uuid\": [\n        -1638903124,\n        -1364335607,\n        -1999291957,\n        -1538083823\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0NDM1MTAzMTI1MywKICAicHJvZmlsZUlkIiA6ICI5ZWEyMTQ0NGFiNjI0MWZkYjg5YjE2NDFhNDg2MGZiZiIsCiAgInByb2ZpbGVOYW1lIiA6ICI3QUJDSE9VTiIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS80MjBjOThjYTlhZjRjYTY1N2ZjN2M5MTc4Yzc5ZjQ5MDM4YmU2ODExMzllNjIwZDEzMmJhNTJmMzA3YjAxMTcyIiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0=\",\n      \"hash\": \"4881cf1a003e7dcb239fd97f75eaaa729324115b\",\n      \"parent_module\": \"gm4_ender_hoppers\"\n    },\n    \"gm4_end_fishing:enderpuff\": {\n      \"uuid\": [\n        -749248143,\n        1561284060,\n        -1964497486,\n        1336566238\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYxNzM3NjU5NjgxNiwKICAicHJvZmlsZUlkIiA6ICI4NDMwMDNlM2JlNTY0M2Q5OTQxMTBkMzJhMzU2MTk2MCIsCiAgInByb2ZpbGVOYW1lIiA6ICJHYWJvTWNHYW1lciIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9lYjIzNTI3MWNhNTZlOGExYTQzMWViMWU2NWNlODIwYWE3ZTUwMWYwNmMxZjEzNTZhY2ViN2U4NjJmMTRhMjgiCiAgICB9CiAgfQp9\",\n      \"hash\": \"d77a8f7ba43aca49a4f98a096b22ef0712876d5f\",\n      \"parent_module\": \"gm4_end_fishing\"\n    },\n    \"gm4_forming_press:forming_press\": {\n      \"uuid\": [\n        -1176243816,\n        418006447,\n        -1230055084,\n        297056131\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1NTQ0MTc1NywKICAicHJvZmlsZUlkIiA6ICJjNjEwOTExMDhlOTQ0MWRhODQyZDA5MDVmMDAyOWVhOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJkZVlvbm8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjM0YWQ1NDAyYzAxMzAzYzA0NmI1MTJlZjBiMzYyYmQwNjJjMWI3ZTg1MTU5YTYzODMzMGQyMjg0NTYzMWNmYSIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\",\n      \"hash\": \"d5356175300c7f90d4638f826e7a7ce73f5411f4\",\n      \"parent_module\": \"gm4_forming_press\"\n    },\n    \"gm4_metallurgy:band/barimium\": {\n      \"uuid\": [\n        -340714413,\n        1525011343,\n        50560746,\n        -1948445052\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYyODc5MjUwNDk5MiwKICAicHJvZmlsZUlkIiA6ICI5MWYwNGZlOTBmMzY0M2I1OGYyMGUzMzc1Zjg2ZDM5ZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJTdG9ybVN0b3JteSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS85MzU2MjZhYzgwZmZmYWFiOTkyOWMwYWViNTg5N2RkN2FlOThjOWI5NTY1NjVjZTc3YTEyNjE0MjExYWI2NTg0IgogICAgfQogIH0KfQ==\",\n      \"hash\": \"f75253001a1bababc6715a25f883cd19fa6f2d11\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_heart_canisters:heart_canister_tier_1\": {\n      \"uuid\": [\n        1567268555,\n        400377645,\n        -2090593244,\n        -1749540666\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYxNjM4NTc2NTU0MSwKICAicHJvZmlsZUlkIiA6ICI3NzI3ZDM1NjY5Zjk0MTUxODAyM2Q2MmM2ODE3NTkxOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJsaWJyYXJ5ZnJlYWsiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjkxNzBhNzY4ZGY1MDQ1OTcwM2JkYWRkYjNlZGI2OTMyNmJkY2NjY2JmNDQxODM4MDM0YTI0N2I2NDFiN2UyZiIKICAgIH0KICB9Cn0=\",\n      \"hash\": \"c36f3f29070e940d4bd0e8994c3f6d390e2e9c77\",\n      \"parent_module\": \"gm4_heart_canisters\"\n    },\n    \"gm4_heart_canisters:heart_canister_tier_2\": {\n      \"uuid\": [\n        -320501529,\n        -244889622,\n        -2022276390,\n        -292592904\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYxNjM4NTgyOTM1NSwKICAicHJvZmlsZUlkIiA6ICI0ZTMwZjUwZTdiYWU0M2YzYWZkMmE3NDUyY2ViZTI5YyIsCiAgInByb2ZpbGVOYW1lIiA6ICJfdG9tYXRvel8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzgxZmU0ZjA2YTM1ZWU3YzQyMzA5ZDM5M2MyNWJjMTFjZDFiNWIxNTBhMTllZGYzODllOGVjY2E0ZmNlMWRkZiIKICAgIH0KICB9Cn0=\",\n      \"hash\": \"e451ff78653c15dc5976ba6b9f650503b7f0ea57\",\n      \"parent_module\": \"gm4_heart_canisters\"\n    },\n    \"gm4_lightning_in_a_bottle:texture_connector\": {\n      \"uuid\": [\n        1196754309,\n        1130089731,\n        -1851853423,\n        152678880\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYzNzc3MDAzOTc2OCwKICAicHJvZmlsZUlkIiA6ICJmODJmNTQ1MDIzZDA0MTFkYmVlYzU4YWI4Y2JlMTNjNyIsCiAgInByb2ZpbGVOYW1lIiA6ICJSZXNwb25kZW50cyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81YzEzZjIxN2U5NmJmY2VhNjIwZTc3YTIzNjRjYTBkNmE0ZTdhN2UwOGMzNzAzNzI3ODI4MTQ4ZjQxNjM0YmVjIiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0=\",\n      \"hash\": \"68071514c7ccaa2f5e14f9061a013bb14fb5e6d5\",\n      \"parent_module\": \"gm4_lightning_in_a_bottle\"\n    },\n    \"gm4_lightning_in_a_bottle:lightning_liquid\": {\n      \"uuid\": [\n        2130271109,\n        -1138570753,\n        -1614258158,\n        -884567317\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYzODMwMzcyNDQ2NywKICAicHJvZmlsZUlkIiA6ICI4MmM2MDZjNWM2NTI0Yjc5OGI5MWExMmQzYTYxNjk3NyIsCiAgInByb2ZpbGVOYW1lIiA6ICJOb3ROb3RvcmlvdXNOZW1vIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2Y3ZjA1OWRiZTJhZDIxZTlmMzZiY2U3NmYyY2YyOGI5ZDdlOGFmN2Q4OTE0MDdhYWYwYTE2OTk3MTJhMmE2YmEiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==\",\n      \"hash\": \"ca9b10a25c2a9bbcc2dc60e8e0be64a377315874\",\n      \"parent_module\": \"gm4_lightning_in_a_bottle\"\n    },\n    \"gm4_liquid_minecarts:liquid_minecart_display/low\": {\n      \"uuid\": [\n        1120840726,\n        453134473,\n        -1920599881,\n        -1587040077\n      ],\n      \"value\": \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTEzNjg2ZjIxMDY1YTRiZTZjYzU3MDYxZDhlNzM2MDQ3MzQ2YzU4NmEzYTU1OWMwMzdhMDMxNGJjNDUyOTA4MSJ9fX0=\",\n      \"hash\": \"ad8328a889382d1dc3e54cd6e1913f70a70b3624\",\n      \"parent_module\": \"gm4_liquid_minecarts\"\n    },\n    \"gm4_liquid_minecarts:liquid_minecart_display/high\": {\n      \"uuid\": [\n        -325521224,\n        -1751038048,\n        -1752797071,\n        -316499442\n      ],\n      \"value\": \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmFjOTBjM2ZmNWI5NzBhNTIyNTliNTdhNDlmMjFmOGE1NTdmZmIxYTM2ZmNjNDkwMDQyMTQzNDZkOWViN2RmZCJ9fX0=\",\n      \"hash\": \"d5be0eb8f20d9861f23989dc63a292519ac9a4b8\",\n      \"parent_module\": \"gm4_liquid_minecarts\"\n    },\n    \"gm4_liquid_minecarts:liquid_minecart_display/full\": {\n      \"uuid\": [\n        -6800160,\n        1470582470,\n        -1663082352,\n        -568664979\n      ],\n      \"value\": \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2M5OTI4ODgxNGY1ODVjN2JjMmU1NWQ0NDY0ZDUzOGQwZDlkOWM4YjE4NzRiZTA5ZDc4Yjk3YzA3YzAwYWIxYSJ9fX0=\",\n      \"hash\": \"74867e13b52f18a58a6cdbdbd1e70518409382ac\",\n      \"parent_module\": \"gm4_liquid_minecarts\"\n    },\n    \"gm4_liquid_minecarts:liquid_minecart_display/empty\": {\n      \"uuid\": [\n        119585825,\n        206784598,\n        -1119495979,\n        -520523912\n      ],\n      \"value\": \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjhiMjU1MjJjMzFiZmU0Y2VhMTAxMDA4MGQ1YTFiOWIwOGU3NWJhZTUzOGRhODk3MmNiZGQ2YTk0Mzk5MjEyYSJ9fX0=\",\n      \"hash\": \"d1f2877b30e215cdaf922cd0005a01192a66eac2\",\n      \"parent_module\": \"gm4_liquid_minecarts\"\n    },\n    \"gm4_standard_liquids:liquids/beetroot_soup\": {\n      \"uuid\": [\n        76960881,\n        2041792394,\n        -1393666914,\n        2103407100\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTI0MjRjYjQxNDY2ZmFlNjk5ZjgyNjk2NTJkOGQxYjBjZjgzZjBkMmFkZDBkNjUzZjA5ZTlkMzFiMmY5YTk0OCd9fX0=\",\n      \"hash\": \"3bbbd041e4ddc003e7f6447fad8f2a2b9391a0ef\",\n      \"parent_module\": \"gm4_liquid_tanks\"\n    },\n    \"gm4_standard_liquids:liquids/experience\": {\n      \"uuid\": [\n        -745806368,\n        -1045543603,\n        -1458236618,\n        515537139\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGNiMGNmY2FjMDJiM2E3ZjZkZWI4N2E4YWZjZDgxYTUyMzdlMWNlNWVlMWI5NWMzNWVhM2U3NDkxMDNiNjc0ZCd9fX0=\",\n      \"hash\": \"d3d8dcc50faf62ea44e33377f860f2fb923be0bb\",\n      \"parent_module\": \"gm4_liquid_tanks\"\n    },\n    \"gm4_standard_liquids:liquids/glow_ink\": {\n      \"uuid\": [\n        2130271109,\n        -1138570753,\n        -1614258158,\n        -884567317\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYyNzQyMDQ0MTc4MiwKICAicHJvZmlsZUlkIiA6ICIyMjg0NDBlODcyYzg0ZGM3ODM0OGIyNzc1ODUwMzRjOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJTcGVjaWFsQnVpbGRlcjMyIiwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2ZjYjc1NzljZWQ1NTRiZWU0ZmQ5ZmZhMGYzYjQ5NGU0YjJhOWE4MDBmM2ZiNmI4Yjc0YjVlMmU3MThjMTgzYmEiCiAgICB9CiAgfQp9\",\n      \"hash\": \"e17f603217f2d39c1b610f8849882ffb504b6636\",\n      \"parent_module\": \"gm4_liquid_tanks\"\n    },\n    \"gm4_standard_liquids:liquids/honey\": {\n      \"uuid\": [\n        1093018679,\n        -1629534446,\n        -2052300824,\n        -1187268546\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjhhYzUxZTBjNWM5MWNmOGNlN2RiMjAyYmY5MWIxNmFkOTQ3NDkwODU0YWM3MjUyMjNmMGIwNDU0MGE1NWYyMCd9fX0=\",\n      \"hash\": \"ea675cd17ceb3e5913936bd1fb39b9a239ee7f22\",\n      \"parent_module\": \"gm4_liquid_tanks\"\n    },\n    \"gm4_standard_liquids:liquids/ink\": {\n      \"uuid\": [\n        2112341109,\n        -1138570753,\n        -1614258018,\n        -889714137\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYyNzQyMDI0MjQ3OCwKICAicHJvZmlsZUlkIiA6ICIyMjg0NDBlODcyYzg0ZGM3ODM0OGIyNzc1ODUwMzRjOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJTcGVjaWFsQnVpbGRlcjMyIiwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2Q5NjAzYmMyODg0M2RhYjVjOTEzYTkxNmVkMzIxZGZhNTFlMzlkZGVjZDA5YWIyMzNiZjViZDNhMDM1ZjlhNWMiCiAgICB9CiAgfQp9\",\n      \"hash\": \"5e1a124e3999963e0914b175f00c040f79b3f1f7\",\n      \"parent_module\": \"gm4_liquid_tanks\"\n    },\n    \"gm4_standard_liquids:liquids/lava\": {\n      \"uuid\": [\n        2084309355,\n        294864792,\n        -1353120517,\n        -2139917050\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2M5OTkzMzI2M2ZjYmNhOGJlYTI1Yjc1MjU1Y2Y4M2E3NTc4MWZiOTkxY2RlYTBmODA0M2RhZjQzMTgxODE1MSd9fX0=\",\n      \"hash\": \"2faed9fa93d0cfd9286096e7965571c1adf9d4d6\",\n      \"parent_module\": \"gm4_liquid_tanks\"\n    },\n    \"gm4_standard_liquids:liquids/milk\": {\n      \"uuid\": [\n        -1652105090,\n        -613725561,\n        -1717347128,\n        1926135093\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDMyODNiOTRjYzhiYWM3YTVkNDQ4ZDUyMTQ0MmFkNDY1MjY1MjM1NzYzYTNmYTJhMGIyODdiMGRiOTIyOWQ4Yyd9fX0=\",\n      \"hash\": \"70a5421e48597699dd6284381b07e81e978ff42a\",\n      \"parent_module\": \"gm4_liquid_tanks\"\n    },\n    \"gm4_standard_liquids:liquids/mushroom_stew\": {\n      \"uuid\": [\n        -851826350,\n        -819969624,\n        -1341610165,\n        -2102026501\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmVlMmMwMjBiYzg2NTBhYWFlN2NkYzhjY2VmYjRhYWI3ZGRkOGNlMjhlYTlmOWJkMDQ0OGIxMWY0Y2M1OGRiZCd9fX0=\",\n      \"hash\": \"ab5933443964922f4cfcaf186ba2a62981a243cf\",\n      \"parent_module\": \"gm4_liquid_tanks\"\n    },\n    \"gm4_standard_liquids:liquids/powder_snow\": {\n      \"uuid\": [\n        793744989,\n        -1949546447,\n        -1499784649,\n        2041283293\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDBiYWVkOWYwYjJhOGM3NTM0YTk0MTY1MjAzYThkZjJlY2JmY2Q2ZDNmZmM2ZjY3ZmVkZTNkYTQ2YzZlMzA2ZSd9fX0=\",\n      \"hash\": \"e01a0deac23275e98e459e5d8b721c4819574d88\",\n      \"parent_module\": \"gm4_liquid_tanks\"\n    },\n    \"gm4_standard_liquids:liquids/rabbit_stew\": {\n      \"uuid\": [\n        -898957329,\n        1308640890,\n        -1080612430,\n        1170134979\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTA1OWJlZWJmOTVlZTQzYzc1NDcyOWZlNmYzYWU5OWUxYzYwZTQ2ODJjNGUyZDZjZDJiYTQwNzBjZTlhZjBlOCd9fX0=\",\n      \"hash\": \"f3b45e34be5a61311f53ec938b90cb8956d522de\",\n      \"parent_module\": \"gm4_liquid_tanks\"\n    },\n    \"gm4_standard_liquids:liquids/water\": {\n      \"uuid\": [\n        -2087209360,\n        1395149785,\n        -1312941628,\n        -799708652\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTllNDg5MGZkZjNiMTZlYjE2NjZlMDA5NmE2YjA0MDhiNTY2YzE4MzRiZjMyNTcwYjFkZWIxNjU4MzczOWUxZSd9fX0=\",\n      \"hash\": \"04b5cd8c45121fe3d18037c26863f84b10967124\",\n      \"parent_module\": \"gm4_liquid_tanks\"\n    },\n    \"gm4_liquid_tanks:liquid_tank\": {\n      \"uuid\": [\n        506554253,\n        2099987480,\n        -1876292803,\n        1704690390\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1NDI1OTYyNSwKICAicHJvZmlsZUlkIiA6ICJiNzVjZDRmMThkZjg0MmNlYjJhY2MxNTU5MTNiMjA0YiIsCiAgInByb2ZpbGVOYW1lIiA6ICJLcmlzdGlqb25hczEzIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzFlOGI5ZjNiODgwNjIzZDNlM2ZmZGZkNmUyZTljYTY0OWQ0ODcyMDY0YzY0NmUyNWNjNDEyZGYzYTZjNmRlMTkiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==\",\n      \"hash\": \"51f68953f83b6158bf973801537f19ca87f7e890\",\n      \"parent_module\": \"gm4_liquid_tanks\"\n    },\n    \"gm4_metallurgy:mould/hot_metal\": {\n      \"uuid\": [\n        140191582,\n        -1151712444,\n        -1271433465,\n        -1758951935\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE0ODE0MTE2NTQxODksInByb2ZpbGVJZCI6Ijk4NWIyNzVlYmI1YTQzNDRiNDM3Njg5NTI4NjNhNjNmIiwicHJvZmlsZU5hbWUiOiJTcGFya3MiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODZkMTEwNmNjZDhhY2E3NDg4N2Q1ODIwNTU0YmZiMzM5YzdhM2NmOTJjNDY1MTU2MmM2NmZiNzZkMTQ0In0sIkNBUEUiOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81YzNjYTdlZTJhNDk4ZjFiNWQyNThkNWZhOTI3ZTYzZTQzMzE0M2FkZDU1MzhjZjYzYjZhOWI3OGFlNzM1In19fQ==\",\n      \"hash\": \"4b169331a5c86b0a5607df6b938f21c7854dba9e\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_metallurgy:mould/cool_empty\": {\n      \"uuid\": [\n        140191582,\n        -1151712444,\n        -1271441790,\n        1896239124\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE0Nzk4NTI1MDM5MzksInByb2ZpbGVJZCI6Ijk4NWIyNzVlYmI1YTQzNDRiNDM3Njg5NTI4NjNhNjNmIiwicHJvZmlsZU5hbWUiOiJTcGFya3MiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMWZhYmExYzg3NTFjYWIzZjEyZjJlODgwMTRjZjRlYmY2N2ZjNWQ3NGNmY2U5YmUyNTI1YWQ0OWE5MjFkY2YyIn0sIkNBUEUiOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81YzNjYTdlZTJhNDk4ZjFiNWQyNThkNWZhOTI3ZTYzZTQzMzE0M2FkZDU1MzhjZjYzYjZhOWI3OGFlNzM1In19fQ==\",\n      \"hash\": \"69a13a9f3e6e40d6428d50fcee10979c2328b682\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_metallurgy:band/mundane\": {\n      \"uuid\": [\n        2090045838,\n        1070000930,\n        -1136417339,\n        1085846924\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE0ODE2NjMzMzg5MDksInByb2ZpbGVJZCI6IjkxYTBlZmEyM2QxODQ5Y2ZiM2JkMGExNzdjZjM3Nzg4IiwicHJvZmlsZU5hbWUiOiJEdWNrSnIiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzQ4MGNjMjY3M2ZmMjhkNTEzNDY0MTMxN2FiYzUzMWU5ZTFjZWU3MTFlYWJmYWY3YzJhZDY1M2E0NmQxZmI3In19fQ==\",\n      \"hash\": \"228842822c2bb932c4411d9e81d6c3a8641c2af6\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_metallurgy:mould/hot_empty\": {\n      \"uuid\": [\n        140191582,\n        -1151712444,\n        -1271434748,\n        932201856\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE0ODE0MTE3MjM4MDYsInByb2ZpbGVJZCI6Ijk4NWIyNzVlYmI1YTQzNDRiNDM3Njg5NTI4NjNhNjNmIiwicHJvZmlsZU5hbWUiOiJTcGFya3MiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTc0NTVkNjg3MjJkOTU3ZmI1ZGVjZGNjY2NjMWI2MWU4NzlhOTY3ZjFiZGM3YzJhMmZkMTlhYTI3OWU4ODUifSwiQ0FQRSI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzVjM2NhN2VlMmE0OThmMWI1ZDI1OGQ1ZmE5MjdlNjNlNDMzMTQzYWRkNTUzOGNmNjNiNmE5Yjc4YWU3MzUifX19\",\n      \"hash\": \"8f66eaf882905a9de8e1f81969f9eaf23a6e9450\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_metallurgy:mould/cool_metal\": {\n      \"uuid\": [\n        140191582,\n        -1151712444,\n        -1271443335,\n        826741136\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE0ODE0MTE1NjYwMjQsInByb2ZpbGVJZCI6Ijk4NWIyNzVlYmI1YTQzNDRiNDM3Njg5NTI4NjNhNjNmIiwicHJvZmlsZU5hbWUiOiJTcGFya3MiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjM3ZjE2Zjc2MTk1ZWM3OWI4MzFmMzc5ZjkzYjYwYzg2MWZkNGNhYmYyZTI5ZDNmZTlkYTJmODU4OTJkY2EifSwiQ0FQRSI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzVjM2NhN2VlMmE0OThmMWI1ZDI1OGQ1ZmE5MjdlNjNlNDMzMTQzYWRkNTUzOGNmNjNiNmE5Yjc4YWU3MzUifX19\",\n      \"hash\": \"9bda9bad8b236e64155957cbcfd74d4763bde9d1\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_metallurgy:ore/aluminium\": {\n      \"uuid\": [\n        140191582,\n        -1151712444,\n        -1271445916,\n        307298631\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYyOTY4NDMzNDA1MiwKICAicHJvZmlsZUlkIiA6ICI3ZmIyOGQ1N2FhZmQ0MmQ1YTcwNWNlZjE4YWI1MzEzZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJjaXJjdWl0MTAiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjU1MTdhNjYyYTgzY2FhYWFjMWE3MTMzMmUzODFiYmZmYzkxYjJhNjBhODc1Y2NhZDhmZTM4ZGM3NWRlZDU0OSIKICAgIH0KICB9Cn0=\",\n      \"hash\": \"36974013a30dbe991e98bcaacd83332a2a473878\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_metallurgy:ore/barium\": {\n      \"uuid\": [\n        140191582,\n        -1151712444,\n        -1271442552,\n        1879524245\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYyOTY4NDI1Njk5MSwKICAicHJvZmlsZUlkIiA6ICJiMGQ0YjI4YmMxZDc0ODg5YWYwZTg2NjFjZWU5NmFhYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNaW5lU2tpbl9vcmciLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjg5ZjJlZjhmZTJlMzhlM2I1YzliMzU0N2M3ZTFmODUzYTlhNDQ4MjFiZDllZTI1YmQ2ODhiYTY0MzcwZTk2MyIKICAgIH0KICB9Cn0=\",\n      \"hash\": \"0b490877e69de3270e478b6166f1ba792c281961\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_metallurgy:ore/bismuth\": {\n      \"uuid\": [\n        140254582,\n        -1151718614,\n        -1277548307,\n        1366135037\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYyOTY4NDM0MzA2MCwKICAicHJvZmlsZUlkIiA6ICI0OWIzODUyNDdhMWY0NTM3YjBmN2MwZTFmMTVjMTc2NCIsCiAgInByb2ZpbGVOYW1lIiA6ICJiY2QyMDMzYzYzZWM0YmY4IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2EwODFiMmY2Nzk3ZDk2YzcxMGYyMjk1YmQ2MGJmYjc3NTE5ZDU4Yzk3NGEwYjM0YjViZDcyZmNkNzc3OTYyMWIiCiAgICB9LAogICAgIkNBUEUiIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzIzNDBjMGUwM2RkMjRhMTFiMTVhOGIzM2MyYTdlOWUzMmFiYjIwNTFiMjQ4MWQwYmE3ZGVmZDYzNWNhN2E5MzMiCiAgICB9CiAgfQp9\",\n      \"hash\": \"5b34fa6299f5ebbf3e97dcf2afe61c5ca09ad1a0\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_metallurgy:ore/thorium\": {\n      \"uuid\": [\n        140191582,\n        -1151712444,\n        -1271454064,\n        -1822255261\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYyOTY4NDM2MzM0MywKICAicHJvZmlsZUlkIiA6ICI3NzI3ZDM1NjY5Zjk0MTUxODAyM2Q2MmM2ODE3NTkxOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJsaWJyYXJ5ZnJlYWsiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjcxYWQ1MTBhMTBjNWMxYzZkMGY3NzVjYWRkNWVmMTliZWRkODY2NTQwNmE5ZWY1NTI0ZGJmOGZiNjQ2MmViIgogICAgfQogIH0KfQ==\",\n      \"hash\": \"3727bbe1dc210a6a23aed1754132d6bc54cc8c4b\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_metallurgy:band/thorium\": {\n      \"uuid\": [\n        1709100198,\n        -881135263,\n        -295939255,\n        1602156123\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE0ODE2NjM1MTAwNzIsInByb2ZpbGVJZCI6IjkxYTBlZmEyM2QxODQ5Y2ZiM2JkMGExNzdjZjM3Nzg4IiwicHJvZmlsZU5hbWUiOiJEdWNrSnIiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTYzOTJhNmQ5OWY5MzE5ZWU3YzRmNGMxYTE5NzQ5ZDY4N2NkY2M4ZWVjOGZjNjY4ZTczZDM3YTZkYWY3N2EifX19\",\n      \"hash\": \"266361d64d25b321b9e1da7f2555410c1cfa1da9\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_metallurgy:band/bismuth\": {\n      \"uuid\": [\n        -359255454,\n        30123560,\n        -1513962184,\n        -616842323\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYyODAxNDc0OTQ2MSwKICAicHJvZmlsZUlkIiA6ICJiMWMyNWQ0YjMwZDU0N2Y4YTk3NmZlYTllOGU1YzBjMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJvd29FbmRlciIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS82NmM0ODcwYmNiMDdkYWJjMjNiNTZkMzJlNzI5OWI5NTE4ZTU1N2VmMzU2YTNiZGRmNDBkNGM3MDIwYzI3MTdhIgogICAgfQogIH0KfQ==\",\n      \"hash\": \"3013a7a04e1eace26fb8ec20af7cbca563e2a430\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_metallurgy:band/copper_RETIRED\": {\n      \"uuid\": [\n        -359695444,\n        30126360,\n        -1513204284,\n        -616246813\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE0ODg0Njc2ODYwNDksInByb2ZpbGVJZCI6IjkxYTBlZmEyM2QxODQ5Y2ZiM2JkMGExNzdjZjM3Nzg4IiwicHJvZmlsZU5hbWUiOiJEdWNrSnIiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjMyNjQ2OGE2N2NlZTNkYTJlYzE0MDJiZGU1MzhlNGZjOGU5ZGVmZGFmOGNlMzVjZGJiYjEzY2RjZTE1ZSJ9fX0=\",\n      \"hash\": \"c5c13cf0c8130a161363402f87a7e1dbb0afe516\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_metallurgy:ore/copper_RETIRED\": {\n      \"uuid\": [\n        140191582,\n        -1151712444,\n        -1271449307,\n        1366570837\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE0ODE0MTA4Mjk2OTAsInByb2ZpbGVJZCI6Ijk4NWIyNzVlYmI1YTQzNDRiNDM3Njg5NTI4NjNhNjNmIiwicHJvZmlsZU5hbWUiOiJTcGFya3MiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDNjMWE3ZGEyZWJkZGI0YTk3YzI3NDA0N2RlNzFkN2RjZWJjMTc2YTBlNjE3MzBmZmQzMzIzODUzNTNlIn0sIkNBUEUiOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81YzNjYTdlZTJhNDk4ZjFiNWQyNThkNWZhOTI3ZTYzZTQzMzE0M2FkZDU1MzhjZjYzYjZhOWI3OGFlNzM1In19fQ==\",\n      \"hash\": \"915a5cc5ebbf4d799049f4e5e0846d539253ff38\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_potion_liquids:liquids/fire_resistance\": {\n      \"uuid\": [\n        2130832668,\n        -69843189,\n        -1628986667,\n        -1615730322\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDI5ZmE3YjFmNDZhMjgzNjgwOTlmMjA4ZmU5NGQ3NzY2NzdkZTUyZWNkMjY0YjhmOTI4MzdjODQ5ZDZmN2NjNCd9fX0=\",\n      \"hash\": \"2398626d300f895b4d62aabfefae73e77370be52\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/floating\": {\n      \"uuid\": [\n        32752701,\n        1442140104,\n        -2121835220,\n        212039422\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmZiNjAxOGVjNzM4NWU4YTE5MTE3OWRjOWE1M2Y4MGY5NGQ4MjIzZWQ5YWEwNDgwMDcyNzdiNzUzMGNlZjgwZCd9fX0=\",\n      \"hash\": \"c54b1eb1be2154c9ae542ee87bfd1efa101457c6\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/harming\": {\n      \"uuid\": [\n        -1211340845,\n        -910802362,\n        -2144368484,\n        -211827793\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2Y4MGUyMjc1N2UxZTUzM2RkMGI3ZTRlZTU2YTE3OWJlYmJlN2RmODE4NzRkMzVmNTkyZDQ1YmM1YWZiNjRhMyd9fX0=\",\n      \"hash\": \"c2f87b8817311d26cbd31b1e064105ba98ccf71a\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/healing\": {\n      \"uuid\": [\n        -575407116,\n        -2057942971,\n        -1081937529,\n        601872280\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMWVkZDU2OWQ1MTM2YThlNzRjM2IyZTliYjdjZTI4NDk4OTFlNTc2ZGFkNjkyNjQwNWNhY2I4ODdhNjk5NWJmNCd9fX0=\",\n      \"hash\": \"73a0fdf1bfec33b5ab2fe0621ba35a08b988c749\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/invisibility\": {\n      \"uuid\": [\n        -332185350,\n        1698318266,\n        -1646469451,\n        1142033314\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjk5OTU0NTAxOTY5MDQ3ZjE4NjQ3NjFhN2Q4ZWFiNzJmMjIwM2JiYzBmZGFiY2FiNjJjOWUxZDU3M2YxN2ZlOSd9fX0=\",\n      \"hash\": \"684edcc54546a42d94e7775ceec3ce2ea37f6ac6\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/leaping\": {\n      \"uuid\": [\n        822748764,\n        -913751735,\n        -2104548355,\n        1076203816\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjJmZTE2ZWFjMDFhNjIyZmE0YTg0ZTYwMDM5MzBiY2E1ZjBiZmZhOThhYTMxOWJmMGRlN2U4YmQ4ZjMwYjAwZid9fX0=\",\n      \"hash\": \"58419073ee28986d29008da1d7bd8d342c34f8e8\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/luck\": {\n      \"uuid\": [\n        1998983973,\n        799228293,\n        -1480289059,\n        -30160010\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTg4ODJmMmQzNzM2YmM5YWYxMTMxMDQxYTg3OTc4ZDg1NGUxNTk1MjE1ODU5YjEwM2Q3ZjY0M2U1ZTZiMTk5OCd9fX0=\",\n      \"hash\": \"be8cd5206b554f01bb1ddbe3a3296f1e076bf81a\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/night_vision\": {\n      \"uuid\": [\n        1591024166,\n        -1403895054,\n        -1150690056,\n        -208826299\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODQ3ZTUxOWU3ODMxMTNkNzY0MWVhZGQ5NzFjYzZkNDE2Y2E2M2Q4MmY3MDdhNzE5NjBmYjQ5YzMzNzQ1ODJjNSd9fX0=\",\n      \"hash\": \"2710022ddb4c3944ea4a20d579867f8b49ec041e\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/poison\": {\n      \"uuid\": [\n        809108775,\n        -1144238335,\n        -1966668314,\n        1676984478\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTY2OWViYmU5NTk3NzQzZmI3ODUzODA1YTk3MTU3ZWVmMTlhZTEwOGI5NWFhZGM0MjI2ZTQ4ZjQyN2FjMmFiNSd9fX0=\",\n      \"hash\": \"3f8a4881a694f447f79fff06d4afd42b6ab71626\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/regeneration\": {\n      \"uuid\": [\n        175112486,\n        -350270963,\n        -1804632664,\n        -1472362007\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTM2OTEzNmNlMGU5MjZhZjg5MTUzNGNlNGI1OGY4NDVmODFlNWRiYTNhZGNlMzA4NzE0YzdjZmZjNmUxZTgyZSd9fX0=\",\n      \"hash\": \"af5e903c6b94e36e3a38feb99e6edf9be9640408\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/slow_falling\": {\n      \"uuid\": [\n        1401295760,\n        -1001370020,\n        -1237459354,\n        -1996662618\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGIwNmUxYjgwOGJiZGE1ZjYxYzc5MjdiYTA2N2ViMDQ4ZDFmY2I3MmEyY2E4OThiOWY3YWQxMDY4YzY0MGM2Yyd9fX0=\",\n      \"hash\": \"12881ca86bfcfd8a67c0b09f8233c7625aae5990\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/slowness\": {\n      \"uuid\": [\n        2073042102,\n        -128102461,\n        -1871962475,\n        708373893\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNWNiM2E4ZTUwNTkxZGE4NTk3NWI3NDU0NjcxMmZmMzc2YTZiMWNjZmI5M2EyNDQ0ZjEwZDdkZTA4MTc2NmFkZid9fX0=\",\n      \"hash\": \"5a88aa4ac65d59cc33d81f9d8e35856f6b2305cb\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/strength\": {\n      \"uuid\": [\n        -1380259552,\n        1048462685,\n        -2136230086,\n        -2011000224\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmFkOWJlMjY2Y2JlM2RmYTFlMWMwNzdjNjRlZDA3MjllZjEwNDFkZDZkZTFmYzViOTcwMTBiZDdmM2RjMzkyOSd9fX0=\",\n      \"hash\": \"72b5105c05c916ea7b8e57fa07dc19b4edfb84a3\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/swiftness\": {\n      \"uuid\": [\n        628694958,\n        -4831928,\n        -1207352243,\n        134819399\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODE3MGJhYWJhYjg3YzhmM2YyMjkzYjQyZjY4ZmI2M2RiZGQ1ODhjNzhjMDllNzcyNTI1YjVjODUxYjJiNDEzNSd9fX0=\",\n      \"hash\": \"c81b184c72db50cb84ccc27a6e9ea758a9886167\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/turtle_master\": {\n      \"uuid\": [\n        363269321,\n        1718175205,\n        -1985643155,\n        497739307\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTc0Zjk5NzNhZDhmZjQ0MThhNWFmNjI4MWM3NDEyYTRjYmNhNmQzMGYzMGMxYWY5M2M2Mzc3Zjc4YzNhZTczJ319fQ==\",\n      \"hash\": \"69f1773d5c561a8616901a3d62bc00c62b3bdea0\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/water_breathing\": {\n      \"uuid\": [\n        2087529956,\n        -762951532,\n        -2088462039,\n        585618953\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGFkZmFlNTE0OWNkMDViN2RkODYwOWYwMDIzMWQyODhiZTAyOWRlZmFmMTc3YzNiY2M3NTNhNjM2YzFiMGI1OSd9fX0=\",\n      \"hash\": \"965aaf4a242305a774eded7eea9a831d396ac107\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/weakness\": {\n      \"uuid\": [\n        1194584133,\n        959795039,\n        -2040976206,\n        1339213576\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTQ1YjZhYzVmZjU4MzVjNzc3ZjAxMzdlZGY1ZDBlMjg4OGVkNjg2MTE5NTMxNmQ3MjhlNDRkZWVkOGM2NDJmMCd9fX0=\",\n      \"hash\": \"ff283cb7ab9bd87333fc675a7791bde5180a7f79\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_relocators:relocator_empty\": {\n      \"uuid\": [\n        939288592,\n        -1692047561,\n        -1963748291,\n        -978837126\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0NDM1MTU0MDM1NCwKICAicHJvZmlsZUlkIiA6ICIxYTc1ZTNiYmI1NTk0MTc2OTVjMmY4NTY1YzNlMDAzZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJUZXJvZmFyIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2Y3YmJiZTlkNzY0MTM3NjRkNmEyNzc0MWJhMTA5ZTViY2E1Mjg1NjFmMGE2NjJlMGE0N2UwZjM1NTc0YTI3OTkiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==\",\n      \"hash\": \"05940a886ac9e528d2e20ea2c5412e6ad0678160\",\n      \"parent_module\": \"gm4_relocators\"\n    },\n    \"gm4_relocators:relocator_full\": {\n      \"uuid\": [\n        938288371,\n        -119475667,\n        -177364551,\n        -680664510\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0NDM1MTY1ODg2NiwKICAicHJvZmlsZUlkIiA6ICJmZDYwZjM2ZjU4NjE0ZjEyYjNjZDQ3YzJkODU1Mjk5YSIsCiAgInByb2ZpbGVOYW1lIiA6ICJSZWFkIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzE3OTE5NTFiNjQ5ZmZmMDI2OGUyZTBkYWZhMGQxZDQ0YjYzNTU4NTg1YTkzYjMyZWMyYzQxMjRmYzM5NmQyNTYiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==\",\n      \"hash\": \"7ec650f7cee4d232b2f48833d2095448ca2f39c3\",\n      \"parent_module\": \"gm4_relocators\"\n    },\n    \"gm4_scuba_gear:scuba_helmet\": {\n      \"uuid\": [\n        -1411342862,\n        -1228846809,\n        -1234065086,\n        1387403600\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWY2YWVlYzM2ZjQ2MmRlYjUzOTc0NWFhMzY4MThiNmQ0NGIwYzk1OGViNTY4NTJlYTAyZTM0YzMzZmRiZGZmMCd9fX0=\",\n      \"hash\": \"4a257159fd9d30ceff7484d393efe9ed2e399abf\",\n      \"parent_module\": \"gm4_scuba_gear\"\n    },\n    \"gm4_smelteries:smeltery\": {\n      \"uuid\": [\n        1784636653,\n        -1150006069,\n        -1125092353,\n        -1658708865\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1NDMwMDcwMywKICAicHJvZmlsZUlkIiA6ICI3NzI3ZDM1NjY5Zjk0MTUxODAyM2Q2MmM2ODE3NTkxOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJsaWJyYXJ5ZnJlYWsiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNWM3MjJlYmQxNzdlNDI3MDUzMmMyNGMyNTFhNGY1NzY4OGNiZDg3YTJmNTlmNGE2NjQ5ZGMxZmFjMGI1YmRlOCIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\",\n      \"hash\": \"ca86945a8f7b2a0321cf5a13c4aa3ac4eca84685\",\n      \"parent_module\": \"gm4_smelteries\"\n    },\n    \"gm4_teleportation_anchors:teleportation_anchor\": {\n      \"uuid\": [\n        772836475,\n        993526495,\n        -815540237,\n        -2046417388\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0NDQ3MTM3OTY2MSwKICAicHJvZmlsZUlkIiA6ICI5ZDQyNWFiOGFmZjg0MGU1OWM3NzUzZjc5Mjg5YjMyZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJUb21wa2luNDIiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTFiZTRkYzdkMTUyOWViYzFlYmZjMWU5MGY5NDM3MDg0NzE2NTAxNzE2ZDA1ODNjOWZjMWNhNmI3OGY5MDhmYyIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\",\n      \"hash\": \"dbf6c4d20f0c8c8ec499c7dd8585d8abd8020cee\",\n      \"parent_module\": \"gm4_teleportation_anchors\"\n    },\n    \"gm4_teleportation_anchors:teleportation_jammer\": {\n      \"uuid\": [\n        878310477,\n        672930541,\n        -264551059,\n        -1299384752\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0NDQ3MTUyNDc4NSwKICAicHJvZmlsZUlkIiA6ICIzZmM3ZmRmOTM5NjM0YzQxOTExOTliYTNmN2NjM2ZlZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJZZWxlaGEiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzI4MDdlOGM2YjcwMzI2ZjU2Y2I4ZDU1NTQzNWU2MjYwMmM5YWJhYzc4NWM0ZmQ4ZjJjY2IwOGMwMDNmY2ZlZCIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\",\n      \"hash\": \"1019c31eb601ab9cbc21482eaa72759805b57917\",\n      \"parent_module\": \"gm4_teleportation_anchors\"\n    },\n    \"gm4_tinkering_compressors:tinkering_compressor\": {\n      \"uuid\": [\n        1102824805,\n        -1759752670,\n        -1411440773,\n        621305304\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1NDM0MjA3MiwKICAicHJvZmlsZUlkIiA6ICI3MzgyZGRmYmU0ODU0NTVjODI1ZjkwMGY4OGZkMzJmOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJJb3lhbCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8xZDYwOWQzYTNiNjRiNjlmZTE0MDhjZmE0NjY3YjU1ZTU1YWE3NTI3OWQ2ZjAyOTU4MjEzOTYyYTlkZDBkMTQ4IiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0=\",\n      \"hash\": \"eaafd00738b3b1ee0d14552ae99e739fa34c0af0\",\n      \"parent_module\": \"gm4_tinkering_compressors\"\n    },\n    \"gm4_tnt_landmines:landmine\": {\n      \"uuid\": [\n        -1172284621,\n        -1030471482,\n        -1585707380,\n        -40076772\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE1NTQ0NzQxMDExMjEsInByb2ZpbGVJZCI6IjU3MGIwNWJhMjZmMzRhOGViZmRiODBlY2JjZDdlNjIwIiwicHJvZmlsZU5hbWUiOiJMb3JkU29ubnkiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2RkZWM2M2RlNWY4MmYyM2ExNTdmNTVkYTcyMmFiOTI3NDgzZTdkODk4YmU5MDg3MzQwOTE5ODZlNjY1MWQ4YTgifX19\",\n      \"hash\": \"fec9ecbe79a210db8262dd9ccc8a21172509e229\",\n      \"parent_module\": \"gm4_tnt_landmines\"\n    },\n    \"gm4_tnt_landmines:disguised/crafting_table\": {\n      \"uuid\": [\n        -893485270,\n        -1979301661,\n        -1601571774,\n        -1580648190\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE1NTQ0NzQyODI1NTUsInByb2ZpbGVJZCI6Ijc1MTQ0NDgxOTFlNjQ1NDY4Yzk3MzlhNmUzOTU3YmViIiwicHJvZmlsZU5hbWUiOiJUaGFua3NNb2phbmciLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzY2ODBmZmEyMTE5MzAwZGU2NWQzNjE4ODVkNjE0YjNlYTM3Y2QwODhiODc5OTAzMjc0MzNkNGMxMWU1ZjNjNSJ9fX0=\",\n      \"hash\": \"66e39f516b02b31b3f2a876e3ff9bb433d04b8a6\",\n      \"parent_module\": \"gm4_tnt_landmines\"\n    },\n    \"gm4_tnt_landmines:disguised/dirt\": {\n      \"uuid\": [\n        -634349232,\n        -591641614,\n        -2012334048,\n        -805394230\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE1NTQ0NzQ0MjA4NDgsInByb2ZpbGVJZCI6IjkxZjA0ZmU5MGYzNjQzYjU4ZjIwZTMzNzVmODZkMzllIiwicHJvZmlsZU5hbWUiOiJTdG9ybVN0b3JteSIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGI1Mzc5ZjE2NWE1Y2M3YmI4YzM4MmZlOTJlMjRlODYwN2NiODU1Y2FjNmU4M2Q4NjJjNjBlZmNlZTA5MTE3NSJ9fX0=\",\n      \"hash\": \"a7b113596757108380739cf10902fdf96f1360b0\",\n      \"parent_module\": \"gm4_tnt_landmines\"\n    },\n    \"gm4_tnt_landmines:disguised/grass\": {\n      \"uuid\": [\n        940595468,\n        1686389043,\n        -1269390340,\n        931805603\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE1NTQ0NzQwMDkwMDUsInByb2ZpbGVJZCI6IjNmYzdmZGY5Mzk2MzRjNDE5MTE5OWJhM2Y3Y2MzZmVkIiwicHJvZmlsZU5hbWUiOiJZZWxlaGEiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzZiMzBmZTgxYWZlNTI2NjkxZGM1MDlhYzEwN2EzYjNjYTk1NTdjNDExZmYwZGMyZmNiNWE4YTlkNzc1ZTk0ODMifX19\",\n      \"hash\": \"685c824fe2a2654290b1a27cc04be1703b8e439e\",\n      \"parent_module\": \"gm4_tnt_landmines\"\n    },\n    \"gm4_tnt_landmines:disguised/invisible\": {\n      \"uuid\": [\n        1874250570,\n        -1321581040,\n        -1389990572,\n        -1166592501\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE1NTQ0NzQzODQ0NTUsInByb2ZpbGVJZCI6IjU3MGIwNWJhMjZmMzRhOGViZmRiODBlY2JjZDdlNjIwIiwicHJvZmlsZU5hbWUiOiJMb3JkU29ubnkiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzVlY2NhZmZlN2UwMWJjNjFiNjdmMDZkNGRmNjU2ZjQxZjdjMGJkODE3NzllNjFkMmEzYjk2YjE0MDVlYWQ1ODYifX19\",\n      \"hash\": \"b5048c04f4385966eac9158f6ae5da85707b5f42\",\n      \"parent_module\": \"gm4_tnt_landmines\"\n    },\n    \"gm4_tnt_landmines:disguised/netherrack\": {\n      \"uuid\": [\n        -1280943243,\n        -877575330,\n        -1094757423,\n        425228596\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE1NTQ0NzQzNDQyNzYsInByb2ZpbGVJZCI6IjVkMjRiYTBiMjg4YzQyOTM4YmExMGVjOTkwNjRkMjU5IiwicHJvZmlsZU5hbWUiOiIxbnYzbnQxdjN0NGwzbnQiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzIwYmVlZWE4OTQ1MzAxOGMzNTVmZGZjZTg5YTM1ZTEyOGUwOWQyMzRlNWY5MGU0YzE4ZWE3MDI5NDYxOTFmNjIifX19\",\n      \"hash\": \"ae94a831f4a04529a02fe14d67d5438ab54be56a\",\n      \"parent_module\": \"gm4_tnt_landmines\"\n    },\n    \"gm4_tnt_landmines:disguised/stone_bricks\": {\n      \"uuid\": [\n        737008073,\n        -1254863835,\n        -1725289382,\n        -810892737\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE1NTQ0NzQyMjMxMzEsInByb2ZpbGVJZCI6ImIwZDczMmZlMDBmNzQwN2U5ZTdmNzQ2MzAxY2Q5OGNhIiwicHJvZmlsZU5hbWUiOiJPUHBscyIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDJhOGE5NDk5MjE5NTk1NzEyYjI1ODdlZmViMzViMWY2NTU2ZGExMmIzZWU4ODI5NGUwMzk0MDM0YmZjMjhlOCJ9fX0=\",\n      \"hash\": \"ac05faafa2bdeeb490c9cbbe866254a3a92617fb\",\n      \"parent_module\": \"gm4_tnt_landmines\"\n    },\n    \"gm4_tnt_landmines:disguised/stone\": {\n      \"uuid\": [\n        -334658666,\n        974668440,\n        -2077434217,\n        -1973492282\n      ],\n      \"value\": \"eyJ0aW1lc3RhbXAiOjE1NTQ0NzQxODg2MTMsInByb2ZpbGVJZCI6IjNmYzdmZGY5Mzk2MzRjNDE5MTE5OWJhM2Y3Y2MzZmVkIiwicHJvZmlsZU5hbWUiOiJZZWxlaGEiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzNjNjk4ZTE5MDllMWI4MzMxYmVhOGQ1YzU3N2NkMGM2M2I4YWVjMDFmYjg4ZjY0OWUwMGYwZmU5NjY1NDdjNWIifX19\",\n      \"hash\": \"f7f4c047b8fe2b1babea1a6d8d9e20f2fe600ae3\",\n      \"parent_module\": \"gm4_tnt_landmines\"\n    },\n    \"gm4_zauber_cauldrons:crystal/instant_damage\": {\n      \"uuid\": [\n        470245391,\n        1887978766,\n        -1504051068,\n        1918240691\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzc5MGEwZDY5MTFiYzg4OTI1Nzc1ZWMyYjNmNWFhZDVhZGVlNDRlMTIxM2YzNWQ0OTA5MzE5OTQ1MjQwZjZmNyd9fX0=\",\n      \"hash\": \"85058d7509650d94fc1787a09da2aea5a259f732\",\n      \"parent_module\": \"gm4_zauber_cauldrons\"\n    },\n    \"gm4_zauber_cauldrons:crystal/instant_health\": {\n      \"uuid\": [\n        -306488150,\n        400956517,\n        403523013,\n        -700259582\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYyNzU4Nzc2NjExMSwKICAicHJvZmlsZUlkIiA6ICI2NGExOGZiZmQ0YWY0Yzg0YjliN2FjZmNlNDRmMTAzZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJieVJPTkFMX1lUIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzIxY2Y1YmM2OTJjZmQwZjI3YzkzNTUyOWJjNjE1ZmRjYjc0ZmZkZWJlYWFlY2JkOTU3OGFhOGUwMzFjNDRjYmYiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==\",\n      \"hash\": \"adf0e109b8b866d452db2cff2460234033d87805\",\n      \"parent_module\": \"gm4_zauber_cauldrons\"\n    },\n    \"gm4_zauber_cauldrons:crystal/jump_boost\": {\n      \"uuid\": [\n        1384053766,\n        -356430469,\n        -1755842415,\n        436879590\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODRlYzgzNmNjZTA2ZTFlZDgxYmQ3MDBmNzc1NDhmNWZlMDkyNDYxZmY5YTJlNjBhNzUyNjQ1YjFkMDVhMjIxOCd9fX0=\",\n      \"hash\": \"cfb3d8417b03f6d8ca360c22e64c66fb5eff90a8\",\n      \"parent_module\": \"gm4_zauber_cauldrons\"\n    },\n    \"gm4_zauber_cauldrons:crystal/poison\": {\n      \"uuid\": [\n        -1452394982,\n        -1051244258,\n        -1129278374,\n        2134833677\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2E0YjY4ZGFiY2JjNDQ4YjBmY2ExNTdhYWU4YTg3YjcwMDlhNmExZmE0Zjg5ZjhkMDVkOTI4MDNkZmY0NTRmMCd9fX0=\",\n      \"hash\": \"f63d55839798a67a0e81a64833dae0ee3ad2baba\",\n      \"parent_module\": \"gm4_zauber_cauldrons\"\n    },\n    \"gm4_zauber_cauldrons:crystal/regeneration\": {\n      \"uuid\": [\n        -503854593,\n        212580059,\n        -440694433,\n        -647960158\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTYyNzU4Nzg1ODA5NywKICAicHJvZmlsZUlkIiA6ICJmNDY0NTcxNDNkMTU0ZmEwOTkxNjBlNGJmNzI3ZGNiOSIsCiAgInByb2ZpbGVOYW1lIiA6ICJSZWxhcGFnbzA1IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2FmNzM2MDQwYmRlNDk2OTRhZjc4OGI4YmEzY2U1ODk0MWZlYTY4MzBkOTIzYzczMmY3ZWJjNDA5NDlkMDIzMTQiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==\",\n      \"hash\": \"6375366e84e2ebb0ee57ec82ff73d7a5c40c9f06\",\n      \"parent_module\": \"gm4_zauber_cauldrons\"\n    },\n    \"gm4_zauber_cauldrons:crystal/speed\": {\n      \"uuid\": [\n        -565293039,\n        1449936483,\n        -1314907026,\n        -480547454\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjBiNmViMTAyZDRmYjM2YTJiMDMwNTVmOGIwYWZkMTg4MWMxZjBiOGNiYzRiODk3YmYxMTA1ZTdhNzFiNDc1Zid9fX0=\",\n      \"hash\": \"1a78314b2c4cd93f28861c03f5e20fea903ed354\",\n      \"parent_module\": \"gm4_zauber_cauldrons\"\n    },\n    \"gm4_zauber_cauldrons:crystal/strength\": {\n      \"uuid\": [\n        944420826,\n        983911599,\n        -1709524351,\n        1416885906\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTY5M2YwYjc1NGUyNzcwMGNiYWM2MGFjOTMwMGI2YzY2M2NmZDVlMjc1YjkwZjkyYmZmNjczNjY3YzViOWY1Nid9fX0=\",\n      \"hash\": \"f0eb5b0c9c1ed40a7c48dd9af588e196b3661429\",\n      \"parent_module\": \"gm4_zauber_cauldrons\"\n    },\n    \"gm4_zauber_liquids:liquids/wormhole\": {\n      \"uuid\": [\n        -1903127985,\n        893928782,\n        -1710128554,\n        467590157\n      ],\n      \"value\": \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODQ5M2Q5OTRlODBmOTc0NWNiZWFiYWMwN2VkYmE2MTk5YTgyNGM3YTJhYTJjNDI1MjhkMDNkMzAzYzVhN2M5YSJ9fX0=\",\n      \"hash\": \"034d4ea119fcfe3d2f981c7f199c0a69774a5029\",\n      \"parent_module\": \"gm4_zauber_liquids\"\n    },\n    \"gm4_custom_crafters:custom_crafter\": {\n      \"uuid\": [\n        -141969460,\n        1701595331,\n        -2105287834,\n        13831947\n      ],\n      \"value\": \"ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1Mzk1Mjk4NiwKICAicHJvZmlsZUlkIiA6ICJhYjlkYmMzZjk4NGE0ZWI4YTVmY2RlYWMzNzEzZWFkMSIsCiAgInByb2ZpbGVOYW1lIiA6ICJDeWJvcm51dDIiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTE1ZDUwNmI2MzlhMzI1OWVlNDhkMTcyMjYzZWI2NzljY2NhNDQzNjVmY2VlMTllZDllYjI3NzU1YjAxN2IyYyIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\",\n      \"hash\": \"18bab6e06c67bcfeba73698c923d43d78cd82ee7\",\n      \"parent_module\": \"gm4_custom_crafters\"\n    },\n    \"gm4_metallurgy:band/thorium_brass_RETIRED\": {\n      \"uuid\": [\n        -1284920301,\n        -2083305742,\n        -2124503944,\n        -860338126\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzA1YTY0N2YzYmY2YzMzZGQwNWI5M2JkZTJiNzRlYzViOWE5YTMxODQxM2FlZWRkZGE3ZDFhYjk3NDVkZmE5OCd9fX0=\",\n      \"hash\": \"b1173eacf6e07f062e2301d25669acc1a3a0ac20\",\n      \"parent_module\": \"gm4_metallurgy\"\n    },\n    \"gm4_lightning_in_a_bottle:texture_connector_exposed\": {\n      \"uuid\": [\n        1105086427,\n        -2014818885,\n        -2050456398,\n        1819890536\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjU0ZTFmZmZlNzNiMjljMGU1NzVhOTg2OTI3OTJhZTIxYzQwNDUzZmMxNDRiYjYxZjE4ZDBmZjhmMjY3N2IxMSd9fX0=\",\n      \"hash\": \"3ba0bc3626c0acf3c8c19ecd9801db477e5f4ef4\",\n      \"parent_module\": \"gm4_lightning_in_a_bottle\"\n    },\n    \"gm4_lightning_in_a_bottle:texture_connector_weathered\": {\n      \"uuid\": [\n        -53579126,\n        -1276100194,\n        -1254675310,\n        1810892024\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTExYjlhYjJlZmY4ZDMzYzU3ZWUyMjVjYWQ5ZmNkMTFmN2JmN2I4MzI2YWJlMTVhOWQ1MzUwNjNmOTZkOGZjMCd9fX0=\",\n      \"hash\": \"4ae3138c18bcb10d5074aa45c403f7a2192a79b8\",\n      \"parent_module\": \"gm4_lightning_in_a_bottle\"\n    },\n    \"gm4_lightning_in_a_bottle:texture_connector_oxidized\": {\n      \"uuid\": [\n        -1160792602,\n        948128354,\n        -1355641425,\n        1430620480\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDY1ZGQ5Njg5MzIyNDZjZjgwODA3Y2E2NmY4M2Y0MThjNjc5YTIzMjI5MDdiYmNkMWYxN2I4ZTQ3NWUwYzE4J319fQ==\",\n      \"hash\": \"0ec19a60309722db4e5d57cba06c29bc62d5051f\",\n      \"parent_module\": \"gm4_lightning_in_a_bottle\"\n    },\n    \"gm4_potion_liquids:liquids/infested\": {\n      \"uuid\": [\n        -1996504295,\n        1552826831,\n        -2054795441,\n        -1569665209\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTM1ZGFiNjQzOGFmZjA1M2VmZDI0NjMzOWZkMjAxNjJmMzViZmJmMjg4MGFiNGVkNmI4NmFmMDllNTQwOTZiMyd9fX0=\",\n      \"hash\": \"50aa38faf483a78bd9a33a437d30713901459ec9\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/oozing\": {\n      \"uuid\": [\n        -783904090,\n        1232292212,\n        -1545737453,\n        -1152375565\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjEyYTBkN2E5YmMzYzczZjQwNTZhYWY3N2FmMmFhNzBmNmRjMjk2MGY2NjRmMjdlZWNjMzVkM2Y2NzMyMDcyOCd9fX0=\",\n      \"hash\": \"a8e2a88fb261b67b80278dade5546dc13a789f64\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/weaving\": {\n      \"uuid\": [\n        842038238,\n        472862371,\n        -1885580302,\n        123777373\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjNlZDM4MWU0MWVmOWJlOWE4OGY5ZGYzOTAzMmJhOGY3OTliYjBiYmM1ODU2ZTk5YzI0YTU3MGFjMjI1OWY1Yyd9fX0=\",\n      \"hash\": \"fb4b712349e985159d1b5dbf20c2ed56f6a47262\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/wind_charged\": {\n      \"uuid\": [\n        -1085379822,\n        1256014354,\n        -2139157479,\n        -487046405\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODJiYTI0NDYzY2FjYTc5MjAzNGVkMGNhNzc4YTUwM2M1OWU1ZTg4YjU2ODBhMTIxM2UxNmIwZmFhZWE5YzMwOSd9fX0=\",\n      \"hash\": \"8d5ed9cbae9e0fc0191d9c140e33adfdd2905ace\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/awkward\": {\n      \"uuid\": [\n        594379978,\n        -2079439988,\n        -2142727791,\n        2046532997\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjc2ZTI2ZmRmZGU4YmY5ZjY0MWM0YjdlZDViNmY3NjNhZmFiZDM5OGIzZjc5MjRhOTViYzA4YjM4N2FhM2MxJ319fQ==\",\n      \"hash\": \"4a3fbe092f343e239311835b44cadd819686e558\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/mundane\": {\n      \"uuid\": [\n        594379978,\n        -2079439988,\n        -2142727791,\n        2046532997\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjc2ZTI2ZmRmZGU4YmY5ZjY0MWM0YjdlZDViNmY3NjNhZmFiZDM5OGIzZjc5MjRhOTViYzA4YjM4N2FhM2MxJ319fQ==\",\n      \"hash\": \"4a3fbe092f343e239311835b44cadd819686e558\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_potion_liquids:liquids/thick\": {\n      \"uuid\": [\n        594379978,\n        -2079439988,\n        -2142727791,\n        2046532997\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjc2ZTI2ZmRmZGU4YmY5ZjY0MWM0YjdlZDViNmY3NjNhZmFiZDM5OGIzZjc5MjRhOTViYzA4YjM4N2FhM2MxJ319fQ==\",\n      \"hash\": \"4a3fbe092f343e239311835b44cadd819686e558\",\n      \"parent_module\": \"gm4_potion_liquids\"\n    },\n    \"gm4_standard_liquids:liquids/ominous_bottle\": {\n      \"uuid\": [\n        -421500789,\n        -352567252,\n        -1207743241,\n        -1662338326\n      ],\n      \"value\": \"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGNkOGI2YzYzMjE2ZTViYjYxYzg4ZGQwNTUwNjg3YmMxNDZmODY3NjdkMTA5YzVmMjk0MjY2NmY1MTI4MDQxMyd9fX0=\",\n      \"hash\": \"73367ae720fb1df246057aaccb4ff07e298e1869\",\n      \"parent_module\": \"gm4_liquid_tanks\"\n    }\n  },\n  \"nonnative_references\": {\n    \"gm4_tinkering_compressors\": [\n      \"gm4_metallurgy:band/curies_bismium\"\n    ],\n    \"gm4_vecto_shamir\": [\n      \"gm4_metallurgy:band/bismuth\"\n    ],\n    \"gm4_weighted_armour\": [\n      \"gm4_metallurgy:band/aluminium\"\n    ],\n    \"gm4_zauber_liquids\": [\n      \"gm4_potion_liquids:liquids/harming\",\n      \"gm4_potion_liquids:liquids/healing\",\n      \"gm4_potion_liquids:liquids/leaping\",\n      \"gm4_potion_liquids:liquids/poison\",\n      \"gm4_potion_liquids:liquids/regeneration\",\n      \"gm4_potion_liquids:liquids/strength\",\n      \"gm4_potion_liquids:liquids/swiftness\"\n    ],\n    \"gm4_audere_shamir\": [\n      \"gm4_metallurgy:band/barium\"\n    ],\n    \"gm4_auto_crafting\": [\n      \"gm4_custom_crafters:custom_crafter\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4/utils.py",
    "content": "import subprocess\nimport warnings\nfrom dataclasses import asdict, dataclass\nfrom functools import total_ordering\nfrom typing import Any, Generic, List, TypeVar\n\nfrom beet import ListOption\nfrom pydantic import RootModel, field_validator\n\nT = TypeVar('T')\nimport csv\nfrom pathlib import Path\n\n\ndef run(cmd: list[str]|str) -> str:\n    \"\"\"Run a shell command and return the stdout.\"\"\"\n    return subprocess.run(cmd, capture_output=True, encoding=\"utf8\", shell=isinstance(cmd, str)).stdout.strip()\n\ndef X_int(val: str) -> int | None:\n    \"\"\"Int casting that accepts character 'X' and returns None\"\"\"\n    return None if val.lower() == 'x' else int(val)\n\ndef add_namespace(val: str, namespace: str) -> str:\n    \"\"\"Adds a namsepace prefix to a string, if one does not already exist\"\"\"\n    if \":\" not in val:\n        return f\"{namespace}:{val}\"\n    return val\n\n@dataclass\n@total_ordering\nclass Version():\n    \"\"\"Class with methods useful for semver versions in the gm4 build pipeline\"\"\"\n    major: int|None\n    minor: int|None\n    patch: int|None\n\n    def __init__(self, input: str):\n        self.major, self.minor, self.patch = map(X_int, input.split(\".\"))\n\n    def __str__(self):\n        if type(None) in map(type, [self.major, self.minor, self.patch]):\n            warnings.warn(f\"Version number was printed to string when one or more fields are not set\")\n        return f\"{self.major}.{self.minor}.{self.patch}\"\n\n    def int_rep(self) -> int:\n        \"\"\"returns integer representation of version, for use in datapack scoreboards\"\"\"\n        if type(None) in map(type, [self.major, self.minor, self.patch]):\n            raise TypeError(f\"Version number cannot be converted to integer when one or more fields are not set\")\n        return 100_000*self.major + 1_000*self.minor + self.patch # type: ignore\n\n    def __eq__(self, other: object) -> bool:\n        if other is None:\n            return False\n        elif isinstance(other, Version):\n            return self.major==other.major and self.minor==other.minor and self.patch==other.patch\n        raise TypeError\n\n    def __lt__(self, other: object) -> bool:\n        if isinstance(other, Version):\n            if self.major is None or self.minor is None or self.patch is None \\\n                or other.major is None or other.minor is None or other.patch is None:\n                raise TypeError(f\"Version numbers cannot be compared when one or more fields are not set\")\n            if self.major < other.major:\n                return True\n            elif self.major == other.major:\n                if self.minor < other.minor:\n                    return True\n                elif self.minor == other.minor:\n                    if self.patch < other.patch:\n                        return True\n            return False\n        raise TypeError\n\n    def replace(self, **changes: Any):\n        params = asdict(self) | changes\n        params = {k:(v if v is not None else 'X') for k,v in params.items()}\n        return Version(f\"{params['major']}.{params['minor']}.{params['patch']}\")\n\ndef nested_get(d: dict[str, Any], key: str) -> list[Any]:\n    \"\"\"Recursively traverses a string-keyed dict (like minecraft json files) for the specified key, returning all that exist\n        returns empty list and throws no errors if key does not exist\"\"\"\n    ret_list: list[Any] = []\n    for k, v in d.items():\n        if k == key:\n            ret_list.append(d[k])\n        elif isinstance(v, dict):\n            ret_list.extend(nested_get(d[k], key))\n        elif isinstance(v, list):\n            for elem in d[k]:\n                if isinstance(elem, dict):\n                    ret_list.extend(nested_get(elem, key)) #type: ignore ; NBT is hard to type due to its nested nature\n    return ret_list\n\nclass NoneAttribute():\n    \"\"\"Object which returns None for any arbitrary attribute access. Used for default members\"\"\"\n    def __getattribute__(self, __name: str) -> None:\n        return None\n\nclass MapOption(RootModel[list[T]|dict[str,T]], Generic[T]):\n    \"\"\"A union-like type of dict and list, supporting common methods for both\n        - Written for use in resource_pack plugin's texture lists\"\"\"\n    root: list[T]|dict[str,T] = []\n\n    def entries(self) -> list[T]:\n        if isinstance(self.root, list):\n            return self.root\n        return list(self.root.values())\n\n    def __getitem__(self, key: str|int) -> T:\n        if isinstance(key, int):\n            return self.entries()[key]\n        if isinstance(self.root, list):\n            raise KeyError(f\"MapOption has no mapping data keys. Could not retrieve {key}\")\n        return self.root[key]\n\n    def items(self):\n        if isinstance(self.root, dict):\n            return self.root.items()\n        raise KeyError(\"MapOption has no mapping data keys. Can not retrieve items()\")\n\n    @field_validator(\"root\", mode=\"before\")\n    @classmethod\n    def validate_root(cls, value: list[T]|dict[str,T]|T) -> list[T]|dict[str,T]:\n        if value is None:\n            value = []\n        elif isinstance(value, ListOption):\n            value = value.entries()\n        if not isinstance(value, (list, tuple, dict)): # single element\n            value = [value]\n        return value # type: ignore\n\n\n# CSV READING UTILS\nclass CSVCell(str):\n    \"\"\"\n    String wrapper for contents of a CSVCell, supports interpreting the content as different formats.\n    \"\"\"\n\n    DEC = 'dec'  # for numbers formatted 16777215\n    HEX = 'hex'  # for numbers formatted #AB0EFF\n    FLOAT = 'float'  # for numbers formatted [0.5, 0.2, 0.9]\n\n    def as_integer(self) -> int:\n        \"\"\"\n        Interprets the string contained in this CSVCell as an integer.\n        Supported formats are:\n            - base 10 integers (no prefix)\n            - prefixed hex color codes (# prefix and 6 digits)\n            - prefixed hex, octal, or binary (0x, 0o, or 0b and some amount of digits)\n            - bool (True or False, case insensitive)\n        Returns a integer representation of the value.\n        \"\"\"\n        if self.startswith('#') and len(self) == 7:  # alternative way of marking base 16 (hex colors)\n            return CSVCell('0x' + self.lstrip('#')).as_integer()\n        if self.startswith('0x'):  # check if the string is in base 2\n            return int(self, 16)\n        if self.startswith('0o'):  # check if the string is in base 8\n            return int(self, 8)\n        if self.startswith('0b'):  # check if the string is in base 16\n            return int(self, 2)\n        if self.casefold() == 'true':\n            return 1\n        if self.casefold() == 'false':\n            return 0\n        return int(self)  # default case, interpret as base 10\n\n    def as_bool(self) -> bool:\n        \"\"\"\n        Interprets the string contained in this CSVCell as a boolean.\n        Returns `True` if the cell's content is:\n            - `TRUE` in any capitalization\n            - A positive number greater or equal to `1`\n        Returns `False` if the cell's content is:\n            - `FALSE` in any capitalization\n            - `0` or any number that truncates to zero\n        Raises a `ValueError` in all other cases.\n        \"\"\"\n        match self.casefold():\n            case 'true':  # TRUE / FALSE keywords\n                return True\n            case 'false':\n                return False\n            case other:\n                try:  # test if contents can be parsed as a number\n                    other = int(other)\n                    if 0 <= other:  # only positive numbers can be interpreted as a boolean\n                        return 1 <= other\n                except ValueError:\n                    pass  # not a number\n                raise ValueError(f\"Couldn't interpret CSVCell contents ('{self}') as a boolean.\")\n\n    def to_color_code(self, encoding: str) -> 'CSVCell':\n        \"\"\"\n        Interprets the string contained in this CSVCell as a color code using the given encoding and returns a new CSVCell with that interpretation as its content.\n        E.g. if the CSVCell this function was called on contains '#4AA0C7' and 'CSVCell.DEC' is given as an encoding, a new CSVCell with content '4890823' is returned.\n        \"\"\"\n        if encoding == CSVCell.HEX:\n            return CSVCell('#' + hex(self.as_integer()).lstrip('0x'))\n        if encoding == CSVCell.DEC:\n            return CSVCell(self.as_integer())\n        if encoding == CSVCell.FLOAT:\n            dec = self.as_integer()\n            return CSVCell([(dec >> 16) / 255, ((dec >> 8) & 0xFF) / 255, (dec & 0xFF) / 255])\n        raise ValueError(\n            f\"Invalid encoding '{encoding}'. Must be '{CSVCell.DEC}', '{CSVCell.HEX}', or '{CSVCell.FLOAT}'.\")\n\n\nclass CSVRow():\n    \"\"\"\n    Read-only dict wrapper which represents a row of data from a .csv file.\n    \"\"\"\n\n    def __init__(self, column_names: List[str] | None = None, data: List[CSVCell] | None = None) -> None:\n        \"\"\"\n        Initialize a new CSVRow object using the supplied column names and data. CSVRow objects are read-only by design.\n        If no data and no column names are supplied the resulting CSVRow object will evaluate to false in boolean expressions.\n\n        Access data within this CSVRow via the `get(key, default)` method or using `[<key: str>]`.\n        \"\"\"\n        if not column_names:\n            column_names = []\n        if not data:\n            data = []\n\n        if len(column_names) != len(data):\n            raise ValueError(\n                f\"Could not build CSVRow from supplied column names and data; Number of supplied column names ({len(column_names)}) does not match number of supplied data entries ({len(data)}).\")\n\n        self._data = {column_names[column_index]\n            : value for column_index, value in enumerate(data)}\n\n    def __bool__(self):\n        \"\"\"\n        Allow for the use of CSVRow instances in if statements; If the CSVRow has no keys it is equivalent to `False`.\n        \"\"\"\n        return len(self._data.keys()) != 0\n\n    def __getitem__(self, key: str):\n        try:\n            return self._data[key]\n        except KeyError as ke:\n            raise ValueError(\n                f\"Failed to select column named '{ke.args[0]}' from CSVRow with columns {[key for key in self._data]}.\")\n\n    def __repr__(self) -> str:\n        return str(self._data)\n\n    def get(self, key: str, default: str | Any) -> CSVCell:\n        \"\"\"\n        Returns the value corresponding to the key if it exists and is not the empty string.\n        Else returns the provided default. The provided default is cast to a string internally.\n        \"\"\"\n        value = self._data.get(key, CSVCell(default))\n        if value:\n            return value\n        else:\n            return CSVCell(default)\n\n\nclass CSV():\n    \"\"\"\n    List-of-Rows representation of a .csv file which can be iteraded over using for ... in.\n    Optimized for row-first access, i.e. select a row, then a column.\n    Also provides a `find_row` function for column-first, i.e. select a column, then a row, access.\n    However, the latter is is more expensive.\n\n    All access methods return CSVRow objects which are dynamically created upon calling an access method.\n    \"\"\"\n\n    @staticmethod\n    def from_file(path: Path) -> 'CSV':\n        \"\"\"\n        Reads in a csv file and returns a list of rows. Each row consists of a dictionary which contains labeled values.\n        \"\"\"\n        with open(path, mode='r') as file:\n            csv_file = csv.reader(file)\n            header = next(csv_file)\n\n            return CSV(column_names=header, rows=[[CSVCell(cell) for cell in row] for row in csv_file])\n\n    def __init__(self, column_names: List[str], rows: List[List[CSVCell]]) -> None:\n        \"\"\"\n        Initialize a new CSV from a list of column names (headers) and a list of rows.\n        The latter contain actual data, whilst the former only holds names of columns.\n        \"\"\"\n        self._column_names = column_names\n        self._rows = rows\n\n    def __iter__(self):\n        \"Iterate over `CSVRow` objects contained within this `CSV`. Traverses in order, starting with the topmost row.\"\n        self.__current = 0\n        self.__last = len(self._rows)\n        return self\n\n    def __next__(self) -> CSVRow:\n        current = self.__current\n        self.__current += 1\n        if current < self.__last:\n            return CSVRow(self._column_names, self._rows[current])\n        raise StopIteration()\n\n    def __getitem__(self, row_index: int):\n        return CSVRow(self._column_names, self._rows[row_index])\n\n    def __repr__(self):\n        return str([CSVRow(self._column_names, data) for data in self._rows])\n\n    def find_row(self, value: str, by_column: str | int = 0) -> CSVRow:\n        \"\"\"\n        Finds and returns the first row in this CSV which has `value` in column `by_column`. `by_column` can either be a str, in which case it is treated\n        as a column name and the header line is searched for a matching string, or an int n, in which case the nth column is selected.\n        `by_column` defaults to `0`.\n        Returns an empty `CSVRow` if no match was found.\n        \"\"\"\n        if isinstance(by_column, str):\n            by_column = self._column_names.index(by_column)\n\n        for row in self._rows:\n            if row[by_column] == value:\n                return CSVRow(self._column_names, row)\n        return CSVRow()\n"
  },
  {
    "path": "gm4_animi_shamir/README.md",
    "content": "# Animi Shamir<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nYou can now cheat death! Or... at least your items can.<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Any items with the Animi Shamir on them will survive after you die and then respawn - like the modded \"Soulbound\" enchantment\r\n- Builds on Gamemode 4's comprehensive and fun take on enchantments with the [Metallurgy]($dynamicLink:gm4_metallurgy) system.\r\n- Respects \"Curse of Vanishing\", so items will not return if on a tool with the Curse and you die.\r\n"
  },
  {
    "path": "gm4_animi_shamir/beet.yaml",
    "content": "id: gm4_animi_shamir\nname: Animi Shamir\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: ../gm4_metallurgy\n    \n\npipeline:\n  - gm4_metallurgy.shamir_model_template\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_player_death\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_metallurgy: 1.8.0\n        lib_player_death: 1.4.0\n      schedule_loops: [main]\n    model_data:\n      - reference: shamir/animi\n        item: [armor, tools, weapons, elytra, bow, crossbow, fishing_rod, warped_fungus_on_a_stick, carrot_on_a_stick, shield, flint_and_steel, shears, clock, compass, recovery_compass, spyglass]\n        template:\n          name: shamir\n          metal: curies_bismium\n          textures_path: gm4_metallurgy:item/shamir/curies_bismium\n    website:\n      description: Adds the Animi Shamir to Metallurgy. Items with Animi will respawn with you when you die!\n      recommended: []\n      notes:\n        - Modifies items right after a player died, and might fight over those items with other Datapacks that do the same.\n    modrinth:\n      project_id: bPnAELDm\n    wiki: https://wiki.gm4.co/wiki/Metallurgy/Animi_Shamir\n    credits:\n      Creator:\n        - Bloo\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/advancement/join.json",
    "content": "{\n    \"criteria\": {\n        \"join_world\": {\n            \"trigger\": \"minecraft:location\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:entity_scores\",\n                        \"entity\": \"this\",\n                        \"scores\": {\n                            \"gm4_animi_leave\": {\n                                \"min\": 1\n                            }\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_animi_shamir:player/rejoin\"\n    }\n}\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/function/check_item_validity.mcfunction",
    "content": "#@s = band is trying to apply to\n#run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'animi'}}] if items entity @s contents #gm4_animi_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_animi_deaths deathCount\nscoreboard objectives add gm4_animi_leave minecraft.custom:minecraft.leave_game\n\nexecute unless score animi_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Animi Shamir\"}\nexecute unless score animi_shamir gm4_earliest_version < animi_shamir gm4_modules run scoreboard players operation animi_shamir gm4_earliest_version = animi_shamir gm4_modules\nscoreboard players set animi_shamir gm4_modules 1\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/function/initialize_item.mcfunction",
    "content": "# sets the item's data from cache\n# @s = @e[type=item,tag=gm4_respawned_animi_item,limit=1]\n# at owner player location\n# run from gm4_animi_shamir:item_caching/unpack_entry\n\n# set owner\ndata modify entity @s Owner set from storage gm4_animi_shamir:cache prepared_entry.owner\n\n# copy NBT\ndata modify entity @s Item set from storage gm4_animi_shamir:cache prepared_entry.inventory[0]\n\n# remove tag\ntag @s remove gm4_respawned_animi_item\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/function/item_caching/add_entry.mcfunction",
    "content": "# adds a prepared entry to the cache\n# @s = a player who has died whilst carrying animi items\n# run from gm4_animi_shamir:player/upon_death\n\n# read player data\ndata modify storage gm4_animi_shamir:cache prepared_entry.owner set from entity @s UUID\n\n# read inventory\ndata modify storage gm4_animi_shamir:cache inventories append from storage gm4_animi_shamir:cache prepared_entry\n\n# remember that this player died with animi items\ntag @s add gm4_animi_user\n\n# sound\nplaysound minecraft:particle.soul_escape player @a[distance=..8] ~ ~ ~ 1 0.7\n\n# wait for respawn\nfunction gm4_animi_shamir:player/wait_for_respawn\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/function/item_caching/prepare_entry.mcfunction",
    "content": "# copies item data of items with animi shamir into cache and deletes them from the world after they were dropped by a dying player\n# @s = item with animi shamir, just dropped by a dying player\n# at location of dying player\n# run from gm4_animi_shamir:player/upon_death\n\n# add this item nbt to storage\ndata modify storage gm4_animi_shamir:cache prepared_entry.inventory append from entity @s Item\n\n# visuals\nparticle minecraft:soul ~ ~0.9 ~ 0.2 0.6 0.2 0.04 1\n\n# remove this item from the world\nkill @s\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/function/item_caching/search_entry.mcfunction",
    "content": "# searches for an entry with owner = prepared_entry.owner. Stores the last match into prepared_entry.inventory. Deletes all duplicates.\n# run from gm4_animi_shamir:player/respawn_inventory\n\n# load target UUID into temp field\ndata modify storage gm4_animi_shamir:cache temp_entry.owner set from storage gm4_animi_shamir:cache prepared_entry.owner\n\n# compare against UUID from list\nexecute store result score $success gm4_animi_deaths run data modify storage gm4_animi_shamir:cache temp_entry.owner set from storage gm4_animi_shamir:cache inventories[0].owner\n\n# store entry into named field if a match is detected\nexecute if score $success gm4_animi_deaths matches 0 run data modify storage gm4_animi_shamir:cache prepared_entry.inventory set from storage gm4_animi_shamir:cache inventories[0].inventory\n\n# cycle entries and delete entry if UUID matched\nexecute if score $success gm4_animi_deaths matches 1.. run data modify storage gm4_animi_shamir:cache inventories append from storage gm4_animi_shamir:cache inventories[0]\ndata remove storage gm4_animi_shamir:cache inventories[0]\n\n# loop until all entries are checked\nscoreboard players remove $loop gm4_animi_deaths 1\nexecute if score $loop gm4_animi_deaths matches 1.. run function gm4_animi_shamir:item_caching/search_entry\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/function/item_caching/unpack_entry.mcfunction",
    "content": "# unpacks prepared_entry into items by summoning one item for each elements in prepared_entry.inventory\n# @s = player who has died recently\n# at @s\n# run from gm4_animi_shamir:player/respawn_inventory\n\n# summon item and populate item NBT\nsummon item ~ ~ ~ {Tags:[\"gm4_respawned_animi_item\"],PickupDelay:0s,Item:{count:1,id:\"minecraft:stone\"}}\nexecute as @e[type=item,tag=gm4_respawned_animi_item,limit=1] run function gm4_animi_shamir:initialize_item\n\n# visuals\nparticle minecraft:soul ~ ~0.9 ~ 0.2 0.6 0.2 0.04 1\n\n# shift pointer forwards and loop\ndata remove storage gm4_animi_shamir:cache prepared_entry.inventory[0]\nscoreboard players remove $loop gm4_animi_deaths 1\nexecute if score $loop gm4_animi_deaths matches 1.. run function gm4_animi_shamir:item_caching/unpack_entry\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/function/player/rejoin.mcfunction",
    "content": "# Revokes advancement and restarts wait_for_respawn clock\n# @s = player that has re-joined with a gm4_animi_deaths score\n# at @s\n# run from advancement gm4_animi_shamir:join\n\n# reset advancement and score\nadvancement revoke @s only gm4_animi_shamir:join\nscoreboard players reset @s gm4_animi_leave\n\n# if the player has a gm4_animi_deaths score, restart waiting_for_respawn clock\nexecute if score @s gm4_animi_deaths matches 1.. run schedule function gm4_animi_shamir:player/wait_for_respawn 1t\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/function/player/respawn_inventory.mcfunction",
    "content": "# respawns an animi item\n# @s = player who has died recently\n# at @s\n# run from gm4_animi_shamir:player/upon_respawn\n\n# look for entries in cache\ndata modify storage gm4_animi_shamir:cache prepared_entry.owner set from entity @s UUID\nexecute store result score $loop gm4_animi_deaths run data get storage gm4_animi_shamir:cache inventories\nfunction gm4_animi_shamir:item_caching/search_entry\n\n# summon item(s)\nexecute store result score $loop gm4_animi_deaths run data get storage gm4_animi_shamir:cache prepared_entry.inventory\nexecute if score $loop gm4_animi_deaths matches 1.. run function gm4_animi_shamir:item_caching/unpack_entry\n\n# sound\nplaysound minecraft:particle.soul_escape player @a[distance=..8] ~ ~ ~ 1 0.7\n\n# remove tag\ntag @s remove gm4_animi_user\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/function/player/upon_death.mcfunction",
    "content": "# @s = player who has died\n# at @s\n# run from #gm4_player_death:soul_bound\n\n# compile item list\ndata remove storage gm4_animi_shamir:cache prepared_entry\nexecute positioned ~ ~0.66 ~ as @e[type=item,distance=..0.67] if items entity @s contents *[custom_data~{gm4_metallurgy:{active_shamir:'animi'}}] if entity @s[nbt={Age:0s}] run function gm4_animi_shamir:item_caching/prepare_entry\n\n# add entry to chache if any animi items were found\nexecute if data storage gm4_animi_shamir:cache prepared_entry.inventory run function gm4_animi_shamir:item_caching/add_entry\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/function/player/upon_respawn.mcfunction",
    "content": "# runs once a player has respawned\n# @s a player that died and has now respawned\n# at @s\n# run from gm4_animi_shamir:player/wait_for_respawn\n\n# reset score and advancement\nadvancement revoke @s only gm4_animi_shamir:death\nscoreboard players reset @s gm4_animi_deaths\n\n# return animi item(s) if this player had at least one animi item\nexecute if entity @s[tag=gm4_animi_user,gamemode=!spectator] run function gm4_animi_shamir:player/respawn_inventory\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/function/player/wait_for_respawn.mcfunction",
    "content": "# Active if a player died with an animi item. Self-schedules until that player either logs out or respawns.\n# @s = none\n# at world spawn\n# self schduled or run from gm4_animi_shamir:item_caching/add_entry or gm4_animi_shamir:player/rejoin\n\n# look for players that just respawned (@e only selects living entities) and has loaded the chunks around themselves\nexecute as @e[type=player,scores={gm4_animi_deaths=1..}] at @s if loaded ~ ~ ~ run function gm4_animi_shamir:player/upon_respawn\n\n# reschedule if there is a player (dead or alive) with a gm4_animi_deaths score (@a also selects dead players)\nexecute if entity @p[scores={gm4_animi_deaths=1..}] run schedule function gm4_animi_shamir:player/wait_for_respawn 1t\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/template via #gm4_metallurgy:summon_band/template\n\nloot spawn ~ ~ ~ loot gm4_animi_shamir:band\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/guidebook/animi_shamir.json",
    "content": "{\n  \"id\": \"animi_shamir\",\n  \"name\": \"Animi Shamir\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"metallurgy\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_animi_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'animi'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_animi_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'animi'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.animi_shamir.description\",\n            \"fallback\": \"Animi allows items to return to their owner upon death.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_animi_shamir\",\n          \"obtain_animi_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.animi_shamir.usage\",\n            \"fallback\": \"The Animi Shamir is found on Curie's Bismium Bands. It can be placed onto tools, armour, weapons, and elytra.\\n\\nAnimi items do not drop when the owner dies, instead appearing in their inventory upon respawning.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/loot_table/band.json",
    "content": "{\n\t\"pools\": [\n\t\t{\n\t\t\t\"rolls\": 1,\n\t\t\t\"entries\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"minecraft:loot_table\",\n\t\t\t\t\t\"value\": \"gm4_metallurgy:curies_bismium_band\",\n\t\t\t\t\t\"functions\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_components\",\n\t\t\t\t\t\t\t\"components\": {\n\t\t\t\t\t\t\t\t\"minecraft:custom_model_data\": {\"strings\":[\"gm4_animi_shamir:shamir/animi\"]}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_custom_data\",\n\t\t\t\t\t\t\t\"tag\": \"{gm4_metallurgy:{stored_shamir:'animi'}}\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_lore\",\n\t\t\t\t\t\t\t\"mode\": \"append\",\n\t\t\t\t\t\t\t\"lore\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"translate\": \"item.gm4.shamir.animi\",\n\t\t\t\t\t\t\t\t\t\"fallback\": \"Animi Shamir\",\n\t\t\t\t\t\t\t\t\t\"italic\": false,\n\t\t\t\t\t\t\t\t\t\"color\": \"gray\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:axes\",\n    \"#minecraft:chest_armor\",\n    \"#minecraft:compasses\",\n    \"#minecraft:foot_armor\",\n    \"#minecraft:head_armor\",\n    \"#minecraft:hoes\",\n    \"#minecraft:leg_armor\",\n    \"#minecraft:pickaxes\",\n    \"#minecraft:shovels\",\n    \"#minecraft:swords\",\n    \"minecraft:bow\",\n    \"minecraft:carrot_on_a_stick\",\n    \"minecraft:clock\",\n    \"minecraft:crossbow\",\n    \"minecraft:elytra\",\n    \"minecraft:fishing_rod\",\n    \"minecraft:flint_and_steel\",\n    \"minecraft:mace\",\n    \"minecraft:shears\",\n    \"minecraft:shield\",\n    \"minecraft:spyglass\",\n    \"minecraft:trident\",\n    \"minecraft:warped_fungus_on_a_stick\"\n  ]\n}\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/test/keep_items.mcfunction",
    "content": "# @template gm4:test_tube\n# @dummy ~1 ~1 ~1\n# @optional\n\ngive @s golden_leggings[custom_data={gm4_metallurgy:{active_shamir:\"animi\"}}]\ngive @s wooden_sword\nkill @s\n\nassert items entity @e[type=item,distance=..3] contents wooden_sword\nassert not items entity @e[type=item,distance=..3] contents golden_leggings\n\nawait delay 1s\n\nkill @e[type=zombie,distance=..3]\nkill @e[type=item,distance=..3]\n\nawait delay 1s\n\ndummy @s respawn\n\nawait items entity @p container.* golden_leggings[custom_data~{gm4_metallurgy:{active_shamir:\"animi\"}}]\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_animi_shamir/test/smoosh.mcfunction",
    "content": "# @template gm4_metallurgy:test_smooshing\n\nloot spawn ~1.5 ~2.5 ~1.8 loot gm4_animi_shamir:band\nsummon item ~1.5 ~2.5 ~1.8 {Item:{id:\"minecraft:diamond_leggings\"}}\n\nawait delay 1s\n\nsetblock ~1 ~4 ~1 redstone_block\n\nawait items entity @e[type=item,distance=..4] contents diamond_leggings[custom_data~{gm4_metallurgy:{active_shamir:\"animi\"}}]\nassert items entity @e[type=item,distance=..4] contents obsidian\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json",
    "content": "{\n\t\"values\": [\n\t\t\"gm4_animi_shamir:check_item_validity\"\n\t]\n}\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_metallurgy/tags/function/summon_band/curies_bismium.json",
    "content": "{\n\t\"values\": [\n\t\t\"gm4_animi_shamir:summon_band\"\n\t]\n}\n"
  },
  {
    "path": "gm4_animi_shamir/data/gm4_player_death/tags/function/soul_bound.json",
    "content": "{\n  \"values\": [\n    \"gm4_animi_shamir:player/upon_death\"\n  ]\n}\n"
  },
  {
    "path": "gm4_animi_shamir/mod.mcdoc",
    "content": "use ::java::world::item::ItemStack\n\ndispatch minecraft:storage[gm4_animi_shamir:cache] to struct {\n  prepared_entry?: Entry,\n  temp_entry?: Entry,\n  inventories?: [Entry],\n}\n\nstruct Entry {\n  owner?: #[uuid] int[] @ 4,\n  inventory?: [ItemStack],\n}\n"
  },
  {
    "path": "gm4_animi_shamir/translations.csv",
    "content": "key,en_us\nitem.gm4.shamir.animi,Animi Shamir\ntext.gm4.guidebook.module_desc.animi_shamir,Adds the Animi Shamir to Metallurgy. Items with Animi will respawn with you when you die!\ntext.gm4.guidebook.animi_shamir.description,Animi allows items to return to their owner upon death.\ntext.gm4.guidebook.animi_shamir.usage,\"The Animi Shamir is found on Curie's Bismium Bands. It can be placed onto tools, armour, weapons, and elytra.\\n\\nAnimi items do not drop when the owner dies, instead appearing in their inventory upon respawning.\"\n"
  },
  {
    "path": "gm4_apple_trees/README.md",
    "content": "# Apple Trees<!--$headerTitle--><!--$pmc:delete-->\n\nApples don't grow on oak trees, silly Mojang! This data pack adds actual apple trees. Find them in forests or buy a sapling from a Wandering Trader.\n\n<img src=\"images/apple_tree.png\" alt=\"Apple Tree in a Forest\" width=\"500\"/><!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- Apple trees naturally generate in Forests\n    - Pick fully grown apples, or wait for them to fall on their own\n    - Apples regrow every three 3 days\n- Apple Saplings drop from chopped down trees, or can be bought from Wandering Traders\n- If you're lucky, you might even find an ultra-rare golden apple tree in the wild\n"
  },
  {
    "path": "gm4_apple_trees/assets/gm4_apple_trees/models/block/apple_unripe.json",
    "content": "{\n    \"parent\": \"minecraft:item/generated\",\n    \"textures\": {\n        \"layer0\": \"gm4_apple_trees:block/apple_unripe\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"translation\" :[ 1 , -0.5, 0],\n            \"scale\": [ 1.1, 1.1, 1.1]\n        }\n    }\n}"
  },
  {
    "path": "gm4_apple_trees/assets/gm4_golden_apple_trees/models/block/golden_apple_unripe.json",
    "content": "{\n    \"parent\": \"minecraft:item/generated\",\n    \"textures\": {\n        \"layer0\": \"gm4_golden_apple_trees:block/golden_apple_unripe\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"translation\" :[ 1 , -0.5, 0],\n            \"scale\": [ 1.1, 1.1, 1.1]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_apple_trees/assets/translations.csv",
    "content": "key,en_us,de_de,en_ws\nitem.gm4.apple_tree_sapling,Apple Tree Sapling,,Ye Small Apple Tree\ntext.gm4.guidebook.module_desc.apple_trees,Introduces fruit-bearing apple trees! Trade for apple saplings with wandering traders or find them growing in forests!,,\ntext.gm4.guidebook.apple_trees.leaf_changes,Apples do not drop from oak or dark oak trees. Another source of apples must be discovered.,,\ntext.gm4.guidebook.apple_trees.obtaining_apples,\"Apple trees are found naturally occurring in forest biomes.\\n\\nWandering traders will also sell apple tree saplings.\\n\\nWhen planted, these saplings grow into apple trees.\",,\ntext.gm4.guidebook.apple_trees.golden_apple_trees,\"Golden apple trees can also be found in forests.\\n\\nThese trees don't drop saplings, and cannot be replanted.\\n\\nThey also have a golden root which grows through stone and dirt.\",,\ntext.gm4.guidebook.apple_trees.new_apples,\"New apples will grow every 3 day cycles. Once ripe, they can be picked or will fall from the tree after a while.\\n\\nBreaking an apple bearing leaf has a 75% chance to drop an apple tree sapling.\",,\n"
  },
  {
    "path": "gm4_apple_trees/beet.yaml",
    "content": "id: gm4_apple_trees\nname: Apple Trees\nversion: 2.6.X\n\nrequire:\n  - bolt\n\ndata_pack:\n  load: .\n\nresource_pack: \n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_trees\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_trees: 1.5.0\n      schedule_loops:\n        - main\n        - slow_clock\n    website:\n      description: Introduces fruit-bearing apple trees! Trade for apple saplings with wandering traders or find them growing in forests!\n      recommended:\n        - gm4_resource_pack\n        - gm4_orbis\n        - gm4_podzol_rooting_soil\n      notes:\n        - Modifies the oak leaves loot table to no longer contain apples. May cause incompatibilities with Datapacks that also modify this loot table.\n    modrinth:\n      project_id: Afacz65w\n    smithed:\n      pack_id: gm4_apple_trees\n    wiki: https://wiki.gm4.co/wiki/Apple_Trees\n    credits:\n      Creators:\n        - Bloo\n        - BPR\n        - SpecialBuilder32\n      Icon Design:\n        - BPR\n    model_data:\n      - item: apple\n        reference: block/apple_unripe\n        model: block/apple_unripe\n      - item: oak_sapling\n        reference: item/apple_tree_sapling\n        template: generated\n      - item: golden_apple\n        reference: block/golden_apple_unripe\n        model: gm4_golden_apple_trees:block/golden_apple_unripe\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/advancement/apple_hand_empty.json",
    "content": "{\n  \"criteria\": {\n    \"apple\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"gm4_apple_trees\"\n              },\n              \"score\": \"load.status\"\n            },\n            \"range\": {\n              \"min\": 1\n            }\n          }\n        ],\n        \"item\": {\n          \"count\": 0\n        },\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:armor_stand\",\n              \"nbt\": \"{Tags:[\\\"gm4_apple\\\",\\\"gm4_ripe_apple\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_apple_trees:leaf/apple/hand_interact\"\n  }\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/advancement/apple_hand_item.json",
    "content": "{\n  \"criteria\": {\n    \"apple\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"gm4_apple_trees\"\n              },\n              \"score\": \"load.status\"\n            },\n            \"range\": {\n              \"min\": 1\n            }\n          }\n        ],\n        \"item\": {\n          \"count\": {\n            \"min\": 1,\n            \"max\": 64\n          }\n        },\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:armor_stand\",\n              \"nbt\": \"{Tags:[\\\"gm4_apple\\\",\\\"gm4_ripe_apple\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_apple_trees:leaf/apple/interact\"\n  }\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/init.mcfunction",
    "content": "execute unless score apple_trees gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Apple Trees\"}\nexecute unless score apple_trees gm4_earliest_version < apple_trees gm4_modules run scoreboard players operation apple_trees gm4_earliest_version = apple_trees gm4_modules\nscoreboard players set apple_trees gm4_modules 1\n\n# scoreboards and constants\nscoreboard objectives add gm4_entity_version dummy\nscoreboard objectives add gm4_fruit_age dummy\nscoreboard objectives add gm4_fruit_stage dummy\nscoreboard objectives add gm4_apple_data dummy\nscoreboard objectives add gm4_ga_root dummy\nscoreboard objectives add gm4_ga_root_count dummy\n\nscoreboard players set #stage_1_start gm4_apple_data 20\nscoreboard players set #stage_2_start gm4_apple_data 40\nscoreboard players set #stage_0_start gm4_apple_data 60\n\nscoreboard players set #golden_root_time gm4_ga_root 4500\nscoreboard players set #3600 gm4_ga_root 3600\nscoreboard players set #10 gm4_ga_root 10\nscoreboard players set #4 gm4_ga_root 4\nscoreboard players set #gapple_stage_1_start gm4_apple_data 80\nscoreboard players set #gapple_stage_2_start gm4_apple_data 220\nscoreboard players set #gapple_stage_0_start gm4_apple_data 240\n\nschedule function gm4_apple_trees:main 10t\nschedule function gm4_apple_trees:slow_clock 12t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/leaf/advance_stage.mcfunction",
    "content": "# advances the stage of the fruit\n# @s = apple_fruiting_leaf armor stand\n# located at @s align xyz\n# run from gm4_apple_trees:leaf/age\n\n# set the visual stage of the fruit depending the score\nexecute if score @s gm4_fruit_age = #stage_1_start gm4_apple_data run function gm4_apple_trees:leaf/set_stage/1\nexecute if score @s gm4_fruit_age = #stage_2_start gm4_apple_data run function gm4_apple_trees:leaf/set_stage/2\nexecute if score @s gm4_fruit_age = #stage_0_start gm4_apple_data run function gm4_apple_trees:leaf/set_stage/0\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/leaf/age.mcfunction",
    "content": "# decreases the age of a fruiting leaf. If it hits 0, the expansion will have to perform some stage change (e.g. grow fruit bigger or drop fruit)\n# @s = gm4_fruiting_leaf marker\n# located at world spawn\n# run from gm4_apple_trees:slow_clock\n\n# increases age\nscoreboard players add @s gm4_fruit_age 1\nexecute if score @s gm4_fruit_age >= @s gm4_fruit_stage at @s align xyz run function gm4_apple_trees:leaf/advance_stage\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/leaf/apple/destroy.mcfunction",
    "content": "# removes a ripe apple leaf armor stand if it is not inside a leaf anymore\n# @s = gm4_ripe_apple armor stand that's holding an apple\n# located at @s align xyz\n# run from gm4_apple_trees:leaf/destroy\n\n# drop apple\nexecute if predicate gm4_apple_trees:apple_holding positioned ~0.5 ~2.5 ~0.5 positioned ^-.25 ^ ^.1 run function gm4_apple_trees:leaf/apple/drop\n\n# kill\nkill @s\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/leaf/apple/drop.mcfunction",
    "content": "# spawns an apple\n# @s = gm4_apple_leaf switching to stage 0\n# at loot spawn location (in head of armor stand or leaf block above the armor stand)\n# run from gm4_apple_trees:leaf/set_stage/0\n# and from gm4_apple_trees:leaf/apple/destroy\n\n# spawn apple item\nplaysound minecraft:entity.item_frame.remove_item block @a[distance=..8] ~ ~ ~ 0.3 0.6\nitem replace entity @s weapon.offhand with minecraft:air\nitem replace entity @s weapon.mainhand with minecraft:air\n\n# visuals\nloot spawn ~ ~ ~ loot gm4_apple_trees:blocks/apple\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/leaf/apple/hand_interact.mcfunction",
    "content": "# update leaf stage\n# @s = player taking apple from tree with empty hand\n# located at @s\n# run from advancement apple_hand_empty\n\nadvancement revoke @s only gm4_apple_trees:apple_hand_empty\n\nplaysound minecraft:entity.item_frame.remove_item block @a[distance=..8] ~ ~ ~ 0.3 0.6\n\n# update armour stand\nexecute positioned ^ ^ ^2.5 as @e[type=minecraft:armor_stand,tag=gm4_apple,tag=gm4_ripe_apple,distance=..3,sort=nearest,limit=1,predicate=!gm4_apple_trees:apple_holding] at @s align xyz run function gm4_apple_trees:leaf/set_stage/0"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/leaf/apple/interact.mcfunction",
    "content": "# update leaf marker and update player's hand items\n# @s = player taking apple from tree while holding an item\n# located at @s\n# run from advancement apple_hand_item\n\nadvancement revoke @s only gm4_apple_trees:apple_hand_item\n\ntag @s add gm4_apple_take\n\nexecute store result score $item_count gm4_apple_data run data get entity @s SelectedItem.count\nexecute positioned ^ ^ ^2.5 as @e[type=minecraft:armor_stand,tag=gm4_apple,tag=gm4_ripe_apple,distance=..3,sort=nearest,limit=1,predicate=gm4_apple_trees:apple_picked] at @s align xyz run function gm4_apple_trees:leaf/apple/pick\n\ntag @s remove gm4_apple_take\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/leaf/apple/pick.mcfunction",
    "content": "# update stack count and leaf stage\n# @s = armor_stand, with apple taken from apple tree\n# at @s align xyz\n# run from gm4_apple_trees:leaf/apple/interact\n\n# return item to player\nitem replace entity @a[tag=gm4_apple_take,limit=1,gamemode=!creative] weapon.mainhand from entity @s weapon.mainhand gm4_apple_trees:count\n\n# update armour stand\nfunction gm4_apple_trees:leaf/set_stage/0"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/leaf/destroy.mcfunction",
    "content": "# removes a leaf marker\n# @s = gm4_apple_leaf marker\n# located at @s\n# run from gm4_apple_trees:verify/destroy_leaf\n\n# drop sapling\nloot spawn ~ ~ ~ loot gm4_apple_trees:blocks/apple_tree_leaf\n# kill apple armor stands\nexecute as @e[type=armor_stand,distance=..3,tag=gm4_apple,tag=!gm4_ripe_apple] at @s unless block ~ ~1 ~ minecraft:oak_leaves run kill @s\nexecute as @e[type=armor_stand,distance=..3,tag=gm4_apple,tag=gm4_ripe_apple] at @s align xyz unless block ~ ~2 ~ minecraft:oak_leaves run function gm4_apple_trees:leaf/apple/destroy\n\n# kill\nkill @s\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/leaf/initialize.mcfunction",
    "content": "# initializes the apple leaf scores\n# @s = gm4_apple armor stand\n# located at world spawn\n# run from gm4_apple_trees:main\n# and from gm4_apple_trees:sapling/generate_tree\n\n# set scores\nscoreboard players set @s gm4_entity_version 2\nscoreboard players operation @s gm4_fruit_stage = #stage_0_start gm4_apple_data\nscoreboard players operation @s gm4_fruit_age = #stage_2_start gm4_apple_data\n\ntag @s remove gm4_apple_uninitialized"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/leaf/process.mcfunction",
    "content": "# removes an apple leaf armor stand if it is not inside a leaf anymore\n# @s = gm4_apple armor stand\n# located at @s align xyz\n# run from gm4_apple_trees:main\n\n# kill apple armor stands\nexecute if entity @s[tag=!gm4_ripe_apple] at @s unless block ~ ~1 ~ minecraft:oak_leaves run kill @s\nexecute if entity @s[tag=gm4_ripe_apple] at @s unless block ~ ~2 ~ minecraft:oak_leaves run function gm4_apple_trees:leaf/apple/destroy\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/leaf/set_stage/0.mcfunction",
    "content": "# sets this apple leaf's stage to 0 (final stage)\n# @s = gm4_apple_leaf on stage 2 (big apple) which should drop its apple\n# located at @s align xyz\n# run from gm4_apple_trees:tree/leaf/fruiting/advance_stage\n\n# set leaf's next stage change age\nscoreboard players operation @s gm4_fruit_stage = #stage_1_start gm4_apple_data\n\n# reset age\nscoreboard players operation @s gm4_fruit_age -= #stage_0_start gm4_apple_data\n\n# visuals\nexecute if predicate gm4_apple_trees:apple_holding positioned ~0.5 ~1.5 ~0.5 positioned ^-.25 ^ ^.1 run function gm4_apple_trees:leaf/apple/drop\ndata merge entity @s {Marker:1b,equipment:{},ShowArms:1b,Small:1b,DisabledSlots:2171166,Tags:[\"gm4_no_edit\",\"gm4_apple\",\"smithed.entity\",\"smithed.strict\"]}\ntp @s ~0.5 ~1.05 ~0.5\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/leaf/set_stage/1.mcfunction",
    "content": "# sets this apple leaf's stage to 1\n# @s = gm4_apple_leaf on stage 0 (no apple) which should drop its apple\n# located at @s align xyz\n# run from gm4_apple_trees:tree/leaf/fruiting/advance_stage\n\n# set leaf's next stage change age\nscoreboard players operation @s gm4_fruit_stage = #stage_2_start gm4_apple_data\n\n# visuals\nplaysound minecraft:block.beehive.drip block @a[distance=..8] ~ ~ ~ 0.3 1.4\ndata merge entity @s {Marker:0b,ShowArms:1b,equipment:{offhand:{id:\"minecraft:apple\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_apple_trees:block/apple_unripe\"]}}}},Pose:{LeftArm:[0.0f,90.0f,90.0f]}}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/leaf/set_stage/2.mcfunction",
    "content": "# sets this apple leaf's stage to 2\n# @s = gm4_apple_leaf on stage 1 (small apple) which should drop its apple\n# located at @s align xyz\n# run from gm4_apple_trees:tree/leaf/fruiting/advance_stage\n\n# set leaf's next stage change age\nscoreboard players operation @s gm4_fruit_stage = #stage_0_start gm4_apple_data\n\n# visuals\nplaysound minecraft:block.beehive.drip block @a[distance=..8] ~ ~ ~ 0.3 1.4\ndata merge entity @s {equipment:{offhand:{id:\"minecraft:apple\",count:1}},ShowArms:1b,Small:0b,DisabledSlots:30,Tags:[\"gm4_no_edit\",\"gm4_apple\",\"gm4_ripe_apple\",\"smithed.entity\",\"smithed.strict\"],Pose:{LeftArm:[0.0f,90.0f,90.0f]}}\ntp @s ~0.5 ~-0.9 ~0.5\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/main.mcfunction",
    "content": "schedule function gm4_apple_trees:main 16t\n\n# upgrade old entities\nexecute as @e[type=armor_stand,tag=gm4_apple_leaf] run function gm4_apple_trees:upgrade_path/apple_leaf_markers\n\n# process apples\nexecute as @e[type=armor_stand,tag=gm4_apple_uninitialized] run function gm4_apple_trees:leaf/initialize\nexecute as @e[type=armor_stand,tag=gm4_apple] at @s align xyz run function gm4_apple_trees:leaf/process\n\n# process golden apples\nexecute as @e[type=armor_stand,tag=gm4_golden_apple_uninitialized] run function gm4_golden_apple_trees:leaf/initialize\nexecute as @e[type=armor_stand,tag=gm4_golden_apple] at @s run function gm4_golden_apple_trees:leaf/process\n# process golden roots\nexecute as @e[type=marker,tag=gm4_golden_root_uninitialized] at @s run function gm4_golden_apple_trees:root/initialize\nexecute as @e[type=marker,tag=gm4_golden_root] at @s run function gm4_golden_apple_trees:root/process\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/sapling/destroy.mcfunction",
    "content": "# restores the data of the sapling when breaking the block\n# @s = apple tree sapling marker\n# located at @s\n# run from gm4_apple_trees:verify/destroy_sapling\n\nexecute align xyz store success score $dropped_item gm4_apple_data run kill @e[type=item,nbt={Item:{id:\"minecraft:oak_sapling\",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0]\nexecute if score $dropped_item gm4_apple_data matches 1.. run loot spawn ~ ~ ~ loot gm4_apple_trees:items/apple_tree_sapling\nscoreboard players reset $dropped_item gm4_apple_data\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/sapling/generate_tree.mcfunction",
    "content": "# generates the apple tree\n# @s = apple sapling marker\n# located at @s\n# run from gm4_apple_trees:verify/generate_tree\n\n# place jigsaw gm4_apple_trees:apple_trees gm4_apple_trees:trunk 2 ~ ~1 ~\n    # jigsaw generation not usable after world-gen due to inherent position-based randomizaton\nexecute unless predicate gm4_apple_trees:valid_placement run return fail\nfunction gm4_apple_trees:sapling/grow/generate_random_tree\nexecute if block ~ ~-1 ~ grass_block run setblock ~ ~-1 ~ dirt\nexecute positioned ~ ~1 ~ as @e[type=armor_stand,tag=gm4_apple_uninitialized,distance=..6] run function gm4_apple_trees:leaf/initialize\nkill @s\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/sapling/grow/generate_random_apple_leaf.mcfunction",
    "content": "# generates an apple armor-stand at a random orientation\n# @s = gm4_apple_leaf jigsaw marker, created by structure file\n# positioned ^ ^ ^1\n# run from gm4_apple_trees:sapling/grow/generate_random_tree\n\n# pick a random facing direction shape\nexecute store result score $random gm4_apple_data run random value 0..3\n\n# place apple at given orientation\nexecute if score $random gm4_apple_data matches 0 run place template gm4_apple_trees:sapling_growth/apple_leaf ~ ~-1 ~ none\nexecute if score $random gm4_apple_data matches 1 run place template gm4_apple_trees:sapling_growth/apple_leaf ~ ~-1 ~ clockwise_90\nexecute if score $random gm4_apple_data matches 2 run place template gm4_apple_trees:sapling_growth/apple_leaf ~ ~-1 ~ 180\nexecute if score $random gm4_apple_data matches 3 run place template gm4_apple_trees:sapling_growth/apple_leaf ~ ~-1 ~ counterclockwise_90\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/sapling/grow/generate_random_tree.mcfunction",
    "content": "# randomly selects a tree structure and places it, mimicing jigsaw behavior without location-based random\n# @s = apple sapling marker\n# located at @s (the sapling)\n# run from gm4_apple_trees:sapling/generate_tree\n\n# pick a random tree shape \nexecute store result score $tree_shape gm4_apple_data run random value 0..7\nexecute store result score $rotation gm4_apple_data run random value 0..3\n\n# place the chosen tree\nexecute if score $tree_shape gm4_apple_data matches 0 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_1 ^-2 ^-1 ^-2 none\nexecute if score $tree_shape gm4_apple_data matches 0 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_1 ^-2 ^-1 ^-2 clockwise_90\nexecute if score $tree_shape gm4_apple_data matches 0 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_1 ^-2 ^-1 ^-2 180\nexecute if score $tree_shape gm4_apple_data matches 0 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_1 ^-2 ^-1 ^-2 counterclockwise_90\n\nexecute if score $tree_shape gm4_apple_data matches 1 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_2 ^-2 ^-1 ^-4 none\nexecute if score $tree_shape gm4_apple_data matches 1 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_2 ^-2 ^-1 ^-4 clockwise_90\nexecute if score $tree_shape gm4_apple_data matches 1 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_2 ^-2 ^-1 ^-4 180\nexecute if score $tree_shape gm4_apple_data matches 1 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_2 ^-2 ^-1 ^-4 counterclockwise_90\n\nexecute if score $tree_shape gm4_apple_data matches 2 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_3 ^-2 ^-1 ^-2 none\nexecute if score $tree_shape gm4_apple_data matches 2 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_3 ^-2 ^-1 ^-2 clockwise_90\nexecute if score $tree_shape gm4_apple_data matches 2 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_3 ^-2 ^-1 ^-2 180\nexecute if score $tree_shape gm4_apple_data matches 2 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_3 ^-2 ^-1 ^-2 counterclockwise_90\n\nexecute if score $tree_shape gm4_apple_data matches 3 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_4 ^-2 ^-1 ^-3 none\nexecute if score $tree_shape gm4_apple_data matches 3 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_4 ^-2 ^-1 ^-3 clockwise_90\nexecute if score $tree_shape gm4_apple_data matches 3 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_4 ^-2 ^-1 ^-3 180\nexecute if score $tree_shape gm4_apple_data matches 3 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_4 ^-2 ^-1 ^-3 counterclockwise_90\n\nexecute if score $tree_shape gm4_apple_data matches 4 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_1 ^-2 ^-1 ^-2 none\nexecute if score $tree_shape gm4_apple_data matches 4 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_1 ^-2 ^-1 ^-2 clockwise_90\nexecute if score $tree_shape gm4_apple_data matches 4 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_1 ^-2 ^-1 ^-2 180\nexecute if score $tree_shape gm4_apple_data matches 4 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_1 ^-2 ^-1 ^-2 counterclockwise_90\n\nexecute if score $tree_shape gm4_apple_data matches 5 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_2 ^-2 ^-1 ^-4 none\nexecute if score $tree_shape gm4_apple_data matches 5 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_2 ^-2 ^-1 ^-4 clockwise_90\nexecute if score $tree_shape gm4_apple_data matches 5 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_2 ^-2 ^-1 ^-4 180\nexecute if score $tree_shape gm4_apple_data matches 5 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_2 ^-2 ^-1 ^-4 counterclockwise_90\n\nexecute if score $tree_shape gm4_apple_data matches 6 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_3 ^-2 ^-1 ^-2 none\nexecute if score $tree_shape gm4_apple_data matches 6 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_3 ^-2 ^-1 ^-2 clockwise_90\nexecute if score $tree_shape gm4_apple_data matches 6 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_3 ^-2 ^-1 ^-2 180\nexecute if score $tree_shape gm4_apple_data matches 6 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_3 ^-2 ^-1 ^-2 counterclockwise_90\n\nexecute if score $tree_shape gm4_apple_data matches 7 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_4 ^-2 ^-1 ^-3 none\nexecute if score $tree_shape gm4_apple_data matches 7 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_4 ^-2 ^-1 ^-3 clockwise_90\nexecute if score $tree_shape gm4_apple_data matches 7 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_4 ^-2 ^-1 ^-3 180\nexecute if score $tree_shape gm4_apple_data matches 7 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_4 ^-2 ^-1 ^-3 counterclockwise_90\n\n# generate apple leaves\nexecute as @e[type=marker,tag=gm4_jpool_apple_leaf] if predicate gm4_apple_trees:apple_gen_chance at @s positioned ^ ^ ^1 run function gm4_apple_trees:sapling/grow/generate_random_apple_leaf\n\n# generate corner leaves\nexecute as @e[type=marker,tag=gm4_jpool_corner_leaf] if predicate gm4_apple_trees:corner_leaf_gen_chance at @s positioned ^ ^ ^1 run setblock ~ ~ ~ oak_leaves[persistent=false,distance=3]\n\nkill @e[type=marker,tag=gm4_jigsaw_marker]\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/sapling/initialize.mcfunction",
    "content": "# initializes the apple tree's marker\n# @s = player who placed down the apple tree sapling\n# located at the center of the placed sapling\n# run from gm4_apple_trees:verify/initialize_sapling\n\nsummon marker ~ ~ ~ {CustomName:\"gm4_apple_tree_sapling\",Tags:[\"gm4_tree_sapling\",\"gm4_apple_tree_sapling\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"]}\nscoreboard players set @e[type=marker,tag=gm4_apple_tree_sapling,distance=..0.1] gm4_sap_growth 2\nscoreboard players set @e[type=marker,tag=gm4_apple_tree_sapling,distance=..0.1] gm4_entity_version 1\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/sapling/podzol_rooting.mcfunction",
    "content": "# plants apple tree saplings to be planted with podzol rooting soil\n# @s = any sapling item that was rooted with podzol_rooting_soil\n# located at @s\n# run from #gm4_podzol_rooting_soil:plant_custom_sapling\n\nexecute if score gm4_apple_trees load.status matches 1.. if items entity @s contents *[custom_data~{gm4_podzol_rooting_soil:{id:\"apple_tree_sapling\"}}] align xyz positioned ~0.5 ~0.5 ~0.5 run function gm4_apple_trees:sapling/initialize\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/slow_clock.mcfunction",
    "content": "schedule function gm4_apple_trees:slow_clock 60s\n\nexecute as @e[type=armor_stand,tag=gm4_apple] run function gm4_apple_trees:leaf/age\nexecute as @e[type=armor_stand,tag=gm4_golden_apple] run function gm4_golden_apple_trees:leaf/age\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/upgrade_path/apple_leaf_markers.mcfunction",
    "content": "\n\n\ntag @s remove gm4_apple_leaf\ntag @s remove gm4_fruiting_leaf\ntag @s add gm4_apple\n\ntag @s remove smithed.block\ntag @s add smithed.entity\ntag @s add smithed.strict\n\nscoreboard players set @s gm4_entity_version 2\n\nexecute if entity @s[tag=gm4_ripe_apple] align xyz run summon marker ~0.5 ~2.5 ~0.5 {CustomName:\"gm4_apple_leaf\",Tags:[\"gm4_tree_leaf\",\"gm4_apple_leaf\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"]}\nexecute if entity @s[tag=!gm4_ripe_apple] align xyz run summon marker ~0.5 ~1.5 ~0.5 {CustomName:\"gm4_apple_leaf\",Tags:[\"gm4_tree_leaf\",\"gm4_apple_leaf\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"]}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/upgrade_path/fruiting_to_general.mcfunction",
    "content": "# updates entities with new tags\n# @s = old sapling marker\n# located at world spawn\n# run from gm4_apple_trees:verify/upgrade_fruiting_to_general\n\ndata merge entity @s {CustomName:\"gm4_apple_tree_sapling\",Tags:[\"gm4_tree_sapling\",\"gm4_apple_tree_sapling\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"]}\nscoreboard players set @s gm4_entity_version 1\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/verify/destroy_leaf.mcfunction",
    "content": "# verifies that the module is enabled and that the leaf type is from this module\n# @s = gm4_tree_leaf marker\n# located at @s\n# run from gm4_trees-1.0:tick via #gm4_trees:destroy_leaf\n\nexecute if score gm4_apple_trees load.status matches 1.. if entity @s[tag=gm4_apple_leaf] run function gm4_apple_trees:leaf/destroy\nexecute if score gm4_apple_trees load.status matches 1.. if entity @s[tag=gm4_golden_apple_leaf] run function gm4_golden_apple_trees:leaf/destroy\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/verify/destroy_sapling.mcfunction",
    "content": "# verifies that the module is enabled and that the sapling type is from this module\n# @s = gm4_tree_sapling marker\n# located at @s\n# run from gm4_trees-1.0:sapling/process via #gm4_trees:destroy_sapling\n\nexecute if score gm4_apple_trees load.status matches 1.. if entity @s[tag=gm4_apple_tree_sapling] run function gm4_apple_trees:sapling/destroy\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/verify/generate_tree.mcfunction",
    "content": "# verifies that the module is enabled and that the sapling type is from this module\n# @s = gm4_tree_sapling marker\n# located at @s\n# run from gm4_trees-1.0:advance_stage via #gm4_trees:generate_tree\n\nexecute if score gm4_apple_trees load.status matches 1.. if entity @s[tag=gm4_apple_tree_sapling] run function gm4_apple_trees:sapling/generate_tree\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/verify/initialize_sapling.mcfunction",
    "content": "# verifies that the module is enabled and that the sapling type is from this module\n# @s = player who just placed down a custom sapling\n# located at the center sapling block\n# run from gm4_trees-1.0:sapling/summon marker via #gm4_trees:initialize_sapling\n\nexecute if score gm4_apple_trees load.status matches 1.. if data storage gm4_trees:temp sapling{type:\"apple\"} run function gm4_apple_trees:sapling/initialize\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/function/verify/upgrade_fruiting_to_general.mcfunction",
    "content": "# verifies that the module is enabled and that the sapling type is from this module\n# @s = gm4_tree_sapling marker\n# located at world spawn\n# run from gm4_trees-1.0:tick via #gm4_trees:upgrade_fruiting_to_general\n\nexecute if score gm4_apple_trees load.status matches 1.. if entity @s[tag=gm4_apple_tree_sapling] run function gm4_apple_trees:upgrade_path/fruiting_to_general\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/guidebook/apple_trees.json",
    "content": "{\n  \"id\": \"apple_trees\",\n  \"name\": \"Apple Trees\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:apple\"\n  },\n  \"criteria\": {\n    \"obtain_apple_sapling\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:oak_sapling\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_trees:{item:{type:\\\"apple\\\"}}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"pick_apple\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:armor_stand\",\n              \"nbt\": \"{Tags:[\\\"gm4_apple\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"leaf_changes\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.apple_trees.leaf_changes\",\n            \"fallback\": \"Apples do not drop from oak or dark oak trees. Another source of apples must be discovered.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"obtaining_apples\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_apple_sapling\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.apple_trees.obtaining_apples\",\n            \"fallback\": \"Apple trees are found naturally occurring in forest biomes.\\n\\nWandering traders will also sell apple tree saplings.\\n\\nWhen planted, these saplings grow into apple trees.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.apple_trees.golden_apple_trees\",\n            \"fallback\": \"Golden apple trees can also be found in forests.\\n\\nThese trees don't drop saplings, and cannot be replanted.\\n\\nThey also have a golden root which grows through stone and dirt.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"new_apples\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"pick_apple\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.apple_trees.new_apples\",\n            \"fallback\": \"New apples will grow every 3 day cycles. Once ripe, they can be picked or will fall from the tree after a while.\\n\\nBreaking an apple bearing leaf has a 75% chance to drop an apple tree sapling.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"obtaining_apples\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/item_modifier/count.json",
    "content": "{\n  \"function\": \"minecraft:set_count\",\n  \"count\": {\n    \"type\": \"minecraft:score\",\n    \"target\": {\n      \"type\": \"minecraft:fixed\",\n      \"name\": \"$item_count\"\n    },\n    \"score\": \"gm4_apple_data\"\n  },\n  \"add\": true\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/loot_table/blocks/apple.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:apple\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/loot_table/blocks/apple_tree_leaf.json",
    "content": "{\n    \"type\": \"minecraft:block\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_apple_trees:items/apple_tree_sapling\",\n                    \"conditions\": [\n                        {\n                            \"condition\": \"minecraft:random_chance\",\n                            \"chance\": 0.75\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/loot_table/items/apple_tree_sapling.json",
    "content": "{\n    \"type\": \"minecraft:block\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:oak_sapling\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.apple_tree_sapling\",\n                                \"fallback\": \"Apple Tree Sapling\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_apple_trees:item/apple_tree_sapling\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_trees:{item:{id:'sapling',type:'apple'}},gm4_podzol_rooting_soil:{id:'apple_tree_sapling'}}\"\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/predicate/apple_gen_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.1667\n}"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/predicate/apple_holding.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:apple\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/predicate/apple_picked.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"count\": 1\n      },\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:apple\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/predicate/corner_leaf_gen_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.3333\n}"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/predicate/overworld.json",
    "content": "{\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n        \"dimension\": \"minecraft:overworld\"\n    }\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/predicate/valid_placement.json",
    "content": "check = []\nfor x in range(-4,5):\n    for y in range(1,8):\n        for z in range(-4,5):\n            check.append(\n                {\n                    \"condition\": \"minecraft:location_check\",\n                    \"offsetX\": x,\n                    \"offsetY\": y,\n                    \"offsetZ\": z,\n                    \"predicate\": {\n                        \"block\": {\n                            \"blocks\": \"#gm4_apple_trees:tree_placeable\"\n                        }\n                    }\n                }\n            )\n\n{\n    \"condition\": \"minecraft:all_of\",\n    \"terms\": check\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/structure/sapling_growth/NOTICE.txt",
    "content": "NOTE. The following files in this directory were generated programatically from their worldgen structure counterparts. \n    it is suggested that if you wish to edit the tree shapes, to do so in the jigsaw based versions and regenerate these\n    files to match them. \n\n    apple_tree_short_1.nbt\n    apple_tree_short_2.nbt\n    apple_tree_short_3.nbt\n    apple_tree_short_4.nbt\n    apple_tree_tall_1.nbt\n    apple_tree_tall_2.nbt\n    apple_tree_tall_3.nbt\n    apple_tree_tall_4.nbt\n    apple_leaf.nbt"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/structure/sapling_growth/jigsaw_structure_convert.py",
    "content": "# converts a jigsaw structure to an function-emulated jigsaw structure for use post-worldgen\n    # written for convertting apple trees structure files with marker entities.\n\nimport amulet_nbt\nimport numpy as np\nfrom structure_normalize_palette import normalize_palette\n\ndef jigsaw_convert(structure_file):\n    # locate which blocks are jigsaws by the block type in palette\n        # and extract facing information for each\n    jigsaws_in_palette = {idx: val['Properties']['orientation'].py_str for idx, val in enumerate(structure_file.tag['palette']) \\\n        if val['Name'].py_str == 'minecraft:jigsaw' }\n\n    # facing to rotation direction mapping\n    rotation_map = {\n        \"north_up\": \"[180f, 0f]\",\n        \"east_up\": \"[-90f, 0f]\",\n        \"south_up\": \"[0f, 0f]\",\n        \"west_up\": \"[90f, 0f]\",\n        \"up_east\": \"[0.0f, -90f]\",\n        \"up_north\": \"[0.0f, -90f]\",\n        \"up_south\": \"[0.0f, -90f]\",\n        \"up_west\": \"[0.0f, -90f]\",\n        \"down\": \"[0.f, 90f]\",\n        \"down_east\": \"[0.f, 90f]\",\n        \"down_north\": \"[0.f, 90f]\",\n        \"down_south\": \"[0.f, 90f]\",\n        \"down_west\": \"[0.f, 90f]\"\n    }\n\n    # locate block positions from palette state(index)s\n    for jigsaw_compound in structure_file.tag['blocks']:\n        if jigsaws_in_palette.get(state_id:=jigsaw_compound['state'].py_int) is not None:\n            # add entity to the entity list\n                # with this jigsaw's direction and position\n            blockPos = np.array(list(map(lambda e:e.py_int, jigsaw_compound['pos'])))\n            jigsaw_pool = 'gm4_jpool_' + jigsaw_compound['nbt']['pool'].py_str.split(':')[1]\n            entity_snbt = f'''{{\n                nbt:{{id:\"minecraft:marker\",Tags:[\"gm4_jigsaw_marker\",\"{jigsaw_pool}\"],\n                    Rotation:{rotation_map[jigsaws_in_palette[state_id]]}}},\n                blockPos:{np.array2string( blockPos, separator=\",\")},\n                pos:{np.array2string( blockPos+[0.5]*3, separator=\",\")}\n                }}'''\n            entity_entry = amulet_nbt.from_snbt(entity_snbt)\n            structure_file.tag['entities'].append(entity_entry)\n\n            # convert the jigsaw block into its final-state block\n            final_name, *final_props = jigsaw_compound['nbt']['final_state'].py_str.split('[')\n            if len(final_props)>0:\n                final_props = final_props[0].strip(']').split(',')\n            final_props = dict((s.split('=') for s in final_props))\n\n            palette_snbt = f'''{{\n                Name:\"{final_name}\",\n                Properties:{final_props}\n            }}'''\n            palette_entry = amulet_nbt.from_snbt(palette_snbt)\n            structure_file.tag['palette'].append(palette_entry)\n            new_state_id = len(structure_file.tag['palette'])-1\n\n            jigsaw_compound['state'] = amulet_nbt.IntTag(new_state_id)\n            del jigsaw_compound['nbt']\n\n    # replace all air with structure-voids (an empty entry)\n    air_state = structure_file.tag['palette'].index(amulet_nbt.CompoundTag({'Name': amulet_nbt.StringTag('minecraft:air')}))\n    air_to_remove = []\n    for idx, b_compound in enumerate(structure_file.tag['blocks']):\n        if b_compound['state'].py_int == air_state:\n            air_to_remove.append(idx)\n    \n    for idx in reversed(air_to_remove):\n        del structure_file.tag['blocks'][idx]\n        # air entry in palette will be cleaned up by normalize\n\n    # normalize blocks and palette to remove repeated values\n    normalized_struct = normalize_palette(structure_file)\n    return normalized_struct\n\nif __name__ == '__main__':\n    # processed desired files into entity-based structures\n    input_files = [\n        \"data\\gm4_apple_trees\\structures\\worldgen\\\\apple_tree_short_1.nbt\",\n        \"data\\gm4_apple_trees\\structures\\worldgen\\\\apple_tree_short_2.nbt\",\n        \"data\\gm4_apple_trees\\structures\\worldgen\\\\apple_tree_short_3.nbt\",\n        \"data\\gm4_apple_trees\\structures\\worldgen\\\\apple_tree_short_4.nbt\",\n        \"data\\gm4_apple_trees\\structures\\worldgen\\\\apple_tree_tall_1.nbt\",\n        \"data\\gm4_apple_trees\\structures\\worldgen\\\\apple_tree_tall_2.nbt\",\n        \"data\\gm4_apple_trees\\structures\\worldgen\\\\apple_tree_tall_3.nbt\",\n        \"data\\gm4_apple_trees\\structures\\worldgen\\\\apple_tree_tall_4.nbt\",\n        \"data\\gm4_apple_trees\\structures\\worldgen\\\\apple_leaf.nbt\"\n    ]\n    output_dir_map = ('worldgen', 'sapling_growth')\n\n    for filepath in input_files:\n        structure_file = amulet_nbt.load(filepath)\n        processed_file = jigsaw_convert(structure_file)\n        processed_file.save_to(filepath.replace(*output_dir_map))"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/structure/sapling_growth/structure_normalize_palette.py",
    "content": "# normalizes a minecraft structure file's palette and removes unused or duplicated\n# entries. This is useful when manipulating structure files via script or by hand, \n# as it reduces filesize and mimics the form of structure blocks produced naturally \n# by the game\n\nimport amulet_nbt\n\ndef normalize_palette(structure):\n    # first generate list of non-repeating palette entries\n    state_map = dict() # maps old->new {old:new}\n    non_repeating_palette = []\n    repeated_idxs = []\n\n    for idx, p_member in enumerate(structure.tag['palette'].copy()):\n        if p_member not in non_repeating_palette:\n            non_repeating_palette.append(p_member)\n            state_map[idx] = idx\n        else:\n            state_map[idx] = non_repeating_palette.index(p_member)\n            # then mark for palette entry deletion\n            repeated_idxs.append(idx)\n    \n    for idx in reversed(repeated_idxs):\n        del structure.tag['palette'][idx]\n        for k in state_map.keys():\n            if k > idx and k not in repeated_idxs:\n                state_map[k] -= 1\n\n    # then search through list of blocks and remove unused palette members\n    used_states = set()\n    for b_member in structure.tag['blocks']:\n        used_states.add(b_member['state'].py_int)\n    unused_states = set(state_map.keys()).difference(used_states)\n    \n    old_state_map = state_map.copy()\n    for idx in unused_states:\n        # adjust palette state mapping for removed entry\n        del state_map[idx]\n        for k, v in old_state_map.items():\n            if v > idx:\n                state_map[k] -= 1\n    \n    for idx in reversed(list(unused_states)):\n        del structure.tag['palette'][idx]\n\n    # finally adjust block state references with new palette\n    for b_member in structure.tag['blocks']:\n        b_member['state'] = amulet_nbt.IntTag(state_map[b_member['state'].py_int])\n\n    return structure\n\nif __name__ == '__main__':\n    LOAD_FILE = 'data\\gm4_golden_apple_trees\\structures\\golden_apple_tree_short_2'\n\n    test_file = amulet_nbt.load(LOAD_FILE+'.nbt')\n    ret = normalize_palette(test_file)\n    ret.save_to(LOAD_FILE+'_normalized.nbt')"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/tags/block/tree_placeable.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:air\",\n        \"#minecraft:logs\",\n        \"#minecraft:replaceable_by_trees\",\n        \"#minecraft:saplings\"\n    ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/tags/worldgen/biome/has_structure/apple_tree.json",
    "content": "{\n  \"values\": [\n    \"minecraft:dark_forest\",\n    \"minecraft:flower_forest\",\n    \"minecraft:forest\"\n  ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/villager_trade/emerald_apple_tree_sapling.json",
    "content": "{\n  \"wants\": {\n    \"id\": \"minecraft:emerald\",\n    \"count\": 5\n  },\n  \"gives\": {\n    \"id\": \"minecraft:oak_sapling\",\n    \"components\": {\n      \"minecraft:custom_data\": \"{gm4_trees:{item:{id:'sapling',type:'apple'}},gm4_podzol_rooting_soil:{id:'apple_tree_sapling'}}\",\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_apple_trees:item/apple_tree_sapling\"]},\n      \"minecraft:item_name\": {\n        \"translate\": \"item.gm4.apple_tree_sapling\",\n        \"fallback\": \"Apple Tree Sapling\"\n      }\n    }\n  },\n  \"max_uses\": 8,\n  \"xp\": 1\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/worldgen/structure/apple_tree.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_apple_trees:has_structure/apple_tree\",\n  \"step\": \"vegetal_decoration\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"beard_thin\",\n  \"start_pool\": \"gm4_apple_trees:apple_trees\",\n  \"size\": 6,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"start_jigsaw_name\": \"gm4_apple_trees:trunk\",\n  \"project_start_to_heightmap\": \"MOTION_BLOCKING_NO_LEAVES\",\n  \"max_distance_from_center\": 80,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/worldgen/structure_set/apple_tree.json",
    "content": "{\n  \"structures\": [\n    {\n      \"structure\": \"gm4_apple_trees:apple_tree\",\n      \"weight\": 1\n    }\n  ],\n  \"placement\": {\n    \"type\": \"minecraft:random_spread\",\n    \"salt\": 314989258,\n    \"frequency_reduction_method\": \"default\",\n    \"frequency\": 0.4,\n    \"locate_offset\": [\n      7,\n      0,\n      7\n    ],\n    \"spacing\": 3,\n    \"separation\": 0\n  }\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/worldgen/template_pool/apple_leaf.json",
    "content": "{\n  \"name\": \"gm4_apple_trees:apple_leaf\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_apple_trees:worldgen/apple_leaf\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:empty_pool_element\",\n        \"projection\": \"rigid\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/worldgen/template_pool/apple_trees.json",
    "content": "{\n  \"name\": \"gm4_apple_trees:apple_trees\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_apple_trees:worldgen/apple_tree_short_1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_apple_trees:worldgen/apple_tree_short_2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_apple_trees:worldgen/apple_tree_short_3\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_apple_trees:worldgen/apple_tree_short_4\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_apple_trees:worldgen/apple_tree_tall_1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_apple_trees:worldgen/apple_tree_tall_2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_apple_trees:worldgen/apple_tree_tall_3\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_apple_trees:worldgen/apple_tree_tall_4\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_apple_trees/worldgen/template_pool/corner_leaf.json",
    "content": "{\n  \"name\": \"gm4_apple_trees:corner_leaf\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_apple_trees:worldgen/corner_leaf\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:empty_pool_element\",\n        \"projection\": \"rigid\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/advancement/apple_hand_empty.json",
    "content": "{\n  \"criteria\": {\n    \"apple\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"gm4_apple_trees\"\n              },\n              \"score\": \"load.status\"\n            },\n            \"range\": {\n              \"min\": 1\n            }\n          }\n        ],\n        \"item\": {\n          \"count\": 0\n        },\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:armor_stand\",\n              \"nbt\": \"{Tags:[\\\"gm4_golden_apple\\\",\\\"gm4_ripe_apple\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_golden_apple_trees:leaf/apple/hand_interact\"\n  }\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/advancement/apple_hand_item.json",
    "content": "{\n  \"criteria\": {\n    \"apple\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"gm4_apple_trees\"\n              },\n              \"score\": \"load.status\"\n            },\n            \"range\": {\n              \"min\": 1\n            }\n          }\n        ],\n        \"item\": {\n          \"count\": {\n            \"min\": 1,\n            \"max\": 64\n          }\n        },\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:armor_stand\",\n              \"nbt\": \"{Tags:[\\\"gm4_golden_apple\\\",\\\"gm4_ripe_apple\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_golden_apple_trees:leaf/apple/interact\"\n  }\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/advance_stage.mcfunction",
    "content": "# advances the stage of the fruit\n# @s = apple_fruiting_leaf armor stand\n# located at @s align xyz\n# run from gm4_apple_trees:leaf/age\n\n# set the visual stage of the fruit depending the score\nexecute if score @s gm4_fruit_age = #gapple_stage_1_start gm4_apple_data run function gm4_golden_apple_trees:leaf/set_stage/1\nexecute if score @s gm4_fruit_age = #gapple_stage_2_start gm4_apple_data run function gm4_golden_apple_trees:leaf/set_stage/2\nexecute if score @s gm4_fruit_age = #gapple_stage_0_start gm4_apple_data run function gm4_golden_apple_trees:leaf/set_stage/0\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/age.mcfunction",
    "content": "# decreases the age of a fruiting leaf. If it hits 0, the expansion will have to perform some stage change (e.g. grow fruit bigger or drop fruit)\n# @s = gm4_fruiting_leaf marker\n# located at world spawn\n# run from gm4_apple_trees:slow_clock\n\n# increases age\nscoreboard players add @s gm4_fruit_age 1\nexecute if score @s gm4_fruit_age >= @s gm4_fruit_stage at @s align xyz run function gm4_golden_apple_trees:leaf/advance_stage\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/apple/destroy.mcfunction",
    "content": "# removes a ripe apple leaf armor stand if it is not inside a leaf anymore\n# @s = gm4_ripe_apple armor stand that's holding an apple\n# located at @s align xyz\n# run from gm4_apple_trees:leaf/destroy\n\n# drop apple\nexecute if predicate gm4_golden_apple_trees:apple_holding positioned ~0.5 ~2.5 ~0.5 positioned ^-.25 ^ ^.1 run function gm4_golden_apple_trees:leaf/apple/drop\n\n# kill\nkill @s\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/apple/drop.mcfunction",
    "content": "# spawns an apple\n# @s = gm4_apple_leaf switching to stage 0\n# at loot spawn location (in head of armor stand or leaf block above the armor stand)\n# run from gm4_apple_trees:leaf/set_stage/0\n# and from gm4_apple_trees:leaf/apple/destroy\n\n# spawn apple item\nplaysound minecraft:entity.item_frame.remove_item block @a[distance=..8] ~ ~ ~ 0.3 0.6\nitem replace entity @s weapon.offhand with minecraft:air\nitem replace entity @s weapon.mainhand with minecraft:air\n\n# visuals\nloot spawn ~ ~ ~ loot gm4_golden_apple_trees:blocks/golden_apple\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/apple/hand_interact.mcfunction",
    "content": "# update leaf stage\n# @s = player taking apple from tree with empty hand\n# located at @s\n# run from advancement apple_hand_empty\n\nadvancement revoke @s only gm4_golden_apple_trees:apple_hand_empty\n\nplaysound minecraft:entity.item_frame.remove_item block @a[distance=..8] ~ ~ ~ 0.3 0.6\n\n# update armour stand\nexecute positioned ^ ^ ^2.5 as @e[type=minecraft:armor_stand,tag=gm4_golden_apple,tag=gm4_ripe_apple,distance=..3,sort=nearest,limit=1,predicate=!gm4_golden_apple_trees:apple_holding] at @s align xyz run function gm4_golden_apple_trees:leaf/set_stage/0"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/apple/interact.mcfunction",
    "content": "# update leaf marker and update player's hand items\n# @s = player taking apple from tree while holding an item\n# located at @s\n# run from advancement apple_hand_item\n\nadvancement revoke @s only gm4_golden_apple_trees:apple_hand_item\n\ntag @s add gm4_apple_take\n\nexecute store result score $item_count gm4_apple_data run data get entity @s SelectedItem.count\nexecute positioned ^ ^ ^2.5 as @e[type=minecraft:armor_stand,tag=gm4_golden_apple,tag=gm4_ripe_apple,distance=..3,sort=nearest,limit=1,predicate=gm4_golden_apple_trees:apple_picked] at @s align xyz run function gm4_golden_apple_trees:leaf/apple/pick\n\ntag @s remove gm4_apple_take\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/apple/pick.mcfunction",
    "content": "# update stack count and leaf stage\n# @s = armor_stand, with apple taken from apple tree\n# at @s align xyz\n# run from gm4_apple_trees:leaf/apple/interact\n\n# return item to player\nitem replace entity @a[tag=gm4_apple_take,limit=1,gamemode=!creative] weapon.mainhand from entity @s weapon.mainhand gm4_apple_trees:count\n\n# update armour stand\nfunction gm4_golden_apple_trees:leaf/set_stage/0"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/destroy.mcfunction",
    "content": "# removes a leaf marker\n# @s = gm4_apple_leaf marker\n# located at @s\n# run from gm4_apple_trees:verify/destroy_leaf\n\n# drop sapling\nloot spawn ~ ~ ~ loot gm4_apple_trees:blocks/apple_tree_leaf\n# kill apple armor stands\nexecute as @e[type=armor_stand,distance=..3,tag=gm4_golden_apple,tag=!gm4_ripe_apple] at @s unless block ~ ~1 ~ minecraft:oak_leaves run kill @s\nexecute as @e[type=armor_stand,distance=..3,tag=gm4_golden_apple,tag=gm4_ripe_apple] at @s align xyz unless block ~ ~2 ~ minecraft:oak_leaves run function gm4_golden_apple_trees:leaf/apple/destroy\n\n# kill\nkill @s\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/initialize.mcfunction",
    "content": "# initializes the apple leaf scores\n# @s = gm4_apple armor stand\n# located at world spawn\n# run from gm4_apple_trees:main\n# and from gm4_apple_trees:sapling/generate_tree\n\n# set scores\nscoreboard players set @s gm4_entity_version 1\nscoreboard players operation @s gm4_fruit_stage = #gapple_stage_0_start gm4_apple_data\nscoreboard players operation @s gm4_fruit_age = #gapple_stage_2_start gm4_apple_data\n\ntag @s remove gm4_golden_apple_uninitialized"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/process.mcfunction",
    "content": "# removes a golden apple leaf armor stand if it is not inside a leaf anymore\n# @s = gm4_golden_apple\n# located at @s align xyz\n# run from gm4_apple_trees:main\n\n# kill apple armor stands\nexecute if entity @s[tag=!gm4_ripe_apple] at @s unless block ~ ~1 ~ minecraft:oak_leaves run kill @s\nexecute if entity @s[tag=gm4_ripe_apple] at @s unless block ~ ~2 ~ minecraft:oak_leaves run function gm4_golden_apple_trees:leaf/apple/destroy\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/set_stage/0.mcfunction",
    "content": "# sets this apple leaf's stage to 0 (final stage)\n# @s = gm4_apple_leaf on stage 2 (big apple) which should drop its apple\n# located at @s align xyz\n# run from gm4_apple_trees:tree/leaf/fruiting/advance_stage\n\n# set leaf's next stage change age\nscoreboard players operation @s gm4_fruit_stage = #gapple_stage_1_start gm4_apple_data\n\n# reset age\nscoreboard players operation @s gm4_fruit_age -= #gapple_stage_0_start gm4_apple_data\n\n# visuals\nexecute if predicate gm4_golden_apple_trees:apple_holding positioned ~0.5 ~1.5 ~0.5 positioned ^-.25 ^ ^.1 run function gm4_golden_apple_trees:leaf/apple/drop\ndata merge entity @s {Marker:1b,equipment:{},ShowArms:1b,Small:1b,DisabledSlots:2171166,Tags:[\"gm4_no_edit\",\"gm4_golden_apple\",\"smithed.entity\",\"smithed.strict\"]}\ntp @s ~0.5 ~1.05 ~0.5\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/set_stage/1.mcfunction",
    "content": "# sets this apple leaf's stage to 1\n# @s = gm4_apple_leaf on stage 0 (no apple) which should drop its apple\n# located at @s align xyz\n# run from gm4_apple_trees:tree/leaf/fruiting/advance_stage\n\n# set leaf's next stage change age\nscoreboard players operation @s gm4_fruit_stage = #gapple_stage_2_start gm4_apple_data\n\n# visuals\nplaysound minecraft:block.beehive.drip block @a[distance=..8] ~ ~ ~ 0.3 1.4\ndata merge entity @s {Marker:0b,ShowArms:1b,equipment:{offhand:{id:\"minecraft:golden_apple\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_apple_trees:block/golden_apple_unripe\"]}}}},Pose:{LeftArm:[0.0f,90.0f,90.0f]}}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/set_stage/2.mcfunction",
    "content": "# sets this apple leaf's stage to 2\n# @s = gm4_apple_leaf on stage 1 (small apple) which should drop its apple\n# located at @s align xyz\n# run from gm4_apple_trees:tree/leaf/fruiting/advance_stage\n\n# set leaf's next stage change age\nscoreboard players operation @s gm4_fruit_stage = #gapple_stage_0_start gm4_apple_data\n\n# visuals\nplaysound minecraft:block.beehive.drip block @a[distance=..8] ~ ~ ~ 0.3 1.4\ndata merge entity @s {equipment:{offhand:{id:\"minecraft:golden_apple\",count:1}},ShowArms:1b,Small:0b,DisabledSlots:30,Tags:[\"gm4_no_edit\",\"gm4_golden_apple\",\"gm4_ripe_apple\",\"smithed.entity\",\"smithed.strict\"],Pose:{LeftArm:[0.0f,90.0f,90.0f]}}\ntp @s ~0.5 ~-0.9 ~0.5\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/root/branch.mcfunction",
    "content": "# handles branching golden apple roots\n# @s = gm4_golden_root_ray marker\n# located at @s\n# run from gm4_golden_apple_trees:root/raycast\n\nsummon marker ~ ~ ~ {Tags:[\"gm4_golden_apple_root_ray\",\"gm4_golden_apple_root_branch\",\"smithed.entity\",\"smithed.strict\"]}\nexecute if score @s gm4_ga_root_count matches 5 run tp @e[type=marker,tag=gm4_golden_apple_root_branch,limit=1] ~ ~ ~ ~160 ~\nexecute if score @s gm4_ga_root_count matches 8 run tp @e[type=marker,tag=gm4_golden_apple_root_branch,limit=1] ~ ~ ~ ~-130 ~\nexecute if score @s gm4_ga_root_count matches 11 run tp @e[type=marker,tag=gm4_golden_apple_root_branch,limit=1] ~ ~ ~ ~100 ~\nscoreboard players set @e[type=marker,tag=gm4_golden_apple_root_branch,limit=1] gm4_ga_root_count 12\n\nexecute as @e[type=marker,tag=gm4_golden_apple_root_branch,limit=1] at @s run function gm4_golden_apple_trees:root/raycast\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/root/grow.mcfunction",
    "content": "# handles growth of golden apple roots\n# @s = gm4_golden_root marker\n# located at @s\n# run from gm4_golden_apple_trees:root/process\n\n# rotate to next root location\ntp @s ~ ~ ~ ~120 0\n\n# grow the root\nsummon marker ^ ^-1 ^1 {Tags:[\"gm4_golden_apple_root_ray\"]}\ntp @e[type=marker,tag=gm4_golden_apple_root_ray,limit=1] @s\n\nexecute as @e[type=marker,tag=gm4_golden_apple_root_ray,limit=1] at @s if block ~ ~ ~ gold_ore run function gm4_golden_apple_trees:root/raycast\nexecute at @e[type=marker,tag=gm4_golden_apple_root_ray] if block ~ ~ ~ #gm4_golden_apple_trees:rootable run function gm4_golden_apple_trees:root/place\n\n# clean up\nscoreboard players reset @s gm4_ga_root\nscoreboard players reset @e[type=marker,tag=gm4_golden_apple_root_ray] gm4_ga_root_count\nkill @e[type=marker,tag=gm4_golden_apple_root_ray]\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/root/initialize.mcfunction",
    "content": "# initializes the golden root\n# @s = uninitialized golden root marker\n# located at @s\n# run from gm4_apple_trees:main\n\n# set salt based on seed and position\nexecute store result score $x gm4_ga_root run data get entity @s Pos[0]\nexecute store result score $y gm4_ga_root run data get entity @s Pos[1]\nexecute store result score $z gm4_ga_root run data get entity @s Pos[2]\nexecute store result score $salt gm4_ga_root run seed\n\nscoreboard players operation $salt gm4_ga_root *= $x gm4_ga_root\nscoreboard players operation $salt gm4_ga_root *= $y gm4_ga_root\nscoreboard players operation $salt gm4_ga_root *= $z gm4_ga_root\n\n# set initial rotation\nscoreboard players operation $rotation gm4_ga_root = $salt gm4_ga_root\nscoreboard players operation $rotation gm4_ga_root %= #3600 gm4_ga_root\nexecute store result entity @s Rotation[0] float 0.1 run scoreboard players get $rotation gm4_ga_root\nscoreboard players reset $rotation gm4_ga_root\n\n# set offset\nscoreboard players operation $offset gm4_ga_root = $salt gm4_ga_root\nscoreboard players operation $rotation gm4_ga_root %= #4 gm4_ga_root\nexecute if score $offset gm4_ga_root matches 0 run tp @s ~0.1 ~ ~\nexecute if score $offset gm4_ga_root matches 1 run tp @s ~-0.1 ~ ~\nexecute if score $offset gm4_ga_root matches 2 run tp @s ~ ~ ~0.1\nexecute if score $offset gm4_ga_root matches 3 run tp @s ~ ~ ~-0.1\nscoreboard players reset $offset gm4_ga_root\n\n# update tags\ndata merge entity @s {Tags:[\"gm4_golden_root\",\"smithed.entity\",\"smithed.strict\"]}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/root/place.mcfunction",
    "content": "# replaces the stone with a gold ore\n# @s = gm4_golden_root_ray marker in stone\n# located at @s\n# run from gm4_golden_apple_trees:tree/root/grow\n\n\nsetblock ~ ~ ~ gold_ore\n\n# visuals\nparticle minecraft:block{block_state:\"minecraft:gold_block\"} ~ ~ ~ 0.7 0.7 0.7 0.02 15\nplaysound minecraft:block.ancient_debris.place block @a[distance=..8] ~ ~ ~ 0.5 0.3\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/root/process.mcfunction",
    "content": "# handles operations on golden apple roots\n# @s = gm4_golden_root marker\n# located at @s\n# run from gm4_apple_trees:main\n\nscoreboard players add @s gm4_ga_root 1\nexecute if block ~ ~ ~ gold_ore if score @s gm4_ga_root >= #golden_root_time gm4_ga_root run function gm4_golden_apple_trees:root/grow\n\nexecute unless block ~ ~ ~ gold_ore run kill @s\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/function/root/raycast.mcfunction",
    "content": "# handles checking golden apple roots\n# @s = gm4_golden_root_ray marker\n# located at @s\n# run from gm4_golden_apple_trees:root/grow\n\ntag @s remove gm4_golden_apple_root_branch\ntp @s ^ ^-1 ^0.6\nexecute if score @s gm4_ga_root_count matches 5 run function gm4_golden_apple_trees:root/branch\nexecute if score @s gm4_ga_root_count matches 8 run function gm4_golden_apple_trees:root/branch\nexecute if score @s gm4_ga_root_count matches 11 run function gm4_golden_apple_trees:root/branch\nscoreboard players add @s gm4_ga_root_count 1\nexecute unless score @s gm4_ga_root_count matches 16.. at @s if block ~ ~ ~ gold_ore run function gm4_golden_apple_trees:root/raycast\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/loot_table/blocks/golden_apple.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:golden_apple\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/loot_table/blocks/golden_apple_tree_leaf.json",
    "content": "{\n    \"type\": \"minecraft:block\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_apple_trees:items/apple_tree_sapling\",\n                    \"conditions\": [\n                        {\n                            \"condition\": \"minecraft:random_chance\",\n                            \"chance\": 0.8\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/predicate/apple_holding.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:golden_apple\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/predicate/apple_picked.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"count\": 1\n      },\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:golden_apple\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/tags/block/rootable.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:base_stone_overworld\",\n        \"#minecraft:substrate_overworld\"\n    ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/worldgen/structure/golden_apple_tree.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_apple_trees:has_structure/apple_tree\",\n  \"step\": \"vegetal_decoration\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"beard_thin\",\n  \"start_pool\": \"gm4_golden_apple_trees:golden_apple_trees\",\n  \"size\": 6,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"start_jigsaw_name\": \"gm4_apple_trees:trunk\",\n  \"project_start_to_heightmap\": \"MOTION_BLOCKING_NO_LEAVES\",\n  \"max_distance_from_center\": 80,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/worldgen/structure_set/golden_apple_tree.json",
    "content": "{\n  \"structures\": [\n    {\n      \"structure\": \"gm4_golden_apple_trees:golden_apple_tree\",\n      \"weight\": 1\n    }\n  ],\n  \"placement\": {\n    \"type\": \"minecraft:random_spread\",\n    \"salt\": 193324921,\n    \"frequency_reduction_method\": \"default\",\n    \"frequency\": 0.1,\n    \"locate_offset\": [\n      14,\n      0,\n      3\n    ],\n    \"spacing\": 5,\n    \"separation\": 2\n  }\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/worldgen/template_pool/golden_apple_leaf.json",
    "content": "{\n  \"name\": \"gm4_golden_apple_trees:golden_apple_leaf\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_golden_apple_trees:worldgen/golden_apple_leaf\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 6,\n      \"element\": {\n        \"element_type\": \"minecraft:empty_pool_element\",\n        \"projection\": \"rigid\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_golden_apple_trees/worldgen/template_pool/golden_apple_trees.json",
    "content": "{\n  \"name\": \"gm4_golden_apple_trees:golden_apple_trees\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_golden_apple_trees:worldgen/golden_apple_tree_short_1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_golden_apple_trees:worldgen/golden_apple_tree_short_2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_golden_apple_trees:worldgen/golden_apple_tree_short_3\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_golden_apple_trees:worldgen/golden_apple_tree_short_4\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_golden_apple_trees:worldgen/golden_apple_tree_tall_1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_golden_apple_trees:worldgen/golden_apple_tree_tall_2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_golden_apple_trees:worldgen/golden_apple_tree_tall_3\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_golden_apple_trees:worldgen/golden_apple_tree_tall_4\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_podzol_rooting_soil/tags/function/plant_custom_sapling.json",
    "content": "{\n    \"values\":[\n        \"gm4_apple_trees:sapling/podzol_rooting\"\n    ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_trees/tags/function/destroy_leaf.json",
    "content": "{\n  \"values\": [\n    \"gm4_apple_trees:verify/destroy_leaf\"\n  ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_trees/tags/function/destroy_sapling.json",
    "content": "{\n  \"values\": [\n    \"gm4_apple_trees:verify/destroy_sapling\"\n  ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_trees/tags/function/generate_tree.json",
    "content": "{\n  \"values\": [\n    \"gm4_apple_trees:verify/generate_tree\"\n  ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_trees/tags/function/initialize_sapling.json",
    "content": "{\n  \"values\": [\n    \"gm4_apple_trees:verify/initialize_sapling\"\n  ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/gm4_trees/tags/function/upgrade_fruiting_to_general.json",
    "content": "{\n  \"values\": [\n    \"gm4_apple_trees:verify/upgrade_fruiting_to_general\"\n  ]\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/minecraft/loot_table/blocks/dark_oak_leaves.json",
    "content": "{\n  \"type\": \"minecraft:block\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:item\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:any_of\",\n                  \"terms\": [\n                    {\n                      \"condition\": \"minecraft:match_tool\",\n                      \"predicate\": {\n                        \"items\": [\n                          \"minecraft:shears\"\n                        ]\n                      }\n                    },\n                    {\n                      \"condition\": \"minecraft:match_tool\",\n                      \"predicate\": {\n                        \"predicates\": {\n                          \"minecraft:enchantments\": [\n                            {\n                              \"enchantments\": \"minecraft:silk_touch\",\n                              \"levels\": {\n                                \"min\": 1\n                              }\n                            }\n                          ]\n                        }\n                      }\n                    }\n                  ]\n                }\n              ],\n              \"name\": \"minecraft:dark_oak_leaves\"\n            },\n            {\n              \"type\": \"minecraft:item\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:survives_explosion\"\n                },\n                {\n                  \"condition\": \"minecraft:table_bonus\",\n                  \"enchantment\": \"minecraft:fortune\",\n                  \"chances\": [\n                    0.05,\n                    0.0625,\n                    0.083333336,\n                    0.1\n                  ]\n                }\n              ],\n              \"name\": \"minecraft:dark_oak_sapling\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:table_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"chances\": [\n                0.02,\n                0.022222223,\n                0.025,\n                0.033333335,\n                0.1\n              ]\n            }\n          ],\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2,\n                \"type\": \"minecraft:uniform\"\n              }\n            },\n            {\n              \"function\": \"minecraft:explosion_decay\"\n            }\n          ],\n          \"name\": \"minecraft:stick\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:inverted\",\n          \"term\": {\n            \"condition\": \"minecraft:any_of\",\n            \"terms\": [\n              {\n                \"condition\": \"minecraft:match_tool\",\n                \"predicate\": {\n                  \"items\": [\n                    \"minecraft:shears\"\n                  ]\n                }\n              },\n              {\n                \"condition\": \"minecraft:match_tool\",\n                \"predicate\": {\n                  \"predicates\": {\n                    \"minecraft:enchantments\": [\n                      {\n                        \"enchantments\": \"minecraft:silk_touch\",\n                        \"levels\": {\n                          \"min\": 1\n                        }\n                      }\n                    ]\n                  }\n                }\n              }\n            ]\n          }\n        }\n      ]\n    }\n  ],\n  \"random_sequence\": \"minecraft:blocks/dark_oak_leaves\",\n  \"__smithed__\": {\n    \"rules\": [\n      {\n        \"type\": \"smithed:merge\",\n        \"target\": \"pools\",\n        \"source\": {\n          \"type\": \"smithed:reference\",\n          \"path\": \"pools\"\n        }\n      }\n    ],\n    \"priority\": {\n      \"default\": 99\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/minecraft/loot_table/blocks/oak_leaves.json",
    "content": "{\n  \"type\": \"minecraft:block\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:item\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:any_of\",\n                  \"terms\": [\n                    {\n                      \"condition\": \"minecraft:match_tool\",\n                      \"predicate\": {\n                        \"items\": [\n                          \"minecraft:shears\"\n                        ]\n                      }\n                    },\n                    {\n                      \"condition\": \"minecraft:match_tool\",\n                      \"predicate\": {\n                        \"predicates\": {\n                          \"minecraft:enchantments\": [\n                            {\n                              \"enchantments\": \"minecraft:silk_touch\",\n                              \"levels\": {\n                                \"min\": 1\n                              }\n                            }\n                          ]\n                        }\n                      }\n                    }\n                  ]\n                }\n              ],\n              \"name\": \"minecraft:oak_leaves\"\n            },\n            {\n              \"type\": \"minecraft:item\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:survives_explosion\"\n                },\n                {\n                  \"condition\": \"minecraft:table_bonus\",\n                  \"enchantment\": \"minecraft:fortune\",\n                  \"chances\": [\n                    0.05,\n                    0.0625,\n                    0.083333336,\n                    0.1\n                  ]\n                }\n              ],\n              \"name\": \"minecraft:oak_sapling\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:table_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"chances\": [\n                0.02,\n                0.022222223,\n                0.025,\n                0.033333335,\n                0.1\n              ]\n            }\n          ],\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2,\n                \"type\": \"minecraft:uniform\"\n              }\n            },\n            {\n              \"function\": \"minecraft:explosion_decay\"\n            }\n          ],\n          \"name\": \"minecraft:stick\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:inverted\",\n          \"term\": {\n            \"condition\": \"minecraft:any_of\",\n            \"terms\": [\n              {\n                \"condition\": \"minecraft:match_tool\",\n                \"predicate\": {\n                  \"items\": [\n                    \"minecraft:shears\"\n                  ]\n                }\n              },\n              {\n                \"condition\": \"minecraft:match_tool\",\n                \"predicate\": {\n                  \"predicates\": {\n                    \"minecraft:enchantments\": [\n                      {\n                        \"enchantments\": \"minecraft:silk_touch\",\n                        \"levels\": {\n                          \"min\": 1\n                        }\n                      }\n                    ]\n                  }\n                }\n              }\n            ]\n          }\n        }\n      ]\n    }\n  ],\n  \"random_sequence\": \"minecraft:blocks/oak_leaves\",\n  \"__smithed__\": {\n    \"rules\": [\n      {\n        \"type\": \"smithed:merge\",\n        \"target\": \"pools\",\n        \"source\": {\n          \"type\": \"smithed:reference\",\n          \"path\": \"pools\"\n        }\n      }\n    ],\n    \"priority\": {\n      \"default\": 99\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_apple_trees/data/minecraft/tags/villager_trade/wandering_trader/common.json",
    "content": "{\n  \"values\": [\n    \"gm4_apple_trees:emerald_apple_tree_sapling\"\n  ]\n}\n"
  },
  {
    "path": "gm4_audere_shamir/README.md",
    "content": "# Audere Shamir<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nPlay the risky game and nearly break your tools! The lower your durability, the faster you mine! <!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Get up to Haste 4 when your durability is really low\r\n- Works across all tool types and all tool tiers (Wood to Netherrite)\r\n- Builds on Gamemode 4's comprehensive and fun take on enchantments with the [Metallurgy]($dynamicLink:gm4_metallurgy) system.\r\n"
  },
  {
    "path": "gm4_audere_shamir/beet.yaml",
    "content": "id: gm4_audere_shamir\nname: Audere Shamir\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: ../gm4_metallurgy\n\npipeline:\n  - gm4_metallurgy.shamir_model_template\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_metallurgy: 1.8.0\n      schedule_loops: [main]\n    model_data:\n      - item: tools\n        reference: shamir/audere\n        template: \n          name: shamir\n          metal: barium\n          textures_path: gm4_metallurgy:item/shamir/barium\n    website:\n      description: Adds the shamir 'Audere' to Metallurgy. Gain Haste with low durability tools.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: 2rSIqoh7\n    wiki: https://wiki.gm4.co/wiki/Metallurgy/Audere_Shamir\n    credits:\n      Creator:\n        - Kattacka\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/active_tool.mcfunction",
    "content": "# @s = players holding an Audere tool\n# at @s\n# run from main\n\ndata modify storage gm4_audere_shamir:temp/player/tool SelectedItem set from entity @s SelectedItem\nexecute store result score $tool_current_damage gm4_ml_data run data get storage gm4_audere_shamir:temp/player/tool SelectedItem.components.\"minecraft:damage\"\nexecute store result score $tool_max_damage gm4_ml_data run data get storage gm4_audere_shamir:temp/player/tool SelectedItem.components.\"minecraft:custom_data\".MaxDurability\n# | MaxDamage is set by gm4_moneo_shamir:store_maximum\n\n# update newly upgraded netherite gear\nexecute if score $tool_max_damage gm4_ml_data matches 1561 if predicate gm4_audere_shamir:holding_netherite run function gm4_audere_shamir:update_netherite\n\n# activate audere\nexecute if score $tool_max_damage gm4_ml_data matches 59 run function gm4_audere_shamir:tools/materials/wood\nexecute if score $tool_max_damage gm4_ml_data matches 131 run function gm4_audere_shamir:tools/materials/stone\nexecute if score $tool_max_damage gm4_ml_data matches 190 run function gm4_audere_shamir:tools/materials/copper\nexecute if score $tool_max_damage gm4_ml_data matches 250 run function gm4_audere_shamir:tools/materials/iron\nexecute if score $tool_max_damage gm4_ml_data matches 1561 run function gm4_audere_shamir:tools/materials/diamond\nexecute if score $tool_max_damage gm4_ml_data matches 2031 run function gm4_audere_shamir:tools/materials/netherite\n# | gold used to be listed as 33 max damage, this is kept for compatibility with old items\nexecute if score $tool_max_damage gm4_ml_data matches 32..33 run function gm4_audere_shamir:tools/materials/gold\nexecute if score $tool_max_damage gm4_ml_data matches 237 run function gm4_audere_shamir:tools/shears\n\n# reset storage and fake players\ndata remove storage gm4_audere_shamir:temp/player/tool SelectedItem\nscoreboard players reset $tool_current_damage gm4_ml_data\nscoreboard players reset $tool_max_damage gm4_ml_data\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/check_item_validity.mcfunction",
    "content": "# @s = band is trying to apply to\n# run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'audere'}}] if items entity @s contents #gm4_audere_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/init.mcfunction",
    "content": "execute unless score audere_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Audere Shamir\"}\nexecute unless score audere_shamir gm4_earliest_version < audere_shamir gm4_modules run scoreboard players operation audere_shamir gm4_earliest_version = audere_shamir gm4_modules\nscoreboard players set audere_shamir gm4_modules 1\n\nschedule function gm4_audere_shamir:main 16t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/main.mcfunction",
    "content": "execute as @a[gamemode=!spectator,predicate=gm4_audere_shamir:holding_audere] at @s run function gm4_audere_shamir:active_tool\n\nschedule function gm4_audere_shamir:main 16t\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n# run from metallurgy:casting/summon_band/barium via #gm4_metallurgy:summon_band/barium\n\nloot spawn ~ ~ ~ loot gm4_audere_shamir:band\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/copper.mcfunction",
    "content": "# @s = player holding an Audere tool\n# at @s\n# run from active_tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 52..139 run effect give @s minecraft:haste 2 0\nexecute if score $tool_max_damage gm4_ml_data matches 20..51 run effect give @s minecraft:haste 2 1\nexecute if score $tool_max_damage gm4_ml_data matches 8..19 run effect give @s minecraft:haste 2 2\nexecute if score $tool_max_damage gm4_ml_data matches ..7 run effect give @s minecraft:haste 2 3\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/diamond.mcfunction",
    "content": "# @s = player holding an Audere tool\n# at @s\n# run from active_tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 424..1148 run effect give @s minecraft:haste 2 0\nexecute if score $tool_max_damage gm4_ml_data matches 156..423 run effect give @s minecraft:haste 2 1\nexecute if score $tool_max_damage gm4_ml_data matches 59..155 run effect give @s minecraft:haste 2 2\nexecute if score $tool_max_damage gm4_ml_data matches ..57 run effect give @s minecraft:haste 2 3\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/gold.mcfunction",
    "content": "# @s = player holding an Audere tool\n# at @s\n# run from active_tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 10..24 run effect give @s minecraft:haste 2 0\nexecute if score $tool_max_damage gm4_ml_data matches 4..9 run effect give @s minecraft:haste 2 1\nexecute if score $tool_max_damage gm4_ml_data matches 2..3 run effect give @s minecraft:haste 2 2\nexecute if score $tool_max_damage gm4_ml_data matches ..1 run effect give @s minecraft:haste 2 3\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/iron.mcfunction",
    "content": "# @s = player holding an Audere tool\n# at @s\n# run from active_tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 69..184 run effect give @s minecraft:haste 2 0\nexecute if score $tool_max_damage gm4_ml_data matches 26..68 run effect give @s minecraft:haste 2 1\nexecute if score $tool_max_damage gm4_ml_data matches 10..25 run effect give @s minecraft:haste 2 2\nexecute if score $tool_max_damage gm4_ml_data matches ..9 run effect give @s minecraft:haste 2 3\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/netherite.mcfunction",
    "content": "# @s = player holding an Audere tool\n# at @s\n# run from active_tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 551..1494 run effect give @s minecraft:haste 2 0\nexecute if score $tool_max_damage gm4_ml_data matches 203..550 run effect give @s minecraft:haste 2 1\nexecute if score $tool_max_damage gm4_ml_data matches 75..202 run effect give @s minecraft:haste 2 2\nexecute if score $tool_max_damage gm4_ml_data matches ..74 run effect give @s minecraft:haste 2 3\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/stone.mcfunction",
    "content": "# @s = player holding an Audere tool\n# at @s\n# run from active_tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 36..96 run effect give @s minecraft:haste 2 0\nexecute if score $tool_max_damage gm4_ml_data matches 14..35 run effect give @s minecraft:haste 2 1\nexecute if score $tool_max_damage gm4_ml_data matches 6..13 run effect give @s minecraft:haste 2 2\nexecute if score $tool_max_damage gm4_ml_data matches ..5 run effect give @s minecraft:haste 2 3\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/wood.mcfunction",
    "content": "# @s = player holding an Audere tool\n# at @s\n# run from active_tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 17..43 run effect give @s minecraft:haste 2 0\nexecute if score $tool_max_damage gm4_ml_data matches 7..16 run effect give @s minecraft:haste 2 1\nexecute if score $tool_max_damage gm4_ml_data matches 3..6 run effect give @s minecraft:haste 2 2\nexecute if score $tool_max_damage gm4_ml_data matches ..2 run effect give @s minecraft:haste 2 3\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/tools/shears.mcfunction",
    "content": "# @s = player holding an Audere tool\n# at @s\n# run from active_tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 65..174 run effect give @s minecraft:haste 2 0\nexecute if score $tool_max_damage gm4_ml_data matches 25..64 run effect give @s minecraft:haste 2 1\nexecute if score $tool_max_damage gm4_ml_data matches 10..24 run effect give @s minecraft:haste 2 2\nexecute if score $tool_max_damage gm4_ml_data matches ..9 run effect give @s minecraft:haste 2 3\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/function/update_netherite.mcfunction",
    "content": "# @s = player holding a netherite audere tool that has the wrong gm4_audere_shamir.max_durability\n# run from active_tool\n\n# item modifier\nitem modify entity @s weapon.mainhand gm4_audere_shamir:update_netherite\n\n# correctly set the max damage\nscoreboard players set $tool_max_damage gm4_ml_data 2031\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/guidebook/audere_shamir.json",
    "content": "{\n  \"id\": \"audere_shamir\",\n  \"name\": \"Audere Shamir\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"metallurgy\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_audere_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'audere'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_audere_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'audere'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.audere_shamir.description\",\n            \"fallback\": \"Audere buffs mining speed, as durability decreases.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_audere_shamir\",\n          \"obtain_audere_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.audere_shamir.usage\",\n            \"fallback\": \"The Audere Shamir is found on Barium Bands. It can be placed onto tools.\\n\\nHigher levels of Haste are awarded for lower durability (percentage-based).\\n\\nThe maximum level of Haste is IV.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/item_modifier/update_netherite.json",
    "content": "{\n  \"function\": \"minecraft:set_custom_data\",\n  \"tag\": \"{gm4_audere_shamir:{max_durability:2031}}\"\n}\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:barium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_audere_shamir:shamir/audere\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'audere'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.audere\",\n                                    \"fallback\": \"Audere Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/predicate/holding_audere.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": \"#gm4_audere_shamir:valid_items\",\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'audere'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/predicate/holding_netherite.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"mainhand\": {\n                \"items\": \"#gm4_audere_shamir:netherite_tools\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/tags/item/netherite_tools.json",
    "content": "{\n    \"values\": [\n        \"minecraft:netherite_shovel\",\n        \"minecraft:netherite_pickaxe\",\n        \"minecraft:netherite_hoe\",\n        \"minecraft:netherite_axe\"\n    ]\n}\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_audere_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:axes\",\n    \"#minecraft:pickaxes\",\n    \"#minecraft:shovels\",\n    \"#minecraft:hoes\",\n    \"minecraft:shears\"\n  ]\n}\n"
  },
  {
    "path": "gm4_audere_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json",
    "content": "{\n    \"values\": [\n      \"gm4_audere_shamir:check_item_validity\"\n    ]\n  }\n  \n  "
  },
  {
    "path": "gm4_audere_shamir/data/gm4_metallurgy/tags/function/summon_band/barium.json",
    "content": "{\n    \"values\":[\n      \"gm4_audere_shamir:summon_band\"\n    ]\n  }\n  \n  "
  },
  {
    "path": "gm4_audere_shamir/mod.mcdoc",
    "content": "use ::java::world::item::ItemStack\n\ndispatch minecraft:storage[gm4_audere_shamir:temp/player/tool] to struct {\n  SelectedItem?: ItemStack,\n}\n"
  },
  {
    "path": "gm4_audere_shamir/translations.csv",
    "content": "key,en_us\nitem.gm4.shamir.audere,Audere Shamir\ntext.gm4.guidebook.module_desc.audere_shamir,Adds the shamir 'Audere' to Metallurgy. Gain Haste with low durability tools.\ntext.gm4.guidebook.audere_shamir.description,\"Audere buffs mining speed, as durability decreases.\"\ntext.gm4.guidebook.audere_shamir.usage,The Audere Shamir is found on Barium Bands. It can be placed onto tools.\\n\\nHigher levels of Haste are awarded for lower durability (percentage-based).\\n\\nThe maximum level of Haste is IV.\n"
  },
  {
    "path": "gm4_balloon_animals/README.md",
    "content": "# Balloon Animals<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nWandering traders needed more pizazz, so now they trade other types of animals!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Wandering Traders now have a chance of trading live animals in their trade list.\r\n- Instead of having llamas follow them, Wandering Traders now can randomly have other mobs\r\n- When buying an animal, it will slowly float down from a collection being dragged along by the trader\r\n"
  },
  {
    "path": "gm4_balloon_animals/animals.csv",
    "content": "type,id,rare,function,names\nCow,minecraft:cow,FALSE,init_farm,\"Abigail,Beef,Belle,Bessie,Clarabell,Delilah,Duchess,Maggie,Moo,Wellington,Wendy\"\nPig,minecraft:pig,FALSE,init_farm,\"Bacon,Betty,Hamm,Hoagie,Piglet,Pua,Pumbaa,Sharla,Swinton\"\nSheep,minecraft:sheep,FALSE,init_animal,\"Baabra,Bellwether,Blackie,Doug,Gruff,Lamb,Lambie,Sheera,Woolensworth,Woolter\"\nHorse,minecraft:horse,FALSE,init_animal,\"Achilles,Buck,Bullseye,Galahad,Khan,Lancelot,Major,Maximus,Pearl,Shadow\"\nRabbit,minecraft:rabbit,FALSE,init_animal,\"Berry,Bouncy,Bushy,Clover,Houdini,Jack,Judy,March,Nibbles,Oswald,Roger,Squirt,Thumper\"\nWolf,minecraft:wolf,FALSE,init_wolf,\"Beast,Bolt,Briar,Bruno,Buddy,Duke,Fenrir,Maugrim,Wolfie,Wolfsbane\"\nLlama,minecraft:llama,FALSE,init_animal,\"Andes,Carl,Carlos,Flower,Kuzco,Paul,Roxy,Ruby,Wendy\"\nFrog,minecraft:frog,FALSE,init_animal,\"Carlos,Croaker,Croaky,Flizard,Frankie,Frogini,Garko,Kermit,Naveen,Ribbiton,Sylvia,Stumpy,Tiana,Toadie\"\nBee,minecraft:bee,FALSE,add_bee_nest,\nChicken,minecraft:chicken,FALSE,add_chicken_egg,\nFox,minecraft:fox,TRUE,init_animal,\"Astuto,Bhati,Fergus,Foxy,Frida,Marian,Nick,Vixen,Vixey,Robin,Sproingo,Tod,Whiskers,Zuzo\"\nParrot,minecraft:parrot,TRUE,init_animal,\"Barker,Beaks,Duncan,Fritz,Iago,Jose,Michael,Pedro,Pierre,Peghook,Polly,Skully,Talon\"\nDonkey,minecraft:donkey,TRUE,init_animal,\"Alexander,Dapple,Duchess,Eeyore,Jack,Lampwick\"\nPanda,minecraft:panda,TRUE,init_animal,\"Chen,Dopey,Dumpling,Helen,Kai,Lily,Mei,Ping,Po,Thunder\"\nCamel,minecraft:camel,TRUE,init_animal,\"Camelot,Camille,Cammy,Caramel,Eden,Jacchus,Kennedy,Mirage,Sarah\"\nGoat,minecraft:goat,TRUE,init_animal,\"Bill,Billy,Djali,Gertrude,Gideon,Joe,Joey,Kid,Phil,Philoctetes,Valentino\"\nOcelot,minecraft:ocelot,TRUE,init_animal,\"Catnip,Clawhauser,Dinah,Felicia,Figaro,Hissy,Jagular,Lucifer,Tallulah\"\nArmadillo,minecraft:armadillo,TRUE,init_animal,\"Annette,Dave,Dharma,Lari,Mighty,Poly,Roly,Tuk-tuk\"\nTurtle,minecraft:turtle,TRUE,add_turtle_egg,\n"
  },
  {
    "path": "gm4_balloon_animals/beet.yaml",
    "content": "id: gm4_balloon_animals\nname: Balloon Animals\nversion: 1.4.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4_balloon_animals.generate\n  - gm4.plugins.extend.module\n\nrequire:\n  - bolt\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    website:\n      description: Looking for exotic animals? This module makes some Wandering Traders sell cute baby animals!\n    modrinth:\n      project_id: zKRZZHQ3\n    wiki: https://wiki.gm4.co/wiki/Balloon_Animals\n    credits:\n      Creator:\n        - TheEpyonProject\n      Icon Design:\n        - Hozz\n    model_data:\n      - item: lead\n        reference: gui/advancement/balloon_animals\n        template:\n          name: advancement\n          forward: minecraft:item/lead\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4/advancement/balloon_animals.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"lead\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_balloon_animals:gui/advancement/balloon_animals\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.balloon_animals.title\",\n      \"fallback\": \"Party Animals\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.balloon_animals.description\",\n      \"fallback\": \"Buy a Balloon Animal from a Wandering Trader\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"balloon_animals\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/advancement/purchased_animal.json",
    "content": "{\n    \"criteria\": {\n      \"primary_animal\": {\n        \"trigger\": \"minecraft:villager_trade\",\n        \"conditions\": {\n          \"item\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_balloon_animals:{trade:1b}}\"\n            }\n          }\n        }\n      },\n      \"secondary_animal\": {\n        \"trigger\": \"minecraft:villager_trade\",\n        \"conditions\": {\n          \"item\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_balloon_animals:{trade:2b}}\"\n            }\n          }\n        }\n      }\n    },\n    \"requirements\": [\n      [\n        \"primary_animal\",\n        \"secondary_animal\"\n      ]\n    ],\n    \"rewards\": {\n      \"function\": \"gm4_balloon_animals:purchased_animal\"\n    }\n  }\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/balloon/check_leashed.mcfunction",
    "content": "# @s = animal, tag=gm4_balloon_animal,tag=!gm4_balloon_animal_purchased\n# at world spawn\n# run from main\n\nexecute store success score $leashed gm4_balloon_animals_data if data entity @s leash\nexecute if score $leashed gm4_balloon_animals_data matches 1 store success score $leashed gm4_balloon_animals_data on leasher if entity @s[type=wandering_trader]\nexecute if score $leashed gm4_balloon_animals_data matches 0 run function gm4_balloon_animals:balloon/fly_away/start_animation\n\n# prevent aging\ndata modify entity @s Age set value -2147483648\n\n# clean up\nscoreboard players reset $leashed gm4_balloon_animals_data\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/balloon/fly_away/animate.mcfunction",
    "content": "# @s = orphaned animal, tag=gm4_balloon_animal,tag=gm4_balloon_animal_purchased\n# run from balloon/fly_away/loop\n\nscoreboard players add @s gm4_balloon_animals_data 1\n\neffect give @s[scores={gm4_balloon_animals_data=1}] levitation infinite 3\neffect give @s[scores={gm4_balloon_animals_data=2}] levitation infinite 7\neffect give @s[scores={gm4_balloon_animals_data=3}] levitation infinite 15\neffect give @s[scores={gm4_balloon_animals_data=4..}] levitation infinite 31\n\nexecute if entity @s[scores={gm4_balloon_animals_data=4..}] at @s run function gm4_balloon_animals:balloon/kill_orphan\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/balloon/fly_away/loop.mcfunction",
    "content": "# @s = orphaned animal, tag=gm4_balloon_animal,tag=gm4_balloon_animal_purchased\n# run from balloon/fly_away/start_animation\n\nexecute as @e[type=#gm4_balloon_animals:balloon_animal,tag=gm4_balloon_animal_fly_away] run function gm4_balloon_animals:balloon/fly_away/animate\n\nexecute if entity @e[type=#gm4_balloon_animals:balloon_animal,tag=gm4_balloon_animal_fly_away,limit=1] run schedule function gm4_balloon_animals:balloon/fly_away/loop 16t\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/balloon/fly_away/start_animation.mcfunction",
    "content": "# @s = orphaned animal, tag=gm4_balloon_animal,tag=gm4_balloon_animal_purchased\n# run from balloon/check_leashed\n\nscoreboard players set @s gm4_balloon_animals_data 0\n\ntag @s add gm4_balloon_animal_fly_away\n\nschedule function gm4_balloon_animals:balloon/fly_away/loop 16t\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/balloon/kill_orphan.mcfunction",
    "content": "# @s = orphaned animal, tag=gm4_balloon_animal,tag=!gm4_balloon_animal_purchased\n# at @s\n# run from balloon/fly_away/animate\n\nparticle poof ~ ~ ~ 0 0 0 0.1 10\ntp @s ~ ~-4096 ~\nkill @s\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/debug/init_trader.mcfunction",
    "content": "# Initializes and saves trader data \n# run from debug/summon_trader_with_llamas\n\ndata modify entity @s DespawnDelay set value 48000\ndata modify storage gm4_balloon_animals:temp trader.uuid set from entity @s UUID\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/debug/summon_trader_with_llamas.mcfunction",
    "content": "# summons wandering trader with 2 llamas, as if it were a natural trader\n# run manually\n\nexecute summon wandering_trader run function gm4_balloon_animals:debug/init_trader\nexecute summon trader_llama run data modify entity @s leash.UUID set from storage gm4_balloon_animals:temp trader.uuid\nexecute summon trader_llama run data modify entity @s leash.UUID set from storage gm4_balloon_animals:temp trader.uuid\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/init.mcfunction",
    "content": "\nscoreboard objectives add gm4_balloon_animals_data dummy\nscoreboard objectives add gm4_balloon_animals_id dummy\n\nexecute unless score balloon_animals gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Balloon Animals\"}\nexecute unless score balloon_animals gm4_earliest_version < balloon_animals gm4_modules run scoreboard players operation balloon_animals gm4_earliest_version = balloon_animals gm4_modules\nscoreboard players set balloon_animals gm4_modules 1\n\nschedule function gm4_balloon_animals:main 1t\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/main.mcfunction",
    "content": "\nexecute as @e[type=minecraft:wandering_trader,tag=!gm4_balloon_animal_eligible_ignore,tag=!smithed.entity] at @s run function gm4_balloon_animals:wandering_trader/check_eligibility\n\nexecute as @e[type=#gm4_balloon_animals:balloon_animal,tag=gm4_balloon_animal,tag=!gm4_balloon_animal_purchased] run function gm4_balloon_animals:balloon/check_leashed\n\nschedule function gm4_balloon_animals:main 4s\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/animal/cleanse.mcfunction",
    "content": "# Removes effects that protected and kept afloat the balloon animal\n# @s = newly purchased balloon animal, tag=gm4_balloon_animal_purchased,tag=gm4_balloon_animal_newly_purchased\n# at world spawn\n# run from purchase/animal/locate_cleanse\n\ntag @s remove gm4_balloon_animal_newly_purchased\n\n# remove balloon effects\neffect clear @s levitation\neffect clear @s slow_falling\neffect clear @s resistance\n\n# temporary protection\neffect give @s slow_falling 5\neffect give @s resistance 5 4\n\n# allow aging\ndata modify entity @s Age set value -12000\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/animal/locate_cleanse.mcfunction",
    "content": "# Delayed activation of cleansing newly purchased animals\n# at world spawn\n# scheduled by purchase/animal/update\n\nexecute as @e[type=#gm4_balloon_animals:balloon_animal,tag=gm4_balloon_animal_newly_purchased] run function gm4_balloon_animals:purchase/animal/cleanse\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/animal/search.mcfunction",
    "content": "# Searches through unpurchased balloon animals for the one that matches the id of the recently purchased animal\n# @s = a random animal, tag=gm4_balloon_animal,tag=!gm4_balloon_animal_purchased\n# at wandering trader, player just traded with\n# run from purchase/trader/check_trade\n\n# load animal score id\nexecute store result score $id gm4_balloon_animals_data run data get storage gm4_balloon_animals:temp temp_source[-1].sell.components.\"minecraft:custom_data\".gm4_balloon_animals.id\n\n# checks all unpurchased balloon animals, if their id matches the recently purchased one then continue\nexecute as @e[type=#gm4_balloon_animals:balloon_animal,tag=gm4_balloon_animal,tag=!gm4_balloon_animal_purchased] if score @s gm4_balloon_animals_id = $id gm4_balloon_animals_data run function gm4_balloon_animals:purchase/animal/update\n\n# if animal not found, refund player (in purchased_animal)\nexecute unless score $trade_success gm4_balloon_animals_data matches 1 run playsound entity.villager.no neutral @a[distance=..8] ~ ~ ~\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/animal/update.mcfunction",
    "content": "# Tag and complete the ownership of the purchased balloon animal to the player\n# @s = purchased balloon animal\n# at wandering trader, player just traded with\n# run from purchase/animal/search\n\ntag @s add gm4_balloon_animal_purchased\nscoreboard players set $trade_success gm4_balloon_animals_data 1\n\n# switch the leasher from the trader to the player\ndata modify entity @s leash.UUID set from storage gm4_balloon_animals:temp player.uuid\n\n# don't know why but having all of these in one file prevents the above line from working properly\ntag @s add gm4_balloon_animal_newly_purchased\nschedule function gm4_balloon_animals:purchase/animal/locate_cleanse 10t\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/trader/check_trade.mcfunction",
    "content": "# Checks the uses count for a specific gm4_balloon_animal trade\n# @s = wandering trader, tag=gm4_balloon_animal_trader\n# at player\n# run from purchase/trades/parse_trades\n\nexecute store result score $uses gm4_balloon_animals_data run data get storage gm4_balloon_animals:temp temp_source[-1].uses\n\n# if uses and maxUses matches, this is the trade we are looking for.\n# continue with searching for purchased animal, reposition to trader for playsound\nexecute if score $uses gm4_balloon_animals_data matches 1 at @s as @e[type=#gm4_balloon_animals:balloon_animal,tag=gm4_balloon_animal,tag=!gm4_balloon_animal_purchased,limit=1] run function gm4_balloon_animals:purchase/animal/search\n# update the trade as processed\nexecute if score $uses gm4_balloon_animals_data matches 1 run function gm4_balloon_animals:purchase/trader/update_trade\n\n# Typically balloon animal trades' uses will be 0 or 2.\n# The maxUses is 1, but we can set any value including higher ones.\n\n# If the uses is 0, we know that it has not been purchased,\n# but if uses is 1, we can set the value higher after checking,\n# which guarantees us that trades with a uses of 1 are the specific trade we are looking for\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/trader/parse_trades.mcfunction",
    "content": "# Checks each trader's trade for a gm4_balloon_animals.trade nbt\n# @s = random wandering trader, tag=gm4_balloon_animal_trader\n# at player\n# run from purchase/trades/search and self\n\ndata modify storage gm4_balloon_animals:temp temp_source append from storage gm4_balloon_animals:temp trades[0]\ndata remove storage gm4_balloon_animals:temp trades[0]\n\n# if current trade is a balloon animal trade, check if it is the one we are looking for\nexecute store success score $trade_applicable gm4_balloon_animals_data if data storage gm4_balloon_animals:temp temp_source[-1].sell.components.\"minecraft:custom_data\".gm4_balloon_animals.trade\nexecute if score $trade_applicable gm4_balloon_animals_data matches 1 run function gm4_balloon_animals:purchase/trader/check_trade\n\n# if any remaining trades, continue looping\nexecute store result score $trade_count gm4_balloon_animals_data run data get storage gm4_balloon_animals:temp trades\nexecute if score $trade_found gm4_balloon_animals_data matches 0 if score $trade_count gm4_balloon_animals_data matches 1.. run function gm4_balloon_animals:purchase/trader/parse_trades\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/trader/search.mcfunction",
    "content": "# Search through traders' trades to find the trade that activated the advancement\n# @s = wandering trader, tag=gm4_balloon_animal_trader, initially nearest\n# at player\n# run from purchased_animal or self\n\n# reset end values\nscoreboard players set $trade_found gm4_balloon_animals_data 0\ndata remove storage gm4_balloon_animals:temp temp_source\n\n# load trades, prepare for search\ndata modify storage gm4_balloon_animals:temp trades set from entity @s Offers.Recipes\n\nfunction gm4_balloon_animals:purchase/trader/parse_trades\n\ntag @s add gm4_balloon_animal_trader_processed\n\n# if not the trader we are looking for, loop unprocessed traders\nexecute if score $trade_found gm4_balloon_animals_data matches 0 as @e[type=wandering_trader,tag=!smithed.entity,tag=gm4_balloon_animal_trader,tag=!gm4_balloon_animal_trader_processed,limit=1] run function gm4_balloon_animals:purchase/trader/search\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/trader/update_trade.mcfunction",
    "content": "# Update the uses count for balloon animal trader's trade\n# @s = wandering trader, tag=gm4_balloon_animal_trader\n# at player\n# run from purchase/trades/check_trade\n\n# update trade, such that uses (2) > maxUses (1)\ndata modify storage gm4_balloon_animals:temp temp_source[-1].uses set value 2\n\n# update trader with the updated trade\ndata modify storage gm4_balloon_animals:temp temp_source append from storage gm4_balloon_animals:temp trades[]\ndata modify entity @s Offers.Recipes set from storage gm4_balloon_animals:temp temp_source\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/purchased_animal.mcfunction",
    "content": "# Granted upon purchasing a balloon animal from a wandering trader\n# @s = trading player\n# at @s\n# run from advancement purchased_animal\n\nscoreboard players reset $trade_success gm4_balloon_animals_data\n\ndata modify storage gm4_balloon_animals:temp player.uuid set from entity @s UUID\n\n# locate trader\nexecute as @e[type=wandering_trader,tag=gm4_balloon_animal_trader,limit=1,sort=nearest] run function gm4_balloon_animals:purchase/trader/search\n\nexecute if score $trade_success gm4_balloon_animals_data matches 1 run advancement grant @s only gm4:balloon_animals\nexecute unless score $trade_success gm4_balloon_animals_data matches 1 run give @s emerald 12\n\n# clean up\nadvancement revoke @s only gm4_balloon_animals:purchased_animal\n\nclear @s lead[custom_data~{gm4_balloon_animals:{trade:1b}}|custom_data~{gm4_balloon_animals:{trade:2b}}]\n\nscoreboard players reset $trade_applicable gm4_balloon_animals_data\nscoreboard players reset $trade_count gm4_balloon_animals_data\nscoreboard players reset $uses gm4_balloon_animals_data\n\ntag @e[type=wandering_trader,tag=gm4_balloon_animal_trader_processed] remove gm4_balloon_animal_trader_processed\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/check_eligibility.mcfunction",
    "content": "# @s = a wandering trader\n# at @s\n# run from gm4_balloon_animals:main\n\n# ensure that this wandering trader is not checked again\ntag @s add gm4_balloon_animal_eligible_ignore\n\nexecute unless predicate gm4_balloon_animals:balloon_trader_chance run return 0\n\n# must have 2 llamas leashed\nscoreboard players set $trader_llama_count gm4_balloon_animals_data 0\ntag @s add gm4_balloon_animal_trader_eligible_check\nexecute as @e[type=trader_llama,tag=!smithed.entity,distance=..6] on leasher if entity @s[tag=gm4_balloon_animal_trader_eligible_check] run scoreboard players add $trader_llama_count gm4_balloon_animals_data 1\ntag @s remove gm4_balloon_animal_trader_eligible_check\nexecute unless score $trader_llama_count gm4_balloon_animals_data matches 2 run return 0\nscoreboard players reset $trader_llama_count gm4_balloon_animals_data\n\ndata modify storage gm4_balloon_animals:temp trader.uuid set from entity @s UUID\nfunction gm4_balloon_animals:wandering_trader/init_trader\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/init_trader.mcfunction",
    "content": "# @s = a wandering trader with exactly 2 trader llamas\n# at @s\n# run from wandering_trader/check_eligibility\n\n# mark that this trader was modified\ntag @s add gm4_balloon_animal_trader\n\n# find leashed llamas\ntag @s add gm4_balloon_animal_trader_new\nexecute as @e[type=trader_llama,tag=!smithed.entity,distance=..6] run function gm4_balloon_animals:wandering_trader/llama/check_leasher\ntag @s remove gm4_balloon_animal_trader_new\n\n# pick two animals and set up trades\nfunction gm4_balloon_animals:wandering_trader/pick_two_animals\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/llama/check_leasher.mcfunction",
    "content": "# Checks that this trader llama is attached to the wandering trader that is being checked\n# @s = a llama within 6 blocks of the wandering trader being checked\n# at @s\n# run from wandering_trader/init_trader\n\nexecute store result score $trader_llama_check gm4_balloon_animals_data on leasher if entity @s[tag=gm4_balloon_animal_trader_new]\nexecute if score $trader_llama_check gm4_balloon_animals_data matches 1 run function gm4_balloon_animals:wandering_trader/llama/kill\nscoreboard players reset $trader_llama_check gm4_balloon_animals_data\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/llama/delay/find_lead.mcfunction",
    "content": "# @s = marker, tag=gm4_balloon_animal_item_cleanup\n# at @s\n# run from wandering_trader/llama/delay/lead_cleanup\n\nkill @e[type=item,distance=..5,nbt={Age:1s},limit=2]\nkill @s\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/llama/delay/lead_cleanup.mcfunction",
    "content": "# Look for gm4_balloon_animal_item_cleanup markers\n# at world spawn\n# scheduled by wandering_trader/llama/kill\n\nexecute as @e[type=marker,tag=gm4_balloon_animal_item_cleanup] at @s run function gm4_balloon_animals:wandering_trader/llama/delay/find_lead\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/llama/kill.mcfunction",
    "content": "# @s = a llama within 6 blocks of the wandering trader being checked\n# at @s\n# run from wandering_trader/llama/check_leasher\n\nexecute on leasher at @s unless entity @e[type=marker,tag=gm4_balloon_animal_item_cleanup,distance=..0.01,limit=1] summon marker run tag @s add gm4_balloon_animal_item_cleanup\n\ntp @s ~ ~-4096 ~\nkill @s\n\nschedule function gm4_balloon_animals:wandering_trader/llama/delay/lead_cleanup 1t\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/pick_two_animals.mcfunction",
    "content": "# @s = a wandering trader with no trader llamas, tag=gm4_balloon_animal_trader\n# at @s\n# run from wandering_trader/init_trader\n\ndata modify storage gm4_balloon_animals:temp gm4_balloon_animals set value {trade:1b}\nfunction gm4_balloon_animals:wandering_trader/trade/pick_animal\n\ndata modify storage gm4_balloon_animals:temp gm4_balloon_animals set value {trade:2b}\nfunction gm4_balloon_animals:wandering_trader/trade/pick_animal\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/add_bee_nest.mcfunction",
    "content": "# @s = wandering trader\n# at wandering trader with no llamas, tag=gm4_balloon_animal_trader\n# run from wandering_trader/trade/pick_animal\n\ndata modify storage gm4_balloon_animals:temp trade set value {buy:{id:\"minecraft:emerald\",count:8},sell:{id:\"minecraft:bee_nest\",components:{\"minecraft:bees\":[{entity_data:{id:\"minecraft:bee\"},ticks_in_hive:0,min_ticks_in_hive:0}]}},maxUses:1,rewardExp:1b,xp:1,priceMultiplier:0.05f}\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/add_chicken_egg.mcfunction",
    "content": "# @s = wandering trader\n# at wandering trader with no llamas, tag=gm4_balloon_animal_trader\n# run from wandering_trader/trade/pick_animal\n\ndata modify storage gm4_balloon_animals:temp trade set value {buy:{id:\"minecraft:emerald\",count:2},maxUses:1,rewardExp:1b,xp:1,priceMultiplier:0.05f}\n\nexecute store result score $variant_id gm4_balloon_animals_data run random value 0..2\nexecute if score $variant_id gm4_balloon_animals_data matches 0 run data modify storage gm4_balloon_animals:temp trade.sell set value {id:\"minecraft:egg\",count:8}\nexecute if score $variant_id gm4_balloon_animals_data matches 1 run data modify storage gm4_balloon_animals:temp trade.sell set value {id:\"minecraft:blue_egg\",count:8}\nexecute if score $variant_id gm4_balloon_animals_data matches 2 run data modify storage gm4_balloon_animals:temp trade.sell set value {id:\"minecraft:brown_egg\",count:8}\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/add_lead.mcfunction",
    "content": "# @s = animal to be attached to trader\n# at wandering trader with no llamas, tag=gm4_balloon_animal_trader\n# run from wandering_trader/trade/init_[animal|wolf|farm]\n\ndata modify storage gm4_balloon_animals:temp trade set value {buy:{id:\"minecraft:emerald\",count:12},maxUses:1,rewardExp:1b,xp:1,priceMultiplier:0.05f}\n\nloot spawn ~ -4096 ~ loot gm4_balloon_animals:lead\nexecute positioned ~ -4096 ~ run data modify storage gm4_balloon_animals:temp trade.sell set from entity @e[type=item,predicate=gm4_balloon_animals:is_lead,distance=..1,limit=1] Item\nexecute positioned ~ -4096 ~ run kill @e[type=item,predicate=gm4_balloon_animals:is_lead,distance=..1,limit=1]\n\ndata modify entity @s CustomName set from storage gm4_balloon_animals:temp trade.sell.components.\"minecraft:lore\"[0].text\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/add_turtle_egg.mcfunction",
    "content": "# @s = wandering trader\n# at wandering trader with no llamas, tag=gm4_balloon_animal_trader\n# run from wandering_trader/trade/pick_animal\n\ndata modify storage gm4_balloon_animals:temp trade set value {buy:{id:\"minecraft:emerald\",count:8},sell:{id:\"minecraft:turtle_egg\",count:1},maxUses:1,rewardExp:1b,xp:1,priceMultiplier:0.05f}\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/init_animal.mcfunction",
    "content": "# @s = animal to be attached to trader, type=#gm4_balloon_animals:balloon_animal\n# at wandering trader with no llamas, tag=gm4_balloon_animal_trader\n# run from wandering_trader/trade/pick_animal\n\ntag @s add gm4_balloon_animal\n\neffect give @s levitation infinite 0 true\neffect give @s slow_falling infinite 0 true\neffect give @s resistance infinite 4 true\n\ndata modify entity @s Age set value -2147483648\ndata modify entity @s leash.UUID set from storage gm4_balloon_animals:temp trader.uuid\n\nexecute store result score @s gm4_balloon_animals_id run scoreboard players add $id gm4_balloon_animals_id 1\nexecute store result storage gm4_balloon_animals:temp gm4_balloon_animals.id int 1 run scoreboard players get $id gm4_balloon_animals_id\n\nfunction gm4_balloon_animals:wandering_trader/trade/add_lead\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/init_farm.mcfunction",
    "content": "# @s = farm animal to be attached to trader, type=#gm4_balloon_animals:balloon_animal\n# at wandering trader with no llamas, tag=gm4_balloon_animal_trader\n# run from wandering_trader/trade/pick_animal\n\ntag @s add gm4_balloon_animal\n\neffect give @s levitation infinite 0 true\neffect give @s slow_falling infinite 0 true\neffect give @s resistance infinite 4 true\n\ndata modify entity @s Age set value -2147483648\ndata modify entity @s leash.UUID set from storage gm4_balloon_animals:temp trader.uuid\n\nexecute store result score $variant_id gm4_balloon_animals_data run random value 0..2\nexecute if score $variant_id gm4_balloon_animals_data matches 0 run data modify entity @s variant set value \"minecraft:warm\"\nexecute if score $variant_id gm4_balloon_animals_data matches 1 run data modify entity @s variant set value \"minecraft:temperate\"\nexecute if score $variant_id gm4_balloon_animals_data matches 2 run data modify entity @s variant set value \"minecraft:cold\"\n\nexecute store result score @s gm4_balloon_animals_id run scoreboard players add $id gm4_balloon_animals_id 1\nexecute store result storage gm4_balloon_animals:temp gm4_balloon_animals.id int 1 run scoreboard players get $id gm4_balloon_animals_id\n\nfunction gm4_balloon_animals:wandering_trader/trade/add_lead\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/init_wolf.mcfunction",
    "content": "# @s = wolf to be attached to trader, type=#gm4_balloon_animals:balloon_animal\n# at wandering trader with no llamas, tag=gm4_balloon_animal_trader\n# run from wandering_trader/trade/pick_animal\n\ntag @s add gm4_balloon_animal\n\neffect give @s levitation infinite 0 true\neffect give @s slow_falling infinite 0 true\neffect give @s resistance infinite 4 true\n\ndata modify entity @s Age set value -2147483648\ndata modify entity @s leash.UUID set from storage gm4_balloon_animals:temp trader.uuid\n\nexecute store result score $variant_id gm4_balloon_animals_data run random value 0..8\nexecute if score $variant_id gm4_balloon_animals_data matches 0 run data modify entity @s variant set value \"minecraft:pale\"\nexecute if score $variant_id gm4_balloon_animals_data matches 1 run data modify entity @s variant set value \"minecraft:ashen\"\nexecute if score $variant_id gm4_balloon_animals_data matches 2 run data modify entity @s variant set value \"minecraft:black\"\nexecute if score $variant_id gm4_balloon_animals_data matches 3 run data modify entity @s variant set value \"minecraft:chestnut\"\nexecute if score $variant_id gm4_balloon_animals_data matches 4 run data modify entity @s variant set value \"minecraft:rusty\"\nexecute if score $variant_id gm4_balloon_animals_data matches 5 run data modify entity @s variant set value \"minecraft:snowy\"\nexecute if score $variant_id gm4_balloon_animals_data matches 6 run data modify entity @s variant set value \"minecraft:spotted\"\nexecute if score $variant_id gm4_balloon_animals_data matches 7 run data modify entity @s variant set value \"minecraft:striped\"\nexecute if score $variant_id gm4_balloon_animals_data matches 7 run data modify entity @s variant set value \"minecraft:woods\"\n\nexecute store result score @s gm4_balloon_animals_id run scoreboard players add $id gm4_balloon_animals_id 1\nexecute store result storage gm4_balloon_animals:temp gm4_balloon_animals.id int 1 run scoreboard players get $id gm4_balloon_animals_id\n\nfunction gm4_balloon_animals:wandering_trader/trade/add_lead\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/pick_animal.mcfunction",
    "content": "# @s = wandering trader and no trader llamas, tag=gm4_balloon_animal_trader\n# at @s\n# run from wandering_trader/pick_two_animals\n\nexecute store result score $animal_id gm4_balloon_animals_data run loot spawn ~ ~-4096 ~ loot gm4_balloon_animals:technical/random/enumeration_value\n\nfor animal in ctx.meta['animals']:\n    if animal['function'] not in ['init_animal', 'init_wolf','init_farm']:\n        execute if score $animal_id gm4_balloon_animals_data matches ctx.meta['enumeration'].index(animal['id']) run function f\"gm4_balloon_animals:wandering_trader/trade/{animal['function']}\"\n        continue\n        \n    execute if score $animal_id gm4_balloon_animals_data matches ctx.meta['enumeration'].index(animal['id']) summon animal['id'] run function f\"gm4_balloon_animals:wandering_trader/trade/{animal['function']}\"\n\ndata modify entity @s Offers.Recipes append from storage gm4_balloon_animals:temp trade\ndata remove storage gm4_balloon_animals:temp trade\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/guidebook/balloon_animals.json",
    "content": "{\n  \"id\": \"balloon_animals\",\n  \"name\": \"Balloon Animals\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:lead\"\n  },\n  \"criteria\": {\n    \"interact_trader\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_balloon_animal_trader\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"interact_trader\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.balloon_animals.description\",\n            \"fallback\": \"Balloon Animals introduces animal trades to some wandering traders.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/loot_table/lead.json",
    "content": "entries = []\nfor animal in ctx.meta['animals']:\n  if animal['function'] not in [\"init_animal\", \"init_wolf\", \"init_farm\"]:\n    continue\n  \n  for name in map(str.strip, animal['names'].split(',')):\n    entries.append(\n      {\n        \"type\": \"minecraft:item\",\n        \"name\": \"minecraft:lead\",\n        \"functions\": [\n          {\n            \"function\": \"minecraft:copy_custom_data\",\n            \"source\": {\n              \"type\": \"minecraft:storage\",\n              \"source\": \"gm4_balloon_animals:temp\"\n            },\n            \"ops\": [\n              {\n                \"source\": \"gm4_balloon_animals\",\n                \"target\": \"gm4_balloon_animals\",\n                \"op\": \"merge\"\n              }\n            ]\n          },\n          {\n            \"function\": \"minecraft:set_name\",\n            \"entity\": \"this\",\n            \"target\": \"item_name\",\n            \"name\": animal['type']\n          },\n          {\n            \"function\": \"minecraft:set_lore\",\n            \"entity\": \"this\",\n            \"lore\": [\n              {\n                \"text\": name,\n                \"color\": \"gray\"\n              }\n            ],\n            \"mode\": \"replace_all\"\n          }\n        ],\n        \"conditions\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"$animal_id\"\n              },\n              \"score\": \"gm4_balloon_animals_data\"\n            },\n            \"range\": ctx.meta['enumeration'].index(animal['id'])\n          }\n        ]\n      }\n    )\n\n{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": entries\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/loot_table/technical/random/enumeration_value.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 3,\n          \"value\": \"gm4_balloon_animals:technical/random/pick_common\"\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 7,\n          \"value\": \"gm4_balloon_animals:technical/random/pick_rare\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/loot_table/technical/random/pick_common.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": {\n        \"min\": 0,\n        \"max\": int(f\"{ctx.meta['rare_start']-1}\")\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:stone\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/loot_table/technical/random/pick_rare.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": {\n        \"min\": ctx.meta['rare_start'],\n        \"max\": int(f\"{len(ctx.meta['enumeration'])-1}\")\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:stone\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/predicate/balloon_trader_chance.json",
    "content": "{\n  \"condition\": \"minecraft:random_chance\",\n  \"chance\": 0.5\n}\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/predicate/is_lead.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"items\": \"minecraft:lead\",\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_balloon_animals:{}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_balloon_animals/data/gm4_balloon_animals/tags/entity_type/balloon_animal.json",
    "content": "animals_list = []\n\nfor animal in ctx.meta['animals']:\n  animals_list.append(f\"{animal['id']}\",)\n\n{\n  \"values\": sorted(animals_list)\n}\n"
  },
  {
    "path": "gm4_balloon_animals/generate.py",
    "content": "from pathlib import Path\nfrom typing import List\n\nfrom beet import Context\n\nfrom gm4.utils import CSV\n\n\ndef beet_default(ctx: Context):\n\n    # read csv file\n    animals =  CSV.from_file(Path('gm4_balloon_animals','animals.csv'))\n    \n    # sort animals into a common and a rare group\n    rare_animals: List[str] = []\n    common_animals: List[str] = []\n    for animal in animals:\n        if animal['rare'] == \"TRUE\":\n            rare_animals.append(str(animal['id']))\n            continue\n        common_animals.append(str(animal['id']))\n\n    # sort each group alphabetically to ensure .csv-independent id assignments\n    rare_animals.sort()\n    common_animals.sort()\n\n    # store to meta\n    ctx.meta['animals'] = animals\n    ctx.meta['enumeration'] = [*common_animals, *rare_animals]\n    ctx.meta['rare_start'] = len(common_animals)\n"
  },
  {
    "path": "gm4_balloon_animals/mod.mcdoc",
    "content": "use ::java::world::entity::mob::breedable::villager::Recipe\n\ndispatch minecraft:storage[gm4_balloon_animals:temp] to struct {\n  player?: struct {\n    uuid: #[uuid] int[] @ 4,\n  },\n  trader?: struct {\n    uuid: #[uuid] int[] @ 4,\n  },\n  temp_source?: [Recipe],\n  trades?: [Recipe],\n  trade?: Recipe,\n  gm4_balloon_animals?: BalloonAnimalsData,\n}\n\ndispatch mcdoc:custom_data[gm4_balloon_animals] to struct BalloonAnimalsData {\n  trade?: byte,\n  id?: int,\n}\n"
  },
  {
    "path": "gm4_balloon_animals/translations.csv",
    "content": "key,en_us\nadvancement.gm4.balloon_animals.title,Party Animals\nadvancement.gm4.balloon_animals.description,Buy a Balloon Animal from a Wandering Trader\ntext.gm4.guidebook.module_desc.balloon_animals,Looking for exotic animals? This module makes some Wandering Traders sell cute baby animals!\ntext.gm4.guidebook.balloon_animals.description,Balloon Animals introduces animal trades to some wandering traders.\n"
  },
  {
    "path": "gm4_bat_grenades/README.md",
    "content": "# Bat Grenades<!--$headerTitle--><!--$pmc:delete-->\n\nTired of the uselessness of bats? Need something to spice up your caving adventures? This modular data pack kills those two birds, er bats, with one stone, and turns bats into tiny furry flying balls of boom! <!--$pmc:headerSize-->\n\n### Features\n- Bats that fly within 7 blocks of a player squeak a warning, and explode if they get within 3 blocks of the player.\n- Bats explode with about 1/3 the strength of a creeper, easily survivable except on low health.\n- Adds a custom advancement obtainable for that unlucky soul who dies via bat.\n- Bats, if you manage to kill them, drop a few pieces of gunpowder.\n"
  },
  {
    "path": "gm4_bat_grenades/assets/translations.csv",
    "content": "key,en_us,de_de\nitem.gm4.bat_leather,Bat Leather,Fledermausleder\ntext.gm4.bat_leather.1,\"Would make for a very strange,\",\"Würde eine ziemlich merkwürde,\"\ntext.gm4.bat_leather.2,very tiny jacket,ziemlich kleine Jacke ergeben\nadvancement.gm4.bat_grenades.title,Batboozled,\nadvancement.gm4.bat_grenades.description,Get blown up by a Bat Grenade,\ntext.gm4.guidebook.module_desc.bat_grenades,Tired of the uselessness of bats? This module will turn them into tiny furry flying balls of boom!,\ntext.gm4.guidebook.bat_grenades.description,\"Bats create a weak explosion when nearby.\\n\\nWhen killed, bats will drop gunpowder and bat leather—a material equivalent to rabbit hide.\",\n"
  },
  {
    "path": "gm4_bat_grenades/beet.yaml",
    "content": "id: gm4_bat_grenades\nname: Bat Grenades\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    website:\n      description: Tired of the uselessness of bats? This module will turn them into tiny furry flying balls of boom!\n      recommended:\n        - gm4_enderman_support_class\n        - gm4_metallurgy\n      notes:\n        - Modifies the bat loot table. May cause incompatibilities with Datapacks that also modify this loot table.\n    modrinth: \n      project_id: qWQqEQMY\n    smithed:\n      pack_id: gm4_bat_grenades\n    planetminecraft: \n      uid: 4293806\n    video: https://www.youtube.com/watch?v=uUoEKtte1GQ\n    wiki: https://wiki.gm4.co/wiki/Bat_Grenades\n    credits:\n      Creator:\n        - Sparks\n      Icon Design:\n        - Sparks\n    model_data:\n      - item: rabbit_hide\n        reference: item/bat_leather\n        template: generated\n      - item: gunpowder\n        reference: gui/advancement/bat_grenades\n        template:\n          name: advancement\n          forward: item/bat_leather\n"
  },
  {
    "path": "gm4_bat_grenades/data/gm4/advancement/bat_grenades.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"gunpowder\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_bat_grenades:gui/advancement/bat_grenades\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.bat_grenades.title\",\n      \"fallback\": \"Batboozled\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.bat_grenades.description\",\n      \"fallback\": \"Get blown up by a Bat Grenade\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"killed_by_bat\": {\n      \"trigger\": \"minecraft:entity_killed_player\",\n      \"conditions\": {\n        \"entity\": {\n          \"type\": \"creeper\",\n          \"nbt\": \"{Tags:[\\\"gm4_bat_grenade\\\"]}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_bat_grenades/data/gm4_bat_grenades/function/explode.mcfunction",
    "content": "summon creeper ~ ~ ~ {CustomName:{\"translate\": \"entity.minecraft.bat\"},ExplosionRadius:1b,ignited:1b,Fuse:0s,Tags:[\"gm4_bat_grenade\"]}\nteleport @s ~ -1000 ~\ndata merge entity @s {DeathTime:19,Health:0.0f}\n"
  },
  {
    "path": "gm4_bat_grenades/data/gm4_bat_grenades/function/init.mcfunction",
    "content": "execute unless score bat_grenades gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Bat Grenades\"}\nexecute unless score bat_grenades gm4_earliest_version < bat_grenades gm4_modules run scoreboard players operation bat_grenades gm4_earliest_version = bat_grenades gm4_modules\nscoreboard players set bat_grenades gm4_modules 1\n\nschedule function gm4_bat_grenades:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_bat_grenades/data/gm4_bat_grenades/function/main.mcfunction",
    "content": "execute at @e[type=bat,tag=!gm4_defused_bat,tag=!smithed.entity] run playsound minecraft:entity.bat.ambient hostile @a[gamemode=!creative,gamemode=!spectator,distance=..7]\nexecute as @e[type=bat,tag=!gm4_defused_bat,tag=!smithed.entity] at @s if entity @a[gamemode=!creative,gamemode=!spectator,distance=..3] unless entity @s[nbt={NoAI:1b}] run function gm4_bat_grenades:explode\n\nschedule function gm4_bat_grenades:main 16t\n"
  },
  {
    "path": "gm4_bat_grenades/data/gm4_bat_grenades/guidebook/bat_grenades.json",
    "content": "{\n  \"id\": \"bat_grenades\",\n  \"name\": \"Bat Grenades\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:gunpowder\"\n  },\n  \"criteria\": {\n    \"hurt_by_exploding_bat\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"source_entity\": {\n            \"type\": \"minecraft:creeper\",\n            \"nbt\": \"{Tags:[\\\"gm4_bat_grenade\\\"]}\"\n          }\n        }\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"bat_explosions\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"hurt_by_exploding_bat\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.bat_grenades.description\",\n            \"fallback\": \"Bats create a weak explosion when nearby.\\n\\nWhen killed, bats will drop gunpowder and bat leather—a material equivalent to rabbit hide.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_bat_grenades/data/gm4_bat_grenades/loot_table/items/bat_leather.json",
    "content": "{\n    \"pools\": [\n      {\n        \"rolls\": 1,\n        \"entries\": [\n            {\n                \"type\": \"item\",\n                \"name\": \"minecraft:rabbit_hide\",\n                \"functions\": [\n                  {\n                    \"function\": \"set_components\",\n                    \"components\": {\n                      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_bat_grenades:item/bat_leather\"]}\n                    }\n                  },\n                  {\n                    \"function\": \"set_name\",\n                    \"target\": \"item_name\",\n                    \"name\": {\n                      \"translate\": \"item.gm4.bat_leather\",\n                      \"fallback\": \"Bat Leather\"\n                    }\n                  },\n                  {\n                    \"function\": \"set_lore\",\n                    \"mode\": \"append\",\n                    \"lore\": [\n                      {\n                        \"translate\": \"text.gm4.bat_leather.1\",\n                        \"fallback\": \"Would make for a very strange,\",\n                        \"italic\": true,\n                        \"color\": \"dark_gray\"\n                      },\n                      {\n                        \"translate\": \"text.gm4.bat_leather.2\",\n                        \"fallback\": \"very tiny jacket\",\n                        \"italic\": true,\n                        \"color\": \"dark_gray\"\n                      }\n                    ]\n                  }\n                ]\n              }\n        ]\n      }\n    ]\n  }\n  "
  },
  {
    "path": "gm4_bat_grenades/data/gm4_bat_grenades/test/boom.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~1\n# @timeout 200\n\nsummon bat ~1 ~2 ~1 {Tags:[gm4_test_bat]}\n\nawait not entity @e[tag=gm4_test_bat,dx=2,dy=2,dz=2]\n"
  },
  {
    "path": "gm4_bat_grenades/data/minecraft/loot_table/entities/bat.json",
    "content": "{\n    \"type\": \"minecraft:entity\",\n    \"pools\": [\n      {\n        \"rolls\": 1,\n        \"entries\": [\n          {\n            \"type\": \"item\",\n            \"name\": \"minecraft:gunpowder\",\n            \"functions\": [\n              {\n                \"function\": \"set_count\",\n                \"count\": {\n                  \"min\": 1,\n                  \"max\": 3\n                }\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"rolls\": 1,\n        \"entries\": [\n          {\n            \"type\": \"minecraft:loot_table\",\n            \"value\": \"gm4_bat_grenades:items/bat_leather\",\n            \"weight\": 1\n          },\n          {\n            \"type\": \"empty\",\n            \"weight\": 5\n          }\n        ]\n      }\n    ],\n    \"random_sequence\": \"minecraft:entities/bat\",\n    \"__smithed__\": {\n      \"rules\": [\n        {\n          \"type\": \"smithed:append\",\n          \"target\": \"pools\",\n          \"source\": {\n            \"type\": \"smithed:reference\",\n            \"path\": \"pools[0]\"\n          }\n        },\n        {\n          \"type\": \"smithed:append\",\n          \"target\": \"pools\",\n          \"source\": {\n            \"type\": \"smithed:reference\",\n            \"path\": \"pools[1]\"\n          }\n        }\n      ],\n      \"priority\": {\n        \"default\": 0\n      }\n    }\n  }\n"
  },
  {
    "path": "gm4_better_armour_stands/README.md",
    "content": "# Better Armour Stands<!--$headerTitle--><!--$pmc:delete-->\n\nEver felt like Armour Stands looked a bit boring? Better Armour Stands lets your Armour Stands strike all the poses you want! Simply use a Book and Quill to edit Armour Stands. <!--$pmc:headerSize-->\n\n<img src=\"images/better_armour_stands.webp\" alt=\"Better Armour Stands Example\" width=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- All armour stands have arms by default\n- Write commands into a Book and Quill to control your armour stands\n    - [Click Here](https://wiki.gm4.co/wiki/Better_Armour_Stands#Codes) to see a full list of codes\n- Copy and Paste poses\n- Make custom statues\n- Survival Friendly!\n\n### Posing Codes\n<!--$pmc:startTable-->\n|Code       |Description                                    |\n| :---:     |-----------------------------------------------|\n|`arms`     |toggle arm visibility                          |\n|`base`     |toggle base-plate visibility                   |\n|`size`     |toggle small/tall size                         |\n|`gravity`  |toggle gravity                                 |\n|`visible`  |toggle invisibility                            |\n|`turn`     |slowly spin right or left                      |\n|`lock`     |disable interactions                           |\n|`unlock`   |enable interactions                            |\n|`pose`     |select and move body parts                     |\n|`default`  |restore the default pose                       |\n|`copy`     |copies pose to armour stand in offhand          |\n|`paste`    |pastes pose from armour stand in offhand        |\n|`equip`    |transfer player offhand to selected body part  |\n<!--$pmc:endTable-->\n\n### Expansion Packs\nWant some preset poses? Download the [Poses Pack Expansion]($dynamicLink:gm4_poses_pack)\n\nAdd particles to your builds with the [Particles Pack Expansion]($dynamicLink:gm4_particles_pack)\n"
  },
  {
    "path": "gm4_better_armour_stands/beet.yaml",
    "content": "id: gm4_better_armour_stands\nname: Better Armour Stands\nversion: 2.6.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: \n        - main\n        - tick\n    website:\n      description: Ever felt like Armour Stands looked a bit boring? Better Armour Stands lets your Armour Stands strike all the poses you want! Simply use a Book and Quill to edit Armour Stands.\n      recommended:\n        - gm4_poses_pack\n        - gm4_particles_pack\n      notes: []\n    modrinth:\n      project_id: ib7YfS5V\n    smithed:\n      pack_id: gm4_better_armour_stands\n    video: https://www.youtube.com/watch?v=ZBqmGpAXqmw\n    wiki: https://wiki.gm4.co/wiki/Better_Armour_Stands\n    credits:\n      Creator:\n        - Sparks\n      Updated by:\n        - SpecialBuilder32\n        - Misode\n        - Denniss\n      Icon Design:\n        - Sparks\n    model_data:\n      - item: armor_stand\n        reference: gui/advancement/better_armour_stands\n        template: advancement\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4/advancement/better_armour_stands.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"armor_stand\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_better_armour_stands:gui/advancement/better_armour_stands\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.better_armour_stands.title\",\n      \"fallback\": \"Gettin' Handsy\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.better_armour_stands.description\",\n      \"fallback\": \"Customize an armour stand\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"arm_armor_stand\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/book/take.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"equipment\": {\n                \"mainhand\": {\n                  \"items\": [\n                    \"minecraft:writable_book\"\n                  ],\n                  \"predicates\": {\n                    \"minecraft:custom_data\": \"{gm4_bas_ignore:1b}\"\n                  }\n                }\n              }\n            }\n          }\n        ],\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"equipment\": {\n                  \"mainhand\": {\n                    \"items\": [\n                      \"minecraft:writable_book\"\n                    ]\n                  }\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_better_armour_stands:book/take\"\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/book/tracking.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_bas_track\\\"]}\"\n            }\n          }\n        ],\n        \"item\": {\n          \"items\": [\n            \"minecraft:writable_book\"\n          ]\n        },\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:armor_stand\"\n            }\n          },\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_better_armour_stands:holding/mainhand/book_ignore\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_better_armour_stands:pose/set\"\n  }\n}"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/book/use.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:writable_book\"\n          ]\n        },\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:armor_stand\"\n            }\n          },\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_better_armour_stands:holding/mainhand/book_ignore\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_better_armour_stands:book/use\"\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/book/use_arms.json",
    "content": "{\n  \"criteria\": {\n    \"stop_track\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:writable_book\"\n          ]\n        },\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:interaction\",\n              \"nbt\": \"{Tags:[\\\"gm4_bas_arms_detect\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_better_armour_stands:book/use_arms\"\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/join.json",
    "content": "{\n  \"criteria\": {\n    \"join\": {\n      \"trigger\": \"minecraft:location\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_better_armour_stands:get_id\"\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/place.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:match_tool\",\n            \"predicate\": {\n              \"items\": [\n                \"minecraft:armor_stand\"\n              ]\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_better_armour_stands:place/check\"\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/pose/invert.json",
    "content": "{\n  \"criteria\": {\n    \"invert\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_bas_track\\\"]}\"\n            }\n          }\n        ],\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:interaction\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_better_armour_stands:pose/invert\"\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/pose/set.json",
    "content": "{\n  \"criteria\": {\n    \"stop_track\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_bas_track\\\"]}\"\n            }\n          }\n        ],\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:interaction\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_better_armour_stands:pose/set\"\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/apply.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/process\n\n# restore armor_stand state to default\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"default\"}]} run function gm4_better_armour_stands:default/check\n\n# remove armor_stand arms\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"arms\"}]} run function gm4_better_armour_stands:toggle/arms/arms\n\n# toggle armor_stand base\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"base\"}]} run function gm4_better_armour_stands:toggle/base\n\n# toggle armor_stand height\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"size\"}]} run function gm4_better_armour_stands:toggle/size\n\n# toggle armor_stand visibility\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"visible\"}]} run function gm4_better_armour_stands:toggle/visible\n\n# toggle armor_stand gravity\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"gravity\"}]} run function gm4_better_armour_stands:toggle/gravity\n\n# rotate the armor_stand by predefined intervals\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"turn\"}]} run function gm4_better_armour_stands:toggle/turn\n\n# equip item into specified slot\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"equip\"}]} run function gm4_better_armour_stands:equip/select\n\n# flip full pose of armor_stand\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"flip\"}]} run function gm4_better_armour_stands:pose/flip\n\n# copy and paste from armor_stand item\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"copy\"}]} if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:holding/offhand/armor_stand] run function gm4_better_armour_stands:pose/copy\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"paste\"}]} if items entity @a[tag=gm4_bas_active,limit=1] weapon.offhand *[entity_data] run function gm4_better_armour_stands:pose/paste\n\n# change armor_stand poses\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"pose\"}]} run function gm4_better_armour_stands:pose/select\nexecute unless score @s gm4_bas_mode matches 1.. if data storage gm4_better_armour_stands:temp {pages:[{raw:\"pose mirror\"}]} run function gm4_better_armour_stands:pose/select\n\n# move/rotate\nexecute unless score @s gm4_bas_mode matches 1.. if data storage gm4_better_armour_stands:temp {pages:[{raw:\"move\"}]} run function gm4_better_armour_stands:pose/move\nexecute unless score @s gm4_bas_mode matches 1.. if data storage gm4_better_armour_stands:temp {pages:[{raw:\"rotate\"}]} run function gm4_better_armour_stands:pose/rotate\n\n# disable armor_stand interaction\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"lock\"}]} unless entity @s[tag=gm4_bas_locked] run function gm4_better_armour_stands:toggle/lock/lock\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"unlock\"}]} if entity @s[tag=gm4_bas_locked] run function gm4_better_armour_stands:toggle/lock/unlock\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/hold.mcfunction",
    "content": "# @s = player holding writable_book\n# at @s\n# run from main\n\n# reveal invisible armor_stand\nexecute if predicate gm4_better_armour_stands:holding/mainhand/book_visible run effect give @e[type=armor_stand,tag=!gm4_no_edit,tag=!smithed.entity,distance=..6,nbt={Invisible:1b}] glowing 2 0\n\n# enable right click detection for nearby armor_stand\nexecute if predicate gm4_better_armour_stands:holding/mainhand/book_arms positioned ^ ^ ^2.5 as @e[type=armor_stand,tag=!gm4_bas_no_arms,tag=!gm4_no_edit,tag=!smithed.entity,distance=..2.5,nbt={ShowArms:0b}] at @s run function gm4_better_armour_stands:toggle/arms/detect_interaction\n\n# remove ignore tag from writable_book\nitem modify entity @s[predicate=gm4_better_armour_stands:holding/mainhand/book_ignore] weapon.mainhand gm4_better_armour_stands:remove_ignore\n\n# enable temporary interaction for locked armor_stand\nexecute if predicate gm4_better_armour_stands:holding/mainhand/book_unlock positioned ^ ^ ^2.5 as @e[type=armor_stand,tag=gm4_bas_locked,tag=!gm4_bas_temp_unlock,distance=..2.5] at @s run function gm4_better_armour_stands:toggle/lock/detect_interaction\n\n# tracking check\nexecute if entity @s[tag=gm4_bas_track] run schedule function gm4_better_armour_stands:pose/track/tick 1t append\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/invalid.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/process\n\nparticle minecraft:block_marker{block_state:\"minecraft:barrier\"} ~ ~.7 ~ 0 0 0 0 1 force @a[tag=gm4_bas_active,limit=1]\nplaysound minecraft:item.book.put player @a[tag=gm4_bas_active,limit=1] ~ ~ ~ 1 .8\ntitle @a[tag=gm4_bas_active,limit=1] actionbar {\"translate\":\"tooltip.gm4.better_armour_stands.invalid_code\",\"fallback\":\"Invalid code\"}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/process.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/use\n\n# get book pages\ndata modify storage gm4_better_armour_stands:temp pages set from entity @s equipment.mainhand.components.\"minecraft:writable_book_content\".pages\n\n# restore item held by armor stand and book from player\nitem replace entity @a[tag=gm4_bas_active,limit=1,gamemode=creative,predicate=gm4_better_armour_stands:holding/mainhand/book_and_quill,predicate=!gm4_better_armour_stands:holding/mainhand/book_ignore] weapon.mainhand with minecraft:air\n# swap items between armor stand and player, using player.cursor as temporary slot\nitem replace entity @a[tag=gm4_bas_active,limit=1] player.cursor from entity @s weapon.mainhand\nitem replace entity @s weapon.mainhand from entity @a[tag=gm4_bas_active,limit=1] weapon.mainhand\nitem replace entity @a[tag=gm4_bas_active,limit=1] weapon.mainhand from entity @a[tag=gm4_bas_active,limit=1] player.cursor\nitem replace entity @a[tag=gm4_bas_active,limit=1] player.cursor with minecraft:air\n\n# check valid codes and apply to armor_stand\nscoreboard players reset $valid_code gm4_bas_data\nfunction #gm4_better_armour_stands:apply_book\nexecute unless score $valid_code gm4_bas_data matches 1 run function gm4_better_armour_stands:book/invalid\n\n# show invisible armour stand\neffect give @s[nbt={Invisible:1b}] glowing 2 0\n\n# reset storage\ndata remove storage gm4_better_armour_stands:temp pages\n\n# schedule checks in case it stopped early (e.g. player logging out)\nexecute if entity @e[type=armor_stand,tag=gm4_bas_no_arms] run schedule function gm4_better_armour_stands:toggle/arms/check 16t\nexecute if entity @e[type=armor_stand,tag=gm4_bas_temp_unlock] run schedule function gm4_better_armour_stands:toggle/lock/check 16t\nexecute if entity @e[type=armor_stand,tag=gm4_bas_track] run schedule function gm4_better_armour_stands:pose/check_no_player 16t\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/ray_arms.mcfunction",
    "content": "# @s = player right clicking armor_stand with writable_book\n# at @s\n# run from book/use_arms and book/ray_arms\n\n# select armor_stand without arms\nexecute positioned ~-.2 ~-.2 ~-.2 as @e[type=minecraft:armor_stand,tag=gm4_bas_no_arms,dx=0,limit=1] positioned ~-.6 ~-.6 ~-.6 run tag @s[dx=0] add gm4_bas_selected\n\n# continue searching if not inside armor_stand\nexecute unless entity @e[type=minecraft:armor_stand,tag=gm4_bas_no_arms,tag=gm4_bas_selected,limit=1] unless entity @s[distance=6..] positioned ^ ^ ^.5 run function gm4_better_armour_stands:book/ray_arms\n\n# found armor_stand holding writable_book\nexecute as @e[type=minecraft:armor_stand,tag=gm4_bas_no_arms,tag=gm4_bas_selected,limit=1] at @s run function gm4_better_armour_stands:toggle/arms/select\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/take.mcfunction",
    "content": "# @s = player taking writable_book from armor_stand\n# at @s\n# run from advancement book/take\n\nadvancement revoke @s only gm4_better_armour_stands:book/take\n\n# remove ignore tag from writable_book\nitem modify entity @s weapon.mainhand gm4_better_armour_stands:remove_ignore\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/use.mcfunction",
    "content": "# @s = player giving writable_book to armor_stand\n# at @s\n# run from advancement book/use\n\n# select targeted armor_stand and process book\ntag @s add gm4_bas_active\nexecute as @e[type=minecraft:armor_stand,tag=!gm4_no_edit,tag=!smithed.entity,distance=..6,limit=1,predicate=gm4_better_armour_stands:holding/mainhand/book_and_quill,predicate=!gm4_better_armour_stands:holding/mainhand/book_ignore] at @s run function gm4_better_armour_stands:book/process\ntag @s remove gm4_bas_active\n\nadvancement revoke @s[tag=!gm4_bas_track] only gm4_better_armour_stands:book/use\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/use_arms.mcfunction",
    "content": "# @s = player giving writable_book to armor_stand\n# at @s\n# run from advancement book/use_arms\n\nadvancement revoke @s only gm4_better_armour_stands:book/use_arms\n\n# tag player and start ray in direction of targeted armor_stand\ntag @s add gm4_bas_active\nexecute anchored eyes run function gm4_better_armour_stands:book/ray_arms\ntag @s remove gm4_bas_active\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/default/all.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# reset pose and other features\ndata modify entity @s Pose set from storage gm4_better_armour_stands:default Pose\ndata merge entity @s {ShowArms:1b,Small:0b,NoBasePlate:0b,NoGravity:0b,Invisible:0b}\nscoreboard players reset @s gm4_bas_turn\n\neffect clear @s glowing\nplaysound minecraft:entity.armor_stand.hit block @a[distance=..6] ~ ~ ~ 0.5 1\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/default/check.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# reset armor_stand\nexecute unless entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:sneaking] run function #gm4_better_armour_stands:default\n\n# reset pose of specific armor_stand part\nexecute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:sneaking] run function gm4_better_armour_stands:default/part\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/default/part.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from default/check\n\n# check size, spawn part detectors\nexecute store result score $size gm4_bas_data run data get entity @s Small\nexecute if score $size gm4_bas_data matches 0 run function gm4_better_armour_stands:pose/select/tall\nexecute if score $size gm4_bas_data matches 1 run function gm4_better_armour_stands:pose/select/small\n\n# detect part player is looking at\ntp @s ~ ~100 ~\nexecute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/head] store success score $default gm4_bas_data run data modify entity @s Pose.Head set from storage gm4_better_armour_stands:default Pose.Head\nexecute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/body] store success score $default gm4_bas_data run data modify entity @s Pose.Body set from storage gm4_better_armour_stands:default Pose.Body\nexecute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/left_arm] store success score $default gm4_bas_data run data modify entity @s Pose.LeftArm set from storage gm4_better_armour_stands:default Pose.LeftArm\nexecute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/right_arm] store success score $default gm4_bas_data run data modify entity @s Pose.RightArm set from storage gm4_better_armour_stands:default Pose.RightArm\nexecute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/left_leg] store success score $default gm4_bas_data run data modify entity @s Pose.LeftLeg set from storage gm4_better_armour_stands:default Pose.LeftLeg\nexecute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/right_leg] store success score $default gm4_bas_data run data modify entity @s Pose.RightLeg set from storage gm4_better_armour_stands:default Pose.RightLeg\ntp @s ~ ~ ~\n\nexecute if score $default gm4_bas_data matches 1 run playsound minecraft:entity.armor_stand.fall block @a[distance=..6] ~ ~ ~ 0.5 1\nscoreboard players reset $default gm4_bas_data\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/hand.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from equip/select\n\n# check for item in hand slot\nexecute if items entity @s weapon.mainhand * run function gm4_better_armour_stands:equip/remove/hand\n\n# move item from player to armor_stand\nitem replace entity @s weapon.mainhand from entity @a[tag=gm4_bas_active,limit=1,predicate=!gm4_better_armour_stands:holding/offhand/nothing] weapon.offhand gm4_better_armour_stands:count\nitem modify entity @a[gamemode=!creative,tag=gm4_bas_active,limit=1,predicate=!gm4_better_armour_stands:holding/offhand/nothing] weapon.offhand gm4_better_armour_stands:remove_item\n\n# add ignore tag to writable_book\nitem modify entity @s[predicate=gm4_better_armour_stands:holding/mainhand/book_and_quill] weapon.mainhand gm4_better_armour_stands:add_ignore\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/head.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from equip/select\n\n# check for item in head slot\nexecute if items entity @s armor.head * run function gm4_better_armour_stands:equip/remove/head\n\n# move item from player to armour stand\nitem replace entity @s armor.head from entity @a[tag=gm4_bas_active,limit=1,predicate=!gm4_better_armour_stands:holding/offhand/nothing] weapon.offhand gm4_better_armour_stands:count\nitem modify entity @a[gamemode=!creative,tag=gm4_bas_active,limit=1,predicate=!gm4_better_armour_stands:holding/offhand/nothing] weapon.offhand gm4_better_armour_stands:remove_item\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/offhand.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from equip/select\n\n# check for item in offhand slot\nexecute if items entity @s weapon.offhand * run function gm4_better_armour_stands:equip/remove/offhand\n\n# move item from player to armour stand\nitem replace entity @s weapon.offhand from entity @a[tag=gm4_bas_active,limit=1,predicate=!gm4_better_armour_stands:holding/offhand/nothing] weapon.offhand gm4_better_armour_stands:count\nitem modify entity @a[gamemode=!creative,tag=gm4_bas_active,limit=1,predicate=!gm4_better_armour_stands:holding/offhand/nothing] weapon.offhand gm4_better_armour_stands:remove_item\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/remove/hand.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from equip/hand\n\nloot spawn ~ ~1 ~ loot gm4_better_armour_stands:replaced_item\nexecute positioned ~ ~1 ~ run item replace entity @e[type=item,distance=..1,sort=nearest,limit=1,nbt={Item:{components:{\"minecraft:custom_data\":{gm4_better_armour_stands_replaced_item:1b}}}}] contents from entity @s weapon.mainhand\nitem replace entity @s weapon.mainhand with minecraft:air\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/remove/head.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from equip/head\n\nloot spawn ~ ~1.5 ~ loot gm4_better_armour_stands:replaced_item\nexecute positioned ~ ~1.5 ~ run item replace entity @e[type=item,distance=..1,sort=nearest,limit=1,nbt={Item:{components:{\"minecraft:custom_data\":{gm4_better_armour_stands_replaced_item:1b}}}}] contents from entity @s armor.head\nitem replace entity @s armor.head with minecraft:air\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/remove/offhand.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from equip/offhand\n\nloot spawn ~ ~1 ~ loot gm4_better_armour_stands:replaced_item\nexecute positioned ~ ~1 ~ run item replace entity @e[type=item,distance=..1,sort=nearest,limit=1,nbt={Item:{components:{\"minecraft:custom_data\":{gm4_better_armour_stands_replaced_item:1b}}}}] contents from entity @s weapon.offhand\nitem replace entity @s weapon.offhand with minecraft:air\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/select/small.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from equip/select\n\n# head\nsummon minecraft:area_effect_cloud ~ ~.45 ~ {Radius:.08f,Tags:[\"gm4_bas_head\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n\n# arms\nsummon minecraft:area_effect_cloud ^.18 ^ ^ {Radius:.09f,Tags:[\"gm4_bas_left_arm\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\nsummon minecraft:area_effect_cloud ^-.18 ^ ^ {Radius:.09f,Tags:[\"gm4_bas_right_arm\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/select/tall.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from equip/select\n\n# head\nsummon minecraft:area_effect_cloud ~ ~.5 ~ {Radius:.1f,Tags:[\"gm4_bas_head\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n\n# arms\nsummon minecraft:area_effect_cloud ^.3 ^ ^ {Radius:.15f,Tags:[\"gm4_bas_left_arm\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\nsummon minecraft:area_effect_cloud ^-.3 ^ ^ {Radius:.15f,Tags:[\"gm4_bas_right_arm\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/select.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# check size, spawn part detectors\nexecute store result score $size gm4_bas_data run data get entity @s Small\nexecute if score $size gm4_bas_data matches 0 positioned ~ ~1 ~ run function gm4_better_armour_stands:equip/select/tall\nexecute if score $size gm4_bas_data matches 1 positioned ~ ~.3 ~ run function gm4_better_armour_stands:equip/select/small\n\n# detect part player is looking at\ntp @s ~ ~100 ~\nexecute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/head] run function gm4_better_armour_stands:equip/head\nexecute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/right_arm] run function gm4_better_armour_stands:equip/hand\nexecute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/left_arm] run function gm4_better_armour_stands:equip/offhand\ntp @s ~ ~ ~\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/get_id.mcfunction",
    "content": "# @s = new player\n# at @s\n# run from advancement join\n\nexecute store result score @s gm4_bas_id run data get entity @s UUID[0]\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_bas_id dummy\nscoreboard objectives add gm4_bas_data dummy\nscoreboard objectives add gm4_bas_mode dummy\nscoreboard objectives add gm4_bas_turn dummy\nscoreboard objectives add gm4_bas_dist dummy\nscoreboard objectives add gm4_bas_dx dummy\nscoreboard objectives add gm4_bas_dy dummy\nscoreboard objectives add gm4_bas_dz dummy\n\nscoreboard players set #1500 gm4_bas_data 1500\n\nteam add gm4_bas\nteam modify gm4_bas collisionRule never\n\ndata modify storage gm4_better_armour_stands:default Pose set value {Head:[0.01f, 0.0f, 0.0f],Body:[0.01f, 0.0f, 0.0f],LeftArm:[-10.01f, 0.0f, -10.0f],RightArm:[-15.01f, 0.0f, 10.0f],LeftLeg:[-1.01f, 0.0f, -1.0f],RightLeg:[1.01f, 0.0f, 1.0f]}\n\nexecute unless score better_armour_stands gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Better Armour Stands\"}\nexecute unless score better_armour_stands gm4_earliest_version < better_armour_stands gm4_modules run scoreboard players operation better_armour_stands gm4_earliest_version = better_armour_stands gm4_modules\nscoreboard players set better_armour_stands gm4_modules 1\n\nschedule function gm4_better_armour_stands:main 1t\nschedule function gm4_better_armour_stands:tick 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/main.mcfunction",
    "content": "# player holding writable_book\nexecute as @a[gamemode=!spectator,predicate=gm4_better_armour_stands:holding/mainhand/book_and_quill] at @s run function gm4_better_armour_stands:book/hold\n\nschedule function gm4_better_armour_stands:main 16t\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/place/check.mcfunction",
    "content": "# @s = player placing an armor_stand\n# at @s\n# run from advancement place\n\nadvancement revoke @s only gm4_better_armour_stands:place\n\n# add arms to new armor_stand and remove randomness. tag= matches armor stands with no existing tags\nexecute positioned ^ ^ ^3 as @e[type=armor_stand,tag=,distance=..3] run function gm4_better_armour_stands:place/new\n\n# copy exact pose from copied armor_stand item to remove randomness\n# TODO 1.20.5: this doesn't seem to be necessary (anymore?)\nexecute as @e[type=armor_stand,tag=gm4_bas_copy,distance=..6,limit=1] run function gm4_better_armour_stands:place/copy\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/place/copy.mcfunction",
    "content": "# @s = new armor_stand with copied data\n# at player who placed armor_stand\n# run from place/check\n\ntag @s remove gm4_bas_copy\n\n# copy exact pose from copied armor_stand item to remove randomness\ndata modify entity @s Pose set from entity @p[predicate=gm4_better_armour_stands:holding/mainhand/armor_stand_copy] SelectedItem.components.\"minecraft:entity_data\".Pose\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/place/new.mcfunction",
    "content": "# @s = new armor_stand\n# run from place/check\n\ntag @s add gm4_bas_placed\n\n# give arms\ndata modify entity @s ShowArms set value 1b\n\n# set pose values and remove randomness\ndata modify entity @s Pose set from storage gm4_better_armour_stands:default Pose\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/check_no_player.mcfunction",
    "content": "# scheduled from pose/select/success\n\n# no tracked player within range\nexecute as @e[type=armor_stand,tag=gm4_bas_track] at @s unless entity @p[tag=gm4_bas_track,distance=..10] run function gm4_better_armour_stands:pose/set_no_player\n\n# repeat check\nexecute if entity @e[type=armor_stand,tag=gm4_bas_track] run schedule function gm4_better_armour_stands:pose/check_no_player 16t\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/copy.mcfunction",
    "content": "# @s = armor_stand to be copied\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# prepare to copy armor_stand tags to item entity\ndata modify storage gm4_better_armour_stands:temp entity_data.id set value \"minecraft:armor_stand\"\ndata modify storage gm4_better_armour_stands:temp entity_data.Pose set from entity @s Pose\ndata modify storage gm4_better_armour_stands:temp entity_data.ShowArms set from entity @s ShowArms\ndata modify storage gm4_better_armour_stands:temp entity_data.NoBasePlate set from entity @s NoBasePlate\ndata modify storage gm4_better_armour_stands:temp entity_data.Small set from entity @s Small\ndata modify storage gm4_better_armour_stands:temp entity_data.NoGravity set from entity @s NoGravity\ndata modify storage gm4_better_armour_stands:temp entity_data.Invisible set from entity @s Invisible\ndata modify storage gm4_better_armour_stands:temp entity_data.Tags set value [\"gm4_bas_placed\",\"gm4_bas_copy\"]\n\n# copy tags from armor_stand to item entity\nitem modify entity @a[tag=gm4_bas_active,limit=1] weapon.offhand gm4_better_armour_stands:copy\nexecute as @a[tag=gm4_bas_active,limit=1] run function gm4_better_armour_stands:pose/copy_entity_data with storage gm4_better_armour_stands:temp\n\n# display particles and play a sound to confirm\nparticle minecraft:item{item:\"minecraft:armor_stand\"} ~ ~ ~ .2 1 .2 0 20\nplaysound minecraft:block.wood.break player @a[distance=..6] ~ ~ ~ 0.5 1\n\n# reset storage\ndata remove storage gm4_better_armour_stands:temp entity_data\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/copy_entity_data.mcfunction",
    "content": "# run from pose/copy\n\n$item modify entity @s weapon.offhand {function:\"minecraft:set_components\",components:{\"minecraft:entity_data\":$(entity_data)}}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/flip.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# store current pose\ndata modify storage gm4_better_armour_stands:temp CurrentPose set from entity @s Pose\ndata modify storage gm4_better_armour_stands:temp Pose set from storage gm4_better_armour_stands:default Pose\n\n# copy/mirror poses\ndata modify storage gm4_better_armour_stands:temp Pose.LeftArm[0] set from storage gm4_better_armour_stands:temp CurrentPose.RightArm[0]\ndata modify storage gm4_better_armour_stands:temp Pose.RightArm[0] set from storage gm4_better_armour_stands:temp CurrentPose.LeftArm[0]\n\ndata modify storage gm4_better_armour_stands:temp Pose.LeftLeg[0] set from storage gm4_better_armour_stands:temp CurrentPose.RightLeg[0]\ndata modify storage gm4_better_armour_stands:temp Pose.RightLeg[0] set from storage gm4_better_armour_stands:temp CurrentPose.LeftLeg[0]\n\ndata modify storage gm4_better_armour_stands:temp Pose.Head[0] set from storage gm4_better_armour_stands:temp CurrentPose.Head[0]\ndata modify storage gm4_better_armour_stands:temp Pose.Body[0] set from storage gm4_better_armour_stands:temp CurrentPose.Body[0]\n\nexecute store result storage gm4_better_armour_stands:temp Pose.LeftArm[1] float -1 run data get storage gm4_better_armour_stands:temp CurrentPose.RightArm[1]\nexecute store result storage gm4_better_armour_stands:temp Pose.RightArm[1] float -1 run data get storage gm4_better_armour_stands:temp CurrentPose.LeftArm[1]\n\nexecute store result storage gm4_better_armour_stands:temp Pose.LeftLeg[1] float -1 run data get storage gm4_better_armour_stands:temp CurrentPose.RightLeg[1]\nexecute store result storage gm4_better_armour_stands:temp Pose.RightLeg[1] float -1 run data get storage gm4_better_armour_stands:temp CurrentPose.LeftLeg[1]\n\nexecute store result storage gm4_better_armour_stands:temp Pose.Head[1] float -1 run data get storage gm4_better_armour_stands:temp CurrentPose.Head[1]\nexecute store result storage gm4_better_armour_stands:temp Pose.Body[1] float -1 run data get storage gm4_better_armour_stands:temp CurrentPose.Body[1]\n\n# apply pose to armor_stand\ndata modify entity @s Pose set from storage gm4_better_armour_stands:temp Pose\n\n# reset storage\ndata remove storage gm4_better_armour_stands:temp CurrentPose\ndata remove storage gm4_better_armour_stands:temp Pose\n\n# advancement for customizing armor_stand\nadvancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/invert.mcfunction",
    "content": "# @s = player hitting armor_stand\n# at @s\n# run from advancement pose/invert\n\nadvancement revoke @a only gm4_better_armour_stands:pose/invert\n\n# get current player id\nscoreboard players operation $current gm4_bas_id = @s gm4_bas_id\n\n# toggle invert mode\nexecute as @e[type=armor_stand,tag=gm4_bas_track,distance=..6] if score @s gm4_bas_id = $current gm4_bas_id store success score $invert gm4_bas_data run tag @s remove gm4_bas_invert\nexecute if score $invert gm4_bas_data matches 0 as @e[type=armor_stand,tag=gm4_bas_track,distance=..6] if score @s gm4_bas_id = $current gm4_bas_id run tag @s add gm4_bas_invert\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/mirror/arm_left.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/track/arm_left\n\n# initialize\ndata modify storage gm4_better_armour_stands:temp Pose merge value {RightArm:[0f,0f,0f]}\n\n# copy pose from other arm and mirror rotation\ndata modify storage gm4_better_armour_stands:temp Pose.RightArm[0] set from storage gm4_better_armour_stands:temp Pose.LeftArm[0]\nexecute store result storage gm4_better_armour_stands:temp Pose.RightArm[1] float -0.01 run scoreboard players get $joint_rot_y gm4_bas_data\nexecute store result storage gm4_better_armour_stands:temp Pose.RightArm[2] float -1 run data get storage gm4_better_armour_stands:temp Pose.LeftArm[2]\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/mirror/arm_right.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/track/arm_right\n\n# initialize\ndata modify storage gm4_better_armour_stands:temp Pose merge value {LeftArm:[0f,0f,0f]}\n\n# copy pose from other arm and mirror rotation\ndata modify storage gm4_better_armour_stands:temp Pose.LeftArm[0] set from storage gm4_better_armour_stands:temp Pose.RightArm[0]\nexecute store result storage gm4_better_armour_stands:temp Pose.LeftArm[1] float -0.01 run scoreboard players get $joint_rot_y gm4_bas_data\nexecute store result storage gm4_better_armour_stands:temp Pose.LeftArm[2] float -1 run data get storage gm4_better_armour_stands:temp Pose.RightArm[2]\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/mirror/leg_left.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/track/leg_left\n\n# initialize\ndata modify storage gm4_better_armour_stands:temp Pose merge value {RightLeg:[0f,0f,0f]}\n\n# copy pose from other arm and mirror rotation\ndata modify storage gm4_better_armour_stands:temp Pose.RightLeg[0] set from storage gm4_better_armour_stands:temp Pose.LeftLeg[0]\nexecute store result storage gm4_better_armour_stands:temp Pose.RightLeg[1] float -0.01 run scoreboard players get $joint_rot_y gm4_bas_data\nexecute store result storage gm4_better_armour_stands:temp Pose.RightLeg[2] float -1 run data get storage gm4_better_armour_stands:temp Pose.LeftLeg[2]\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/mirror/leg_right.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/track/leg_right\n\n# initialize\ndata modify storage gm4_better_armour_stands:temp Pose merge value {LeftLeg:[0f,0f,0f]}\n\n# copy pose from other arm and mirror rotation\ndata modify storage gm4_better_armour_stands:temp Pose.LeftLeg[0] set from storage gm4_better_armour_stands:temp Pose.RightLeg[0]\nexecute store result storage gm4_better_armour_stands:temp Pose.LeftLeg[1] float -0.01 run scoreboard players get $joint_rot_y gm4_bas_data\nexecute store result storage gm4_better_armour_stands:temp Pose.LeftLeg[2] float -1 run data get storage gm4_better_armour_stands:temp Pose.RightLeg[2]\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/move.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\nscoreboard players operation @s gm4_bas_id = @a[tag=gm4_bas_active,limit=1] gm4_bas_id\n\nfunction gm4_better_armour_stands:pose/select/move/move\nfunction gm4_better_armour_stands:pose/select/success\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/paste.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# copy item data to armor_stand\ndata modify entity @s {} merge from entity @a[tag=gm4_bas_active,limit=1] equipment.offhand.components.\"minecraft:entity_data\"\n\n# play a sound to confirm\nplaysound minecraft:entity.armor_stand.fall block @a[distance=..6] ~ ~ ~ 0.5 1\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/rotate.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\nscoreboard players operation @s gm4_bas_id = @a[tag=gm4_bas_active,limit=1] gm4_bas_id\n\nscoreboard players set @s gm4_bas_mode 8\nfunction gm4_better_armour_stands:pose/select/success\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/arm_left.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/select\n\nscoreboard players set @s gm4_bas_mode 3\n\n# spawn markers\nexecute if score $size gm4_bas_data matches 0 positioned ~ ~1.4 ~ run summon marker ^.3 ^ ^ {CustomName:\"gm4_bas_left_arm\",Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_joint\",\"gm4_bas_left_arm\",\"gm4_bas_marker\",\"gm4_bas_new\",\"gm4_bas_temp\"]}\nexecute if score $size gm4_bas_data matches 1 positioned ~ ~.7 ~ run summon marker ^.15 ^ ^ {CustomName:\"gm4_bas_left_arm\",Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_joint\",\"gm4_bas_left_arm\",\"gm4_bas_marker\",\"gm4_bas_new\",\"gm4_bas_temp\"]}\n\n# store current data\ndata modify storage gm4_better_armour_stands:temp Data.Pose.LeftArm set from entity @s Pose.LeftArm\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/arm_right.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/select\n\nscoreboard players set @s gm4_bas_mode 4\n\n# spawn markers\nexecute if score $size gm4_bas_data matches 0 positioned ~ ~1.4 ~ run summon marker ^-.3 ^ ^ {CustomName:\"gm4_bas_right_arm\",Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_joint\",\"gm4_bas_right_arm\",\"gm4_bas_marker\",\"gm4_bas_new\",\"gm4_bas_temp\"]}\nexecute if score $size gm4_bas_data matches 1 positioned ~ ~.7 ~ run summon marker ^-.15 ^ ^ {CustomName:\"gm4_bas_right_arm\",Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_joint\",\"gm4_bas_right_arm\",\"gm4_bas_marker\",\"gm4_bas_new\",\"gm4_bas_temp\"]}\n\n# store current data\ndata modify storage gm4_better_armour_stands:temp Data.Pose.RightArm set from entity @s Pose.RightArm\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/body.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/select\n\nscoreboard players set @s gm4_bas_mode 2\n\n# spawn markers\nexecute if score $size gm4_bas_data matches 0 run summon marker ~ ~1.5 ~ {CustomName:\"gm4_bas_body\",Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_joint\",\"gm4_bas_body\",\"gm4_bas_marker\",\"gm4_bas_new\",\"gm4_bas_temp\"]}\nexecute if score $size gm4_bas_data matches 1 run summon marker ~ ~.7 ~ {CustomName:\"gm4_bas_body\",Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_joint\",\"gm4_bas_body\",\"gm4_bas_marker\",\"gm4_bas_new\",\"gm4_bas_temp\"]}\n\n# store current data\ndata modify storage gm4_better_armour_stands:temp Data.Pose.Body set from entity @s Pose.Body\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/failure.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/select\n\ntitle @a[tag=gm4_bas_active,limit=1] actionbar {\"translate\":\"tooltip.gm4.better_armour_stands.invalid_right_click_location\",\"fallback\":\"Right click the joint of a part to start editing\"}\n\nscoreboard players reset @s gm4_bas_id\n\nplaysound minecraft:entity.villager.no block @a[tag=gm4_bas_active,limit=1] ~ ~ ~ 0.5 2\n\nparticle electric_spark ~ ~.1 ~ 0 0 0 0 1\n\nexecute if score $size gm4_bas_data matches 0 run particle electric_spark ~ ~1.6 ~ 0 0 0 0 1\nexecute if score $size gm4_bas_data matches 1 run particle electric_spark ~ ~0.9 ~ 0 0 0 0 1\n\nexecute if score $size gm4_bas_data matches 0 run particle electric_spark ~ ~1.3 ~ 0 0 0 0 1\nexecute if score $size gm4_bas_data matches 1 run particle electric_spark ~ ~0.7 ~ 0 0 0 0 1\n\nexecute if score $size gm4_bas_data matches 0 positioned ~ ~1.4 ~ run particle electric_spark ^.3 ^ ^ 0 0 0 0 1\nexecute if score $size gm4_bas_data matches 1 positioned ~ ~0.7 ~ run particle electric_spark ^.15 ^ ^ 0 0 0 0 1\n\nexecute if score $size gm4_bas_data matches 0 positioned ~ ~1.4 ~ run particle electric_spark ^-.3 ^ ^ 0 0 0 0 1\nexecute if score $size gm4_bas_data matches 1 positioned ~ ~0.7 ~ run particle electric_spark ^-.15 ^ ^ 0 0 0 0 1\n\nexecute if score $size gm4_bas_data matches 0 positioned ~ ~0.8 ~ run particle electric_spark ^.15 ^ ^ 0 0 0 0 1\nexecute if score $size gm4_bas_data matches 1 positioned ~ ~0.4 ~ run particle electric_spark ^.05 ^ ^ 0 0 0 0 1\n\nexecute if score $size gm4_bas_data matches 0 positioned ~ ~0.8 ~ run particle electric_spark ^-.15 ^ ^ 0 0 0 0 1\nexecute if score $size gm4_bas_data matches 1 positioned ~ ~0.4 ~ run particle electric_spark ^-.05 ^ ^ 0 0 0 0 1\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/head.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/select\n\nscoreboard players set @s gm4_bas_mode 1\n\n# spawn markers\nexecute if score $size gm4_bas_data matches 0 run summon marker ~ ~1.4 ~ {CustomName:\"gm4_bas_head\",Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_joint\",\"gm4_bas_head\",\"gm4_bas_marker\",\"gm4_bas_new\",\"gm4_bas_temp\"]}\nexecute if score $size gm4_bas_data matches 1 run summon marker ~ ~.7 ~ {CustomName:\"gm4_bas_head\",Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_joint\",\"gm4_bas_head\",\"gm4_bas_marker\",\"gm4_bas_new\",\"gm4_bas_temp\"]}\n\n# store current data\ndata modify storage gm4_better_armour_stands:temp Data.Pose.Head set from entity @s Pose.Head\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/leg_left.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/select\n\nscoreboard players set @s gm4_bas_mode 5\n\n# spawn markers\nexecute if score $size gm4_bas_data matches 0 positioned ~ ~.8 ~ run summon marker ^.15 ^ ^ {CustomName:\"gm4_bas_left_leg\",Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_joint\",\"gm4_bas_left_leg\",\"gm4_bas_marker\",\"gm4_bas_new\",\"gm4_bas_temp\"]}\nexecute if score $size gm4_bas_data matches 1 positioned ~ ~.4 ~ run summon marker ^.05 ^ ^ {CustomName:\"gm4_bas_left_leg\",Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_joint\",\"gm4_bas_left_leg\",\"gm4_bas_marker\",\"gm4_bas_new\",\"gm4_bas_temp\"]}\n\n# store current data\ndata modify storage gm4_better_armour_stands:temp Data.Pose.LeftLeg set from entity @s Pose.LeftLeg\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/leg_right.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/select\n\nscoreboard players set @s gm4_bas_mode 6\n\n# spawn markers\nexecute if score $size gm4_bas_data matches 0 positioned ~ ~.8 ~ run summon marker ^-.15 ^ ^ {CustomName:\"gm4_bas_right_leg\",Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_joint\",\"gm4_bas_right_leg\",\"gm4_bas_marker\",\"gm4_bas_new\",\"gm4_bas_temp\"]}\nexecute if score $size gm4_bas_data matches 1 positioned ~ ~.4 ~ run summon marker ^-.05 ^ ^ {CustomName:\"gm4_bas_right_leg\",Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_joint\",\"gm4_bas_right_leg\",\"gm4_bas_marker\",\"gm4_bas_new\",\"gm4_bas_temp\"]}\n\n# store current data\ndata modify storage gm4_better_armour_stands:temp Data.Pose.RightLeg set from entity @s Pose.RightLeg\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/move/move.mcfunction",
    "content": "# @s = armor_stand to be moved\n# at @s\n# run from pose/select\n\nscoreboard players set @s gm4_bas_mode 7\ntp @s ~ ~ ~\n\n# reset previous data\nscoreboard players reset @s gm4_bas_dist\nscoreboard players reset @s gm4_bas_dx\nscoreboard players reset @s gm4_bas_dy\nscoreboard players reset @s gm4_bas_dz\n\n# skip some calculations if coordinate values too high (>2M)\ntag @s remove gm4_bas_move_alt\ntag @s[predicate=!gm4_better_armour_stands:coord_check] add gm4_bas_move_alt\n\n# calculate distance/offset \nexecute at @a[tag=gm4_bas_active,limit=1] positioned ~ ~1.6 ~ positioned ^ ^ ^.5 run function gm4_better_armour_stands:pose/select/move/ray\n\n# store current data\ndata modify storage gm4_better_armour_stands:temp Data.Pos set from entity @s Pos\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/move/offset.mcfunction",
    "content": "# @s = armor_stand to be moved\n# at @s\n# run from pose/select/move/ray\n\ntag @e remove gm4_bas_stop_ray\nsummon marker ~ ~ ~ {Tags:[\"gm4_bas_temp_offset\"]}\n\n# player position\nexecute as @e[type=marker,tag=gm4_bas_temp_offset,limit=1] store result score @s gm4_bas_dx run data get entity @s Pos[0] 1000\nexecute as @e[type=marker,tag=gm4_bas_temp_offset,limit=1] store result score @s gm4_bas_dy run data get entity @s Pos[1] 1000\nexecute as @e[type=marker,tag=gm4_bas_temp_offset,limit=1] store result score @s gm4_bas_dz run data get entity @s Pos[2] 1000\n\n# armour stand position\nexecute store result score @s gm4_bas_dx run data get entity @s Pos[0] 1000\nexecute store result score @s gm4_bas_dy run data get entity @s Pos[1] 1000\nexecute store result score @s gm4_bas_dz run data get entity @s Pos[2] 1000\n\n# difference in positions\nscoreboard players operation @s gm4_bas_dx -= @e[type=marker,tag=gm4_bas_temp_offset,limit=1] gm4_bas_dx\nscoreboard players operation @s gm4_bas_dy -= @e[type=marker,tag=gm4_bas_temp_offset,limit=1] gm4_bas_dy\nscoreboard players operation @s gm4_bas_dz -= @e[type=marker,tag=gm4_bas_temp_offset,limit=1] gm4_bas_dz\n\nkill @e[type=marker,tag=gm4_bas_temp_offset,distance=..1]\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/move/ray.mcfunction",
    "content": "# @s = armor_stand to be moved\n# at @s\n# run from functions in pose/select/move/\n\nscoreboard players add @s gm4_bas_dist 5\nexecute positioned ~-.2 ~-.2 ~-.2 as @s[dx=0] positioned ~-.6 ~-.6 ~-.6 run tag @s[dx=0] add gm4_bas_stop_ray\n\n# continue searching if not inside armor_stand\nexecute unless entity @s[tag=gm4_bas_stop_ray] unless score @s gm4_bas_dist matches 50.. positioned ^ ^ ^.5 run function gm4_better_armour_stands:pose/select/move/ray\n\n# found armor_stand\nexecute as @s[tag=gm4_bas_stop_ray] run function gm4_better_armour_stands:pose/select/move/offset\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/rotate.mcfunction",
    "content": "# @s = armor_stand to be moved\n# at @s\n# run from pose/select\n\nscoreboard players set @s gm4_bas_mode 8\n\n# store current data\ndata modify storage gm4_better_armour_stands:temp Data.Rotation set from entity @s Rotation\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/small.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/select and default/part\n\n# base\nsummon minecraft:area_effect_cloud ~ ~-.25 ~ {Radius:.2f,Tags:[\"gm4_bas_base\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n\n# head\nsummon minecraft:area_effect_cloud ~ ~.75 ~ {Radius:.08f,Tags:[\"gm4_bas_head\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n\n# body\nsummon minecraft:area_effect_cloud ~ ~.25 ~ {Radius:.09f,Tags:[\"gm4_bas_body\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n\n# arms\nexecute positioned ~ ~.3 ~ run summon minecraft:area_effect_cloud ^.18 ^ ^ {Radius:.09f,Tags:[\"gm4_bas_left_arm\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\nexecute positioned ~ ~.3 ~ run summon minecraft:area_effect_cloud ^-.18 ^ ^ {Radius:.09f,Tags:[\"gm4_bas_right_arm\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n\n# legs\nsummon minecraft:area_effect_cloud ^.1 ^ ^ {Radius:.1f,Tags:[\"gm4_bas_left_leg\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\nsummon minecraft:area_effect_cloud ^-.1 ^ ^ {Radius:.1f,Tags:[\"gm4_bas_right_leg\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/success.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/select\n\nplaysound minecraft:entity.armor_stand.fall block @a[distance=..6] ~ ~ ~ 0.5 1\n\ntag @s add gm4_bas_track\ntag @a[tag=gm4_bas_active,limit=1] add gm4_bas_track\n\ndata modify entity @s DisabledSlots set value 4144959\ndata modify entity @s[nbt={Invisible:1b}] Glowing set value 1b\n\n# right click detection\nsummon minecraft:interaction ~ ~ ~ {Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_detect\",\"gm4_bas_new\",\"gm4_bas_temp\"],height:2,width:1}\n\n# spawn marker for player offset and current armour stand data\nsummon marker ~ ~ ~ {CustomName:\"gm4_bas_player_offset\",Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_player_offset\",\"gm4_bas_marker\",\"gm4_bas_new\",\"gm4_bas_temp\"]}\ndata modify entity @e[type=minecraft:marker,tag=gm4_bas_player_offset,tag=gm4_bas_new,distance=..1,limit=1] data set from storage gm4_better_armour_stands:temp Data\ndata remove storage gm4_better_armour_stands:temp Data\n\n# copy player id to entities\nexecute if score @s gm4_bas_mode matches 1.. run scoreboard players operation @e[type=interaction,tag=gm4_bas_new,distance=..1] gm4_bas_id = @s gm4_bas_id\ntag @e[type=interaction,tag=gm4_bas_new,limit=1] remove gm4_bas_new\n\nexecute if score @s gm4_bas_mode matches 1.. run scoreboard players operation @e[type=marker,tag=gm4_bas_new,distance=..2] gm4_bas_id = @s gm4_bas_id\ntag @e[type=marker,tag=gm4_bas_new,distance=..2,limit=2] remove gm4_bas_new\n\n# optional checks\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"pose mirror\"}]} run tag @s add gm4_bas_mirror\nexecute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:sneaking] run tag @s add gm4_bas_alt\n\n# start tracking clock\nschedule function gm4_better_armour_stands:pose/track/tick 1t\nschedule function gm4_better_armour_stands:pose/check_no_player 16t\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/tall.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/select and default/part\n\n# base\nsummon minecraft:area_effect_cloud ~ ~-.4 ~ {Radius:.375f,Tags:[\"gm4_bas_base\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n\n# head\nsummon minecraft:area_effect_cloud ~ ~1.5 ~ {Radius:.1f,Tags:[\"gm4_bas_head\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n\n# body\nsummon minecraft:area_effect_cloud ~ ~1 ~ {Radius:.15f,Tags:[\"gm4_bas_body\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n\n# arms\nexecute positioned ~ ~1 ~ run summon minecraft:area_effect_cloud ^.3 ^ ^ {Radius:.15f,Tags:[\"gm4_bas_left_arm\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\nexecute positioned ~ ~1 ~ run summon minecraft:area_effect_cloud ^-.3 ^ ^ {Radius:.15f,Tags:[\"gm4_bas_right_arm\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n\n# legs\nexecute positioned ~ ~.4 ~ run summon minecraft:area_effect_cloud ^.15 ^ ^ {Radius:.15f,Tags:[\"gm4_bas_left_leg\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\nexecute positioned ~ ~.4 ~ run summon minecraft:area_effect_cloud ^-.15 ^ ^ {Radius:.15f,Tags:[\"gm4_bas_right_leg\"],Duration:0,WaitTime:2,custom_particle:{type:\"minecraft:item\",item:\"minecraft:armor_stand\"}}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\nscoreboard players operation @s gm4_bas_id = @a[tag=gm4_bas_active,limit=1] gm4_bas_id\n\n# check size, spawn part detectors\nexecute store result score $size gm4_bas_data run data get entity @s Small\nexecute if score $size gm4_bas_data matches 0 run function gm4_better_armour_stands:pose/select/tall\nexecute if score $size gm4_bas_data matches 1 run function gm4_better_armour_stands:pose/select/small\n\n# detect part player is looking at\ntp @s ~ ~100 ~\nexecute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/head] run function gm4_better_armour_stands:pose/select/head\nexecute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/body] run function gm4_better_armour_stands:pose/select/body\nexecute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/left_arm] run function gm4_better_armour_stands:pose/select/arm_left\nexecute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/right_arm] run function gm4_better_armour_stands:pose/select/arm_right\nexecute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/left_leg] run function gm4_better_armour_stands:pose/select/leg_left\nexecute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/right_leg] run function gm4_better_armour_stands:pose/select/leg_right\nexecute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/base,predicate=!gm4_better_armour_stands:sneaking] run function gm4_better_armour_stands:pose/select/move/move\nexecute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/base,predicate=gm4_better_armour_stands:sneaking] run function gm4_better_armour_stands:pose/select/rotate\ntp @s ~ ~ ~\n\n# start editing if success, otherwise feedback\nexecute if score @s gm4_bas_mode matches 1.. run function gm4_better_armour_stands:pose/select/success\nexecute unless score @s gm4_bas_mode matches 1.. positioned ^ ^ ^.1 run function gm4_better_armour_stands:pose/select/failure\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/set.mcfunction",
    "content": "# @s = player modifying armor_stand\n# at @s\n# run from advancement pose/set, pose/undo\n\nadvancement revoke @s only gm4_better_armour_stands:book/use\nadvancement revoke @s only gm4_better_armour_stands:pose/set\nadvancement revoke @s only gm4_better_armour_stands:book/tracking\n\n# advancement for customizing armor_stand\nadvancement grant @s only gm4:better_armour_stands\n\n# get current player id\nscoreboard players operation $current gm4_bas_id = @s gm4_bas_id\n\n# reset/remove linked entities\nexecute as @e[type=armor_stand,tag=gm4_bas_track] if score @s gm4_bas_id = $current gm4_bas_id at @s run function gm4_better_armour_stands:pose/track/clear\nexecute as @e[type=marker,tag=gm4_bas_marker] if score @s gm4_bas_id = $current gm4_bas_id at @s run kill @s\nexecute as @e[type=interaction,tag=gm4_bas_detect] if score @s gm4_bas_id = $current gm4_bas_id at @s run kill @s\n\n# reset tag\ntag @s remove gm4_bas_track\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/set_no_player.mcfunction",
    "content": "# @s = armor_stand with no nearby tracked player\n# at @s\n# run from pose/check_no_player\n\n# get current armor_stand id\nscoreboard players operation $current gm4_bas_id = @s gm4_bas_id\n\n# remove linked entities\nexecute as @e[type=marker,tag=gm4_bas_marker] if score @s gm4_bas_id = $current gm4_bas_id at @s run kill @s\nexecute as @e[type=interaction,tag=gm4_bas_detect] if score @s gm4_bas_id = $current gm4_bas_id at @s run kill @s\n\n# reset tracking data\nfunction gm4_better_armour_stands:pose/track/clear\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/snap/pose.mcfunction",
    "content": "# @s = player modifying armor_stand\n# at @s\n# run from pose/track/update\n\nscoreboard players add $joint_rot_x gm4_bas_data 750\nscoreboard players operation $joint_rot_x gm4_bas_data /= #1500 gm4_bas_data\nscoreboard players operation $joint_rot_x gm4_bas_data *= #1500 gm4_bas_data\n\nscoreboard players add $joint_rot_y gm4_bas_data 750\nscoreboard players operation $joint_rot_y gm4_bas_data /= #1500 gm4_bas_data\nscoreboard players operation $joint_rot_y gm4_bas_data *= #1500 gm4_bas_data\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/snap/position.mcfunction",
    "content": "# @s = armor_stand being moved\n# at @s\n# run from pose/track/move\n\n# round to nearest 1/8th of a block\nexecute store result entity @s Pos[0] double .125 run data get entity @s Pos[0] 8\nexecute store result entity @s Pos[1] double .125 run data get entity @s Pos[1] 8\nexecute store result entity @s Pos[2] double .125 run data get entity @s Pos[2] 8\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/snap/rotation.mcfunction",
    "content": "# @s = armor_stand being rotated\n# at @s\n# run from pose/track/rotate\n\n# round to nearest 15 degrees of a block\nexecute store result score $as_rot_y gm4_bas_data run data get entity @s Rotation[0] .06667\nexecute store result entity @s Rotation[0] float 15 run scoreboard players get $as_rot_y gm4_bas_data\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/arm_left.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~\n# run from pose/track/update\n\n# convert scores to rotation in storage\ndata modify storage gm4_better_armour_stands:temp Pose set value {LeftArm:[0f,0f,0f]}\nexecute store result storage gm4_better_armour_stands:temp Pose.LeftArm[0] float 0.01 run scoreboard players remove $joint_rot_x gm4_bas_data 9000\nexecute store result storage gm4_better_armour_stands:temp Pose.LeftArm[1] float 0.01 run scoreboard players get $joint_rot_y gm4_bas_data\n\n# mirror to other arm\nexecute if entity @s[tag=gm4_bas_mirror] run function gm4_better_armour_stands:pose/mirror/arm_left\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/arm_right.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~\n# run from pose/track/update\n\n# convert scores to rotation in storage\ndata modify storage gm4_better_armour_stands:temp Pose set value {RightArm:[0f,0f,0f]}\nexecute store result storage gm4_better_armour_stands:temp Pose.RightArm[0] float 0.01 run scoreboard players remove $joint_rot_x gm4_bas_data 9000\nexecute store result storage gm4_better_armour_stands:temp Pose.RightArm[1] float 0.01 run scoreboard players get $joint_rot_y gm4_bas_data\n\n# mirror to other arm\nexecute if entity @s[tag=gm4_bas_mirror] run function gm4_better_armour_stands:pose/mirror/arm_right\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/body.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~\n# run from pose/track/update\n\n# convert scores to rotation in storage\ndata modify storage gm4_better_armour_stands:temp Pose set value {Body:[0f,0f,0f]}\nexecute store result storage gm4_better_armour_stands:temp Pose.Body[0] float 0.01 run scoreboard players get $joint_rot_x gm4_bas_data\nexecute store result storage gm4_better_armour_stands:temp Pose.Body[1] float 0.01 run scoreboard players get $joint_rot_y gm4_bas_data\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/clear.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from pose/set\n\nscoreboard players reset @s gm4_bas_id\nscoreboard players reset @s gm4_bas_mode\n\ntag @s remove gm4_bas_track\ntag @s remove gm4_bas_mirror\ntag @s remove gm4_bas_alt\ntag @s remove gm4_bas_invert\n\ndata remove entity @s DisabledSlots\ndata remove entity @s Glowing\n\nplaysound minecraft:entity.armor_stand.fall block @a[distance=..6] ~ ~ ~ 0.5 1\n\n# undo changes if ran from pose/undo\nexecute if score $undo gm4_bas_data matches 1 run data modify entity @s {} merge from storage gm4_better_armour_stands:temp Undo\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/head.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~\n# run from pose/track/update\n\n# convert scores to rotation in storage\ndata modify storage gm4_better_armour_stands:temp Pose set value {Head:[0f,0f,0f]}\nexecute store result storage gm4_better_armour_stands:temp Pose.Head[0] float 0.01 run scoreboard players get $joint_rot_x gm4_bas_data\nexecute store result storage gm4_better_armour_stands:temp Pose.Head[1] float 0.01 run scoreboard players get $joint_rot_y gm4_bas_data\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/leg_left.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~\n# run from pose/track/update\n\n# convert scores to rotation in storage\ndata modify storage gm4_better_armour_stands:temp Pose set value {LeftLeg:[0f,0f,0f]}\nexecute store result storage gm4_better_armour_stands:temp Pose.LeftLeg[0] float 0.01 run scoreboard players remove $joint_rot_x gm4_bas_data 9000\nexecute store result storage gm4_better_armour_stands:temp Pose.LeftLeg[1] float 0.01 run scoreboard players get $joint_rot_y gm4_bas_data\n\n# mirror to other leg\nexecute if entity @s[tag=gm4_bas_mirror] run function gm4_better_armour_stands:pose/mirror/leg_left\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/leg_right.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~\n# run from pose/track/update\n\n# convert scores to rotation in storage\ndata modify storage gm4_better_armour_stands:temp Pose set value {RightLeg:[0f,0f,0f]}\nexecute store result storage gm4_better_armour_stands:temp Pose.RightLeg[0] float 0.01 run scoreboard players remove $joint_rot_x gm4_bas_data 9000\nexecute store result storage gm4_better_armour_stands:temp Pose.RightLeg[1] float 0.01 run scoreboard players get $joint_rot_y gm4_bas_data\n\n# mirror to other leg\nexecute if entity @s[tag=gm4_bas_mirror] run function gm4_better_armour_stands:pose/mirror/leg_right\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/move.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~\n# run from pose/track/update\n\n# move armor_stand in front of player\nexecute if score @s gm4_bas_dist matches 5 run tp @s ^ ^ ^.5\nexecute if score @s gm4_bas_dist matches 10 run tp @s ^ ^ ^1\nexecute if score @s gm4_bas_dist matches 15 run tp @s ^ ^ ^1.5\nexecute if score @s gm4_bas_dist matches 20 run tp @s ^ ^ ^2\nexecute if score @s gm4_bas_dist matches 25 run tp @s ^ ^ ^2.5\nexecute if score @s gm4_bas_dist matches 30 run tp @s ^ ^ ^3\nexecute if score @s gm4_bas_dist matches 35 run tp @s ^ ^ ^3.5\nexecute if score @s gm4_bas_dist matches 40 run tp @s ^ ^ ^4\nexecute if score @s gm4_bas_dist matches 45 run tp @s ^ ^ ^4.5\nexecute if score @s gm4_bas_dist matches 50 run tp @s ^ ^ ^5\n\n# armour stand position\nexecute store result score $as_pos_x gm4_bas_data run data get entity @s[tag=!gm4_bas_move_alt] Pos[0] 1000\nexecute store result score $as_pos_z gm4_bas_data run data get entity @s[tag=!gm4_bas_move_alt] Pos[2] 1000\nexecute store result score $as_pos_y gm4_bas_data run data get entity @s Pos[1] 1000\n\n# add difference to position\nexecute store result entity @s[tag=!gm4_bas_move_alt] Pos[0] double .001 run scoreboard players operation $as_pos_x gm4_bas_data += @s gm4_bas_dx\nexecute store result entity @s[tag=!gm4_bas_move_alt] Pos[2] double .001 run scoreboard players operation $as_pos_z gm4_bas_data += @s gm4_bas_dz\nexecute store result entity @s Pos[1] double .001 run scoreboard players operation $as_pos_y gm4_bas_data += @s gm4_bas_dy\n\n# round up position to multiples of 1/8th of a block\nexecute if entity @p[tag=gm4_bas_track,predicate=gm4_better_armour_stands:sneaking] run function gm4_better_armour_stands:pose/snap/position\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/rotate.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~\n# run from pose/track/update\n\n# rotate armor_stand towards marker\nexecute at @s run tp @s ~ ~ ~ facing entity @e[type=marker,tag=gm4_bas_player_offset,sort=nearest,limit=1]\n\n# round up rotation to multiples of 15 degrees\nexecute if entity @p[tag=gm4_bas_track,predicate=gm4_better_armour_stands:sneaking] run function gm4_better_armour_stands:pose/snap/rotation\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/select_armour_stand.mcfunction",
    "content": "# @s = player modifying armor_stand\n# at @s\n# run from pose/track/tick\n\n# get current player id\nscoreboard players operation $current gm4_bas_id = @s gm4_bas_id\n\n# select armor_stand linked to player\nscoreboard players reset $success gm4_bas_data\nexecute if predicate gm4_better_armour_stands:holding/mainhand/book_and_quill as @e[type=armor_stand,tag=gm4_bas_track,distance=..6] if score @s gm4_bas_id = $current gm4_bas_id positioned ~ ~1.6 ~ run function gm4_better_armour_stands:pose/track/update\n\n# undo changes if no linked armor_stand found, or if player not holding book_and_quill\nexecute unless score $success gm4_bas_data matches 1 run function gm4_better_armour_stands:pose/undo\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/tick.mcfunction",
    "content": "# update values for tracked armor_stand, for pose/move/rotate\nexecute as @a[tag=gm4_bas_track] at @s run function gm4_better_armour_stands:pose/track/select_armour_stand\n\n# repeat tracking loop\nexecute if entity @a[tag=gm4_bas_track,limit=1] run schedule function gm4_better_armour_stands:pose/track/tick 1t\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/update.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~\n# run from tick\n\nscoreboard players set $success gm4_bas_data 1\n\n# keep interaction in front of player\nexecute as @e[type=interaction,tag=gm4_bas_detect] if score @s gm4_bas_id = $current gm4_bas_id positioned ~ ~-1 ~ run tp @s ^ ^ ^.5\n\n# move offset marker, rotate joint marker facing offset marker, and update rotation scores\nexecute as @e[type=marker,tag=gm4_bas_player_offset] if score @s gm4_bas_id = $current gm4_bas_id run function gm4_better_armour_stands:pose/track/update_markers\n\n# update armor_stand part pose\nexecute if score @s gm4_bas_mode matches 1..6 run function gm4_better_armour_stands:pose/track/update_pose\n\n# update for move/rotate\nexecute if score @s gm4_bas_mode matches 7 run function gm4_better_armour_stands:pose/track/move\nexecute if score @s gm4_bas_mode matches 8 run function gm4_better_armour_stands:pose/track/rotate\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/update_joint.mcfunction",
    "content": "# @s = @e[type=marker,tag=gm4_bas_player_offset]\n# at @e[type=marker,tag=gm4_bas_joint]\n# run from pose/track/update_markers\n\n# rotate joint marker to face offset marker\ntp @e[type=marker,tag=gm4_bas_joint,distance=..1,sort=nearest,limit=1] ~ ~ ~ facing entity @s\n\n# store player and armor_stand rotation in scoreboard so rotation offset can be applied.\nexecute store result score $joint_rot_x gm4_bas_data run data get entity @e[type=marker,tag=gm4_bas_joint,sort=nearest,limit=1] Rotation[1] 100\nexecute store result score $joint_rot_y gm4_bas_data run data get entity @e[type=marker,tag=gm4_bas_joint,sort=nearest,limit=1] Rotation[0] 100\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/update_markers.mcfunction",
    "content": "# @s = @e[type=marker,tag=gm4_bas_player_offset]\n# at @p[tag=gm4_bas_track]\n# run from pose/track/update\n\n# keep offset marker in front of player\ntp @s ^ ^ ^2\n\n# rotate joint marker to face offset marker and update rotation scores\nexecute at @e[type=marker,tag=gm4_bas_joint] if score @e[type=marker,tag=gm4_bas_joint,distance=..1,sort=nearest,limit=1] gm4_bas_id = @s gm4_bas_id run function gm4_better_armour_stands:pose/track/update_joint\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/update_pose.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~\n# run from pose/track/update\n\n# update rotation calculations\nexecute store result score $as_rot_y gm4_bas_data run data get entity @s Rotation[0] 100\nscoreboard players operation $joint_rot_y gm4_bas_data -= $as_rot_y gm4_bas_data \n\n# snap pose\nexecute as @p[tag=gm4_bas_track] if predicate gm4_better_armour_stands:sneaking run function gm4_better_armour_stands:pose/snap/pose\n\n# apply optional modifiers\nexecute if entity @s[tag=gm4_bas_invert] run scoreboard players add $joint_rot_x gm4_bas_data 18000\nexecute if entity @s[tag=gm4_bas_alt] run scoreboard players add $joint_rot_x gm4_bas_data 9000\n\n# check for armor_stand part\nexecute if score @s gm4_bas_mode matches 1 run function gm4_better_armour_stands:pose/track/head\nexecute if score @s gm4_bas_mode matches 2 run function gm4_better_armour_stands:pose/track/body\nexecute if score @s gm4_bas_mode matches 3 run function gm4_better_armour_stands:pose/track/arm_left\nexecute if score @s gm4_bas_mode matches 4 run function gm4_better_armour_stands:pose/track/arm_right\nexecute if score @s gm4_bas_mode matches 5 run function gm4_better_armour_stands:pose/track/leg_left\nexecute if score @s gm4_bas_mode matches 6 run function gm4_better_armour_stands:pose/track/leg_right\n\n# copy pose data from storage to entity.\ndata modify entity @s Pose merge from storage gm4_better_armour_stands:temp Pose\ndata remove storage gm4_better_armour_stands:temp Pose\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/undo.mcfunction",
    "content": "# @s = player modifying armor_stand\n# at @s\n# run from pose/track/select_armour_stand\n\n# move undo data from marker to storage\nexecute as @e[type=marker,tag=gm4_bas_player_offset] if score @s gm4_bas_id = $current gm4_bas_id run data modify storage gm4_better_armour_stands:temp Undo set from entity @s data\n\n# stop tracking\nscoreboard players set $undo gm4_bas_data 1\nfunction gm4_better_armour_stands:pose/set\nplaysound minecraft:entity.armor_stand.hit block @s ~ ~ ~ 0.5 1\n\n# reset undo data\nscoreboard players reset $undo gm4_bas_data\ndata remove storage gm4_better_armour_stands:temp Undo\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/tick.mcfunction",
    "content": "# turn armor_stand\nexecute as @e[type=armor_stand,scores={gm4_bas_turn=1..}] at @s run function gm4_better_armour_stands:turn\n\nschedule function gm4_better_armour_stands:tick 1t\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/arms/arms.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# toggle arms\nexecute store result score $arms gm4_bas_data run data get entity @s ShowArms\n\nexecute if score $arms gm4_bas_data matches 0 run data modify entity @s ShowArms set value 1\nexecute if score $arms gm4_bas_data matches 0 run playsound minecraft:entity.armor_stand.place block @a[distance=..6] ~ ~ ~ 0.5 1.5\n\nexecute if score $arms gm4_bas_data matches 1 run data modify entity @s ShowArms set value 0\nexecute if score $arms gm4_bas_data matches 1 run playsound minecraft:entity.armor_stand.break block @a[distance=..6] ~ ~ ~ 0.5 1.5\nexecute if score $arms gm4_bas_data matches 1 run function gm4_better_armour_stands:toggle/arms/detect_interaction\n\n# check size and show particles\nexecute store result score $size gm4_bas_data run data get entity @s Small\n\nexecute if score $size gm4_bas_data matches 0 positioned ~ ~1.4 ~ run particle minecraft:block{block_state:\"minecraft:oak_planks\"} ^.35 ^ ^ 0 0 0 0 4\nexecute if score $size gm4_bas_data matches 0 positioned ~ ~1.4 ~ run particle minecraft:block{block_state:\"minecraft:oak_planks\"} ^-.35 ^ ^ 0 0 0 0 4\n\nexecute if score $size gm4_bas_data matches 1 positioned ~ ~.7 ~ run particle minecraft:block{block_state:\"minecraft:oak_planks\"} ^.2 ^ ^ 0 0 0 0 4\nexecute if score $size gm4_bas_data matches 1 positioned ~ ~.7 ~ run particle minecraft:block{block_state:\"minecraft:oak_planks\"} ^-.2 ^ ^ 0 0 0 0 4\n\n# advancement for customizing armor_stand\nadvancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/arms/check.mcfunction",
    "content": "# scheduled from toggle/arms/detect_interaction\n\n# remove right click detection on armor_stand with no arms if player is too far away\nexecute as @e[type=armor_stand,tag=gm4_bas_no_arms] at @s unless entity @p[distance=..6,predicate=gm4_better_armour_stands:holding/mainhand/book_arms] run function gm4_better_armour_stands:toggle/arms/remove_detection\n\n# repeat check\nexecute if entity @e[type=armor_stand,tag=gm4_bas_no_arms] run schedule function gm4_better_armour_stands:toggle/arms/check 16t\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/arms/detect_interaction.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/hold and toggle/arms/arms\n\ntag @s add gm4_bas_no_arms\n\n# size check\nexecute store result score $size gm4_bas_data run data get entity @s Small\n\n# place interaction inside armor_stand to detect right click\nexecute if score $size gm4_bas_data matches 0 run summon minecraft:interaction ~ ~-0.01 ~ {Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_arms_detect\"],height:2,width:0.51}\nexecute if score $size gm4_bas_data matches 1 run summon minecraft:interaction ~ ~-0.01 ~ {Tags:[\"smithed.entity\",\"smithed.strict\",\"gm4_bas_arms_detect\"],height:1,width:0.251}\n\n# start check loop to remove interaction\nschedule function gm4_better_armour_stands:toggle/arms/check 16t\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/arms/remove_detection.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from toggle/arms/check and toggle/arms/select\n\nkill @e[type=interaction,tag=gm4_bas_arms_detect,distance=..1,sort=nearest,limit=1]\ntag @s remove gm4_bas_no_arms\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/arms/select.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/ray_arms\n\n# get book data\ndata modify storage gm4_better_armour_stands:temp pages set from entity @a[tag=gm4_bas_active,limit=1] SelectedItem.components.\"minecraft:writable_book_content\".pages\n\n# apply to armor_stand\nfunction #gm4_better_armour_stands:apply_book\n\n# remove detection\nfunction gm4_better_armour_stands:toggle/arms/remove_detection\ntag @s remove gm4_bas_selected\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/base.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# toggle base plate\nexecute store result score $base gm4_bas_data run data get entity @s NoBasePlate\n\nexecute if score $base gm4_bas_data matches 0 run data modify entity @s NoBasePlate set value 1b\nexecute if score $base gm4_bas_data matches 0 run playsound minecraft:block.stone.break block @a[distance=..6] ~ ~ ~ 0.5 1\nexecute if score $base gm4_bas_data matches 0 run particle minecraft:block{block_state:\"minecraft:smooth_stone\"} ~ ~ ~ .15 0 .15 0 10\n\nexecute if score $base gm4_bas_data matches 1 run data modify entity @s NoBasePlate set value 0b\nexecute if score $base gm4_bas_data matches 1 run playsound minecraft:block.stone.place block @a[distance=..6] ~ ~ ~ 0.5 1\n\n# advancement for customizing armor_stand\nadvancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/gravity.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# toggle gravity\nexecute store result score $gravity gm4_bas_data run data get entity @s NoGravity\nplaysound minecraft:item.chorus_fruit.teleport block @a[distance=..6] ~ ~ ~ 0.5 2\n\nexecute if score $gravity gm4_bas_data matches 0 run data modify entity @s NoGravity set value 1b\nexecute if score $gravity gm4_bas_data matches 0 run particle minecraft:reverse_portal ~ ~ ~ .2 1 .2 0 20\n\nexecute if score $gravity gm4_bas_data matches 1 run data modify entity @s NoGravity set value 0b\nexecute if score $gravity gm4_bas_data matches 1 run particle minecraft:portal ~ ~ ~ .2 1 .2 0 20\n\n# advancement for customizing armor_stand\nadvancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/lock/check.mcfunction",
    "content": "# scheduled from toggle/lock/detect_interaction\n\n# remove temporary interaction with locked armor_stand\nexecute as @e[type=armor_stand,tag=gm4_bas_temp_unlock] at @s unless entity @p[predicate=gm4_better_armour_stands:holding/mainhand/book_unlock,distance=..6] run function gm4_better_armour_stands:toggle/lock/remove_temp_unlock\n\n# repeat check\nexecute if entity @e[type=armor_stand,tag=gm4_bas_temp_unlock] run schedule function gm4_better_armour_stands:toggle/lock/check 16t\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/lock/detect_interaction.mcfunction",
    "content": "# @s = locked armor_stand\n# at @s\n# run from book/hold\n\n# enable temporary interaction\ndata merge entity @s {Marker:0b,Glowing:1b}\ntag @s add gm4_bas_temp_unlock\n\n# start check loop to remove temporary unlock\nschedule function gm4_better_armour_stands:toggle/lock/check 16t\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/lock/lock.mcfunction",
    "content": "# @s = armor_stand\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# lock armor_stand\ndata merge entity @s {Marker:1b,NoGravity:1b}\nplaysound minecraft:block.wooden_trapdoor.close block @a[distance=..6] ~ ~ ~ 0.5 2\nparticle minecraft:enchant ~ ~.5 ~ .15 .5 .15 .3 10\n\ntag @s add gm4_bas_locked\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/lock/remove_temp_unlock.mcfunction",
    "content": "# @s = temporarily unlocked armor_stand\n# at @s\n# run from toggle/lock/check\n\ndata merge entity @s {Marker:1b,Glowing:0b}\ntag @s remove gm4_bas_temp_unlock\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/lock/unlock.mcfunction",
    "content": "# @s = armor_stand\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# unlock armor_stand\ndata modify entity @s Glowing set value 0b\nplaysound minecraft:block.wooden_trapdoor.open block @a[distance=..6] ~ ~ ~ 0.5 2\nparticle minecraft:enchant ~ ~.5 ~ .15 .5 .15 0 10\n\ntag @s remove gm4_bas_locked\ntag @s remove gm4_bas_temp_unlock\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/size.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# toggle size\nexecute store result score $size gm4_bas_data run data get entity @s Small\nplaysound minecraft:entity.armor_stand.fall block @a[distance=..6] ~ ~ ~ 0.5 1\n\nexecute if score $size gm4_bas_data matches 0 run data modify entity @s Small set value 1b\nexecute if score $size gm4_bas_data matches 0 run playsound minecraft:entity.puffer_fish.blow_out block @a[distance=..6] ~ ~ ~ .3 2\n\nexecute if score $size gm4_bas_data matches 1 run data modify entity @s Small set value 0b\nexecute if score $size gm4_bas_data matches 1 run playsound minecraft:entity.puffer_fish.blow_up block @a[distance=..6] ~ ~ ~ .3 2\n\n# advancement for customizing armor_stand\nadvancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/turn.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# rotate through turn options\nscoreboard players add @s gm4_bas_turn 1\nexecute unless score @s gm4_bas_turn matches 0..2 run scoreboard players set @s gm4_bas_turn 0\n\nexecute if score @s gm4_bas_turn matches 0 run playsound minecraft:entity.armor_stand.hit block @a[distance=..6] ~ ~ ~ .2 2\nexecute if score @s gm4_bas_turn matches 1..2 run playsound minecraft:entity.item_frame.rotate_item master @a[distance=..6] ~ ~ ~ 0.5 2\n\n# advancement for customizing armor_stand\nadvancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/visible.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from book/apply\n\nscoreboard players set $valid_code gm4_bas_data 1\n\n# toggle visibility\nexecute store result score $invisible gm4_bas_data run data get entity @s Invisible\nplaysound minecraft:entity.player.attack.nodamage neutral @a[distance=..6] ~ ~ ~ 0.5 0.6\n\nexecute if score $invisible gm4_bas_data matches 0 run data modify entity @s Invisible set value 1b\nexecute if score $invisible gm4_bas_data matches 0 run effect give @s glowing 2 0\n\nexecute if score $invisible gm4_bas_data matches 1 run data modify entity @s Invisible set value 0b\nexecute if score $invisible gm4_bas_data matches 1 run effect clear @s glowing\n\n# advancement for customizing armor_stand\nadvancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/function/turn.mcfunction",
    "content": "# @s = armor_stand\n# at @s\n# run from tick\n\nexecute if score @s gm4_bas_turn matches 1 run tp @s ~ ~ ~ ~-1 ~\nexecute if score @s gm4_bas_turn matches 2 run tp @s ~ ~ ~ ~1 ~\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/guidebook/better_armour_stands.json",
    "content": "{\n  \"id\": \"better_armour_stands\",\n  \"name\": \"Better Armour Stands\",\n  \"module_type\": \"base\",\n  \"icon\": {\n    \"id\": \"minecraft:writable_book\"\n  },\n  \"criteria\": {\n    \"place_armor_stand\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:match_tool\",\n            \"predicate\": {\n              \"items\": [\n                \"minecraft:armor_stand\"\n              ]\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_book_and_quill\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:writable_book\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"place_armor_stand\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.better_armour_stands.description\",\n            \"fallback\": \"Armour stands will have arms by default, and can be altered with a book and quill.\\n\\nThis allows one to create custom statues and interesting displays.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"codes\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_book_and_quill\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.better_armour_stands.applying\",\n            \"fallback\": \"To modify an armour stand, write one of the codes in a book and quill, then use it on the armour stand.\\n\\nMultiple codes can be written on separate pages to apply multiple modifiers at once.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.better_armour_stands.toggle_codes\",\n            \"fallback\": \"The following codes will toggle the specific feature:\"\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"arms\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.arms\",\n                  \"fallback\": \"Toggle the arms of the armour stand\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"arms\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"base\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.base\",\n                  \"fallback\": \"Toggle the base plate of the armour stand\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"base\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"size\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.size\",\n                  \"fallback\": \"Toggle the size of the armour stand\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"size\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"gravity\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.gravity\",\n                  \"fallback\": \"Toggle the gravity of the armour stand\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"gravity\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"visible\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.visible\",\n                  \"fallback\": \"Toggle the visibility of the armour stand.\\nHolding a book with this code will reveal\\nnearby invisible armour stands.\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"visible\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"turn\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.turn\",\n                  \"fallback\": \"Toggle rotating of the armour stand\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"turn\"\n            }\n          },\n          {\n            \"text\": \"\\n\\n- \"\n          },\n          {\n            \"text\": \"lock\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.lock\",\n                  \"fallback\": \"Disable interactions with the armour stand\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"lock\"\n            }\n          },\n          {\n            \"text\": \" / \"\n          },\n          {\n            \"text\": \"unlock\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.unlock\",\n                  \"fallback\": \"Enable interactions with the armour stand.\\nHolding a book with this code will reveal\\nnearby locked armour stands.\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"unlock\"\n            }\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.better_armour_stands.part_editing\",\n            \"fallback\": \"The following codes activate editing of armour stand parts:\"\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"pose\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.pose\",\n                  \"fallback\": \"Edit a part of the armour stand by looking at its \\\"joint\\\".\\n- Hold sneak to enable \\\"snapping\\\"\\n- Left click to invert this pose\\n- Right click to stop editing\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"pose\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"pose mirror\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.pose_mirror\",\n                  \"fallback\": \"Edit a part of the armour stand by looking at its \\\"joint\\\".\\nIf an arm/leg is selected, the other arm/leg pose is mirrored.\\n- Hold sneak to enable \\\"snapping\\\"\\n- Left click to invert this pose\\n- Right click to stop editing\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"pose mirror\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"move\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.move\",\n                  \"fallback\": \"Move the armour stand around you.\\n- Hold sneak to enable \\\"snapping\\\"\\n- Right click to stop editing\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"move\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"rotate\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.rotate\",\n                  \"fallback\": \"Rotate the armour stand.\\n- Hold sneak to enable \\\"snapping\\\"\\n- Right click to stop editing\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"rotate\"\n            }\n          },\n          {\n            \"text\": \"\\n\\n- \"\n          },\n          {\n            \"text\": \"flip\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.flip\",\n                  \"fallback\": \"Flip the full pose of the armour stand\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"flip\"\n            }\n          },\n          {\n            \"text\": \"\\n\\n- \"\n          },\n          {\n            \"text\": \"default\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.default\",\n                  \"fallback\": \"- Look at a part of the armour stand to reset this pose.\\n- Sneak to fully reset the armour stand.\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"default\"\n            }\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.better_armour_stands.equipping\",\n            \"fallback\": \"Items can be placed in the head or arm slots:\"\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"equip\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.equip\",\n                  \"fallback\": \"Look at the head or shoulders of the armour stand to place an item from the offhand into this slot.\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"equip\"\n            }\n          },\n          {\n            \"text\": \"\\n\\n\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_and_paste\",\n            \"fallback\": \"Armour stand data can be copied and pasted:\"\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"copy\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy\",\n                  \"fallback\": \"Copy modified features onto the armour stand items in your offhand.\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"copy\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"paste\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.paste\",\n                  \"fallback\": \"Copy features from the copied armour stand items in your offhand to the armour stand.\",\n                  \"color\": \"gray\"\n                },\n                \"\\n\",\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"paste\"\n            }\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/item_modifier/add_ignore.json",
    "content": "{\n  \"function\": \"minecraft:set_custom_data\",\n  \"tag\": \"{gm4_bas_ignore:1b}\"\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/item_modifier/copy.json",
    "content": "[\n  {\n    \"function\": \"minecraft:set_components\",\n    \"components\": {\n      \"minecraft:enchantment_glint_override\": true\n    }\n  },\n  {\n    \"function\": \"minecraft:set_lore\",\n    \"mode\": \"replace_all\",\n    \"entity\": \"this\",\n    \"lore\": [\n      [\n        {\n          \"translate\": \"item.gm4.better_armour_stands.copied_armor_stand.author\",\n          \"fallback\": \"Copied by: \",\n          \"color\": \"gray\",\n          \"italic\": false,\n          \"extra\": [\n            {\n              \"selector\": \"@a[tag=gm4_bas_active,limit=1]\"\n            }\n          ]\n        }\n      ]\n    ]\n  },\n  {\n    \"function\": \"minecraft:set_lore\",\n    \"mode\": \"append\",\n    \"entity\": \"this\",\n    \"lore\": [\n      [\n        {\n          \"text\": \"● \",\n          \"color\": \"gray\",\n          \"italic\": false\n        },\n        {\n          \"translate\": \"item.gm4.better_armour_stands.copied_armor_stand.property.custom_pose\",\n          \"fallback\": \"Custom pose\",\n          \"color\": \"gray\",\n          \"italic\": false\n        }\n      ]\n    ]\n  },\n  {\n    \"function\": \"minecraft:set_lore\",\n    \"mode\": \"append\",\n    \"entity\": \"this\",\n    \"lore\": [\n      [\n        {\n          \"text\": \"● \",\n          \"color\": \"gray\",\n          \"italic\": false\n        },\n        {\n          \"translate\": \"item.gm4.better_armour_stands.copied_armor_stand.property.small\",\n          \"fallback\": \"Small\",\n          \"color\": \"gray\",\n          \"italic\": false\n        }\n      ]\n    ],\n    \"conditions\": [\n      {\n        \"condition\": \"minecraft:entity_properties\",\n        \"entity\": \"this\",\n        \"predicate\": {\n          \"nbt\": \"{Small:1b}\"\n        }\n      }\n    ]\n  },\n  {\n    \"function\": \"minecraft:set_lore\",\n    \"mode\": \"append\",\n    \"entity\": \"this\",\n    \"lore\": [\n      [\n        {\n          \"text\": \"● \",\n          \"color\": \"gray\",\n          \"italic\": false\n        },\n        {\n          \"translate\": \"item.gm4.better_armour_stands.copied_armor_stand.property.no_base\",\n          \"fallback\": \"No base plate\",\n          \"color\": \"gray\",\n          \"italic\": false\n        }\n      ]\n    ],\n    \"conditions\": [\n      {\n        \"condition\": \"minecraft:entity_properties\",\n        \"entity\": \"this\",\n        \"predicate\": {\n          \"nbt\": \"{NoBasePlate:1b}\"\n        }\n      }\n    ]\n  },\n  {\n    \"function\": \"minecraft:set_lore\",\n    \"mode\": \"append\",\n    \"entity\": \"this\",\n    \"lore\": [\n      [\n        {\n          \"text\": \"● \",\n          \"color\": \"gray\",\n          \"italic\": false\n        },\n        {\n          \"translate\": \"item.gm4.better_armour_stands.copied_armor_stand.property.no_gravity\",\n          \"fallback\": \"No gravity\",\n          \"color\": \"gray\",\n          \"italic\": false\n        }\n      ]\n    ],\n    \"conditions\": [\n      {\n        \"condition\": \"minecraft:entity_properties\",\n        \"entity\": \"this\",\n        \"predicate\": {\n          \"nbt\": \"{NoGravity:1b}\"\n        }\n      }\n    ]\n  },\n  {\n    \"function\": \"minecraft:set_lore\",\n    \"mode\": \"append\",\n    \"entity\": \"this\",\n    \"lore\": [\n      [\n        {\n          \"text\": \"● \",\n          \"color\": \"gray\",\n          \"italic\": false\n        },\n        {\n          \"translate\": \"item.gm4.better_armour_stands.copied_armor_stand.property.invisible\",\n          \"fallback\": \"Invisible\",\n          \"color\": \"gray\",\n          \"italic\": false\n        }\n      ]\n    ],\n    \"conditions\": [\n      {\n        \"condition\": \"minecraft:entity_properties\",\n        \"entity\": \"this\",\n        \"predicate\": {\n          \"nbt\": \"{Invisible:1b}\"\n        }\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/item_modifier/count.json",
    "content": "{\n  \"function\": \"minecraft:set_count\",\n  \"count\": 1,\n  \"add\": false\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/item_modifier/remove_ignore.json",
    "content": "{\n  \"function\": \"minecraft:set_custom_data\",\n  \"tag\": \"{gm4_bas_ignore:0b}\"\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/item_modifier/remove_item.json",
    "content": "{\n  \"function\": \"minecraft:set_count\",\n  \"count\": -1,\n  \"add\": true\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/loot_table/replaced_item.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:stick\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_better_armour_stands_replaced_item:1b}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/coord_check.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"location\": {\n      \"position\": {\n        \"x\": {\n          \"min\": -2000000,\n          \"max\": 2000000\n        },\n        \"z\": {\n          \"min\": -2000000,\n          \"max\": 2000000\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/emptybook.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:writable_book\"\n        ],\n        \"components\": {\n          \"minecraft:writable_book_content\": {\n            \"pages\": []\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/mainhand/armor_stand_copy.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:armor_stand\"\n        ],\n        \"components\": {\n          \"minecraft:enchantment_glint_override\": true\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/mainhand/book_and_quill.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:writable_book\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/mainhand/book_arms.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:writable_book\"\n        ],\n        \"components\": {\n          \"minecraft:writable_book_content\": {\n            \"pages\": [\n              \"arms\"\n            ]\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/mainhand/book_ignore.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_bas_ignore:1b}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"components\": {\n              \"minecraft:writable_book_content\": {\n                \"pages\": []\n              }\n            }\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/mainhand/book_unlock.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:writable_book\"\n        ],\n        \"components\": {\n          \"minecraft:writable_book_content\": {\n            \"pages\": [\n              \"unlock\"\n            ]\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/mainhand/book_visible.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:writable_book\"\n        ],\n        \"components\": {\n          \"minecraft:writable_book_content\": {\n            \"pages\": [\n              \"visible\"\n            ]\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/offhand/armor_stand.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:armor_stand\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/offhand/nothing.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"count\": 0\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/base.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"type_specific\": {\n      \"type\": \"player\",\n      \"looking_at\": {\n        \"nbt\": \"{Tags:[\\\"gm4_bas_base\\\"]}\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/body.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"type_specific\": {\n      \"type\": \"player\",\n      \"looking_at\": {\n        \"nbt\": \"{Tags:[\\\"gm4_bas_body\\\"]}\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/head.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"type_specific\": {\n      \"type\": \"player\",\n      \"looking_at\": {\n        \"nbt\": \"{Tags:[\\\"gm4_bas_head\\\"]}\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/left_arm.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"type_specific\": {\n      \"type\": \"player\",\n      \"looking_at\": {\n        \"nbt\": \"{Tags:[\\\"gm4_bas_left_arm\\\"]}\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/left_leg.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"type_specific\": {\n      \"type\": \"player\",\n      \"looking_at\": {\n        \"nbt\": \"{Tags:[\\\"gm4_bas_left_leg\\\"]}\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/right_arm.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"type_specific\": {\n      \"type\": \"player\",\n      \"looking_at\": {\n        \"nbt\": \"{Tags:[\\\"gm4_bas_right_arm\\\"]}\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/right_leg.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"type_specific\": {\n      \"type\": \"player\",\n      \"looking_at\": {\n        \"nbt\": \"{Tags:[\\\"gm4_bas_right_leg\\\"]}\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/sneaking.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"flags\": {\n      \"is_sneaking\": true\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/tags/function/apply_book.json",
    "content": "{\n  \"values\": [\n    \"gm4_better_armour_stands:book/apply\"\n  ]\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/data/gm4_better_armour_stands/tags/function/default.json",
    "content": "{\n  \"values\": [\n    \"gm4_better_armour_stands:default/all\"\n  ]\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/mod.mcdoc",
    "content": "use ::java::world::entity::mob::armor_stand::Pose\nuse ::java::world::entity::AnyEntity\nuse ::java::util::Filterable\n\ndispatch minecraft:storage[gm4_better_armour_stands:default] to struct {\n  Pose?: Pose\n}\n\ndispatch minecraft:storage[gm4_better_armour_stands:temp] to struct {\n  pages?: [Filterable<string>],\n  entity_data?: AnyEntity,\n  CurrentPose?: Pose,\n  Pose?: Pose,\n  Undo?: any,\n  Data?: struct {\n    Pose?: Pose,\n    Rotation?: [float] @ 2,\n    Pos?: [double] @ 3,\n  },\n}\n"
  },
  {
    "path": "gm4_better_armour_stands/translations.csv",
    "content": "key,en_us\nadvancement.gm4.better_armour_stands.description,Customize an armour stand\nadvancement.gm4.better_armour_stands.title,Gettin' Handsy\nitem.gm4.better_armour_stands.copied_armor_stand.author,Copied by: \nitem.gm4.better_armour_stands.copied_armor_stand.property.custom_pose,Custom pose\nitem.gm4.better_armour_stands.copied_armor_stand.property.invisible,Invisible\nitem.gm4.better_armour_stands.copied_armor_stand.property.no_base,No base plate\nitem.gm4.better_armour_stands.copied_armor_stand.property.no_gravity,No gravity\nitem.gm4.better_armour_stands.copied_armor_stand.property.small,Small\ntooltip.gm4.better_armour_stands.invalid_code,Invalid code\ntooltip.gm4.better_armour_stands.invalid_right_click_location,Right click the joint of a part to start editing\ntext.gm4.guidebook.module_desc.better_armour_stands,Ever felt like Armour Stands looked a bit boring? Better Armour Stands lets your Armour Stands strike all the poses you want! Simply use a Book and Quill to edit Armour Stands.\ntext.gm4.guidebook.better_armour_stands.description,\"Armour stands will have arms by default, and can be altered with a book and quill.\\n\\nThis allows one to create custom statues and interesting displays.\"\ntext.gm4.guidebook.better_armour_stands.applying,\"To modify an armour stand, write one of the codes in a book and quill, then use it on the armour stand.\\n\\nMultiple codes can be written on separate pages to apply multiple modifiers at once.\"\ntext.gm4.guidebook.better_armour_stands.toggle_codes,The following codes will toggle the specific feature:\ntext.gm4.guidebook.better_armour_stands.arms,Toggle the arms of the armour stand\ntext.gm4.guidebook.better_armour_stands.copy_code,Click to copy\ntext.gm4.guidebook.better_armour_stands.base,Toggle the base plate of the armour stand\ntext.gm4.guidebook.better_armour_stands.size,Toggle the size of the armour stand\ntext.gm4.guidebook.better_armour_stands.gravity,Toggle the gravity of the armour stand\ntext.gm4.guidebook.better_armour_stands.visible,Toggle the visibility of the armour stand.\\nHolding a book with this code will reveal\\nnearby invisible armour stands.\ntext.gm4.guidebook.better_armour_stands.turn,Toggle rotating of the armour stand\ntext.gm4.guidebook.better_armour_stands.lock,Disable interactions with the armour stand\ntext.gm4.guidebook.better_armour_stands.unlock,Enable interactions with the armour stand.\\nHolding a book with this code will reveal\\nnearby locked armour stands.\ntext.gm4.guidebook.better_armour_stands.part_editing,The following codes activate editing of armour stand parts:\ntext.gm4.guidebook.better_armour_stands.pose,\"Edit a part of the armour stand by looking at its \"\"joint\"\".\\n- Hold sneak to enable \"\"snapping\"\"\\n- Left click to invert this pose\\n- Right click to stop editing\"\ntext.gm4.guidebook.better_armour_stands.pose_mirror,\"Edit a part of the armour stand by looking at its \"\"joint\"\".\\nIf an arm/leg is selected, the other arm/leg pose is mirrored.\\n- Hold sneak to enable \"\"snapping\"\"\\n- Left click to invert this pose\\n- Right click to stop editing\"\ntext.gm4.guidebook.better_armour_stands.move,\"Move the armour stand around you.\\n- Hold sneak to enable \"\"snapping\"\"\\n- Right click to stop editing\"\ntext.gm4.guidebook.better_armour_stands.rotate,\"Rotate the armour stand.\\n- Hold sneak to enable \"\"snapping\"\"\\n- Right click to stop editing\"\ntext.gm4.guidebook.better_armour_stands.flip,Flip the full pose of the armour stand\ntext.gm4.guidebook.better_armour_stands.default,- Look at a part of the armour stand to reset this pose.\\n- Sneak to fully reset the armour stand.\ntext.gm4.guidebook.better_armour_stands.equipping,Items can be placed in the head or arm slots:\ntext.gm4.guidebook.better_armour_stands.equip,Look at the head or shoulders of the armour stand to place an item from the offhand into this slot.\ntext.gm4.guidebook.better_armour_stands.copy_and_paste,Armour stand data can be copied and pasted:\ntext.gm4.guidebook.better_armour_stands.copy,Copy modified features onto the armour stand items in your offhand.\ntext.gm4.guidebook.better_armour_stands.paste,Copy features from the copied armour stand items in your offhand to the armour stand.\n"
  },
  {
    "path": "gm4_block_compressors/README.md",
    "content": "# Block Compressors<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nStore even more blocks in a single slot by squishing them within an inch of their cubic-self.<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- The same item type can be compressed to 1/64 of its size - eg 64 wool blocks becomes 1 compressed wool block, which itself can be stacked to 64.\r\n- Adds a machine block that can automate compression for storage systems \r\n- A chest full of shulker boxes, each full of *64 compressed items, can hold 2,985,984 items... think of the efficiency!\r\n"
  },
  {
    "path": "gm4_block_compressors/assets/gm4_block_compressors/models/block/block_compressor_full.json",
    "content": "{\n\t\"parent\": \"gm4:block/cube_with_plate\",\n\t\"textures\": {\n\t\t\"side\": \"gm4_block_compressors:block/block_compressor_side\",\n\t\t\"bottom\": \"minecraft:block/furnace_top\",\n\t\t\"top\": \"gm4_block_compressors:block/block_compressor_top\",\n\t\t\"front\": \"gm4_block_compressors:block/block_compressor_side\",\n\t\t\"plate\": \"gm4_block_compressors:block/block_compressor_plate\",\n\t\t\"particle\": \"gm4_block_compressors:block/block_compressor_side\"\n\t}\n}\n"
  },
  {
    "path": "gm4_block_compressors/assets/gm4_block_compressors/models/block/block_compressor_plate.json",
    "content": "{\n\t\"parent\": \"gm4:block/plate\",\n\t\"textures\": {\n\t\t\"top\": \"gm4_block_compressors:block/block_compressor_plate\",\n\t\t\"particle\": \"gm4_block_compressors:block/block_compressor_plate\"\n\t}\n}\n"
  },
  {
    "path": "gm4_block_compressors/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.block_compressors.compressed_diet.description,Eat too much of everything. This can't be good for you...\nadvancement.gm4.block_compressors.compressed_diet.title,A Compressed Diet\nadvancement.gm4.block_compressors.description,Make yourself a Block Compressor\nadvancement.gm4.block_compressors.title,Clever Crushing\nblock.gm4.block_compressor,Compressor\ncontainer.gm4.block_compressor,Compression Amount\ntext.gm4.block_compressors.compressed,Compressed ×%s\ntext.gm4.guidebook.module_desc.block_compressors,\"Chest space won't be an issue with this module! Use a Block Compressor to compress stacks of items, turning a stack of items into a single item for long-term storage. Make sure to uncompress your items before using them again, though!\"\ntext.gm4.guidebook.block_compressors.description,\"Block Compressors can be used to cut down on bulk storage. Item stacks can be compressed into a single item, and vice versa.\"\ntext.gm4.guidebook.block_compressors.crafting,A Block Compressor can be crafted in a crafting table:\ntext.gm4.guidebook.block_compressors.usage,\"To select the amount of compression, put that amount of items inside the block compressor, then drop the items on top of the compressor.\\n\\nPutting 1 item in the compressor will decompress any items on top.\"\n"
  },
  {
    "path": "gm4_block_compressors/beet.yaml",
    "content": "id: gm4_block_compressors\nname: Block Compressors\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_machines\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_machines: 1.5.0\n      schedule_loops: [main]\n    translation_linter_ignores:\n      - text.gm4.block_compressors.compressed\n    model_data:\n      - item: purpur_block\n        reference: block/block_compressor_plate\n        transforms:\n          - name: item_display\n            origin: [0.5, 0.5, 0.5]\n            scale: [0.625, 0.625, 0.625]\n            translation: [0, -0.225, 0]\n            rotation: [180, 0, 0]\n      - item: stone\n        reference: block/block_compressor\n        template: block\n        textures:\n          top: gm4_block_compressors:block/block_compressor_top\n          bottom: minecraft:block/furnace_top\n          front: gm4_block_compressors:block/block_compressor_side\n          side: gm4_block_compressors:block/block_compressor_side\n        transforms:\n          - name: item_display\n            origin: [0.5, 0.5, 0.5]\n            scale: [0.5, 0.5, 0.5]\n      - item: player_head\n        reference: block/block_compressor_full\n      - item: piston\n        reference: gui/advancement/block_compressors\n        template:\n          name: advancement\n          forward: block/block_compressor_full\n    gui_fonts:\n      - translation: gui.gm4.block_compressor\n        container: dropper\n        texture: gui/container/block_compressor\n    website:\n      description: Chest space won't be an issue with this module! Use a Block Compressor to compress stacks of items, turning a stack of items into a single item for long-term storage. Make sure to uncompress your items before using them again, though!\n      recommended:\n        - gm4_resource_pack\n        - gm4_standard_crafting\n        - gm4_ender_hoppers\n        - gm4_enchantment_extractors\n        - gm4_forming_press\n        - gm4_disassemblers\n        - gm4_tunnel_bores\n        - gm4_boots_of_ostara\n        - gm4_heart_canisters\n        - gm4_smelteries\n        - gm4_liquid_tanks\n      notes: []\n    modrinth:\n      project_id: TSz8iiMD\n    planetminecraft: \n      uid: 4344954\n    video: https://www.youtube.com/watch?v=sdrTJYjL8C0\n    wiki: https://wiki.gm4.co/wiki/Block_Compressors\n    credits:\n      Creator:\n        - Sparks\n      Updated by:\n        - SunderB\n        - Misode\n        - JP12\n        - BPR\n      Textures by:\n        - Kyrius\n      Icon Design:\n        - Sparks\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4/advancement/block_compressors.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"piston\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_block_compressors:gui/advancement/block_compressors\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.block_compressors.title\",\n      \"fallback\": \"Clever Crushing\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.block_compressors.description\",\n      \"fallback\": \"Make yourself a Block Compressor\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"obtain_block_compressor\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"block_compressor\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4/advancement/block_compressors_compressed_diet.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:apple\",\n      \"components\": {\n        \"minecraft:enchantment_glint_override\": true\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.block_compressors.compressed_diet.title\",\n      \"fallback\": \"A Compressed Diet\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.block_compressors.compressed_diet.description\",\n      \"fallback\": \"Eat too much of everything. This can't be good for you...\",\n      \"color\": \"gray\"\n    },\n    \"frame\": \"challenge\",\n    \"hidden\": true\n  },\n  \"parent\": \"gm4:block_compressors\",\n  \"criteria\": {\n    \"apple\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:apple\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"bread\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:bread\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"porkchop\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:porkchop\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"cooked_porkchop\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:cooked_porkchop\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"golden_apple\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:golden_apple\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"cod\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:cod\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"salmon\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:salmon\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"tropical_fish\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:tropical_fish\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"pufferfish\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:pufferfish\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"cooked_cod\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:cooked_cod\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"cooked_salmon\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:cooked_salmon\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"cookie\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:cookie\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"melon_slice\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:melon_slice\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"beef\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:beef\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"cooked_beef\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:cooked_beef\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"chicken\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:chicken\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"cooked_chicken\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:cooked_chicken\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"rotten_flesh\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:rotten_flesh\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"spider_eye\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:spider_eye\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"carrot\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:carrot\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"potato\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:potato\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"baked_potato\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:baked_potato\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"poisonous_potato\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:poisonous_potato\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"golden_carrot\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:golden_carrot\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"pumpkin_pie\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:pumpkin_pie\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"rabbit\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:rabbit\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"cooked_rabbit\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:cooked_rabbit\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"mutton\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:mutton\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"cooked_mutton\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:cooked_mutton\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"chorus_fruit\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:chorus_fruit\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"beetroot\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:beetroot\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"dried_kelp\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:dried_kelp\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"sweet_berries\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:sweet_berries\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    },\n    \"honey_bottle\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:honey_bottle\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:16}}\"\n          }\n        }\n      }\n    },\n    \"glow_berries\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:glow_berries\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_block_compressors:{compression_level:64}}\"\n          }\n        }\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"apple\"\n    ],\n    [\n      \"bread\"\n    ],\n    [\n      \"porkchop\"\n    ],\n    [\n      \"cooked_porkchop\"\n    ],\n    [\n      \"golden_apple\"\n    ],\n    [\n      \"cod\"\n    ],\n    [\n      \"salmon\"\n    ],\n    [\n      \"tropical_fish\"\n    ],\n    [\n      \"pufferfish\"\n    ],\n    [\n      \"cooked_cod\"\n    ],\n    [\n      \"cooked_salmon\"\n    ],\n    [\n      \"cookie\"\n    ],\n    [\n      \"melon_slice\"\n    ],\n    [\n      \"beef\"\n    ],\n    [\n      \"cooked_beef\"\n    ],\n    [\n      \"chicken\"\n    ],\n    [\n      \"cooked_chicken\"\n    ],\n    [\n      \"rotten_flesh\"\n    ],\n    [\n      \"spider_eye\"\n    ],\n    [\n      \"carrot\"\n    ],\n    [\n      \"potato\"\n    ],\n    [\n      \"baked_potato\"\n    ],\n    [\n      \"poisonous_potato\"\n    ],\n    [\n      \"golden_carrot\"\n    ],\n    [\n      \"pumpkin_pie\"\n    ],\n    [\n      \"rabbit\"\n    ],\n    [\n      \"cooked_rabbit\"\n    ],\n    [\n      \"mutton\"\n    ],\n    [\n      \"cooked_mutton\"\n    ],\n    [\n      \"chorus_fruit\"\n    ],\n    [\n      \"beetroot\"\n    ],\n    [\n      \"dried_kelp\"\n    ],\n    [\n      \"sweet_berries\"\n    ],\n    [\n      \"honey_bottle\"\n    ],\n    [\n      \"glow_berries\"\n    ]\n  ],\n  \"rewards\": {\n    \"experience\": 500\n  }\n}\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/advancement/recipes/compressor.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_block_compressors:compressor\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:purpur_block\",\n              \"minecraft:purpur_pillar\",\n              \"minecraft:piston\",\n              \"minecraft:obsidian\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_block_compressors:compressor\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/init.mcfunction",
    "content": "execute unless score block_compressors gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Block Compressors\"}\nexecute unless score block_compressors gm4_earliest_version < block_compressors gm4_modules run scoreboard players operation block_compressors gm4_earliest_version = block_compressors gm4_modules\nscoreboard players set block_compressors gm4_modules 1\n\nscoreboard objectives add gm4_bc_data dummy\n\nschedule function gm4_block_compressors:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/item/compress.mcfunction",
    "content": "# @s = item entity to be compressed\n# at location of dropper (compressor)\n# run from block_compressors:item\n# compresses item by setting count, storing current item tag, and adding lore/enchantment glint\n\n# copy existing data for restoration at decompression, second line fixes bug where gm4_block_compressors gets saved to old_components\ndata modify storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_block_compressors.old_components set from storage gm4_block_compressors:temp/item_stack Item.components\ndata remove storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_block_compressors.old_components.\"minecraft:custom_data\".gm4_block_compressors\n\n# add tag to indicate store compression size\nexecute store result storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_block_compressors.compression_level int 1 run data get storage gm4_block_compressors:temp/item_stack Item.count\n\n# set count to 1 and add compressed item visuals \ndata merge storage gm4_block_compressors:temp/item_stack {Item:{count:1,components:{\"minecraft:enchantment_glint_override\":true}}}\nfunction gm4_block_compressors:item/set_lore with storage gm4_block_compressors:temp/item_stack Item.components.'minecraft:custom_data'.gm4_block_compressors\n\n# clone data to original item entity\ndata modify entity @s Item set from storage gm4_block_compressors:temp/item_stack Item\ndata modify entity @s PickupDelay set value 4\n\nplaysound block.piston.extend block @a\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/item/decompress.mcfunction",
    "content": "# @s = item entity to be decompressed\n# at location of dropper (compressor)\n# run from block_compressors:item\n# decompresses item by setting count and restoring old item tag\n\n# code automatically handles archaic items, this newer old items\ndata modify storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_block_compressors.compression_level set from storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_compressed.value\ndata modify storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_block_compressors.old_tag set from storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_precompression_tag\ndata modify storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_block_compressors.old_components.\"minecraft:custom_data\" merge from storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_block_compressors.old_tag\n\n# set item count\ndata modify storage gm4_block_compressors:temp/item_stack Item.count set from storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_block_compressors.compression_level\n\n# remove components if it does not have gm4_block_compressors.old_components\nexecute unless data storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_block_compressors.old_components run data remove storage gm4_block_compressors:temp/item_stack Item.components\n\n# restore original item components, overwriting components from compression\ndata modify storage gm4_block_compressors:temp/item_stack Item.components set from storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_block_compressors.old_components\ndata modify entity @s Item set from storage gm4_block_compressors:temp/item_stack Item\ndata modify entity @s PickupDelay set value 4\n\nplaysound entity.firework_rocket.blast block @a ~ ~ ~ 1 .1\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/item/set_lore.mcfunction",
    "content": "# Uses a macro to append the compressed lore line to the item in storage\n# @s = item entity to be compressed\n# run from gm4_block_compressors:item/compress\n\n$data modify storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:lore\" append value {translate:\"text.gm4.block_compressors.compressed\",fallback:\"Compressed ×%s\",with:[$(compression_level)],color:\"gray\",italic:false}\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/item/try_compress.mcfunction",
    "content": "# @s = item above block compressor\n# at location of dropper (compressor)\n# run from process\n# checks if item's count is matched anywhere in dropper, then compresses\n\ndata modify storage gm4_block_compressors:temp/compressor Items set from block ~ ~ ~ Items\n\nexecute if data storage gm4_block_compressors:temp/compressor Items[0] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[0].count set from storage gm4_block_compressors:temp/item_stack Item.count\nexecute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[1] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[1].count set from storage gm4_block_compressors:temp/item_stack Item.count\nexecute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[2] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[2].count set from storage gm4_block_compressors:temp/item_stack Item.count\nexecute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[3] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[3].count set from storage gm4_block_compressors:temp/item_stack Item.count\nexecute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[4] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[4].count set from storage gm4_block_compressors:temp/item_stack Item.count\nexecute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[5] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[5].count set from storage gm4_block_compressors:temp/item_stack Item.count\nexecute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[6] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[6].count set from storage gm4_block_compressors:temp/item_stack Item.count\nexecute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[7] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[7].count set from storage gm4_block_compressors:temp/item_stack Item.count\nexecute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[8] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[8].count set from storage gm4_block_compressors:temp/item_stack Item.count\n\nexecute if score @s gm4_bc_data matches 0 run function gm4_block_compressors:item/compress\ndata remove storage gm4_block_compressors:temp/compressor Items\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/item/try_decompress.mcfunction",
    "content": "# @s = item above block compressor\n# at location of dropper (compressor)\n# run from process\n# checks if item is a compressed item, prevents further checks\n\nscoreboard players set $decompressing gm4_bc_data 1\n\ndata modify storage gm4_block_compressors:temp/compressor Items set from block ~ ~ ~ Items\n\nexecute if data storage gm4_block_compressors:temp/compressor {Items:[{count:1}]} if data storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_block_compressors run function gm4_block_compressors:item/decompress\n# grandfather in older items\nexecute if data storage gm4_block_compressors:temp/compressor {Items:[{count:1}]} if data storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_compressed run function gm4_block_compressors:item/decompress\n\ndata remove storage gm4_block_compressors:temp/compressor Items\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/item.mcfunction",
    "content": "# @s = item above block compressor\n# at location of dropper (compressor)\n# run from process\n# tries to compress/decompress the current item entity.\n# $decompressing's states are 0:try compresss, 1:try decompress\n\ndata modify storage gm4_block_compressors:temp/item_stack Item set from entity @s Item\n\nscoreboard players set $decompressing gm4_bc_data 0\nexecute if data storage gm4_block_compressors:temp/item_stack Item{count:1} run function gm4_block_compressors:item/try_decompress\nexecute unless score $decompressing gm4_bc_data matches 1 unless data storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_block_compressors unless data storage gm4_block_compressors:temp/item_stack Item.components.\"minecraft:custom_data\".gm4_compressed run function gm4_block_compressors:item/try_compress\n\nscoreboard players reset $decompressing gm4_bc_data\ndata remove storage gm4_block_compressors:temp/item_stack Item\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/machine/create.mcfunction",
    "content": "# places the block_compressor down\n# @s = player who placed the block_compressor\n# located at the center of the placed block\n# run from gm4_block_compressors:machine/verify_place_down\n\n# place dropper\nsetblock ~ ~ ~ dropper[facing=down]{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.block_compressor\",\"fallback\":\"Compression Amount\"},[{\"text\":\" \",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.block_compressor\",\"fallback\":\"Compression Amount\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.block_compressor\",\"fallback\":\"Compression Amount\",\"font\":\"gm4:offscreen\"},{\"translate\":\"gui.gm4.block_compressor\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"text\":\" \",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.block_compressor\",\"fallback\":\"Compression Amount\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.block_compressor\",\"fallback\":\"Compression Amount\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon display armor stand and marker entity\nsummon item_display ~ ~ ~ {Tags:[\"gm4_block_compressor_plate\",\"gm4_machine_stand\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_block_compressor_plate\",item:{id:\"minecraft:purpur_block\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_block_compressors:block/block_compressor_plate\"]}}},transformation:{right_rotation:[0f,0f,0f,1f],left_rotation:[1f,0f,0f,0f],translation:[0.0,0.225,0.0],scale:[0.625,0.625,0.625]},brightness:{block:15,sky:15},item_display:\"head\"}\nsummon item_display ~ ~ ~ {Tags:[\"gm4_block_compressor_display\",\"gm4_machine_stand\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_block_compressor_display\",item:{id:\"minecraft:stone\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_block_compressors:block/block_compressor\"]}}},transformation:{right_rotation:[0f,0f,0f,1f],left_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0.5,0.5,0.5]},brightness:{block:15,sky:15},item_display:\"head\"}\nsummon marker ~ ~ ~ {Tags:[\"gm4_block_compressor\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_block_compressor\",Rotation:[0.0f,0.0f]}\n\n# mark block as placed\nplaysound minecraft:block.piston.contract block @a[distance=..5]\nscoreboard players set $placed_block gm4_machine_data 1\nscoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2\ntag @e[distance=..2] remove gm4_new_machine\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/machine/destroy.mcfunction",
    "content": "# destroys the block_compressor\n# @s = block_compressor marker\n# located at @s\n# run from gm4_block_compressors:machine/verify_destroy\n\n# kill entities related to machine block\nexecute positioned ~ ~ ~ run kill @e[type=item_display,tag=gm4_block_compressor_plate,limit=1,distance=..0.1]\nexecute positioned ~ ~ ~ run kill @e[type=item_display,tag=gm4_block_compressor_display,limit=1,distance=..0.1]\nexecute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:\"minecraft:dropper\",count:1,components:{}}},limit=1,sort=nearest]\nkill @s\n\n# drop item (unless broken in creative mode)\nparticle minecraft:block{block_state:\"minecraft:piston\"} ~ ~ ~ .1 .25 .1 .05 30 normal @a\nexecute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_block_compressors:items/block_compressor\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/machine/verify_destroy.mcfunction",
    "content": "# verifies that the destroyed machine was from this module\n# @s = machine block marker\n# located at @s\n# run from #gm4_machines:destroy\n\nexecute if entity @s[tag=gm4_block_compressor] run function gm4_block_compressors:machine/destroy\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/machine/verify_place_down.mcfunction",
    "content": "# verifies that the placed down machine was from this module\n# @s = player who placed down the machine\n# located at the machine block marker (at the center of the placed down block)\n# run from #gm4_machines:place_down\n\nexecute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:\"block_compressor\"} run function gm4_block_compressors:machine/create\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/main.mcfunction",
    "content": "# process machine\nexecute as @e[type=marker,tag=gm4_block_compressor] at @s run function gm4_block_compressors:process\n\nschedule function gm4_block_compressors:main 16t\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/pressure_plate_down.mcfunction",
    "content": "# @s = compressor armor stand that needs to be moved down\n# located at @s\n# run from process\n\ntp @s ~ ~-0.03 ~\ntag @s add gm4_compressor_depressed\ntag @e[type=marker,tag=gm4_block_compressor_processing,limit=1] add gm4_compressor_sound\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/pressure_plate_up.mcfunction",
    "content": "# @s = compressor armor stand that needs to be reset\n# located at @s\n# run from process\n\ntp @s ~ ~0.03 ~\ntag @s remove gm4_compressor_depressed\ntag @e[type=marker,tag=gm4_block_compressor_processing,limit=1] remove gm4_compressor_sound\nplaysound block.stone_pressure_plate.click_off block @a[distance=..6] ~ ~0.35 ~ 0.7 0.3\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/process.mcfunction",
    "content": "# @s = block compressor\n# located at @s\n# run from main\n\ntag @s add gm4_block_compressor_processing\nexecute positioned ~-0.5 ~0.5 ~-0.5 as @e[type=item,dx=0] positioned ~0.5 ~-0.9 ~0.5 run function gm4_block_compressors:item\nparticle portal ~ ~0.7 ~ 0 0 0 0.1 20\n\n# simulate pressure plate\nexecute positioned ~ ~-0.03 ~ as @e[type=item_display,tag=gm4_block_compressor_plate,tag=gm4_compressor_depressed,distance=..0.01,limit=1] positioned ~-0.5 ~0.5 ~-0.5 unless entity @e[dx=0] at @s run function gm4_block_compressors:pressure_plate_up\nexecute positioned ~-0.5 ~0.5 ~-0.5 if entity @e[dx=0] positioned ~0.5 ~-0.5 ~0.5 as @e[type=item_display,tag=gm4_block_compressor_plate,tag=!gm4_compressor_depressed,distance=..0.01,limit=1] at @s run function gm4_block_compressors:pressure_plate_down\nexecute if entity @s[tag=gm4_compressor_sound] run playsound block.stone_pressure_plate.click_on block @a[distance=..6] ~ ~0.35 ~ 0.7 0.6\n\n# clean up\ntag @s remove gm4_compressor_sound\ntag @s remove gm4_block_compressor_processing\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/function/upgrade_paths/1.4.mcfunction",
    "content": "execute as @e[type=armor_stand,tag=gm4_block_compressor_stand] at @s positioned ~ ~0.965 ~ align y run summon item_display ~ ~0.5 ~ {Tags:[\"gm4_block_compressor_plate\",\"gm4_machine_stand\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_block_compressor_plate\",item:{id:\"minecraft:purpur_block\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_block_compressors:block/block_compressor_plate\"]}}},transformation:{right_rotation:[0f,0f,0f,1f],left_rotation:[1f,0f,0f,0f],translation:[0.0,0.225,0.0],scale:[0.625,0.625,0.625]},brightness:{block:15,sky:15},item_display:\"head\"}\nexecute as @e[type=armor_stand,tag=gm4_block_compressor_display] at @s align y run summon item_display ~ ~0.5 ~ {Tags:[\"gm4_block_compressor_display\",\"gm4_machine_stand\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_block_compressor_display\",item:{id:\"minecraft:stone\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_block_compressors:block/block_compressor\"]}}},transformation:{right_rotation:[0f,0f,0f,1f],left_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0.5,0.5,0.5]},brightness:{block:15,sky:15},item_display:\"head\"}\n\nexecute as @e[type=armor_stand,tag=gm4_block_compressor_display] at @s run scoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2\nexecute as @e[type=armor_stand,tag=gm4_block_compressor_display] at @s run tag @e[distance=..2] remove gm4_new_machine\n\nkill @e[type=armor_stand,tag=gm4_block_compressor_display]\nkill @e[type=armor_stand,tag=gm4_block_compressor_stand]\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/guidebook/block_compressors.json",
    "content": "{\n  \"id\": \"block_compressors\",\n  \"name\": \"Block Compressors\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:piston\"\n  },\n  \"criteria\": {\n    \"obtain_obsidian\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:obsidian\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_piston\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:piston\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_block_compressor\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"block_compressor\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"open_block_compressor\": {\n      \"trigger\": \"minecraft:default_block_use\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:dropper\"\n                ],\n                \"nbt\": \"{CustomName:{\\\"translate\\\":\\\"gm4.second\\\",\\\"fallback\\\":\\\"%1$s\\\",\\\"with\\\":[{\\\"translate\\\":\\\"container.gm4.block_compressor\\\",\\\"fallback\\\":\\\"Compression Amount\\\"},{\\\"text\\\":\\\" \\\",\\\"extra\\\":[{\\\"translate\\\":\\\"container.gm4.block_compressor\\\",\\\"fallback\\\":\\\"Compression Amount\\\",\\\"font\\\":\\\"gm4:half_invert\\\"},{\\\"translate\\\":\\\"container.gm4.block_compressor\\\",\\\"fallback\\\":\\\"Compression Amount\\\",\\\"font\\\":\\\"gm4:offscreen\\\"},{\\\"translate\\\":\\\"gui.gm4.block_compressor\\\",\\\"fallback\\\":\\\"\\\",\\\"font\\\":\\\"gm4:container_gui\\\",\\\"color\\\":\\\"white\\\"},{\\\"text\\\":\\\" \\\",\\\"font\\\":\\\"gm4:half_invert\\\"},{\\\"translate\\\":\\\"container.gm4.block_compressor\\\",\\\"fallback\\\":\\\"Compression Amount\\\",\\\"font\\\":\\\"gm4:half_invert\\\"},{\\\"translate\\\":\\\"container.gm4.block_compressor\\\",\\\"fallback\\\":\\\"Compression Amount\\\",\\\"font\\\":\\\"gm4:default\\\",\\\"color\\\":\\\"#404040\\\"}],\\\"font\\\":\\\"gm4:half_invert\\\"}]}}\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.block_compressors.description\",\n            \"fallback\": \"Block Compressors can be used to cut down on bulk storage. Item stacks can be compressed into a single item, and vice versa.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"crafting\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_obsidian\",\n          \"obtain_piston\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.block_compressors.crafting\",\n            \"fallback\": \"A Block Compressor can be crafted in a crafting table:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_block_compressors:compressor\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"description\"\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"open_block_compressor\",\n          \"obtain_block_compressor\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.block_compressors.usage\",\n            \"fallback\": \"To select the amount of compression, put that amount of items inside the block compressor, then drop the items on top of the compressor.\\n\\nPutting 1 item in the compressor will decompress any items on top.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"crafting\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/loot_table/items/block_compressor.json",
    "content": "{\n  \"type\": \"block\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_block_compressors:block/block_compressor_full\"]},\n                \"minecraft:profile\": \"$block_compressor\"\n              }\n            },\n            {\n              \"function\": \"set_custom_data\",\n              \"tag\": \"{gm4_machines:{id:'block_compressor'}}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"translate\": \"block.gm4.block_compressor\",\n                  \"fallback\": \"Compressor\",\n                  \"color\": \"white\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/recipe/compressor.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"redstone\",\n  \"pattern\": [\n    \"IPI\",\n    \"pOp\",\n    \"CCC\"\n  ],\n  \"key\": {\n    \"I\": \"minecraft:iron_ingot\",\n    \"P\": \"minecraft:purpur_block\",\n    \"p\": \"minecraft:piston\",\n    \"O\": \"minecraft:obsidian\",\n    \"C\": \"minecraft:cobblestone\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:player_head\",\n    \"components\": {\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_block_compressors:block/block_compressor_full\"]},\n      \"minecraft:profile\": \"$block_compressor\",\n      \"minecraft:custom_data\": \"{gm4_machines:{id:'block_compressor'}}\",\n      \"minecraft:custom_name\": {\"translate\":\"block.gm4.block_compressor\",\"fallback\":\"Compressor\",\"color\":\"white\",\"italic\":false}\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/test/compress_64.mcfunction",
    "content": "# @template gm4:test_platform\n# @skyaccess\n\nexecute positioned ~1.5 ~1.5 ~1.5 run function gm4_block_compressors:machine/create\nitem replace block ~1 ~1 ~1 container.0 with cobblestone 64\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:diamond\",count:64}}\n\nawait items entity @e[type=item,distance=..4] contents diamond[custom_data~{gm4_block_compressors:{compression_level:64}}]\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/test/compress_7.mcfunction",
    "content": "# @template gm4:test_platform\n# @skyaccess\n\nexecute positioned ~1.5 ~1.5 ~1.5 run function gm4_block_compressors:machine/create\nitem replace block ~1 ~1 ~1 container.0 with cobblestone 7\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:diamond\",count:7}}\n\nawait items entity @e[type=item,distance=..4] contents diamond[custom_data~{gm4_block_compressors:{compression_level:7}}]\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/test/decompress_64.mcfunction",
    "content": "# @template gm4:test_platform\n# @skyaccess\n\nexecute positioned ~1.5 ~1.5 ~1.5 run function gm4_block_compressors:machine/create\nitem replace block ~1 ~1 ~1 container.0 with cobblestone\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:diamond\",components:{\"minecraft:custom_data\":{gm4_block_compressors:{compression_level:64}}}}}\n\nawait items entity @e[type=item,distance=..4] contents minecraft:diamond[!custom_data~{gm4_block_compressors:{}}]\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/test/destroy.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n\nexecute positioned ~1.5 ~1.5 ~1.5 run function gm4_block_compressors:machine/create\ngive @s diamond_pickaxe\ndummy @s mine ~1 ~1 ~1\n\nassert items entity @e[type=item,distance=..3] contents minecraft:dropper[count=1]\n\nawait items entity @e[type=item,distance=..3] contents minecraft:player_head[count=1,custom_data~{gm4_machines:{id:\"block_compressor\"}}]\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/test/fixed_uuid_present.mcfunction",
    "content": "# Make sure that the armor stand with fixed UUID is present\nassert entity 344d47-4-4-4-f04ce104d\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_block_compressors/test/place.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n\nloot give @s loot gm4_block_compressors:items/block_compressor\nexecute at @s run tp @s ~ ~ ~ facing ~1 ~-0.5 ~1\ndummy @s use block ~1 ~1 ~1\n\nassert block ~1 ~1 ~1 dropper\nassert entity @e[tag=gm4_block_compressor,distance=..3]\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_machines/tags/function/destroy.json",
    "content": "{\n    \"values\": [\n        \"gm4_block_compressors:machine/verify_destroy\"\n    ]\n}\n"
  },
  {
    "path": "gm4_block_compressors/data/gm4_machines/tags/function/place_down.json",
    "content": "{\n    \"values\": [\n        \"gm4_block_compressors:machine/verify_place_down\"\n    ]\n}\n"
  },
  {
    "path": "gm4_block_compressors/mod.mcdoc",
    "content": "use ::java::world::item::ItemStack\n\ndispatch minecraft:storage[gm4_block_compressors:temp/item_stack] to struct {\n  Item?: ItemStack,\n  gm4_compressed?: boolean,\n}\n\ndispatch minecraft:storage[gm4_block_compressors:temp/compressor] to struct {\n  Items?: [ItemStack],\n}\n"
  },
  {
    "path": "gm4_blossoming_pots/README.md",
    "content": "# Blossoming Pots<!--$headerTitle--><!--$pmc:delete-->\n\nGreatly expands the selection of potable plants. Use Decorated Pots as abnormally large Flower Pots. Decorate in Style! <!--$pmc:headerSize-->\n\n<img src=\"images/blossoming_pots.webp\" alt=\"Plant in Decorated Pots and Flower Pots alike\" width=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- To pot a plant, interact with a Decorated Pot or empty Flower Pot while holding a supported item.\n- Flower Pots from this module can be emptied by interacting with an empty hand, just like vanilla Flower Pots. To empty a Decorated Pot of its plant, it must be broken.\n- Decorated Pot plants often have multiple stages for a plant.\n\nA full list of supported items can be found on the [Wiki](https://wiki.gm4.co/Blossoming_Pots#Supported_Items)\n"
  },
  {
    "path": "gm4_blossoming_pots/beet.yaml",
    "content": "id: gm4_blossoming_pots\nname: Blossoming Pots\nversion: 3.5.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    website:\n      description: Greatly expands the selection of potable plants. Use Decorated Pots as abnormally large flower pots. Decorate in Style!\n      recommended: \n        - gm4_lively_lily_pads\n      notes: []\n      search_keywords: \n        - flowering\n        - plant\n    modrinth:\n      project_id: wOnn6VDU\n    smithed:\n      pack_id: gm4_blossoming_pots\n    planetminecraft:\n      uid: 6135276\n    wiki: https://wiki.gm4.co/wiki/Blossoming_Pots\n    credits:\n      Creator:\n        - runcows\n      Icon Design:\n        - runcows\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/advancement/interact_with_decorated_pot.json",
    "content": "{\n  \"criteria\": {\n    \"use_pot\": {\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:decorated_pot\"\n                ]\n              }\n            }\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:any_block_use\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_blossoming_pots:decorated/as_player\"\n  }\n}\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/advancement/interact_with_flower_pot.json",
    "content": "{\n  \"criteria\": {\n    \"use_pot\": {\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:flower_pot\"\n                ]\n              }\n            }\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:any_block_use\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_blossoming_pots:flower/as_player\"\n  }\n}\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/advancement/interact_with_vanilla_flower_pot.json",
    "content": "{\n  \"criteria\": {\n    \"use_pot\": {\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": \"#gm4_blossoming_pots:potted_plants\"\n              }\n            }\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:any_block_use\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_blossoming_pots:vanilla_pot_handling/as_player\"\n  }\n}\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/as_player.mcfunction",
    "content": "# Raycasts for pot the player interacted with, then proceeds if necessary\n# @s = player who interacted with a decorated pot\n# at @s\n# run from advancement gm4_blossoming_pots:interact_with_decorated_pot\n\n# Reset advancement\nadvancement revoke @s only gm4_blossoming_pots:interact_with_decorated_pot\n\n# run upgrade paths if needed\nexecute if score blossoming_pots gm4_earliest_version matches 0 \\\n    as @e[type=minecraft:block_display,tag=rc_blossoming_pots.decorPotPlant0,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_decorated_pot\nexecute if score blossoming_pots gm4_earliest_version matches 0 \\\n    as @e[type=minecraft:marker,tag=rc_blossoming_pots.flowerPot,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_flower_pot\nexecute if score blossoming_pots gm4_earliest_version matches ..304000 \\\n    as @e[type=minecraft:marker,tag=gm4_blossoming_pots.data.flower_pot,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.4/remove_perma_marker\n\n# Reset temp\ndata remove storage gm4_blossoming_pots:decorated_pots temp\n\nfunction gm4_blossoming_pots:decorated/get_player_rotation\n# raycast\nexecute store result score @s gm4_blossoming_pots.range run attribute @s minecraft:block_interaction_range get 200\nexecute anchored eyes positioned ^ ^ ^ run function gm4_blossoming_pots:decorated/raycast\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/check_if_pot_empty.mcfunction",
    "content": "# Checks if decorated pot has any items inside before trying to instantiate macro\n# @s = temp marker inside decorated pot\n# at @s align xyz positioned ~.5 ~.5 ~.5\n# run from decorated/raycast\n\n# kills marker and returns, if pot empty\nexecute unless data block ~ ~ ~ item run return run kill @s\n\n# fail if smithed.block\nexecute align xyz if entity @e[tag=smithed.block,dx=0,dz=0,dy=0,limit=1] run return run kill @s\n\n# continues if not empty\nfunction gm4_blossoming_pots:decorated/set_count with block ~ ~ ~ item\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/get_player_rotation.mcfunction",
    "content": "# Gets player rotation data for later\n# @s = player who interacted with a decorated pot\n# at @s\n# run from decorated/as_player\n\n# player facing west\nexecute if entity @s[y_rotation=45..135] unless entity @s[y_rotation=45] run return run data modify storage gm4_blossoming_pots:decorated_pots temp.rotation set value 0\n# player facing north\nexecute if entity @s[y_rotation=135..225] unless entity @s[y_rotation=135] run return run data modify storage gm4_blossoming_pots:decorated_pots temp.rotation set value 90\n# player facing east\nexecute if entity @s[y_rotation=225..315] unless entity @s[y_rotation=225] run return run data modify storage gm4_blossoming_pots:decorated_pots temp.rotation set value 180\n# player facing south\nexecute if entity @s[y_rotation=315..405] unless entity @s[y_rotation=315] run return run data modify storage gm4_blossoming_pots:decorated_pots temp.rotation set value -90\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/in_decorated_pot.mcfunction",
    "content": "# Checks the temp markers physical location in the block, to see if it is in the collision box of the decorated pot\n# @s = temp marker summoned in parent function\n# at @s\n# run from decorated/raycast\n\n# merge marker data for if it doesn't get killed\ndata merge entity @s {Tags:[\"gm4_blossoming_pots.temp.decorated_pot\",\"smithed.strict\",\"smithed.entity\"],CustomName:{\"text\":\"gm4_blossoming_pots.temp_marker\"}}\n\n# if temp marker in physical hit box, return 1\n# dxdydz all 0 bc of MC-123441.\nexecute at @s align xyz positioned ~0.062499 ~ ~0.062499 if entity @s[dx=0,dy=0,dz=0] \\\n    at @s align xyz positioned ~-0.062499 ~ ~-0.062499 if entity @s[dx=0,dy=0,dz=0] \\\n    run return 1\n\n# else, kill marker, return fail\nkill @s\nreturn fail\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/prepare_data.mcfunction",
    "content": "# Sets up loop for plant stage changes\n# @s = temp marker inside decorated pot\n# at @s align xyz positioned ~.5 ~.5 ~.5\n# with {id, count}\n# run from decorated/set_count\n\n# early return if displays are already on desired stage, does not check plant type\n$execute if score @e[type=minecraft:block_display,distance=..0.1,tag=gm4_blossoming_pots.display.decorated_pot,limit=1] gm4_blossoming_pots.display_stage matches $(count) run return run kill @s\n\n# only use rotation from player if there's no plant there, else overwrite with the plant's rotation value\ndata modify storage gm4_blossoming_pots:decorated_pots temp.rotation set from entity @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.decorated_pot,distance=..0.1,limit=1] Rotation[0]\n\n# kill existing displays to recreate them\nkill @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.decorated_pot,distance=..0.1]\n\n# initialize other loop data\nexecute store result storage gm4_blossoming_pots:decorated_pots temp.display_number int 1 run scoreboard players set $display_number gm4_blossoming_pots.misc 0\nfunction gm4_blossoming_pots:decorated/set_temp_data with storage gm4_blossoming_pots:decorated_pots temp\n# temp storage should now contain {rotation, display_number, id, count, data}\n\n# store the number of displays needed\n$execute store result score $array_len gm4_blossoming_pots.misc run data get storage gm4_blossoming_pots:decorated_pots $(id).$(count)\n\nfunction gm4_blossoming_pots:decorated/set_displays with storage gm4_blossoming_pots:decorated_pots temp\n\n# play sound\n$function gm4_blossoming_pots:play_sound with storage gm4_blossoming_pots:decorated_pots $(id)\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/raycast.mcfunction",
    "content": "# Main loop for raycasting for the decorated pot the player interacted with\n# @s = player who interacted with a decorated pot\n# at @s anchored eyes, then marched forward 0.005 over and over\n# run from decorated/as_player and self\n\n# if current location is within the decorated pots hit box, summon a temp marker, set its data with the player rotation, and exit raycast\nexecute if block ~ ~ ~ minecraft:decorated_pot \\\n    summon minecraft:marker if function gm4_blossoming_pots:decorated/in_decorated_pot \\\n    at @s align xyz positioned ~.5 ~.5 ~.5 \\\n    run return run function gm4_blossoming_pots:decorated/check_if_pot_empty\n\nscoreboard players remove @s gm4_blossoming_pots.range 1\n\n# repeat until find decorated pot or out of range\nexecute if score @s gm4_blossoming_pots.range matches 1.. positioned ^ ^ ^0.005 run function gm4_blossoming_pots:decorated/raycast\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/set_count.mcfunction",
    "content": "# Decides if decorated/prepare_data should use maximum or count\n# @s = temp entity inside decorated pot\n# at @s align xyz positioned ~.5 ~.5 ~.5\n# with {id, count}\n# run from decorated/check_if_pot_empty and upgrade_paths/3.1/legacy_decorated_pot\n\n# early return for unsupported item\n$execute unless data storage gm4_blossoming_pots:decorated_pots $(id) run return run kill @s\n\n$execute store result score $max_count gm4_blossoming_pots.misc run data get storage gm4_blossoming_pots:decorated_pots $(id).maximum\n# if pot over maximum use maximum as count\n$execute unless score $max_count gm4_blossoming_pots.misc matches $(count).. \\\n    run data modify storage gm4_blossoming_pots:decorated_pots temp.count set from storage gm4_blossoming_pots:decorated_pots $(id).maximum\n# if not, just use count as is\n$execute if score $max_count gm4_blossoming_pots.misc matches $(count).. run data modify storage gm4_blossoming_pots:decorated_pots temp.count set value $(count)\n\n# set id as well\n$data merge storage gm4_blossoming_pots:decorated_pots {temp:{id:\"$(id)\"}}\n\nfunction gm4_blossoming_pots:decorated/prepare_data with storage gm4_blossoming_pots:decorated_pots temp\n\nkill @s\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/set_displays.mcfunction",
    "content": "# Main Loop for setting displays to desired stage\n# @s = temp entity inside decorated pot\n# at @s align xyz positioned ~.5 ~.5 ~.5\n# with {display_number, count, data}\n# run from decorated/prepare_data and self\n\n# create display\n$summon minecraft:block_display ~ ~ ~ $(data)\n# set display_stage score to prevent running the loop when the displays are already on the right stage number\n$scoreboard players set @e[type=minecraft:block_display,distance=..0.1,tag=gm4_blossoming_pots.display.decorated_pot.$(display_number),limit=1] gm4_blossoming_pots.display_stage $(count)\n\n# increment display_number\nexecute store result storage gm4_blossoming_pots:decorated_pots temp.display_number int 1 run scoreboard players add $display_number gm4_blossoming_pots.misc 1\n\n# sets temp.data to next display_number's data\nfunction gm4_blossoming_pots:decorated/set_temp_data with storage gm4_blossoming_pots:decorated_pots temp\n# run again if needed\nexecute unless score $display_number gm4_blossoming_pots.misc >= $array_len gm4_blossoming_pots.misc run function gm4_blossoming_pots:decorated/set_displays with storage gm4_blossoming_pots:decorated_pots temp\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/set_storage.mcfunction",
    "content": "# Sets command storage for decorated pot plants\n# @s = unspecified\n# at unspecified\n# run from init\n\n\n# Data storage layout\n    # gm4_blossoming_pots:decorated_pots <item_namespace>:<item_name>\n        # place_sound: sound file to play when succesfully adding plant or changing stage, include namespace\n        # maximum:  the number of stages / arrays. The maximum number of items the pot can take\n        # 1:[]  array of starting data for the all the block displays used in this stage, all data\n        # 2:[]  array of starting data for the all the block displays used in this stage, all data\n        # ......\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:pale_hanging_moss set value {\\\n    place_sound:\"minecraft:block.moss_carpet.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_hanging_moss\",\\\n                Properties:{\\\n                    tip:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,1.443f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_hanging_moss\",\\\n                Properties:{\\\n                    tip:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.1425f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_hanging_moss\",\\\n                Properties:{\\\n                    tip:\"false\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,1.443f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_hanging_moss\",\\\n                Properties:{\\\n                    tip:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.842f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_hanging_moss\",\\\n                Properties:{\\\n                    tip:\"false\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.1425f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_hanging_moss\",\\\n                Properties:{\\\n                    tip:\"false\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,1.443f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:pointed_dripstone set value {\\\n    place_sound:\"minecraft:block.pointed_dripstone.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pointed_dripstone\",\\\n                Properties:{\\\n                    vertical_direction:\"down\",\\\n                    thickness:\"frustum\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,1.4435f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pointed_dripstone\",\\\n                Properties:{\\\n                    vertical_direction:\"down\",\\\n                    thickness:\"tip\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.143f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pointed_dripstone\",\\\n                Properties:{\\\n                    vertical_direction:\"down\",\\\n                    thickness:\"middle\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,1.4435f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pointed_dripstone\",\\\n                Properties:{\\\n                    vertical_direction:\"down\",\\\n                    thickness:\"frustum\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.143f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pointed_dripstone\",\\\n                Properties:{\\\n                    vertical_direction:\"down\",\\\n                    thickness:\"tip\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.8425f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pointed_dripstone\",\\\n                Properties:{\\\n                    vertical_direction:\"down\",\\\n                    thickness:\"middle\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,1.4435f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pointed_dripstone\",\\\n                Properties:{\\\n                    vertical_direction:\"down\",\\\n                    thickness:\"middle\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.143f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pointed_dripstone\",\\\n                Properties:{\\\n                    vertical_direction:\"down\",\\\n                    thickness:\"frustum\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.8425f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pointed_dripstone\",\\\n                Properties:{\\\n                    vertical_direction:\"down\",\\\n                    thickness:\"tip\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,3.542f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:small_amethyst_bud set value {\\\n    place_sound:\"minecraft:block.small_amethyst_bud.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:small_amethyst_bud\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.4f,0.7435f,-0.4f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.8f,0.8f,0.8f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:medium_amethyst_bud set value {\\\n    place_sound:\"minecraft:block.medium_amethyst_bud.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:medium_amethyst_bud\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.4f,0.7435f,-0.4f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.8f,0.8f,0.8f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:large_amethyst_bud set value {\\\n    place_sound:\"minecraft:block.large_amethyst_bud.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:large_amethyst_bud\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.4f,0.7435f,-0.4f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.8f,0.8f,0.8f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:amethyst_cluster set value {\\\n    place_sound:\"minecraft:block.amethyst_cluster.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:amethyst_cluster\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.4f,0.7435f,-0.4f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.8f,0.8f,0.8f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\n# For all leaves, empty no rotated middle, no inverted\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:oak_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,2.2435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:spruce_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:spruce_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:spruce_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:spruce_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:spruce_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:spruce_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:spruce_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,2.2435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:birch_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:birch_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:birch_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:birch_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:birch_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:birch_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:birch_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,2.2435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:jungle_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:jungle_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:jungle_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:jungle_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:jungle_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:jungle_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:jungle_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,2.2435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:acacia_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:acacia_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:acacia_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:acacia_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:acacia_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:acacia_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:acacia_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,2.2435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dark_oak_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dark_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dark_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dark_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dark_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dark_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dark_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,2.2435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:mangrove_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:mangrove_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:mangrove_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:mangrove_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:mangrove_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:mangrove_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:mangrove_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,2.2435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:cherry_leaves set value {\\\n    place_sound:\"minecraft:block.cherry_leaves.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cherry_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cherry_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cherry_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cherry_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cherry_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cherry_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,2.2435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:pale_oak_leaves set value {\\\n    place_sound:\"minecraft:block.grass.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,2.2435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:azalea_leaves set value {\\\n    place_sound:\"minecraft:block.azalea_leaves.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,2.2435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:flowering_azalea_leaves set value {\\\n    place_sound:\"minecraft:block.azalea_leaves.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:flowering_azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:flowering_azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:flowering_azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:flowering_azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:flowering_azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:flowering_azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,2.2435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\n# Sapling second stages with vanilla tweaks has a lighting bug at certain angles, so the second stage rotates it back to 0\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:oak_sapling set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:oak_sapling\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:oak_sapling\",\\\n                Properties:{\\\n                    stage:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            },\\\n            Rotation:[0f,0f]\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:spruce_sapling set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:spruce_sapling\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:spruce_sapling\",\\\n                Properties:{\\\n                    stage:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            },\\\n            Rotation:[0f,0f]\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:birch_sapling set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:birch_sapling\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:birch_sapling\",\\\n                Properties:{\\\n                    stage:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            },\\\n            Rotation:[0f,0f]\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:jungle_sapling set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:jungle_sapling\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:jungle_sapling\",\\\n                Properties:{\\\n                    stage:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            },\\\n            Rotation:[0f,0f]\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:acacia_sapling set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:acacia_sapling\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:acacia_sapling\",\\\n                Properties:{\\\n                    stage:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            },\\\n            Rotation:[0f,0f]\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dark_oak_sapling set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dark_oak_sapling\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dark_oak_sapling\",\\\n                Properties:{\\\n                    stage:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            },\\\n            Rotation:[0f,0f]\\\n        }\\\n    ]\\\n}\n\n# lighting bug also affects the default mangrove propagule, so it gets rotated immediately to 0\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:mangrove_propagule set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:mangrove_propagule\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.4935f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            },\\\n            Rotation:[0f,0f]\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:mangrove_propagule\",\\\n                Properties:{\\\n                    stage:\"1\",\\\n                    age:\"4\",\\\n                    hanging:\"false\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.4935f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            },\\\n            Rotation:[0f,0f]\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:cherry_sapling set value {\\\n    place_sound:\"minecraft:block.cherry_sapling.place\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cherry_sapling\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cherry_sapling\",\\\n                Properties:{\\\n                    stage:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            },\\\n            Rotation:[0f,0f]\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:pale_oak_sapling set value {\\\n    place_sound:\"minecraft:block.cherry_sapling.place\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_oak_sapling\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_oak_sapling\",\\\n                Properties:{\\\n                    stage:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            },\\\n            Rotation:[0f,0f]\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:azalea set value {\\\n    place_sound:\"minecraft:block.azalea.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:azalea\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.7435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:azalea\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,0.7435f,-0.35f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:azalea\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.45f,0.7435f,-0.45f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.9f,0.9f,0.9f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:flowering_azalea set value {\\\n    place_sound:\"minecraft:block.flowering_azalea.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:flowering_azalea\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.7435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:flowering_azalea\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,0.7435f,-0.35f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:flowering_azalea\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.45f,0.7435f,-0.45f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.9f,0.9f,0.9f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:brown_mushroom set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:brown_mushroom\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:red_mushroom set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:red_mushroom\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:crimson_fungus set value {\\\n    place_sound:\"minecraft:block.fungus.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:crimson_fungus\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:warped_fungus set value {\\\n    place_sound:\"minecraft:block.fungus.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:warped_fungus\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:short_grass set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:short_grass\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.361f,0.65325f,-0.361f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.722f,0.722f,0.722f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:fern set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:fern\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.4935f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:short_dry_grass set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:short_dry_grass\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.4315f,0.6895625f,-0.4315f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.863f,0.863f,0.863f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:bush set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:bush\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_bush set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_bush\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dandelion set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dandelion\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:poppy set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:poppy\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:blue_orchid set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:blue_orchid\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:allium set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:allium\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.6185f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:azure_bluet set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:azure_bluet\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:red_tulip set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:red_tulip\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:orange_tulip set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:orange_tulip\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:white_tulip set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:white_tulip\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:pink_tulip set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pink_tulip\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:oxeye_daisy set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:oxeye_daisy\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:cornflower set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cornflower\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:lily_of_the_valley set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:lily_of_the_valley\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:torchflower set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:torchflower\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:cactus_flower set value {\\\n    place_sound:\"minecraft:block.cactus_flower.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cactus_flower\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:closed_eyeblossom set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:closed_eyeblossom\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:open_eyeblossom set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:open_eyeblossom\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:wither_rose set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:wither_rose\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:spore_blossom set value {\\\n    place_sound:\"minecraft:block.spore_blossom.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:spore_blossom\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.4f,1.54f,0.4f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.8f,0.8f,0.8f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:firefly_bush set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:firefly_bush\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.4325f,0.6895625f,-0.4325f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.863f,0.863f,0.863f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:bamboo set value {\\\n    place_sound:\"minecraft:block.bamboo_sapling.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:bamboo_sapling\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:bamboo\",\\\n                Properties:{\\\n                    leaves:\"none\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:bamboo\",\\\n                Properties:{\\\n                    leaves:\"small\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,1.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:bamboo\",\\\n                Properties:{\\\n                    leaves:\"none\",\\\n                    age:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:bamboo\",\\\n                Properties:{\\\n                    leaves:\"small\",\\\n                    age:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,1.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:bamboo\",\\\n                Properties:{\\\n                    leaves:\"small\",\\\n                    age:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,2.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:bamboo\",\\\n                Properties:{\\\n                    leaves:\"large\",\\\n                    age:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,3.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:sugar_cane set value {\\\n    place_sound:\"minecraft:block.grass.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sugar_cane\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.7435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sugar_cane\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.7435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sugar_cane\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.2435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sugar_cane\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.7435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sugar_cane\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.2435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sugar_cane\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.7435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n# Cactus\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:cactus set value {\\\n    place_sound:\"minecraft:block.wool.place\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:potted_cactus\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.3684f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:potted_cactus\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.3684f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:potted_cactus\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,1.05f,-0.2f],\\\n                left_rotation:[0.328f,0f,0f,0.945f],\\\n                scale:[0.4f,0.4f,0.4f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:potted_cactus\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,0.7f,-0.05f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.4f,0.4f,0.4f],\\\n                right_rotation:[-0.445f,0f,0f,0.895f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:crimson_roots set value {\\\n    place_sound:\"minecraft:block.roots.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:potted_crimson_roots\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.353f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:warped_roots set value {\\\n    place_sound:\"minecraft:block.roots.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:potted_warped_roots\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.353f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:weeping_vines set value {\\\n    place_sound:\"minecraft:block.weeping_vines.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:weeping_vines\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.1429f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:weeping_vines_plant\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,1.4434f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:weeping_vines\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.8424f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:weeping_vines_plant\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.1429f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:weeping_vines_plant\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,1.4434f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:weeping_vines\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,3.5419f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:weeping_vines_plant\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.8424f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:weeping_vines_plant\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.1429f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:weeping_vines_plant\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,1.4434f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:twisting_vines set value {\\\n    place_sound:\"minecraft:block.weeping_vines.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:twisting_vines\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:twisting_vines\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:twisting_vines_plant\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:twisting_vines\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,2.2435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:twisting_vines_plant\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,1.4935f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:twisting_vines_plant\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.375f,0.7435f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:tall_grass set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:tall_grass\",\\\n                Properties:{\\\n                    half:\"lower\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.361f,0.65325f,-0.361f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.722f,0.722f,0.722f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:tall_grass\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.361f,1.37525f,-0.361f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.722f,0.722f,0.722f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:large_fern set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:large_fern\",\\\n                Properties:{\\\n                    half:\"lower\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.6185f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:large_fern\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,1.6185f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:tall_dry_grass set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:tall_dry_grass\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.4315f,0.6895626f,-0.4315f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.863f,0.863f,0.863f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\n# default sunflower rotation is sunflower facing east, player should be facing west\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:sunflower set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sunflower\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sunflower\",\\\n                Properties:{\\\n                    half:\"lower\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.6185f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sunflower\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,1.6185f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:lilac set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:lilac\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:lilac\",\\\n                Properties:{\\\n                    half:\"lower\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.6185f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:lilac\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,1.6185f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:rose_bush set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:rose_bush\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.745f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:rose_bush\",\\\n                Properties:{\\\n                    half:\"lower\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.6185f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:rose_bush\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,1.6185f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:peony set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:peony\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.745f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:peony\",\\\n                Properties:{\\\n                    half:\"lower\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.556f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:peony\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,1.556f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:pitcher_plant set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pitcher_plant\",\\\n                Properties:{\\\n                    half:\"lower\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.6185f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pitcher_plant\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,1.6185f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:big_dripleaf set value {\\\n    place_sound:\"minecraft:block.big_dripleaf.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:big_dripleaf\",\\\n                Properties:{\\\n                    facing:\"east\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.019f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:big_dripleaf\",\\\n                Properties:{\\\n                    facing:\"east\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.271f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:big_dripleaf\",\\\n                Properties:{\\\n                    facing:\"east\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.56855f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:small_dripleaf set value {\\\n    place_sound:\"minecraft:block.small_dripleaf.place\",\\\n    maximum:2,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:small_dripleaf\",\\\n                Properties:{\\\n                    facing:\"east\",\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:small_dripleaf\",\\\n                Properties:{\\\n                    facing:\"east\",\\\n                    half:\"lower\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.306f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:small_dripleaf\",\\\n                Properties:{\\\n                    facing:\"east\",\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,1.306f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:chorus_flower set value {\\\n    place_sound:\"minecraft:block.chorus_flower.grow\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_flower\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.2435f,-0.75f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_flower\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.7435f,0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    up:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.7435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    north:\"true\",\\\n                    south:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.2435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    up:\"true\",\\\n                    north:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.2435f,0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_flower\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,2.2435f,-0.75f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_flower\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,2.7435f,0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    up:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.7435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    north:\"true\",\\\n                    south:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.2435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    up:\"true\",\\\n                    north:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.2435f,0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    up:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,2.2435f,0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    up:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.7435f,0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    up:\"true\",\\\n                    south:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.2435f,-0.75f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    up:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.7435f,-0.75f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_flower\"\\\n            },\\\n            transformation:{\\\n                translation:[0.25f,3.2435f,-0.75f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_flower\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.75f,2.2435f,-0.75f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    up:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.7435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    north:\"true\",\\\n                    south:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.2435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    up:\"true\",\\\n                    north:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.2435f,0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    up:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,2.2435f,0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    up:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.7435f,0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    up:\"true\",\\\n                    south:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.2435f,-0.75f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    up:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,1.7435f,-0.75f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    north:\"true\",\\\n                    south:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,2.7435f,0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    up:\"true\",\\\n                    north:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,2.7435f,0.75f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    up:\"true\",\\\n                    south:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,2.7435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    up:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,3.2435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    west:\"true\",\\\n                    east:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,2.2435f,-0.75f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    up:\"true\",\\\n                    west:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[0.25f,2.2435f,-0.75f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    up:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[0.25f,2.7435f,-0.75f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_flower\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,3.2435f,0.75f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_flower\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,3.7435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:hanging_roots set value {\\\n    place_sound:\"minecraft:block.hanging_roots.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:hanging_roots\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.361f,1.37525f,0.361f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.722f,0.722f,0.722f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:wheat_seeds set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:wheat\",\\\n                Properties:{\\\n                    age:\"2\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.77475f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:wheat\",\\\n                Properties:{\\\n                    age:\"5\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.77475f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:wheat\",\\\n                Properties:{\\\n                    age:\"7\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.77475f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:pumpkin_seeds set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pumpkin_stem\",\\\n                Properties:{\\\n                    age:\"4\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.806f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pumpkin_stem\",\\\n                Properties:{\\\n                    age:\"7\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"attached_pumpkin_stem\",\\\n                Properties:{\\\n                    facing:\"north\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:melon_seeds set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:melon_stem\",\\\n                Properties:{\\\n                    age:\"4\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.806f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:melon_stem\",\\\n                Properties:{\\\n                    age:\"7\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"attached_melon_stem\",\\\n                Properties:{\\\n                    facing:\"north\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:beetroot_seeds set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:beetroots\",\\\n                Properties:{\\\n                    age:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.77475f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:beetroots\",\\\n                Properties:{\\\n                    age:\"2\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.77475f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:beetroots\",\\\n                Properties:{\\\n                    age:\"3\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.77475f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:glow_berries set value {\\\n    place_sound:\"minecraft:block.cave_vines.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cave_vines\",\\\n                Properties:{\\\n                    berries:\"false\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,1.443f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cave_vines\",\\\n                Properties:{\\\n                    berries:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.1425f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cave_vines_plant\",\\\n                Properties:{\\\n                    berries:\"false\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,1.443f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cave_vines\",\\\n                Properties:{\\\n                    berries:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.842f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cave_vines_plant\",\\\n                Properties:{\\\n                    berries:\"false\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,2.1425f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cave_vines_plant\",\\\n                Properties:{\\\n                    berries:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.35f,1.443f,0.35f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.7f,0.7f,0.7f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:sweet_berries set value {\\\n    place_sound:\"minecraft:block.sweet_berry_bush.place\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sweet_berry_bush\",\\\n                Properties:{\\\n                    age:\"0\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sweet_berry_bush\",\\\n                Properties:{\\\n                    age:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sweet_berry_bush\",\\\n                Properties:{\\\n                    age:\"3\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:nether_wart set value {\\\n    place_sound:\"minecraft:item.nether_wart.plant\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:nether_wart\",\\\n                Properties:{\\\n                    age:\"0\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.775f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:nether_wart\",\\\n                Properties:{\\\n                    age:\"1\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.775f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:nether_wart\",\\\n                Properties:{\\\n                    age:\"3\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.775f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:sea_pickle set value {\\\n    place_sound:\"minecraft:block.slime_block.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sea_pickle\",\\\n                Properties:{\\\n                    waterlogged:\"false\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:tube_coral set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:tube_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:brain_coral set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:brain_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:bubble_coral set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:bubble_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:fire_coral set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:fire_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:horn_coral set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:horn_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_tube_coral set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_tube_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_brain_coral set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_brain_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_bubble_coral set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_bubble_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_fire_coral set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_fire_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_horn_coral set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_horn_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.7435f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:tube_coral_fan set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:tube_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.744f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:brain_coral_fan set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:brain_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.744f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:bubble_coral_fan set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:bubble_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.744f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:fire_coral_fan set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:fire_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.744f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:horn_coral_fan set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:horn_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.744f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_tube_coral_fan set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_tube_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.744f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_brain_coral_fan set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_brain_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.744f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_bubble_coral_fan set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_bubble_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.744f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_fire_coral_fan set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_fire_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.744f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_horn_coral_fan set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_horn_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.744f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:carrot set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:carrots\",\\\n                Properties:{\\\n                    age:\"2\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.775f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:carrots\",\\\n                Properties:{\\\n                    age:\"4\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.775f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:carrots\",\\\n                Properties:{\\\n                    age:\"7\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.775f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:potato set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    maximum:3,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:potatoes\",\\\n                Properties:{\\\n                    age:\"2\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.775f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    2:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:potatoes\",\\\n                Properties:{\\\n                    age:\"4\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.775f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ],\\\n    3:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:potatoes\",\\\n                Properties:{\\\n                    age:\"7\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.775f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:decorated_pots minecraft:golden_dandelion set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    maximum:1,\\\n    1:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:golden_dandelion\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,0.681f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/set_temp_data.mcfunction",
    "content": "# Sets temp.data for decorated/set_displays\n# @s = temp entity inside decorated pot\n# at @s align xyz positioned ~.5 ~.5 ~.5\n# with {id, count, display_number, rotation}\n# run from decorated/set_displays\n\n$data modify storage gm4_blossoming_pots:decorated_pots temp.data set value {\\\n  view_range:0.7935f,\\\n  Tags:[\"gm4_blossoming_pots.display.decorated_pot\",\"gm4_blossoming_pots.display.decorated_pot.$(display_number)\",\"smithed.entity\",\"smithed.strict\"],\\\n  Rotation:[$(rotation)f,0f]\\\n}\n$data modify storage gm4_blossoming_pots:decorated_pots temp.data merge from storage gm4_blossoming_pots:decorated_pots $(id).$(count)[$(display_number)]\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/as_player.mcfunction",
    "content": "# Raycasts for pot the player interacted with, then proceeds if necessary\n# @s = player who interacted with an empty flower pot\n# at @s\n# run from advancement gm4_blossoming_pots:interact_with_flower_pot\n\n# Reset advancement\nadvancement revoke @s only gm4_blossoming_pots:interact_with_flower_pot\n\n# run upgrade paths if needed\nexecute if score blossoming_pots gm4_earliest_version matches 0 \\\n    as @e[type=minecraft:block_display,tag=rc_blossoming_pots.decorPotPlant0,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_decorated_pot\nexecute if score blossoming_pots gm4_earliest_version matches 0 \\\n    as @e[type=minecraft:marker,tag=rc_blossoming_pots.flowerPot,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_flower_pot\nexecute if score blossoming_pots gm4_earliest_version matches ..304000 \\\n    as @e[type=minecraft:marker,tag=gm4_blossoming_pots.data.flower_pot,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.4/remove_perma_marker\n\n# Reset temp & scoreboard signals\ndata remove storage gm4_blossoming_pots:flower_pots temp\nscoreboard players set $signal_item_decr gm4_blossoming_pots.misc 0\n\nfunction gm4_blossoming_pots:flower/get_player_data\n# raycast\nexecute store result score @s gm4_blossoming_pots.range run attribute @s minecraft:block_interaction_range get 200\nexecute anchored eyes positioned ^ ^ ^ run function gm4_blossoming_pots:flower/raycast\n\n# if signaled, decrement player mainhand (set in flower/prepare_data)\nexecute if score $signal_item_decr gm4_blossoming_pots.misc matches 1 run item modify entity @s[gamemode=!creative] weapon.mainhand {\"function\": \"minecraft:set_count\",\"count\": -1,\"add\": true}\n\n# if signaled, give item back to player (set in flower/remove_plant)\nexecute if score $signal_give_back gm4_blossoming_pots.misc matches 1 run function gm4_blossoming_pots:flower/give_item_to_player with storage gm4_blossoming_pots:flower_pots temp.item_data\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/cleanup.mcfunction",
    "content": "# Flower pot cleanup if display isn't in a flower pot\n# @s = flower pot display 0\n# at @s\n# with {id}\n# run from main\n\n# kill displays\nkill @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.flower_pot,distance=..0.1]\n\n# Motion is predetermined. I can't be asked to make it random, shoot me.\n$summon minecraft:item ~ ~-.25 ~ {Item:{id:\"$(id)\",count:1},Motion:[0.03d,0.2d,0.02d]}\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/get_player_data.mcfunction",
    "content": "# Gets needed player data\n# @s = player who interacted with a flower pot\n# at @s\n# run from flower/as_player\n\n# set item id to null, should player not be holding an item\ndata modify storage gm4_blossoming_pots:flower_pots temp.id set value null\ndata modify storage gm4_blossoming_pots:flower_pots temp.id set from entity @s SelectedItem.id\n\n# player facing west\nexecute if entity @s[y_rotation=45..135] unless entity @s[y_rotation=45] run return run data modify storage gm4_blossoming_pots:flower_pots temp.rotation set value 0\n# player facing north\nexecute if entity @s[y_rotation=135..225] unless entity @s[y_rotation=135] run return run data modify storage gm4_blossoming_pots:flower_pots temp.rotation set value 90\n# player facing east\nexecute if entity @s[y_rotation=225..315] unless entity @s[y_rotation=225] run return run data modify storage gm4_blossoming_pots:flower_pots temp.rotation set value 180\n# player facing south\nexecute if entity @s[y_rotation=315..405] unless entity @s[y_rotation=315] run return run data modify storage gm4_blossoming_pots:flower_pots temp.rotation set value -90\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/give_item_to_player.mcfunction",
    "content": "# Summons an item stack at the players feet for them to pick up & resets signal\n# @s = player who right clicked on custom flower pot with an empty hand\n# at temp marker align xyz positioned ~.5 ~.5 ~.5\n# with {id, count}\n# run from flower/as_player\n\nscoreboard players set $signal_give_back gm4_blossoming_pots.misc 0\n$execute at @s run summon minecraft:item ~ ~ ~ {Item:{id:\"$(id)\",count:1}}\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/in_flower_pot.mcfunction",
    "content": "# Checks the temp markers physical location in the block, to see if it is in the collision box of the flower pot\n# @s = temp marker summoned in parent function\n# at @s\n# run from flower/raycast\n\n# merge marker data for if it doesn't get killed\ndata merge entity @s {Tags:[\"gm4_blossoming_pots.temp.flower_pot\",\"smithed.strict\",\"smithed.entity\"],CustomName:{\"text\":\"gm4_blossoming_pots.temp_marker\"}}\n\n# if temp marker in physical hit box, return 1\n# dxdydz all 0 bc of MC-123441.\nexecute at @s align xyz positioned ~0.312499 ~ ~0.312499 if entity @s[dx=0,dy=0,dz=0] \\\n    at @s align xyz positioned ~-0.312499 ~-0.625 ~-0.312499 if entity @s[dx=0,dy=0,dz=0] \\\n    run return 1\n\n# else, kill marker, return fail\nkill @s\nreturn fail\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/prepare_data.mcfunction",
    "content": "# Sets up loop for plant stage changes\n# @s = temp entity inside flower pot\n# at @s align xyz positioned ~.5 ~.5 ~.5\n# with {id, rotation}\n# run from flower/raycast and upgrade_paths/3.1/legacy_flower_pot\n\n# early returns\n# if empty hand, empty the pot, give player the item\nexecute if data storage gm4_blossoming_pots:flower_pots {temp:{id:\"null\"}} run return run function gm4_blossoming_pots:flower/remove_plant\n# if storage doesn't have, doesnt matter\n$execute unless data storage gm4_blossoming_pots:flower_pots $(id) run return run kill @s\n# if existing display, fail\nexecute if entity @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.flower_pot,distance=..0.1,limit=1] run return run kill @s\n# fail if smithed.block\nexecute align xyz if entity @e[tag=smithed.block,dx=0,dz=0,dy=0,limit=1] run return run kill @s\n\n# signal player mainhand to be decremented by as_player\nscoreboard players set $signal_item_decr gm4_blossoming_pots.misc 1\n\n# setting temp\nexecute store result storage gm4_blossoming_pots:flower_pots temp.display_number int 1 run scoreboard players set $display_number gm4_blossoming_pots.misc 0\nfunction gm4_blossoming_pots:flower/set_temp_data with storage gm4_blossoming_pots:flower_pots temp\n# temp storage should now contain {rotation, display_number, id, count, data}\n\n# store the number of displays needed\n$execute store result score $array_len gm4_blossoming_pots.misc run data get storage gm4_blossoming_pots:flower_pots $(id).display\n\nfunction gm4_blossoming_pots:flower/set_displays with storage gm4_blossoming_pots:flower_pots temp\n\n# sound\n$execute positioned ~ ~-0.3125 ~ run function gm4_blossoming_pots:play_sound with storage gm4_blossoming_pots:flower_pots $(id)\n\nkill @s\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/raycast.mcfunction",
    "content": "# Main loop for raycasting for the flower pot the player interacted with\n# @s = player who interacted with a flower pot\n# at @s anchored eyes, then marched forward 0.005 over and over\n# run from flower/as_player and self\n\n# if current location is within the flower pots hit box, summon a temp marker, set its data with the player rotation, and exit raycast\nexecute if block ~ ~ ~ minecraft:flower_pot \\\n    summon minecraft:marker if function gm4_blossoming_pots:flower/in_flower_pot \\\n    at @s align xyz positioned ~.5 ~.5 ~.5 \\\n    run return run function gm4_blossoming_pots:flower/prepare_data with storage gm4_blossoming_pots:flower_pots temp\n\n# remove range\nscoreboard players remove @s gm4_blossoming_pots.range 1\n\n# repeat until find flower pot or out of range\nexecute if score @s gm4_blossoming_pots.range matches 1.. positioned ^ ^ ^0.005 run function gm4_blossoming_pots:flower/raycast\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/remove_plant.mcfunction",
    "content": "# Removes a plant from a flower pot following a player empty hand right clicks on it\n# @s = temp marker inside flower pot\n# at @s align xyz positioned ~.5 ~.5 ~.5\n# run from flower/prepare_data\n\n# signal give back\nscoreboard players set $signal_give_back gm4_blossoming_pots.misc 1\n\n# store item data for as_player to give the item back to the player\ndata modify storage gm4_blossoming_pots:flower_pots temp.item_data set from entity @e[tag=gm4_blossoming_pots.display.flower_pot.0,distance=..0.1,limit=1] data.gm4_blossoming_pots.Item\n\n# kill flower pot displays, and temp marker\nkill @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.flower_pot,distance=..0.1]\nkill @s\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/set_displays.mcfunction",
    "content": "# Main Loop for setting displays to desired stage\n# @s = temp entity inside flower pot\n# at @s align xyz positioned ~.5 ~.5 ~.5\n# with {data}\n# run from flower/prepare_data and self\n\n# create display\n$summon minecraft:block_display ~ ~ ~ $(data)\n\n# increment display_number\nexecute store result storage gm4_blossoming_pots:flower_pots temp.display_number int 1 run scoreboard players add $display_number gm4_blossoming_pots.misc 1\n\n# sets temp.data to next display_number's data\nfunction gm4_blossoming_pots:flower/set_temp_data with storage gm4_blossoming_pots:flower_pots temp\n# run again if needed\nexecute unless score $display_number gm4_blossoming_pots.misc >= $array_len gm4_blossoming_pots.misc run function gm4_blossoming_pots:flower/set_displays with storage gm4_blossoming_pots:flower_pots temp\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/set_storage.mcfunction",
    "content": "# Sets command storage for flower pot plants\n# @s = unspecified\n# at unspecified\n# run from init\n\n\n# Data storage layout\n    # gm4_blossoming_pots:flower_pots <item_namespace>:<item_name>\n        # place_sound: sound file to play when succesfully adding plant or changing stage, include namespace\n        # display:[]  array of starting data for the all the block displays used, all data\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:pale_hanging_moss set value {\\\n    place_sound:\"minecraft:block.moss_carpet.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_hanging_moss\",\\\n                Properties:{\\\n                    tip:\"false\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.243f,0.25f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_hanging_moss\",\\\n                Properties:{\\\n                    tip:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.7425f,0.25f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:pointed_dripstone set value {\\\n    place_sound:\"minecraft:block.pointed_dripstone.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pointed_dripstone\",\\\n                Properties:{\\\n                    vertical_direction:\"down\",\\\n                    thickness:\"frustum\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.1435f,0.25f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pointed_dripstone\",\\\n                Properties:{\\\n                    vertical_direction:\"down\",\\\n                    thickness:\"tip\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.6435f,0.25f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:small_amethyst_bud set value {\\\n    place_sound:\"minecraft:block.small_amethyst_bud.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:small_amethyst_bud\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.2565f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:medium_amethyst_bud set value {\\\n    place_sound:\"minecraft:block.medium_amethyst_bud.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:medium_amethyst_bud\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.2565f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:large_amethyst_bud set value {\\\n    place_sound:\"minecraft:block.large_amethyst_bud.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:large_amethyst_bud\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.2565f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:amethyst_cluster set value {\\\n    place_sound:\"minecraft:block.amethyst_cluster.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:amethyst_cluster\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.2565f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:oak_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.125f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:spruce_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:spruce_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.125f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:birch_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:birch_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.125f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:jungle_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:jungle_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.125f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:acacia_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:acacia_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.125f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:dark_oak_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dark_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.125f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:mangrove_leaves set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:mangrove_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.125f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:cherry_leaves set value {\\\n    place_sound:\"minecraft:block.cherry_leaves.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cherry_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.125f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:pale_oak_leaves set value {\\\n    place_sound:\"minecraft:block.grass.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pale_oak_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.125f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:azalea_leaves set value {\\\n    place_sound:\"minecraft:block.azalea_leaves.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.125f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:flowering_azalea_leaves set value {\\\n    place_sound:\"minecraft:block.azalea_leaves.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:flowering_azalea_leaves\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.125f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:short_grass set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:short_grass\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,-0.25f,-0.2f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.4f,0.5f,0.4f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:short_dry_grass set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:short_dry_grass\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.325f,-0.2565f,-0.325f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.65f,0.65f,0.65f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:bush set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:bush\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.39f,-0.2565f,-0.39f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.78f,0.78f,0.78f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:cactus_flower set value {\\\n    place_sound:\"minecraft:block.cactus_flower.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cactus_flower\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.4f,-0.2565f,-0.4f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.8f,0.9f,0.8f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:spore_blossom set value {\\\n    place_sound:\"minecraft:block.spore_blossom.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:spore_blossom\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,0.42f,0.2f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.4f,0.4f,0.6f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:firefly_bush set value {\\\n    place_sound:\"minecraft:block.sweet_berry_bush.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:firefly_bush\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.3f,-0.2565f,-0.3f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.6f,0.6f,0.6f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:sugar_cane set value {\\\n    place_sound:\"minecraft:block.grass.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sugar_cane\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.15f,-0.2565f,-0.15f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.3f,0.3f,0.3f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sugar_cane\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.15f,0.0435f,-0.15f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.3f,0.3f,0.3f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:weeping_vines set value {\\\n    place_sound:\"minecraft:block.weeping_vines.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:weeping_vines_plant\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.2434f,0.25f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:weeping_vines\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.7434f,0.25f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:twisting_vines set value {\\\n    place_sound:\"minecraft:block.weeping_vines.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:twisting_vines_plant\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.2565f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:twisting_vines\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.2435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:tall_grass set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:tall_grass\",\\\n                Properties:{\\\n                    half:\"lower\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.15f,-0.35025f,-0.15f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.3f,0.4f,0.3f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:tall_grass\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.15f,0.04975f,-0.15f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.3f,0.4f,0.3f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:large_fern set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:large_fern\",\\\n                Properties:{\\\n                    half:\"lower\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.4f,-0.2515f,-0.4f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.8f,0.8f,0.8f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:large_fern\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.4f,0.5485f,-0.4f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.8f,0.8f,0.8f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:tall_dry_grass set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:tall_dry_grass\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.325f,-0.2565f,-0.325f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.65f,0.65f,0.65f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\n# default sunflower rotation is sunflower facing east, player should be facing west\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:sunflower set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sunflower\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.4f,-0.3f,-0.4f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.8f,0.8f,0.8f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:lilac set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:lilac\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.3f,-0.3f,-0.3f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.6f,0.6f,0.6f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:rose_bush set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:rose_bush\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.3f,-0.3f,-0.3f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.6f,0.6f,0.6f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:peony set value {\\\n    place_sound:\"minecraft:item.bone_meal.use\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:peony\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.3f,-0.3f,-0.3f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.6f,0.6f,0.6f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:pitcher_plant set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pitcher_plant\",\\\n                Properties:{\\\n                    half:\"lower\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.4f,-0.3815f,-0.4f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.8f,0.8f,0.8f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:pitcher_plant\",\\\n                Properties:{\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.4f,0.4185f,-0.4f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.8f,0.8f,0.8f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:big_dripleaf set value {\\\n    place_sound:\"minecraft:block.big_dripleaf.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:big_dripleaf\",\\\n                Properties:{\\\n                    facing:\"east\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.175f,-0.219f,-0.375f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.75f,0.75f,0.75f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:small_dripleaf set value {\\\n    place_sound:\"minecraft:block.small_dripleaf.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:small_dripleaf\",\\\n                Properties:{\\\n                    facing:\"east\",\\\n                    half:\"upper\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.4f,-0.25f,-0.4f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.8f,0.8f,0.8f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:chorus_flower set value {\\\n    place_sound:\"minecraft:block.chorus_flower.grow\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_flower\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.3435f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:chorus_plant\",\\\n                Properties:{\\\n                    down:\"true\",\\\n                    up:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,-0.1565f,-0.25f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:hanging_roots set value {\\\n    place_sound:\"minecraft:block.hanging_roots.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:hanging_roots\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,0.2432f,0.2f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.4f,0.4f,0.5f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:wheat_seeds set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:wheat\",\\\n                Properties:{\\\n                    age:\"7\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.1875f,-0.22525f,-0.1875f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.375f,0.375f,0.375f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:pumpkin_seeds set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"attached_pumpkin_stem\",\\\n                Properties:{\\\n                    facing:\"north\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,-0.319f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:melon_seeds set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"attached_melon_stem\",\\\n                Properties:{\\\n                    facing:\"north\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,-0.319f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:beetroot_seeds set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:beetroots\",\\\n                Properties:{\\\n                    age:\"3\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.1875f,-0.22525f,-0.1875f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.375f,0.375f,0.375f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:glow_berries set value {\\\n    place_sound:\"minecraft:block.cave_vines.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cave_vines_plant\",\\\n                Properties:{\\\n                    berries:\"false\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.243f,0.25f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        },\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:cave_vines\",\\\n                Properties:{\\\n                    berries:\"true\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.25f,0.7425f,0.25f],\\\n                left_rotation:[0.707f,0f,0f,0.707f],\\\n                scale:[0.5f,0.5f,0.5f],\\\n                right_rotation:[0.707f,0f,0f,0.707f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:sweet_berries set value {\\\n    place_sound:\"minecraft:block.sweet_berry_bush.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sweet_berry_bush\",\\\n                Properties:{\\\n                    age:\"3\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.4f,-0.319f,-0.4f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.8f,0.8f,0.8f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:nether_wart set value {\\\n    place_sound:\"minecraft:item.nether_wart.plant\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:nether_wart\",\\\n                Properties:{\\\n                    age:\"3\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.1875f,-0.225f,-0.1875f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.375f,0.375f,0.375f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:sea_pickle set value {\\\n    place_sound:\"minecraft:block.slime_block.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:sea_pickle\",\\\n                Properties:{\\\n                    waterlogged:\"false\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.5f,-0.2565f,-0.5f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[1f,1f,1f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:tube_coral set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:tube_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,-0.25f,-0.2f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.4f,0.5f,0.4f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:brain_coral set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:brain_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,-0.25f,-0.2f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.4f,0.5f,0.4f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:bubble_coral set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:bubble_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,-0.25f,-0.2f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.4f,0.5f,0.4f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:fire_coral set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:fire_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,-0.25f,-0.2f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.4f,0.5f,0.4f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:horn_coral set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:horn_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,-0.25f,-0.2f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.4f,0.5f,0.4f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:dead_tube_coral set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_tube_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,-0.25f,-0.2f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.4f,0.5f,0.4f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:dead_brain_coral set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_brain_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,-0.25f,-0.2f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.4f,0.5f,0.4f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:dead_bubble_coral set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_bubble_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,-0.25f,-0.2f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.4f,0.5f,0.4f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:dead_fire_coral set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_fire_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,-0.25f,-0.2f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.4f,0.5f,0.4f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:dead_horn_coral set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_horn_coral\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.2f,-0.25f,-0.2f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.4f,0.5f,0.4f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:tube_coral_fan set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:tube_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.1875f,-0.225f,-0.1875f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.375f,0.8f,0.375f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:brain_coral_fan set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:brain_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.1875f,-0.225f,-0.1875f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.375f,0.8f,0.375f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:bubble_coral_fan set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:bubble_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.1875f,-0.225f,-0.1875f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.375f,0.8f,0.375f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:fire_coral_fan set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:fire_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.1875f,-0.225f,-0.1875f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.375f,0.8f,0.375f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:horn_coral_fan set value {\\\n    place_sound:\"minecraft:block.wet_grass.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:horn_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.1875f,-0.225f,-0.1875f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.375f,0.8f,0.375f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:dead_tube_coral_fan set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_tube_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.1875f,-0.225f,-0.1875f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.375f,0.8f,0.375f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:dead_brain_coral_fan set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_brain_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.1875f,-0.225f,-0.1875f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.375f,0.8f,0.375f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:dead_bubble_coral_fan set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_bubble_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.1875f,-0.225f,-0.1875f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.375f,0.8f,0.375f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:dead_fire_coral_fan set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_fire_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.1875f,-0.225f,-0.1875f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.375f,0.8f,0.375f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:dead_horn_coral_fan set value {\\\n    place_sound:\"minecraft:block.stone.place\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:dead_horn_coral_fan\"\\\n            },\\\n            transformation:{\\\n                translation:[-0.1875f,-0.225f,-0.1875f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.375f,0.8f,0.375f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:carrot set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:carrots\",\\\n                Properties:{\\\n                    age:\"7\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.225f,-0.22525f,-0.225f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.45f,0.45f,0.45f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\ndata modify storage gm4_blossoming_pots:flower_pots minecraft:potato set value {\\\n    place_sound:\"minecraft:item.crop.plant\",\\\n    display:[\\\n        {\\\n            block_state:{\\\n                Name:\"minecraft:potatoes\",\\\n                Properties:{\\\n                    age:\"7\"\\\n                }\\\n            },\\\n            transformation:{\\\n                translation:[-0.225f,-0.22525f,-0.225f],\\\n                left_rotation:[0f,0f,0f,1f],\\\n                scale:[0.45f,0.45f,0.45f],\\\n                right_rotation:[0f,0f,0f,1f]\\\n            }\\\n        }\\\n    ]\\\n}\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/set_temp_data.mcfunction",
    "content": "# Sets temp.data for flower/set_displays\n# @s = temp entity inside flower pot\n# at @s align xyz positioned ~.5 ~.5 ~.5\n# with {id, display_number, rotation}\n# run from flower/set_displays and flower/prepare_data\n\n$data modify storage gm4_blossoming_pots:flower_pots temp.data set value {\\\n  view_range:0.7935f,\\\n  Tags:[\"gm4_blossoming_pots.display.flower_pot\",\"gm4_blossoming_pots.display.flower_pot.$(display_number)\",\"smithed.entity\",\"smithed.strict\"],\\\n  Rotation:[$(rotation)f,0f],\\\n  data:{gm4_blossoming_pots:{Item:{id:\"$(id)\"}}}\\\n}\n# count set as one so that legacy displays can have higher counts respected in the flower/cleanup function\n$data modify storage gm4_blossoming_pots:flower_pots temp.data merge from storage gm4_blossoming_pots:flower_pots $(id).display[$(display_number)]\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/init.mcfunction",
    "content": "execute unless score blossoming_pots gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Blossoming Pots\"}\nexecute unless score blossoming_pots gm4_earliest_version < blossoming_pots gm4_modules run scoreboard players operation blossoming_pots gm4_earliest_version = blossoming_pots gm4_modules\nscoreboard players set blossoming_pots gm4_modules 1\n\n# detect pre-gm4 blossoming pots\nexecute if data storage rc_blossoming_pots:storage version_history run scoreboard players set blossoming_pots gm4_earliest_version 0\n\nscoreboard objectives add gm4_blossoming_pots.range dummy \"gm4_bPots.range\"\nscoreboard objectives add gm4_blossoming_pots.display_stage dummy \"gm4_bPots.display_stage\"\nscoreboard objectives add gm4_blossoming_pots.misc dummy \"gm4_bPots.misc\"\n\nfunction gm4_blossoming_pots:decorated/set_storage\nfunction gm4_blossoming_pots:flower/set_storage\n\nschedule function gm4_blossoming_pots:main 1t\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/main.mcfunction",
    "content": "execute as @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.decorated_pot] at @s unless block ~ ~ ~ minecraft:decorated_pot run kill @s\n\nexecute as @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.flower_pot.0] at @s unless block ~ ~ ~ minecraft:flower_pot run function gm4_blossoming_pots:flower/cleanup with entity @s data.gm4_blossoming_pots.Item\n\nschedule function gm4_blossoming_pots:main 16t\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/play_sound.mcfunction",
    "content": "# plays sound\n# @s = temp entity inside pot\n# at center of pot\n# with {place_sound}\n# run from decorated/prepare_data and flower/prepare_data\n\n$playsound $(place_sound) block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.1/check_legacy_flower_pot_in_storage.mcfunction",
    "content": "# Check if flower pot id is in storage\n# @s = type=minecraft:marker, tag=rc_blossoming_pots.flowerPot\n# at @s\n# with {id}\n# run from upgrade_paths/3.1/legacy_flower_pot\n\n$execute store success score $legacy_in_storage gm4_blossoming_pots.misc if data storage gm4_blossoming_pots:flower_pots $(id)\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.1/drop_legacy_items.mcfunction",
    "content": "# drop extra items from legacy flower pot\n# @s = type=minecraft:marker, tag=rc_blossoming_pots.flowerPot\n# at @s\n# with {id, count}\n# run from upgrade_paths/3.1/legacy_flower_pot\n\n# Motion is predetermined. I can't be asked to make it random, shoot me.\n$summon minecraft:item ~ ~.25 ~ {Item:{id:\"$(id)\",count:$(count)},Motion:[0.03d,0.2d,0.02d]}\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.1/legacy_decorated_pot.mcfunction",
    "content": "# Upgrade legacy decorated pot plant to current gm4 version\n# @s = type=minecraft:block_display, tag=rc_blossoming_pots.decorPotPlant0\n# at @s\n# run from upgrade_paths/3.1 and decorated/as_player and flower/as_player and vanilla_pot_handling/as_player\n\n\n# Note: legacy pot displays are located at align xyz positioned ~.5 ~ ~.5, different from current version.\n\n# clear temp just in case\ndata remove storage gm4_blossoming_pots:decorated_pots temp\n\n# kill all other displays distance =..0.1\nkill @e[type=minecraft:block_display,tag=rc_blossoming_pots.decorPotPlant,tag=!rc_blossoming_pots.decorPotPlant0,distance=..0.1]\n# if pot is now empty, kill @s and return. Cleanup complete\nexecute unless data block ~ ~ ~ item run return run kill @s\n\n# grab Rotation from @s\ndata modify storage gm4_blossoming_pots:decorated_pots temp.rotation set from entity @s Rotation[0]\n\n# pivot to decorated/set_count using rc_blossoming_pots.decorPotPlant0 as the temp entity, which is killed in set_count after displays are set\nexecute positioned ~ ~.5 ~ run function gm4_blossoming_pots:decorated/set_count with block ~ ~ ~ item\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.1/legacy_flower_pot.mcfunction",
    "content": "# Upgrade legacy flower pot plant to current gm4 version\n# @s = type=minecraft:marker, tag=rc_blossoming_pots.flowerPot\n# at @s\n# run from upgrade_paths/3.1 and decorated/as_player and flower/as_player and vanilla_pot_handling/as_player\n\n\n# Note: legacy pot displays are located at align xyz positioned ~.5 ~ ~.5, different from current version.\n\n# clear temp just in case\ndata remove storage gm4_blossoming_pots:flower_pots temp\n\n# grab item id\ndata modify storage gm4_blossoming_pots:flower_pots temp.id set from entity @s data.id\ndata modify storage gm4_blossoming_pots:flower_pots temp.legacy.id set from storage gm4_blossoming_pots:flower_pots temp.id\n\n# grab Rotation from block display tag=rc_blossoming_pots.flowerPotPlant0\ndata modify storage gm4_blossoming_pots:flower_pots temp.rotation set from entity @e[type=minecraft:block_display,tag=rc_blossoming_pots.flowerPotPlant0,distance=..0.1,limit=1] Rotation[0]\n\n# kill all block displays for this plant\nkill @e[type=minecraft:block_display,tag=rc_blossoming_pots.flowerPotPlant,distance=..0.1]\n\n# drop items of id and count-1\nexecute store result score $count gm4_blossoming_pots.misc run data get entity @s data.count\nexecute store result storage gm4_blossoming_pots:flower_pots temp.legacy.count int 1 run scoreboard players remove $count gm4_blossoming_pots.misc 1\nexecute unless score $count gm4_blossoming_pots.misc matches ..0 run function gm4_blossoming_pots:upgrade_paths/3.1/drop_legacy_items with storage gm4_blossoming_pots:flower_pots temp.legacy\n\n# We need to check using a macro function if the id stored in @s data is in storage, and if not then drop item\nfunction gm4_blossoming_pots:upgrade_paths/3.1/check_legacy_flower_pot_in_storage with storage gm4_blossoming_pots:flower_pots temp.legacy\n\n# set legacy count back to 1 for potential clean up\ndata modify storage gm4_blossoming_pots:flower_pots temp.legacy.count set value 1\n\n# if legacy plant IS NOT in modern storage, clean up @s and drop items using legacy storage\nexecute unless score $legacy_in_storage gm4_blossoming_pots.misc matches 1 run function gm4_blossoming_pots:upgrade_paths/3.1/drop_legacy_items with storage gm4_blossoming_pots:flower_pots temp.legacy\nexecute unless score $legacy_in_storage gm4_blossoming_pots.misc matches 1 run return run kill @s\n\n# if legacy plant IS in modern storage, summon new displays using @s as a temp entity\nexecute if score $legacy_in_storage gm4_blossoming_pots.misc matches 1 positioned ~ ~.5 ~ run \\\n    return run function gm4_blossoming_pots:flower/prepare_data with storage gm4_blossoming_pots:flower_pots temp\n\n# @s is killed in both cases\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.1.mcfunction",
    "content": "# Upgrade pre-gm4 blossoming pots entities\n# @s = player\n# at @s\n# run via upgrade paths util\n\n# upgrade legacy flower pots\nexecute as @e[type=minecraft:marker,tag=rc_blossoming_pots.flowerPot] at @s \\\n    run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_flower_pot\n\n# upgrade legacy decorated pots\nexecute as @e[type=minecraft:block_display,tag=rc_blossoming_pots.decorPotPlant0] at @s \\\n    run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_decorated_pot\n\n\n# not cleaning up legacy storage, sorry. Its like 20KB, 190 storage keys.\n# not worth it to clean all the storage keys, when we cant delete the files\n# Just leaving the files there for world owners to clean up if they really want to\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.4/remove_perma_marker.mcfunction",
    "content": "# transfers item data to display entity, kills marker\n# @s = type=minecraft:marker, tag=gm4_blossoming_pots.data.flower_pot\n# at @s\n# run from upgrade_paths/3.4\n\ndata modify entity @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.flower_pot.0,distance=..0.1,limit=1] data.gm4_blossoming_pots.Item set from entity @s data.gm4_blossoming_pots\n\nkill @s\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.4.mcfunction",
    "content": "# Upgrade flower pots to no longer need the marker\n# @s = player\n# at @s\n# run via upgrade paths util\n\n# target <3.4 perma marker to delete\nexecute as @e[type=minecraft:marker,tag=gm4_blossoming_pots.data.flower_pot] at @s \\\n  run function gm4_blossoming_pots:upgrade_paths/3.4/remove_perma_marker\n\n# smithed tags\ntag @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,tag=!smithed.strict] add smithed.strict\ntag @e[type=block_display,tag=gm4_blossoming_pots.display.decorated_pot,tag=!smithed.strict] add smithed.strict\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/vanilla_pot_handling/as_marker.mcfunction",
    "content": "# If player is placing a vanilla plant in custom flower pot, prevent them and give them the item back\n# @s = temp marker inside filled vanilla flower pot\n# at @s align xyz positioned ~.5 ~.5 ~.5\n# run from vanilla_pot_handling/raycast\n\n# if no custom flower pot, return   let the player place their vanilla pots in peace\nexecute unless entity @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.flower_pot,distance=..0.1,limit=1] run return run kill @s\n\nfill ~ ~ ~ ~ ~ ~ minecraft:flower_pot destroy\n\n# kill flower pot item\nexecute as @n[type=minecraft:item,distance=..0.5,nbt={Item:{id:\"minecraft:flower_pot\"},Age:0s}] run kill @s\n\n# store dropped items data in temp and kill it\nexecute as @n[type=minecraft:item,distance=..0.5,nbt={Age:0s},predicate=gm4_blossoming_pots:item_potable] run function gm4_blossoming_pots:vanilla_pot_handling/get_dropped_item\n\n# giving item back is run from as_player following this.\nscoreboard players set $signal_give_back gm4_blossoming_pots.misc 1\n\n# clean\nkill @s\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/vanilla_pot_handling/as_player.mcfunction",
    "content": "# Prevent a player putting an item from potable_pots tag list into a pot that already has a blossoming pots block display\n# @s = player who interacted with a filled vanilla flower pot\n# at @s\n# run from advancement gm4_blossoming_pots:interact_with_vanilla_flower_pot\n\n# Reset advancement\nadvancement revoke @s only gm4_blossoming_pots:interact_with_vanilla_flower_pot\n\n# run upgrade paths if needed\nexecute if score blossoming_pots gm4_earliest_version matches 0 \\\n    as @e[type=minecraft:block_display,tag=rc_blossoming_pots.decorPotPlant0,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_decorated_pot\nexecute if score blossoming_pots gm4_earliest_version matches 0 \\\n    as @e[type=minecraft:marker,tag=rc_blossoming_pots.flowerPot,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_flower_pot\nexecute if score blossoming_pots gm4_earliest_version matches ..304000 \\\n    as @e[type=minecraft:marker,tag=gm4_blossoming_pots.data.flower_pot,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.4/remove_perma_marker\n\n# Reset temp\ndata remove storage gm4_blossoming_pots:flower_pots temp\n\n# Raycast for the pot (set up range and search) and proceed if needed\nexecute store result score @s gm4_blossoming_pots.range run attribute @s minecraft:block_interaction_range get 200\nexecute anchored eyes positioned ^ ^ ^ run function gm4_blossoming_pots:vanilla_pot_handling/raycast\n\n# if signaled (set in vanilla_pot_handling/as_marker), summon item at player to give it back to them\nexecute if score $signal_give_back gm4_blossoming_pots.misc matches 1 if entity @s[gamemode=!creative] run function gm4_blossoming_pots:vanilla_pot_handling/give_item_back with storage gm4_blossoming_pots:flower_pots temp\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/vanilla_pot_handling/get_dropped_item.mcfunction",
    "content": "# Gets the id off of the fresh item and then kills it\n# @s = age:0s item of vanilla flower pot\n# at temp marker align xyz positioned ~.5 ~.5 ~.5\n# run from vanilla_pot_handling/as_marker\n\ndata modify storage gm4_blossoming_pots:flower_pots temp.id set from entity @s Item.id\nkill @s\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/vanilla_pot_handling/give_item_back.mcfunction",
    "content": "# Gives player the vanilla flower pot item back that they tried to plant in a custom flower pot, reset signal score\n# @s = player who triggered advancement\n# at @s\n# with {id}\n# run from vanilla_pot_handling/as_player\n\nscoreboard players set $signal_give_back gm4_blossoming_pots.misc 0\n$summon minecraft:item ~ ~ ~ {Item:{id:\"$(id)\"}}\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/vanilla_pot_handling/in_vanilla_flower_pot.mcfunction",
    "content": "# Checks the temp markers physical location in the block, to see if it is in the collision box of the flower pot\n# @s = temp marker summoned in parent function\n# at @s\n# run from vanilla_pot_handling/raycast\n\n# merge marker data for if it doesn't get killed\ndata merge entity @s {Tags:[\"gm4_blossoming_pots.temp.vanilla_flower_pot\",\"smithed.strict\",\"smithed.entity\"],CustomName:{\"text\":\"gm4_blossoming_pots.temp_marker\"}}\n\n# if temp marker in physical hit box, return 1\n# dxdydz all 0 bc of MC-123441.\nexecute at @s align xyz positioned ~0.312499 ~ ~0.312499 if entity @s[dx=0,dy=0,dz=0] \\\n    at @s align xyz positioned ~-0.312499 ~-0.625 ~-0.312499 if entity @s[dx=0,dy=0,dz=0] \\\n    run return 1\n\n# else, kill marker, return fail\nkill @s\nreturn fail\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/function/vanilla_pot_handling/raycast.mcfunction",
    "content": "# Main loop for raycasting for the vanilla flower pot the player interacted with\n# @s = player who interacted with a flower pot\n# at @s anchored eyes, then marched forward 0.005 over and over\n# run from vanilla_pot_handling/as_player and self\n\n# if block is a vanilla flower pot and execution context is in the flower pot, proceed to as_marker\nexecute if block ~ ~ ~ #gm4_blossoming_pots:potted_plants \\\n    summon minecraft:marker if function gm4_blossoming_pots:vanilla_pot_handling/in_vanilla_flower_pot \\\n    at @s align xyz positioned ~.5 ~.5 ~.5 \\\n    run return run function gm4_blossoming_pots:vanilla_pot_handling/as_marker\n    \n\n# remove range\nscoreboard players remove @s gm4_blossoming_pots.range 1\n\n# repeat until find flower pot or out of range\nexecute if score @s gm4_blossoming_pots.range matches 1.. positioned ^ ^ ^0.005 run function gm4_blossoming_pots:vanilla_pot_handling/raycast\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/guidebook/blossoming_pots.json",
    "content": "{\n  \"id\": \"blossoming_pots\",\n  \"name\": \"Blossoming Pots\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:decorated_pot\"\n  },\n  \"criteria\": {\n    \"obtain_pot\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:decorated_pot\",\n              \"minecraft:flower_pot\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"display\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_pot\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.blossoming_pots.description\",\n            \"fallback\": \"To pot a plant, interact with a Decorated Pot or empty Flower Pot while holding a supported item.\\nTo remove a plant, break the decorated pot or interact with the flower pot with an empty hand.\"\n          }\n        ],\n        [\n          {\n            \"translate\":\"text.gm4.guidebook.blossoming_pots.item_list.header\",\n            \"fallback\":\"Supported Items:\",\n            \"underlined\":true\n          },\n          {\n            \"text\":\"\\n\\n\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.blossoming_pots.item_list.1\",\n            \"fallback\": \"Vanilla Flower Pot\\n                    plants\\nPale hanging moss\\nPointed dripstone\\nAmethyst crystals\\nLeaves\\nGrass plants\\nLush cave plants\",\n            \"underlined\":false\n          }\n        ],\n        [\n          {\n            \"translate\":\"text.gm4.guidebook.blossoming_pots.item_list.header\",\n            \"fallback\":\"Supported Items:\",\n            \"underlined\":true\n          },\n          {\n            \"text\":\"\\n\\n\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.blossoming_pots.item_list.2\",\n            \"fallback\": \"Sugar cane\\nNether vines\\n2 tall plants\\nChorus flower\\nNon-sniffer seeds\\nNether wart\\nBush plants\\nCoral reef plants\\nCactus Flower\",\n            \"underlined\":false\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/predicate/item_potable.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n      \"type\": \"minecraft:item\",\n      \"slots\": {\n        \"contents\": {\n          \"items\": \"#gm4_blossoming_pots:potable_plants\"\n        }\n      }\n    }\n  }\n  "
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/tags/block/potted_plants.json",
    "content": "{\n    \"values\": [\n      \"minecraft:potted_dandelion\",\n      \"minecraft:potted_poppy\",\n      \"minecraft:potted_blue_orchid\",\n      \"minecraft:potted_allium\",\n      \"minecraft:potted_azure_bluet\",\n      \"minecraft:potted_red_tulip\",\n      \"minecraft:potted_orange_tulip\",\n      \"minecraft:potted_white_tulip\",\n      \"minecraft:potted_pink_tulip\",\n      \"minecraft:potted_oxeye_daisy\",\n      \"minecraft:potted_cornflower\",\n      \"minecraft:potted_lily_of_the_valley\",\n      \"minecraft:potted_wither_rose\",\n      \"minecraft:potted_torchflower\",\n      \"minecraft:potted_oak_sapling\",\n      \"minecraft:potted_spruce_sapling\",\n      \"minecraft:potted_birch_sapling\",\n      \"minecraft:potted_jungle_sapling\",\n      \"minecraft:potted_acacia_sapling\",\n      \"minecraft:potted_dark_oak_sapling\",\n      \"minecraft:potted_cherry_sapling\",\n      \"minecraft:potted_red_mushroom\",\n      \"minecraft:potted_brown_mushroom\",\n      \"minecraft:potted_fern\",\n      \"minecraft:potted_dead_bush\",\n      \"minecraft:potted_cactus\",\n      \"minecraft:potted_bamboo\",\n      \"minecraft:potted_azalea_bush\",\n      \"minecraft:potted_flowering_azalea_bush\",\n      \"minecraft:potted_crimson_fungus\",\n      \"minecraft:potted_warped_fungus\",\n      \"minecraft:potted_crimson_roots\",\n      \"minecraft:potted_warped_roots\",\n      \"minecraft:potted_mangrove_propagule\",\n      \"minecraft:potted_closed_eyeblossom\",\n      \"minecraft:potted_open_eyeblossom\",\n      \"minecraft:potted_pale_oak_sapling\"\n    ]\n  }\n  "
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/tags/item/potable_plants.json",
    "content": "{\n    \"values\": [\n      \"minecraft:dandelion\",\n      \"minecraft:poppy\",\n      \"minecraft:blue_orchid\",\n      \"minecraft:allium\",\n      \"minecraft:azure_bluet\",\n      \"minecraft:red_tulip\",\n      \"minecraft:orange_tulip\",\n      \"minecraft:white_tulip\",\n      \"minecraft:pink_tulip\",\n      \"minecraft:oxeye_daisy\",\n      \"minecraft:cornflower\",\n      \"minecraft:lily_of_the_valley\",\n      \"minecraft:wither_rose\",\n      \"minecraft:torchflower\",\n      \"minecraft:oak_sapling\",\n      \"minecraft:spruce_sapling\",\n      \"minecraft:birch_sapling\",\n      \"minecraft:jungle_sapling\",\n      \"minecraft:acacia_sapling\",\n      \"minecraft:dark_oak_sapling\",\n      \"minecraft:cherry_sapling\",\n      \"minecraft:red_mushroom\",\n      \"minecraft:brown_mushroom\",\n      \"minecraft:fern\",\n      \"minecraft:dead_bush\",\n      \"minecraft:cactus\",\n      \"minecraft:bamboo\",\n      \"minecraft:azalea\",\n      \"minecraft:flowering_azalea\",\n      \"minecraft:crimson_fungus\",\n      \"minecraft:warped_fungus\",\n      \"minecraft:crimson_roots\",\n      \"minecraft:warped_roots\",\n      \"minecraft:mangrove_propagule\",\n      \"minecraft:closed_eyeblossom\",\n      \"minecraft:open_eyeblossom\",\n      \"minecraft:pale_oak_sapling\"\n    ]\n  }\n  "
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/test/decorated_pot_bounding_box.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n# @timeout 400\n\n# tests for correct pot found when raycast overlaps with a different decorated pot\nsetblock ~1 ~1 ~2 decorated_pot{item:{id:\"minecraft:cherry_sapling\",count:1}}\nsetblock ~1 ~1 ~1 decorated_pot{item:{id:\"minecraft:cherry_leaves\",count:1}}\nrotate @s facing ~1.06 ~ ~2\nadvancement grant @s only gm4_blossoming_pots:interact_with_decorated_pot\nawait entity @e[type=block_display,tag=gm4_blossoming_pots.display.decorated_pot,nbt={block_state:{Name:\"minecraft:cherry_sapling\"}},dx=2,dy=2,dz=2]\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/test/place_in_decorated_pot.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n# @timeout 400\n\n# place\nsetblock ~ ~1 ~2 decorated_pot\ngive @s oak_leaves\nrotate @s facing ~.5 ~ ~2\ndummy @s use block ~.5 ~1 ~2\n# any_block_use isnt triggering for   dummy @s use block\nadvancement grant @s only gm4_blossoming_pots:interact_with_decorated_pot\nawait entity @e[type=block_display,tag=gm4_blossoming_pots.display.decorated_pot,dx=2,dy=2,dz=2]\n\nawait delay 2s\n\n# break\ndummy @s mine ~.5 ~1 ~2\nawait not entity @e[type=block_display,tag=gm4_blossoming_pots.display.decorated_pot,dx=2,dy=2,dz=2]\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/test/place_in_flower_pot.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n# @timeout 400\n\n# place\nsetblock ~ ~1 ~2 flower_pot\nitem replace entity @s weapon.mainhand with oak_leaves\nrotate @s facing ~.5 ~ ~2\ndummy @s use block ~.5 ~1 ~2\n# any_block_use isnt triggering for   dummy @s use block\nadvancement grant @s only gm4_blossoming_pots:interact_with_flower_pot\nawait entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2]\nassert not items entity @s weapon.mainhand *\n\nawait delay 2s\n\n# remove custom plant\n# | need to clear guidebook from mainhand...\nclear @s written_book\ndummy @s use block ~.5 ~1 ~2\n# any_block_use isnt triggering for   dummy @s use block\nadvancement grant @s only gm4_blossoming_pots:interact_with_flower_pot\nawait not entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2]\nawait items entity @s weapon.mainhand oak_leaves\n\nawait delay 2s\n\n# place back, to break\ndummy @s use block ~.5 ~1 ~2\n# any_block_use isnt triggering for   dummy @s use block\nadvancement grant @s only gm4_blossoming_pots:interact_with_flower_pot\nawait delay 1s\ndummy @s mine ~.5 ~1 ~2\nawait not entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2]\nassert entity @e[type=item,nbt={Item:{id:\"minecraft:oak_leaves\",count:1}},dx=2,dy=2,dz=2]\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/test/upgrade_path_3.1.mcfunction",
    "content": "# @template gm4:test_platform\n# @timeout 400\n\n# setup legacy displays.... pain\n\n# decorated\nsetblock ~ ~1 ~2 decorated_pot{item:{id:\"minecraft:flowering_azalea\",count:1}}\nexecute align xyz run summon block_display ~0.5 ~1.0 ~2.5 {Tags:[\"rc_blossoming_pots.decorPotPlant0\",\"rc_blossoming_pots.decorPotPlant\"],block_state:{Name:\"minecraft:flowering_azalea\"},transformation:{translation:[-0.25f,1.2435f,-0.25f],left_rotation:[0f,0f,0f,1f],scale:[0.5f,0.5f,0.5f],right_rotation:[0f,0f,0f,1f]}}\n\n# flower pot\nsetblock ~2 ~1 ~2 flower_pot\nexecute align xyz run summon block_display ~2.5 ~1.0 ~2.5 {Tags:[\"rc_blossoming_pots.flowerPotPlant\",\"rc_blossoming_pots.flowerPotPlant0\"],block_state:{Name:\"minecraft:amethyst_cluster\"},transformation:{translation:[-0.25f,0.2435f,-0.25f],left_rotation:[0f,0f,0f,1f],scale:[0.5f,0.5f,0.5f],right_rotation:[0f,0f,0f,1f]}}\nexecute align xyz run summon marker ~2.5 ~1.0 ~2.5 {Tags:[\"rc_blossoming_pots.flowerPot\"],data:{id:\"minecraft:amethyst_cluster\",count:1,full:1}}\n\n# deleted plant\nsetblock ~2 ~1 ~ flower_pot\nexecute align xyz run summon block_display ~2.5 ~1.0 ~0.5 {Tags:[\"rc_blossoming_pots.flowerPotPlant\",\"rc_blossoming_pots.flowerPotPlant0\"],block_state:{Name:\"minecraft:cocoa\"},transformation:{translation:[-0.25f,0.2435f,-0.25f],left_rotation:[0f,0f,0f,1f],scale:[0.5f,0.5f,0.5f],right_rotation:[0f,0f,0f,1f]}}\nexecute align xyz run summon marker ~2.5 ~1.0 ~0.5 {Tags:[\"rc_blossoming_pots.flowerPot\"],data:{id:\"minecraft:cocoa_beans\",count:3,full:1}}\n\nfunction gm4_blossoming_pots:upgrade_paths/3.1\n\nassert entity @e[type=block_display,tag=gm4_blossoming_pots.display.decorated_pot,dx=2,dy=2,dz=2]\nassert entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2,nbt={data:{gm4_blossoming_pots:{Item:{id:\"minecraft:amethyst_cluster\"}}}}]\nassert not entity @e[type=marker,tag=rc_blossoming_pots.flowerPot,dx=2,dy=2,dz=2]\nassert entity @e[type=item,dx=2,dy=2,dz=2,nbt={Item:{id:\"minecraft:cocoa_beans\"}}]\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/test/upgrade_path_3.4.mcfunction",
    "content": "# @template gm4:test_platform\n# @timeout 400\n\nsetblock ~2 ~1 ~2 flower_pot\nexecute align xyz run summon block_display ~2.5 ~1.5 ~2.5 {view_range:0.7935f,Tags:[\"gm4_blossoming_pots.display.flower_pot\",\"gm4_blossoming_pots.display.flower_pot.0\",\"smithed.entity\"],block_state:{Name:\"minecraft:amethyst_cluster\"},transformation:{translation:[-0.25f,0.2435f,-0.25f],left_rotation:[0f,0f,0f,1f],scale:[0.5f,0.5f,0.5f],right_rotation:[0f,0f,0f,1f]}}\nexecute align xyz run summon marker ~2.5 ~1.5 ~2.5 {Tags:[\"gm4_blossoming_pots.data.flower_pot\",\"smithed.strict\",\"smithed.entity\"],data:{gm4_blossoming_pots:{id:\"minecraft:amethyst_cluster\",count:1,full:1}},CustomName:{\"text\":\"gm4_blossoming_pots.flower_pot\"}}\n\nfunction gm4_blossoming_pots:upgrade_paths/3.4\n\nassert not entity @e[type=marker,tag=gm4_blossoming_pots.data.flower_pot,dx=2,dz=2,dy=2]\nassert data entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot.0,limit=1,dx=2,dz=2,dy=2] data.gm4_blossoming_pots.Item.id\n"
  },
  {
    "path": "gm4_blossoming_pots/data/gm4_blossoming_pots/test/vanilla_pot_handling.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n# @timeout 400\n\n# place vanilla potted plant, there is no reason this should fail\nsetblock ~ ~1 ~2 flower_pot\nitem replace entity @s weapon.mainhand with red_tulip\nrotate @s facing ~.5 ~ ~2 \ndummy @s use block ~.5 ~1 ~2\n# any_block_use isnt triggering for   dummy @s use block\nadvancement grant @s only gm4_blossoming_pots:interact_with_vanilla_flower_pot\nassert not entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2]\nassert not items entity @s weapon.mainhand *\n\nawait delay 2s\n\n# replace vanilla potted plant with custom\nitem replace entity @s weapon.mainhand with oak_leaves\ndummy @s use block ~.5 ~1 ~2\n# any_block_use isnt triggering for   dummy @s use block\nadvancement grant @s only gm4_blossoming_pots:interact_with_flower_pot\nassert entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2]\nassert not items entity @s weapon.mainhand oak_leaves\n\nawait delay 2s\n\n# place vanilla plant in custom pot, should fail\nitem replace entity @s weapon.mainhand with orange_tulip\ndummy @s use block ~.5 ~1 ~2\n# any_block_use isnt triggering for   dummy @s use block\nadvancement grant @s only gm4_blossoming_pots:interact_with_vanilla_flower_pot\nassert entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2]\nawait items entity @s weapon.mainhand orange_tulip\n"
  },
  {
    "path": "gm4_blossoming_pots/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.blossoming_pots,\"Greatly expands the selection of potable plants. Use Decorated Pots as abnormally large flower pots. Decorate in Style!\"\ntext.gm4.guidebook.blossoming_pots.description,\"To pot a plant, interact with a Decorated Pot or empty Flower Pot while holding a supported item.\\nTo remove a plant, break the decorated pot or interact with the flower pot with an empty hand.\"\ntext.gm4.guidebook.blossoming_pots.item_list.header,\"Supported Items:\"\ntext.gm4.guidebook.blossoming_pots.item_list.1,\"Vanilla Flower Pot\\n                    plants\\nPale hanging moss\\nPointed dripstone\\nAmethyst crystals\\nLeaves\\nGrass plants\\nLush cave plants\"\ntext.gm4.guidebook.blossoming_pots.item_list.2,\"Sugar cane\\nNether vines\\n2 tall plants\\nChorus flower\\nNon-sniffer seeds\\nNether wart\\nBush plants\\nCoral reef plants\\nCactus Flower\"\n"
  },
  {
    "path": "gm4_book_binders/README.md",
    "content": "# Book Binders<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nStoring enchantments is a hassle, but with this data pack it is now an breeze!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Adds new functionality to the lectern\r\n- All enchanted books get ripped into pages - with each enchantment on the book creating one page\r\n- Placing a hopper on the lectern can automate the splitting of books\r\n- Different torn pages can be reassembled into new multi-enchantment books\r\n"
  },
  {
    "path": "gm4_book_binders/assets/translations.csv",
    "content": "key,en_us\nitem.gm4.enchanted_page,Enchanted Page\nadvancement.gm4.book_binders.title,Ain't Got Rhythm\nadvancement.gm4.book_binders.description,Set up a Book Binder\nadvancement.gm4.book_binders_bind.title,Curse of Binding\nadvancement.gm4.book_binders_bind.description,Publish your first Enchanted Book\nadvancement.gm4.book_binders_debind.title,Tearing Up!\nadvancement.gm4.book_binders_debind.description,Get your first enchanted page\ntext.gm4.guidebook.module_desc.book_binders,Start printing your own Enchanted Books with Book Binders. Use lecterns to exract singular pages from Enchanted Books and recombine pages with Leather to create your own Enchanted Books -- free of charge!\ntext.gm4.guidebook.book_binders.tearing,Lecterns have a small area at the center where enchanted books can be placed.\\n\\nThis will cause the enchanted book to be ripped up into separate pages—one for each enchantment.\ntext.gm4.guidebook.book_binders.rebinding,\"Placing enchanted pages onto a lectern will add it to its internal inventory.\\n\\nPlacing a leather onto the lectern will then bind the pages in its inventory, creating an enchanted book.\"\ntext.gm4.guidebook.book_binders.hoppers,A hopper pointing into the back of the lectern will push items into it.\\n\\nA hopper below the lectern will catch any items dropped by the lectern.\n"
  },
  {
    "path": "gm4_book_binders/beet.yaml",
    "content": "id: gm4_book_binders\nname: Book Binders\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\nrequire:\n  - bolt\n\nresource_pack: \n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    model_data:\n      - item: paper\n        reference: item/enchanted_page\n        template: generated\n      - item: lectern\n        reference: gui/advancement/book_binders\n        template: advancement\n      - item: paper\n        reference: gui/advancement/book_binders_debind\n        template:\n          name: advancement\n          forward: item/enchanted_page\n      - item: enchanted_book\n        reference: gui/advancement/book_binders_bind\n        template: advancement\n\n    website:\n      description: Start printing your own Enchanted Books with Book Binders. Use lecterns to exract singular pages from Enchanted Books and recombine pages with Leather to create your own Enchanted Books -- free of charge!\n      recommended:\n        - gm4_resource_pack\n      notes: []\n    modrinth:\n      project_id: oIqNf2N4\n    wiki: https://wiki.gm4.co/wiki/Book_Binders\n    credits:\n      Creators:\n        - Bloo\n        - Sparks\n      Icon Design:\n        - Sparks\n"
  },
  {
    "path": "gm4_book_binders/data/gm4/advancement/book_binders.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"lectern\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_book_binders:gui/advancement/book_binders\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.book_binders.title\",\n      \"fallback\": \"Ain't Got Rhythm\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.book_binders.description\",\n      \"fallback\": \"Set up a Book Binder\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"gm4_place_book_binder\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:block_state_property\",\n            \"block\": \"minecraft:lectern\"\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_book_binders/data/gm4/advancement/book_binders_bind.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"enchanted_book\",\n      \"components\": {\n        \"minecraft:enchantments\": {\n          \"minecraft:mending\": 1\n        },\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_book_binders:gui/advancement/book_binders_bind\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.book_binders_bind.title\",\n      \"fallback\": \"Curse of Binding\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.book_binders_bind.description\",\n      \"fallback\": \"Publish your first Enchanted Book\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:book_binders\",\n  \"criteria\": {\n    \"gm4_book_binders_bind\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_book_binders/data/gm4/advancement/book_binders_debind.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"paper\",\n      \"components\": {\n        \"minecraft:enchantments\": {\n          \"minecraft:mending\": 1\n        },\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_book_binders:gui/advancement/book_binders_debind\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.book_binders_debind.title\",\n      \"fallback\": \"Tearing Up!\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.book_binders_debind.description\",\n      \"fallback\": \"Get your first enchanted page\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:book_binders\",\n  \"criteria\": {\n    \"gm4_book_binders_debind\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/advancement/place_new_lectern.json",
    "content": "{\n  \"criteria\": {\n    \"place_lectern\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:block_state_property\",\n            \"block\": \"minecraft:lectern\"\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_book_binders:binder/placement/revoke_advancement\"\n  }\n}\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/hopper_grab.mcfunction",
    "content": "# @s an active book binder with active hopper in the back\n# at location of hopper\n# run from gm4_book_binders:binder/tick\n\n# give item into armor stand's hand (done before count is reduced)\ndata modify entity @s equipment.mainhand set from block ~ ~ ~ Items[0]\ndata modify entity @s equipment.mainhand.count set value 1\n\n# remove one item from hopper's first (filled) slot\nexecute store result score $hopper_slot_count gm4_binder_data run data get block ~ ~ ~ Items[0].count\n\nexecute if score $hopper_slot_count gm4_binder_data matches ..1 run data remove block ~ ~ ~ Items[0]\nexecute if score $hopper_slot_count gm4_binder_data matches 2.. store result block ~ ~ ~ Items[0].count int 1 run scoreboard players remove $hopper_slot_count gm4_binder_data 1\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/placement/detect_facing.mcfunction",
    "content": "# initializes the book binders armor stand.\n# @s = player who has placed a lectern\n# at most negative corner of lectern\n# run from binder/placement/find_lectern\nexecute if block ~ ~ ~ lectern[facing=north] run summon minecraft:armor_stand ~.5 ~.01 ~.38 {NoGravity:1b,Small:1b,ShowArms:1b,Invisible:1b,Pose:{RightArm:[25.0f,0.0f,180.0f]},CustomName:\"gm4_book_binder\",Tags:[\"gm4_book_binder\",\"gm4_book_binder_north\",\"gm4_no_edit\",\"smithed.entity\",\"smithed.strict\"],equipment:{feet:{id:\"minecraft:enchanted_book\",count:1}}}\nexecute if block ~ ~ ~ lectern[facing=south] run summon minecraft:armor_stand ~.5 ~.01 ~.6 {Rotation:[180f,0f],NoGravity:1b,Small:1b,ShowArms:1b,Invisible:1b,Pose:{RightArm:[25.0f,0.0f,180.0f]},CustomName:\"gm4_book_binder\",Tags:[\"gm4_book_binder\",\"gm4_book_binder_south\",\"gm4_no_edit\",\"smithed.entity\",\"smithed.strict\"],equipment:{feet:{id:\"minecraft:enchanted_book\",count:1}}}\nexecute if block ~ ~ ~ lectern[facing=east] run summon minecraft:armor_stand ~.6 ~.01 ~.5 {Rotation:[90f,0f],NoGravity:1b,Small:1b,ShowArms:1b,Invisible:1b,Pose:{RightArm:[25.0f,0.0f,180.0f]},CustomName:\"gm4_book_binder\",Tags:[\"gm4_book_binder\",\"gm4_book_binder_east\",\"gm4_no_edit\",\"smithed.entity\",\"smithed.strict\"],equipment:{feet:{id:\"minecraft:enchanted_book\",count:1}}}\nexecute if block ~ ~ ~ lectern[facing=west] run summon minecraft:armor_stand ~.38 ~.01 ~.5 {Rotation:[-90f,0f],NoGravity:1b,Small:1b,ShowArms:1b,Invisible:1b,Pose:{RightArm:[25.0f,0.0f,180.0f]},CustomName:\"gm4_book_binder\",Tags:[\"gm4_book_binder\",\"gm4_book_binder_west\",\"gm4_no_edit\",\"smithed.entity\",\"smithed.strict\"],equipment:{feet:{id:\"minecraft:enchanted_book\",count:1}}}\n\nscoreboard players set @e[type=armor_stand,dx=0,tag=gm4_book_binder] gm4_entity_version 1\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/placement/disable.mcfunction",
    "content": "# @s any active book binder armor stand in lectern with book on actual lectern\n# at @s\n# run from gm4_book_binders:process_binder\n\ndata merge entity @s {DisabledSlots:2039583,Marker:1b}\ntag @s remove gm4_book_binder_active\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/placement/drop_hand_item.mcfunction",
    "content": "# @s a book binder NOT inside a lectern, with items in the hand slot\n# at @s\n# run from gm4_book_binders:binder/placement/kill\n\n# summon hand item as item entity\nsummon item ~ ~ ~ {Tags:[\"gm4_empty_hand_item\"],PickupDelay:0s,Item:{id:\"minecraft:wooden_hoe\",count:1}}\ndata modify entity @e[type=item,limit=1,sort=nearest,tag=gm4_empty_hand_item,dx=0] Item set from entity @s equipment.mainhand\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/placement/drop_stored_item.mcfunction",
    "content": "# @s a book binder NOT inside a lectern, with items in the foot slot\n# at @s\n# run from gm4_book_binders:binder/placement/kill\n\n#move the foot item with the lectern's inventory to the hand slot and then run the debinder to drop it all as pages\nitem replace entity @s weapon.mainhand from entity @s armor.feet\nfunction gm4_book_binders:binder/recipes/debind\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/placement/enable.mcfunction",
    "content": "# @s any disabled book binder armor stand in lectern without book on actual lectern\n# at @s\n# run from gm4_book_binders:process_binder\n\ndata merge entity @s {DisabledSlots:1973790,Marker:0b}\ntag @s add gm4_book_binder_active\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/placement/find_lectern.mcfunction",
    "content": "# marches forward until a lectern is encountered\n# @s = player who has placed down a lectern\n# at start location\n# run from binder/placement/revoke_advancement\n\nscoreboard players add gm4_ray_counter gm4_count 1\nexecute unless block ~ ~ ~ lectern if score gm4_ray_counter gm4_count matches 0..500 positioned ^ ^ ^0.01 run function gm4_book_binders:binder/placement/find_lectern\nexecute if block ~ ~ ~ lectern align xyz unless entity @e[type=armor_stand,dx=0,tag=gm4_book_binder,limit=1] run function gm4_book_binders:binder/placement/detect_facing\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/placement/kill.mcfunction",
    "content": "# @s a book binder NOT inside a lectern\n# at @s\n# run from gm4_book_binders:binder/placement/disable\n\n# check for the existence of an hand item\nscoreboard players reset $has_hand_item gm4_binder_data\nexecute store success score $has_hand_item gm4_binder_data if items entity @s weapon.* *\n\n# drop hand items if necessary\nexecute if score $has_hand_item gm4_binder_data matches 1.. run function gm4_book_binders:binder/placement/drop_hand_item\n\n# check for the existence of an hand item\nscoreboard players reset $has_stored_item gm4_binder_data\nexecute store success score $has_stored_item gm4_binder_data unless items entity @s armor.* *[stored_enchantments={}]\n\n# drop internally stored pages if necessary\nexecute if score $has_stored_item gm4_binder_data matches 1.. run function gm4_book_binders:binder/placement/drop_stored_item\n\n# kill armor stand\nkill @s\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/placement/revoke_advancement.mcfunction",
    "content": "# @s = player that just placed a lectern\n# at @s\n# run from advancement place_new_lectern\n\n# revoke advancement and summon ray\nadvancement revoke @s only gm4_book_binders:place_new_lectern\n\n# raycast\nscoreboard players set gm4_ray_counter gm4_count 0\nexecute anchored eyes positioned ^ ^ ^ run function gm4_book_binders:binder/placement/find_lectern\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/recipes/bind.mcfunction",
    "content": "# as book binder marker armor stands with leather in hand\n# at @s\n#run from binder/recipes/check_recipes\n\n# summon empty enchanted book\nsummon item ~ ~-0.26 ~ {Tags:[\"gm4_empty_enchanted_book\"],PickupDelay:0s,Item:{id:\"minecraft:enchanted_book\",count:1}}\n\n# remove the leather\nitem replace entity @s weapon.mainhand with minecraft:air\n\n# compose enchants\nitem replace entity @e[type=item,tag=gm4_empty_enchanted_book,distance=..0.3] contents from entity @s armor.feet\n\n# advancement\nadvancement grant @a[distance=..3,gamemode=!spectator] only gm4:book_binders_bind\n\n# clear stored pages\ndata remove entity @s equipment.feet.components.\"minecraft:stored_enchantments\"\n\n# reset tags\ntag @s remove gm4_book_binder_with_page\ntag @e[type=item,distance=..0.3] remove gm4_empty_enchanted_book\n\n# sounds and visuals\nplaysound minecraft:item.armor.equip_leather block @a ~ ~ ~ 0.4 1.5\nparticle crit ^-.15 ^1.05 ^.05 .1 0 .1 .1 8\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/recipes/check_recipes.mcfunction",
    "content": "# as book binder marker armor stands\n# at @s\n#run from gm4_book_binders:binder/tick\n\n# check for binding/debinding\nexecute if items entity @s weapon.* minecraft:paper[custom_data~{gm4_book_binders:{item:\"enchanted_page\"}}] run function gm4_book_binders:binder/recipes/page\nexecute if items entity @s weapon.* minecraft:enchanted_book run function gm4_book_binders:binder/recipes/debind\nexecute if items entity @s[tag=gm4_book_binder_with_page] weapon.* minecraft:leather run function gm4_book_binders:binder/recipes/bind\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/recipes/debind.mcfunction",
    "content": "# as book binder marker armor stands with enchanted book in hand\n# at @s\n#run from binder/recipes/check_recipes\n\n# transfer enchants onto pages\ndata modify storage gm4_book_binders:temp stored_enchantments set from entity @s equipment.mainhand.components.\"minecraft:stored_enchantments\"\nloot spawn ~ ~-0.26 ~ loot gm4_book_binders:debind_book\n\n# advancement\nadvancement grant @a[distance=..3,gamemode=!spectator] only gm4:book_binders_debind\n\n# delete used up book\ndata remove entity @s equipment.mainhand\n\n# sounds and visuals\nplaysound minecraft:block.beehive.shear master @a ~ ~ ~ 0.4 0.1\nparticle minecraft:item{item:\"minecraft:enchanted_book\"} ^-.15 ^1.05 ^.05 .1 .1 .1 .07 6\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/recipes/page.mcfunction",
    "content": "# as book binder marker armor stands with enchanted page in hand\n# at @s\n#run from gm4_book_binders:binder/recipes/check_recipes\n\n# transfer data from paper to foot storage\nexecute store success score $new_page gm4_binder_data run data modify entity @s equipment.feet.components.\"minecraft:stored_enchantments\" merge from entity @s equipment.mainhand.components.\"minecraft:enchantments\"\n\n# exit if page already exists -- duplicate enchantments would not be added but deleted anyway\nexecute if score $new_page gm4_binder_data matches 0 run return 0\n\n# delete the held page item\nitem replace entity @s weapon.mainhand with minecraft:air\n\n# mark armor stand as holding at least one page\ntag @s add gm4_book_binder_with_page\n\n# sounds and visuals\nplaysound minecraft:item.book.page_turn block @a ~ ~ ~ 0.6 0.7\nplaysound minecraft:entity.item.pickup block @a ~ ~ ~ 0.4 0.1\nparticle enchant ^-.15 ^1.05 ^.05 .1 .1 .1 .1 10\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/binder/tick.mcfunction",
    "content": "# @s an active book binder\n# at @s\n# run from gm4_book_binders:process_binders\n\n# check for the existence of an hand item\nscoreboard players reset $has_hand_item gm4_binder_data\nexecute store success score $has_hand_item gm4_binder_data if items entity @s weapon.* *[count=1]\n\n# handle binders with item in hand slot\nexecute if score $has_hand_item gm4_binder_data matches 1.. if predicate gm4_book_binders:successful_process run function gm4_book_binders:binder/recipes/check_recipes\n\n# look for hopper in the back and move item into hand slot\nexecute if score $has_hand_item gm4_binder_data matches 0 if entity @s[tag=gm4_book_binder_north] positioned ~ ~ ~1 if block ~ ~ ~ hopper[facing=north,enabled=true] if items block ~ ~ ~ container.* * run function gm4_book_binders:binder/hopper_grab\nexecute if score $has_hand_item gm4_binder_data matches 0 if entity @s[tag=gm4_book_binder_south] positioned ~ ~ ~-1 if block ~ ~ ~ hopper[facing=south,enabled=true] if items block ~ ~ ~ container.* * run function gm4_book_binders:binder/hopper_grab\nexecute if score $has_hand_item gm4_binder_data matches 0 if entity @s[tag=gm4_book_binder_east] positioned ~-1 ~ ~ if block ~ ~ ~ hopper[facing=east,enabled=true] if items block ~ ~ ~ container.* * run function gm4_book_binders:binder/hopper_grab\nexecute if score $has_hand_item gm4_binder_data matches 0 if entity @s[tag=gm4_book_binder_west] positioned ~1 ~ ~ if block ~ ~ ~ hopper[facing=west,enabled=true] if items block ~ ~ ~ container.* * run function gm4_book_binders:binder/hopper_grab\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/init.mcfunction",
    "content": "# scoreboard init\nscoreboard objectives add gm4_count dummy\nscoreboard objectives add gm4_binder_data dummy\nscoreboard objectives add gm4_entity_version dummy\n\n# base init\nexecute unless score book_binders gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Book Binders\"}\nexecute unless score book_binders gm4_earliest_version < book_binders gm4_modules run scoreboard players operation book_binders gm4_earliest_version = book_binders gm4_modules\nscoreboard players set book_binders gm4_modules 1\n\nschedule function gm4_book_binders:main 10t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/main.mcfunction",
    "content": "schedule function gm4_book_binders:main 16t\n\n# handle book binders\nexecute as @e[type=armor_stand,tag=gm4_book_binder] at @s run function gm4_book_binders:process_binders\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/function/process_binders.mcfunction",
    "content": "# @s any book binder armor stand\n# at @s\n# run from gm4_book_binders:main\n\n# disable bookbinders with books on actual lectern\nexecute unless entity @s[tag=gm4_book_binder_active] if block ~ ~ ~ lectern[has_book=false] run function gm4_book_binders:binder/placement/enable\nexecute if entity @s[tag=gm4_book_binder_active] unless block ~ ~ ~ lectern[has_book=false] run function gm4_book_binders:binder/placement/disable\n\n# kill armor stands that are no longer in a lectern\nexecute unless block ~ ~ ~ lectern run function gm4_book_binders:binder/placement/kill\n\n# slow clock per book binder for recipe processing\nscoreboard players add @s[tag=gm4_book_binder_active] gm4_binder_data 1\nexecute if score @s gm4_binder_data matches 4.. run scoreboard players set @s gm4_binder_data 0\n\n\n#process binders that aren't locked on a slow clock\nexecute if score @s[tag=gm4_book_binder_active] gm4_binder_data matches 0 at @s run function gm4_book_binders:binder/tick\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/guidebook/book_binders.json",
    "content": "{\n  \"id\": \"book_binders\",\n  \"name\": \"Book Binders\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:enchanted_book\"\n  },\n  \"criteria\": {\n    \"obtain_enchanted_page\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:paper\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_book_binders:{item:\\\"enchanted_page\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"tearing\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.book_binders.tearing\",\n            \"fallback\": \"Lecterns have a small area at the center where enchanted books can be placed.\\n\\nThis will cause the enchanted book to be ripped up into separate pages—one for each enchantment.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"rebinding\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_enchanted_page\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.book_binders.rebinding\",\n            \"fallback\": \"Placing enchanted pages onto a lectern will add it to its internal inventory.\\n\\nPlacing a leather onto the lectern will then bind the pages in its inventory, creating an enchanted book.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.book_binders.hoppers\",\n            \"fallback\": \"A hopper pointing into the back of the lectern will push items into it.\\n\\nA hopper below the lectern will catch any items dropped by the lectern.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/loot_table/debind_book.json",
    "content": "pools = []\nenchantments = [\"minecraft:binding_curse\", \"minecraft:vanishing_curse\", \"minecraft:riptide\", \"minecraft:channeling\", \"minecraft:wind_burst\",  \"minecraft:frost_walker\",  \"minecraft:sharpness\",  \"minecraft:smite\",  \"minecraft:bane_of_arthropods\",  \"minecraft:impaling\",  \"minecraft:power\",  \"minecraft:density\",  \"minecraft:breach\",  \"minecraft:piercing\",  \"minecraft:sweeping_edge\",  \"minecraft:multishot\",  \"minecraft:fire_aspect\",  \"minecraft:flame\",  \"minecraft:knockback\",  \"minecraft:punch\",  \"minecraft:protection\",  \"minecraft:blast_protection\",  \"minecraft:fire_protection\",  \"minecraft:projectile_protection\",  \"minecraft:feather_falling\",  \"minecraft:fortune\",  \"minecraft:looting\",  \"minecraft:silk_touch\",  \"minecraft:luck_of_the_sea\",  \"minecraft:efficiency\",  \"minecraft:quick_charge\",  \"minecraft:lure\",  \"minecraft:respiration\",  \"minecraft:aqua_affinity\",  \"minecraft:soul_speed\",  \"minecraft:swift_sneak\",  \"minecraft:depth_strider\",  \"minecraft:thorns\",  \"minecraft:loyalty\",  \"minecraft:unbreaking\",  \"minecraft:infinity\",  \"minecraft:mending\", \"minecraft:lunge\"]\n# expecting enchantment in format, \"minecraft:name\"\n# see bookshelf inspectors, evaluate/process_display/spawn/components_to_list\n\nfor enchantment in enchantments:\n  pools.append(\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:paper\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_book_binders:item/enchanted_page\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_book_binders:{item:\\\"enchanted_page\\\"}}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"entity\": \"this\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.enchanted_page\",\n                \"fallback\": \"Enchanted Page\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_enchantments\",\n              \"enchantments\": {\n                f\"{enchantment}\": {\n                  \"type\": \"minecraft:storage\",\n                  \"storage\": \"gm4_book_binders:temp\",\n                  \"path\": f\"stored_enchantments.\\\"{enchantment}\\\"\"\n                }\n              }\n            }\n          ]\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:value_check\",\n          \"value\": {\n            \"type\": \"minecraft:storage\",\n            \"storage\": \"gm4_book_binders:temp\",\n            \"path\": f\"stored_enchantments.\\\"{enchantment}\\\"\"\n          },\n          \"range\": {\n            \"min\": 1,\n            \"max\": 255\n          }\n        }\n      ]\n    }\n  )\n\n{\n  \"pools\": pools\n}\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/predicate/successful_process.json",
    "content": "{\n  \"condition\": \"minecraft:random_chance\",\n  \"chance\": 0.82\n}\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/test/binding.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n# @timeout 400\n\ngive @s lectern\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1.5\ndummy @s use block ~ ~ ~1\nassert entity @s[advancements={gm4:book_binders=true}]\n\nitem replace entity @s weapon.mainhand with minecraft:paper[enchantments={efficiency:3},custom_data={gm4_book_binders:{item:\"enchanted_page\"}}]\ndummy @s use entity @e[tag=gm4_book_binder,distance=..3,limit=1]\n\nawait not items entity @e[tag=gm4_book_binder,distance=..3] weapon.* minecraft:paper\n\nitem replace entity @s weapon.mainhand with minecraft:leather\ndummy @s use entity @e[tag=gm4_book_binder,distance=..3,limit=1]\n\nawait not items entity @e[tag=gm4_book_binder,distance=..3] weapon.* minecraft:leather\n\nawait items entity @s container.* minecraft:enchanted_book[count=1,stored_enchantments={efficiency:3}]\n"
  },
  {
    "path": "gm4_book_binders/data/gm4_book_binders/test/debinding.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n# @timeout 300\n\ngive @s lectern\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1.5\ndummy @s use block ~ ~ ~1\nassert entity @s[advancements={gm4:book_binders=true}]\n\nitem replace entity @s weapon.mainhand with minecraft:enchanted_book[stored_enchantments={efficiency:3,silk_touch:1}]\ndummy @s use entity @e[tag=gm4_book_binder,distance=..3,limit=1]\n\nawait entity @s[advancements={gm4:book_binders_debind=true}]\n\ntp @e[type=item,dx=2,dy=2,dz=2] @s\n\nawait items entity @s container.* minecraft:paper[enchantments={silk_touch:1},custom_data~{gm4_book_binders:{item:\"enchanted_page\"}}]\nassert items entity @s container.* minecraft:paper[enchantments={efficiency:3},custom_data~{gm4_book_binders:{item:\"enchanted_page\"}}]\n"
  },
  {
    "path": "gm4_book_binders/mod.mcdoc",
    "content": "use ::java::world::component::item::EnchantmentLevels\n\ndispatch minecraft:storage[gm4_book_binders:temp] to struct {\n  stored_enchantments?: EnchantmentLevels\n}\n"
  },
  {
    "path": "gm4_bookshelf_inspector/README.md",
    "content": "# Bookshelf Inspector<!--$headerTitle--><!--$pmc:delete-->\n\nSee what's in your Chiseled Bookshelves without having to take all the books out! <!--$pmc:headerSize-->\n\n<img src=\"images/bookshelf_inspector.png\" alt=\"Enchanted Books show Enchantments!\" height=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- Stand still and look at a book in a Chiseled Bookshelf to see its name.\n- Shows the enchantments on Enchanted Books.\n- Shows the author for Written Books.\n- Works in any language and supports custom formatting for the name!\n"
  },
  {
    "path": "gm4_bookshelf_inspector/beet.yaml",
    "content": "id: gm4_bookshelf_inspector\nname: Bookshelf Inspector\nversion: 1.5.X\n\ndata_pack:\n  load: .\n\nrequire:\n  - bolt\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    website:\n      description: See what's in your Chiseled Bookshelves without having to take all the books out!\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: hI6pAf86\n    smithed:\n      pack_id: gm4_bookshelf_inspector\n    wiki: https://wiki.gm4.co/wiki/Bookshelf_Inspector\n    credits:\n      Creator:\n        - Djones\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/evaluate/raycast.mcfunction",
    "content": "# raycast for a chiseled bookshelf\n# @s = player not in spectator mode\n# at @s anchored eyes, positioned ^ ^ ^1 + 0.25x (x = 0..11)\n# run from evaluate/run\n# run from here\n\nscoreboard players remove $simple_raycast gm4_bookshelf_inspector_data 1\n\n# check for chiseled bookshelves\nexecute if block ~ ~ ~ chiseled_bookshelf run function gm4_bookshelf_inspector:find_book/prep\n\n# stop raycast when block is hit (including chiseled bookshelf)\nexecute unless block ~ ~ ~ #gm4:no_collision run scoreboard players set $simple_raycast gm4_bookshelf_inspector_data 0\n\nexecute if score $simple_raycast gm4_bookshelf_inspector_data matches 1.. positioned ^ ^ ^0.25 run function gm4_bookshelf_inspector:evaluate/raycast\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/evaluate/run.mcfunction",
    "content": "# check if the player is looking at a chiseled bookshelf\n# @s = player not in spectator mode and not moving\n# at unspecified\n# run from main\n\n# look for chiseled bookshelf\nscoreboard players set $simple_raycast gm4_bookshelf_inspector_data 11\nexecute at @s anchored eyes positioned ^ ^ ^1 run function gm4_bookshelf_inspector:evaluate/raycast\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/find_book/find_book.mcfunction",
    "content": "# collect data on the looked at book\n# @s = player not in spectator mode\n# positioned ^ ^ ^-0.05 before chiseled bookshelf\n# run from find_book/raycast\n\n# stop the raycast\nscoreboard players set $raycast gm4_bookshelf_inspector_data 0\n\n# get the slot being looked at\nscoreboard players set $evaluate gm4_bookshelf_inspector_data 1\ntag @s add gm4_bookshelf_inspector_target\nexecute summon marker run function gm4_bookshelf_inspector:find_book/get_book_slot\ntag @s remove gm4_bookshelf_inspector_target\n\n# if evaluation failed stop the function\nexecute if score $evaluate gm4_bookshelf_inspector_data matches 0 run return 0\n\n# store book data in storage\nexecute if score $rotation gm4_bookshelf_inspector_data matches 1 run data modify storage gm4_bookshelf_inspector:temp book_data set from block ~ ~ ~-1 Items\nexecute if score $rotation gm4_bookshelf_inspector_data matches 2 run data modify storage gm4_bookshelf_inspector:temp book_data set from block ~ ~ ~1 Items\nexecute if score $rotation gm4_bookshelf_inspector_data matches 3 run data modify storage gm4_bookshelf_inspector:temp book_data set from block ~-1 ~ ~ Items\nexecute if score $rotation gm4_bookshelf_inspector_data matches 4 run data modify storage gm4_bookshelf_inspector:temp book_data set from block ~1 ~ ~ Items\nexecute if score $book_slot gm4_bookshelf_inspector_data matches 0 run data modify storage gm4_bookshelf_inspector:temp book_data set from storage gm4_bookshelf_inspector:temp book_data[{Slot:0b}]\nexecute if score $book_slot gm4_bookshelf_inspector_data matches 1 run data modify storage gm4_bookshelf_inspector:temp book_data set from storage gm4_bookshelf_inspector:temp book_data[{Slot:1b}]\nexecute if score $book_slot gm4_bookshelf_inspector_data matches 2 run data modify storage gm4_bookshelf_inspector:temp book_data set from storage gm4_bookshelf_inspector:temp book_data[{Slot:2b}]\nexecute if score $book_slot gm4_bookshelf_inspector_data matches 3 run data modify storage gm4_bookshelf_inspector:temp book_data set from storage gm4_bookshelf_inspector:temp book_data[{Slot:3b}]\nexecute if score $book_slot gm4_bookshelf_inspector_data matches 4 run data modify storage gm4_bookshelf_inspector:temp book_data set from storage gm4_bookshelf_inspector:temp book_data[{Slot:4b}]\nexecute if score $book_slot gm4_bookshelf_inspector_data matches 5 run data modify storage gm4_bookshelf_inspector:temp book_data set from storage gm4_bookshelf_inspector:temp book_data[{Slot:5b}]\n\n# check if slot actually has a book, otherwise stop the function\n# this does not fail evaluation, so there is no delay in case the player is scanning over a half-filled bookshelf\nexecute unless data storage gm4_bookshelf_inspector:temp book_data.id run return 0\n\n# find top-left location of this chiseled bookshelf\n# 1=north / 2=south / 3=west / 4=east (this is facing direction, so you look against the opposite side of the block)\nexecute if score $rotation gm4_bookshelf_inspector_data matches 1 positioned ~ ~ ~-1 align xyz positioned ~0.1875 ~0.5625 ~1.001 rotated 0 0 run function gm4_bookshelf_inspector:process_display/locate_slot\nexecute if score $rotation gm4_bookshelf_inspector_data matches 2 positioned ~ ~ ~1 align xyz positioned ~0.8125 ~0.5625 ~-0.001 rotated 180 0 run function gm4_bookshelf_inspector:process_display/locate_slot\nexecute if score $rotation gm4_bookshelf_inspector_data matches 3 positioned ~-1 ~ ~ align xyz positioned ~1.001 ~0.5625 ~0.8125 rotated -90 0 run function gm4_bookshelf_inspector:process_display/locate_slot\nexecute if score $rotation gm4_bookshelf_inspector_data matches 4 positioned ~1 ~ ~ align xyz positioned ~-0.001 ~0.5625 ~0.1875 rotated 90 0 run function gm4_bookshelf_inspector:process_display/locate_slot\n\n# cleanup storage\ndata remove storage gm4_bookshelf_inspector:temp book_data\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/find_book/get_book_slot.mcfunction",
    "content": "# check which book slot is being looked at\n# @s = marker\n# at chiseled bookshelf\n# run from find_book/find_book\n\n# get y position relative to the block\nexecute store result score $y gm4_bookshelf_inspector_data run data get entity @s Pos[1] 100\nscoreboard players operation $y gm4_bookshelf_inspector_data %= #100 gm4_bookshelf_inspector_data\n\n# get rotation from player yaw and transform it into a score\n# 1=north / 2=south / 3=west / 4=east\nexecute summon marker run function gm4_bookshelf_inspector:find_book/get_rotation\n\n# check if bookshelf is rotated correctly\nexecute if score $rotation gm4_bookshelf_inspector_data matches 1 unless block ~ ~ ~-1 chiseled_bookshelf[facing=south] run scoreboard players set $evaluate gm4_bookshelf_inspector_data 0\nexecute if score $rotation gm4_bookshelf_inspector_data matches 2 unless block ~ ~ ~1 chiseled_bookshelf[facing=north] run scoreboard players set $evaluate gm4_bookshelf_inspector_data 0\nexecute if score $rotation gm4_bookshelf_inspector_data matches 3 unless block ~-1 ~ ~ chiseled_bookshelf[facing=east] run scoreboard players set $evaluate gm4_bookshelf_inspector_data 0\nexecute if score $rotation gm4_bookshelf_inspector_data matches 4 unless block ~1 ~ ~ chiseled_bookshelf[facing=west] run scoreboard players set $evaluate gm4_bookshelf_inspector_data 0\n# stop if evaluation failed\nexecute if score $evaluate gm4_bookshelf_inspector_data matches 0 run kill @s\nexecute if score $evaluate gm4_bookshelf_inspector_data matches 0 run return 0\n\n# check if the marker is located on the front face of the bookshelf\nexecute if score $rotation gm4_bookshelf_inspector_data matches 1..2 store result score $face_check gm4_bookshelf_inspector_data run data get entity @s Pos[2] 100\nexecute if score $rotation gm4_bookshelf_inspector_data matches 3..4 store result score $face_check gm4_bookshelf_inspector_data run data get entity @s Pos[0] 100\nscoreboard players operation $face_check gm4_bookshelf_inspector_data %= #100 gm4_bookshelf_inspector_data\nexecute unless score $face_check gm4_bookshelf_inspector_data matches 0..5 unless score $face_check gm4_bookshelf_inspector_data matches 94..99 run scoreboard players set $evaluate gm4_bookshelf_inspector_data 0\n# stop if evaluation failed\nexecute if score $evaluate gm4_bookshelf_inspector_data matches 0 run kill @s\nexecute if score $evaluate gm4_bookshelf_inspector_data matches 0 run return 0\n\n# store either the x or z coord depending on player facing\nexecute if score $rotation gm4_bookshelf_inspector_data matches 1..2 store result score $xz gm4_bookshelf_inspector_data run data get entity @s Pos[0] 100\nexecute if score $rotation gm4_bookshelf_inspector_data matches 3..4 store result score $xz gm4_bookshelf_inspector_data run data get entity @s Pos[2] 100\nscoreboard players operation $xz gm4_bookshelf_inspector_data %= #100 gm4_bookshelf_inspector_data\n\n# book slots:\n# 0 1 2\n# 3 4 5\nscoreboard players set $book_slot gm4_bookshelf_inspector_data 0\nexecute if score $xz gm4_bookshelf_inspector_data matches 33.. unless score $rotation gm4_bookshelf_inspector_data matches 2..3 run scoreboard players add $book_slot gm4_bookshelf_inspector_data 1\nexecute if score $xz gm4_bookshelf_inspector_data matches 66.. unless score $rotation gm4_bookshelf_inspector_data matches 2..3 run scoreboard players add $book_slot gm4_bookshelf_inspector_data 1\nexecute if score $xz gm4_bookshelf_inspector_data matches ..33 if score $rotation gm4_bookshelf_inspector_data matches 2..3 run scoreboard players add $book_slot gm4_bookshelf_inspector_data 1\nexecute if score $xz gm4_bookshelf_inspector_data matches ..66 if score $rotation gm4_bookshelf_inspector_data matches 2..3 run scoreboard players add $book_slot gm4_bookshelf_inspector_data 1\nexecute if score $y gm4_bookshelf_inspector_data matches ..50 run scoreboard players add $book_slot gm4_bookshelf_inspector_data 3\n\n# remove marker\nkill @s\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/find_book/get_rotation.mcfunction",
    "content": "# spawn marker to get player yaw\n# @s = marker\n# at @s\n# run from find_book/get_book_slot\n\ntp @s @p[tag=gm4_bookshelf_inspector_target]\nexecute store result score $rotation gm4_bookshelf_inspector_data run data get entity @s Rotation[0]\nexecute if score $rotation gm4_bookshelf_inspector_data matches -45..44 run scoreboard players set $rotation gm4_bookshelf_inspector_data 2\nexecute if score $rotation gm4_bookshelf_inspector_data matches -135..-45 run scoreboard players set $rotation gm4_bookshelf_inspector_data 4\nexecute if score $rotation gm4_bookshelf_inspector_data matches 45..135 run scoreboard players set $rotation gm4_bookshelf_inspector_data 3\nexecute unless score $rotation gm4_bookshelf_inspector_data matches 2..4 run scoreboard players set $rotation gm4_bookshelf_inspector_data 1\nkill @s\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/find_book/prep.mcfunction",
    "content": "# prep looking for a looked at book\n# @s = player not in spectator mode\n# at unspecified\n# run from evaluate/raycast\n\n# start a more precise raycast\nscoreboard players set $raycast gm4_bookshelf_inspector_data 50\nexecute at @s anchored eyes positioned ^ ^ ^1 run function gm4_bookshelf_inspector:find_book/raycast\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/find_book/raycast.mcfunction",
    "content": "# raycast for a chiseled bookshelf\n# @s = player not in spectator mode\n# at @s anchored eyes, positioned ^ ^ ^1 + 0.05x (x = 0..50)\n# run from find_book/prep\n# run from here\n\nscoreboard players remove $raycast gm4_bookshelf_inspector_data 1\n\n# check for bookshelf slightly up ahead\nexecute if block ^ ^ ^0.0501 chiseled_bookshelf run function gm4_bookshelf_inspector:find_book/find_book\n\n# if a block is hit stop the raycast\nexecute unless block ~ ~ ~ #gm4:no_collision run scoreboard players set $raycast gm4_bookshelf_inspector_data 0\n\nexecute if score $raycast gm4_bookshelf_inspector_data matches 1.. positioned ^ ^ ^0.05 run function gm4_bookshelf_inspector:find_book/raycast\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/init.mcfunction",
    "content": "execute unless score bookshelf_inspector gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Bookshelf Inspector\"}\nexecute unless score bookshelf_inspector gm4_earliest_version < bookshelf_inspector gm4_modules run scoreboard players operation bookshelf_inspector gm4_earliest_version = bookshelf_inspector gm4_modules\nscoreboard players set bookshelf_inspector gm4_modules 1\n\nscoreboard objectives add gm4_bookshelf_inspector_data dummy\nscoreboard objectives add gm4_bookshelf_inspector_keep dummy\nscoreboard objectives add gm4_bookshelf_inspector_display_state dummy\nscoreboard objectives add gm4_bookshelf_inspector_walk custom:walk_one_cm\nscoreboard objectives add gm4_bookshelf_inspector_sprint custom:sprint_one_cm\nscoreboard objectives add gm4_bookshelf_inspector_fall custom:fall_one_cm\n\nscoreboard players set #100 gm4_bookshelf_inspector_data 100\n\nschedule function gm4_bookshelf_inspector:main 1t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/main.mcfunction",
    "content": "schedule function gm4_bookshelf_inspector:main 8t\n\n# reset keep scores for present text_displays\nscoreboard players set @e[type=text_display,tag=gm4_bookshelf_inspector_display.active] gm4_bookshelf_inspector_keep 0\n\n# process players\n# do not check for chiseled bookshelves if the player moved anyway, allow some leniency for walking to avoid nudging removing the display\nexecute as @a[gamemode=!spectator] unless score @s gm4_bookshelf_inspector_walk matches 100.. unless score @s gm4_bookshelf_inspector_sprint matches 1.. unless score @s gm4_bookshelf_inspector_fall matches 1.. run function gm4_bookshelf_inspector:evaluate/run\n\n# reset player scores\nscoreboard players reset @a gm4_bookshelf_inspector_walk\nscoreboard players reset @a gm4_bookshelf_inspector_sprint\nscoreboard players reset @a gm4_bookshelf_inspector_fall\n\n# remove text_displays that are not looked at\nexecute as @e[type=text_display,tag=gm4_bookshelf_inspector_display.active,scores={gm4_bookshelf_inspector_keep=0}] run function gm4_bookshelf_inspector:process_display/remove/start\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/check_location.mcfunction",
    "content": "# check if text_display exists in this location, if so update it, otherwise spawn a new one\n# @s = player not in spectator mode\n# at chiseled bookshelf positioned at book slot\n# run from process_display/locate_slot\n\n# check for existing display\nexecute store success score $display_found gm4_bookshelf_inspector_data run scoreboard players set @e[type=text_display,tag=gm4_bookshelf_inspector_display,distance=..0.01] gm4_bookshelf_inspector_keep 1\n\n# spawn new display\nexecute if score $display_found gm4_bookshelf_inspector_data matches 0 summon text_display run function gm4_bookshelf_inspector:process_display/spawn/init\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/locate_slot.mcfunction",
    "content": "# locate decided book slot in this chiseled bookshelf, then spawn text_display there\n# @s = player not in spectator mode\n# at chiseled bookshelf\n# run from find_book/find_book\n\nexecute if score $book_slot gm4_bookshelf_inspector_data matches 0 run function gm4_bookshelf_inspector:process_display/check_location\nexecute if score $book_slot gm4_bookshelf_inspector_data matches 1 positioned ^0.3125 ^ ^ run function gm4_bookshelf_inspector:process_display/check_location\nexecute if score $book_slot gm4_bookshelf_inspector_data matches 2 positioned ^0.625 ^ ^ run function gm4_bookshelf_inspector:process_display/check_location\nexecute if score $book_slot gm4_bookshelf_inspector_data matches 3 positioned ^ ^-0.5 ^ run function gm4_bookshelf_inspector:process_display/check_location\nexecute if score $book_slot gm4_bookshelf_inspector_data matches 4 positioned ^0.3125 ^-0.5 ^ run function gm4_bookshelf_inspector:process_display/check_location\nexecute if score $book_slot gm4_bookshelf_inspector_data matches 5 positioned ^0.625 ^-0.5 ^ run function gm4_bookshelf_inspector:process_display/check_location\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/remove/process.mcfunction",
    "content": "# text_display removing tick clock\n# @s = removing text_display\n# at unspecified\n# run from process_display/remove/tick\n\nscoreboard players add @s gm4_bookshelf_inspector_display_state 1\n\nexecute if score @s gm4_bookshelf_inspector_display_state matches 6 run data merge entity @s {start_interpolation:-1,interpolation_duration:5,transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0f,0f,0f]}}\nexecute unless score @s gm4_bookshelf_inspector_display_state matches 9 run scoreboard players set $keep_loop_active gm4_bookshelf_inspector_data 1\nexecute if score @s gm4_bookshelf_inspector_display_state matches 9 run kill @s\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/remove/start.mcfunction",
    "content": "# remove a text_display no longer being looked at\n# @s = text_display\n# at unspecified\n# run from main\n\n# schedule tick function unless it's already active\nexecute unless entity @e[type=text_display,tag=gm4_bookshelf_inspector_display.removing] run schedule function gm4_bookshelf_inspector:process_display/remove/tick 1t\n\ntag @s remove gm4_bookshelf_inspector_display.active\ntag @s add gm4_bookshelf_inspector_display.removing\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/remove/tick.mcfunction",
    "content": "# text_display removing tick clock\n# @s = unspecified\n# at unspecified\n# schedule from process_display/remove/init\n# schedule from here\n\nscoreboard players set $keep_loop_active gm4_bookshelf_inspector_data 0\n\nexecute as @e[type=text_display,tag=gm4_bookshelf_inspector_display.removing] run function gm4_bookshelf_inspector:process_display/remove/process\n\nexecute if score $keep_loop_active gm4_bookshelf_inspector_data matches 1 run schedule function gm4_bookshelf_inspector:process_display/remove/tick 1t\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/components_to_list.mcfunction",
    "content": "# converts new 1.20.5 stored enchantment component structure to a previous format of a list of {id:,lvl:}\n  ## NOTE: a more substantial rewrite may be possible in the future if we get a way to iterate over the nbt keys dynamically\n  # keeping this format enables most of the module to remain intact for the 1.20.5 update quickly, though may be less efficient overall\n\n# @s = text display\n# at chiseled bookshelf, selected book slot\n# run from process_display/spawn/list_enchantments\n\ndata modify storage gm4_bookshelf_inspector:temp enchantments set value []\n\nALL_ENCHANTMENTS = [\n    \"binding_curse\",\n    \"vanishing_curse\",\n    \"riptide\",\n    \"channeling\",\n    \"wind_burst\",\n    \"frost_walker\",\n    \"sharpness\",\n    \"smite\",\n    \"bane_of_arthropods\",\n    \"impaling\",\n    \"power\",\n    \"density\",\n    \"breach\",\n    \"piercing\",\n    \"sweeping_edge\",\n    \"multishot\",\n    \"fire_aspect\",\n    \"flame\",\n    \"knockback\",\n    \"punch\",\n    \"protection\",\n    \"blast_protection\",\n    \"fire_protection\",\n    \"projectile_protection\",\n    \"feather_falling\",\n    \"fortune\",\n    \"looting\",\n    \"silk_touch\",\n    \"luck_of_the_sea\",\n    \"efficiency\",\n    \"quick_charge\",\n    \"lunge\",\n    \"lure\",\n    \"respiration\",\n    \"aqua_affinity\",\n    \"soul_speed\",\n    \"swift_sneak\",\n    \"depth_strider\",\n    \"thorns\",\n    \"loyalty\",\n    \"unbreaking\",\n    \"infinity\",\n    \"mending\"\n]\n\n## beet 0.105.0 is missing enchantment tag support. Uncomment in a future version to auto-pull ids from the vanilla jar.\n# from beet.contrib.vanilla import Vanilla\n# vanilla = ctx.inject(Vanilla).mount(\"data/minecraft/tags/enchantment/tooltip_order.json\")\n# ALL_ENCHANTMENTS = vanilla.data.enchantment_tags[\"minecraft:tooltip_order\"].data[\"values\"]\n\nfor ench_id in ALL_ENCHANTMENTS:\n    execute if data storage gm4_bookshelf_inspector:temp f\"levels.\\\"minecraft:{ench_id}\\\"\" run data modify storage gm4_bookshelf_inspector:temp enchantments append value {id:f\"minecraft:{ench_id}\"}\n    execute if data storage gm4_bookshelf_inspector:temp f\"levels.\\\"minecraft:{ench_id}\\\"\" run data modify storage gm4_bookshelf_inspector:temp enchantments[{id:f\"minecraft:{ench_id}\"}].lvl set from storage gm4_bookshelf_inspector:temp f\"levels.\\\"minecraft:{ench_id}\\\"\"\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/decide_name.mcfunction",
    "content": "# decide the name of the text_display\n# @s = text display\n# at chiseled bookshelf, selected book slot\n# run from process_display/spawn/init\n\nscoreboard players set $name_given gm4_bookshelf_inspector_data 0\n\n# if book is named use that (decide color based on item)\nexecute if data storage gm4_bookshelf_inspector:temp book_data{id:\"minecraft:enchanted_book\"}.components.\"minecraft:custom_name\" store success score $name_given gm4_bookshelf_inspector_data run data modify storage gm4_bookshelf_inspector:temp text append value [{\"text\":\"\",\"color\":\"yellow\"},{\"nbt\":\"book_data.components.'minecraft:custom_name'\",\"storage\":\"gm4_bookshelf_inspector:temp\",\"interpret\":true}]\nexecute unless score $name_given gm4_bookshelf_inspector_data matches 1 if data storage gm4_bookshelf_inspector:temp book_data.components.\"minecraft:enchantments\" if data storage gm4_bookshelf_inspector:temp book_data.components.\"minecraft:custom_name\" unless data storage gm4_bookshelf_inspector:temp book_data{id:\"minecraft:enchanted_book\"} store success score $name_given gm4_bookshelf_inspector_data run data modify storage gm4_bookshelf_inspector:temp text append value [{\"text\":\"\",\"color\":\"aqua\"},{\"nbt\":\"book_data.components.'minecraft:custom_name'\",\"storage\":\"gm4_bookshelf_inspector:temp\",\"interpret\":true}]\nexecute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data run data modify storage gm4_bookshelf_inspector:temp text append from storage gm4_bookshelf_inspector:temp book_data.components.\"minecraft:custom_name\"\n\n# if not and book & quill use the title\nexecute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data.components.\"minecraft:written_book_content\".title if data storage gm4_bookshelf_inspector:temp book_data.components.\"minecraft:enchantments\" run data modify storage gm4_bookshelf_inspector:temp text append value [{\"text\":\"\",\"color\":\"aqua\"},{\"nbt\":\"book_data.components.'minecraft:written_book_content'.title.raw\",\"storage\":\"gm4_bookshelf_inspector:temp\"}]\nexecute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data.components.\"minecraft:written_book_content\".title run data modify storage gm4_bookshelf_inspector:temp text append value {\"nbt\":\"book_data.components.'minecraft:written_book_content'.title.raw\",\"storage\":\"gm4_bookshelf_inspector:temp\"}\n\n# if not and (enchanted) book use translation key\nexecute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data{id:\"minecraft:enchanted_book\"} run data modify storage gm4_bookshelf_inspector:temp text append value {\"translate\":\"item.minecraft.enchanted_book\",\"color\":\"yellow\"}\nexecute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data{id:\"minecraft:book\"} run data modify storage gm4_bookshelf_inspector:temp text append value {\"translate\":\"item.minecraft.book\"}\nexecute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data{id:\"minecraft:book\"}.components.\"minecraft:enchantments\" run data modify storage gm4_bookshelf_inspector:temp text append value {\"translate\":\"item.minecraft.book\",\"color\":\"aqua\"}\nexecute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data{id:\"minecraft:writable_book\"} run data modify storage gm4_bookshelf_inspector:temp text append value {\"translate\":\"item.minecraft.writable_book\"}\nexecute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data{id:\"minecraft:writable_book\"}.components.\"minecraft:enchantments\" run data modify storage gm4_bookshelf_inspector:temp text append value {\"translate\":\"item.minecraft.writable_book\",\"color\":\"aqua\"}\nexecute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data{id:\"minecraft:knowledge_book\"} run data modify storage gm4_bookshelf_inspector:temp text append value {\"translate\":\"item.minecraft.knowledge_book\",\"color\":\"light_purple\"}\n\n# if written book also display the author\nexecute if data storage gm4_bookshelf_inspector:temp book_data{id:\"minecraft:written_book\"} run data modify storage gm4_bookshelf_inspector:temp text append value {\"translate\":\"book.byAuthor\",\"with\":[{\"nbt\":\"book_data.components.'minecraft:written_book_content'.author\",\"storage\":\"gm4_bookshelf_inspector:temp\"}],\"color\":\"gray\"}\n\n# if enchanted book with enchantments also display the enchantments\nexecute if data storage gm4_bookshelf_inspector:temp book_data{id:\"minecraft:enchanted_book\"}.components.\"minecraft:stored_enchantments\" run function gm4_bookshelf_inspector:process_display/spawn/list_enchantments\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/eval_enchantment.mcfunction",
    "content": "# transform enchantment id and lvl into displayable text\n# @s = text display\n# at chiseled bookshelf, selected book slot\n# run from process_display/spawn/process_enchantments\n# with $id = id of the enchantment with \"minecract.\" stripped off\n# with $lvl = level of the enchantment as integer\n\n# if enchantment level is 10 or lower display latin number, otherwise just print level\n$execute if score $enchant_lvl gm4_bookshelf_inspector_data matches 1..10 run data modify storage gm4_bookshelf_inspector:temp enchantment_list append value [{\"translate\":\"enchantment.minecraft.$(id)\"},{\"text\":\" \"},{\"translate\":\"enchantment.level.$(lvl)\"}]\n$execute unless score $enchant_lvl gm4_bookshelf_inspector_data matches 1..10 run data modify storage gm4_bookshelf_inspector:temp enchantment_list append value [{\"translate\":\"enchantment.minecraft.$(id)\"},{\"text\":\" $(lvl)\"}]\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/init.mcfunction",
    "content": "# init text display\n# @s = text display\n# at chiseled bookshelf, selected book slot\n# run from process_display/locate_slot\n\n# schedule tick function unless it's already active\nexecute unless entity @e[type=text_display,tag=gm4_bookshelf_inspector_display.extending] run schedule function gm4_bookshelf_inspector:process_display/spawn/tick 1t\n\n# set data\ndata merge entity @s {Tags:[\"gm4_bookshelf_inspector_display\",\"gm4_bookshelf_inspector_display.extending\"],default_background:1b,view_range:0.05f,see_through:1b,line_width:130,transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0f,0f,0f]},text:{\"text\":\"???\"}}\n\n# build text storage\ndata modify storage gm4_bookshelf_inspector:temp text set value []\nfunction gm4_bookshelf_inspector:process_display/spawn/decide_name\ndata modify entity @s text set value {\"nbt\":\"text[]\",\"storage\":\"gm4_bookshelf_inspector:temp\",\"separator\":\"\\n\",\"interpret\":true}\ndata remove storage gm4_bookshelf_inspector:temp text\n\n# set rotation\nexecute if score $rotation gm4_bookshelf_inspector_data matches 1 run data modify entity @s Rotation set value [0.0F,0.0F]\nexecute if score $rotation gm4_bookshelf_inspector_data matches 2 run data modify entity @s Rotation set value [180.0F,0.0F]\nexecute if score $rotation gm4_bookshelf_inspector_data matches 3 run data modify entity @s Rotation set value [-90.0F,0.0F]\nexecute if score $rotation gm4_bookshelf_inspector_data matches 4 run data modify entity @s Rotation set value [90.0F,0.0F]\n\nscoreboard players set @s gm4_bookshelf_inspector_keep 1\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/list_enchantments.mcfunction",
    "content": "# create a list of all the enchantments\n# @s = text display\n# at chiseled bookshelf, selected book slot\n# run from process_display/spawn/decide_name\n\n# create array of all enchantments with levels\nscoreboard players set $enchantments_max gm4_bookshelf_inspector_data 4\ndata modify storage gm4_bookshelf_inspector:temp levels set from storage gm4_bookshelf_inspector:temp book_data.components.\"minecraft:stored_enchantments\"\nfunction gm4_bookshelf_inspector:process_display/spawn/components_to_list\ndata modify storage gm4_bookshelf_inspector:temp enchantment_list set value []\nfunction gm4_bookshelf_inspector:process_display/spawn/process_enchantments\n\n# add to the text\ndata modify storage gm4_bookshelf_inspector:temp text append value {\"nbt\":\"enchantment_list[]\",\"storage\":\"gm4_bookshelf_inspector:temp\",\"separator\":\"\\n\",\"interpret\":true,\"color\":\"gray\"}\n\n# cleanup\ndata remove storage gm4_bookshelf_inspector:temp enchantments\ndata remove storage gm4_bookshelf_inspector:temp levels\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/process.mcfunction",
    "content": "# text_display extending tick clock\n# @s = extending text_display\n# at unspecified\n# run from process_display/spawn/tick\n\nscoreboard players add @s gm4_bookshelf_inspector_display_state 1\n\nexecute if score @s gm4_bookshelf_inspector_display_state matches 2 run data merge entity @s {start_interpolation:-1,interpolation_duration:2,transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.3f,0f],scale:[0.6f,0.6f,0.6f]}}\n\nexecute if score @s gm4_bookshelf_inspector_display_state matches 4 run tag @s add gm4_bookshelf_inspector_display.active\nexecute if score @s gm4_bookshelf_inspector_display_state matches 4 run tag @s remove gm4_bookshelf_inspector_display.extending\n\nexecute unless score @s gm4_bookshelf_inspector_display_state matches 4 run scoreboard players set $keep_loop_active gm4_bookshelf_inspector_data 1\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/process_enchantments.mcfunction",
    "content": "# add enchantments to the list 1 by 1\n# @s = text display\n# at chiseled bookshelf, selected book slot\n# run from process_display/spawn/list_enchantments\n# run from here\n\n# get id and lvl of enchantment\ndata modify storage gm4_bookshelf_inspector:temp new_enchant.id set string storage gm4_bookshelf_inspector:temp enchantments[0].id 10\nexecute store result storage gm4_bookshelf_inspector:temp new_enchant.lvl int 1 run data get storage gm4_bookshelf_inspector:temp enchantments[0].lvl\nexecute store result score $enchant_lvl gm4_bookshelf_inspector_data run data get storage gm4_bookshelf_inspector:temp new_enchant.lvl\n\n# get corresponding text using macro's\nfunction gm4_bookshelf_inspector:process_display/spawn/eval_enchantment with storage gm4_bookshelf_inspector:temp new_enchant\n\n# cleanup\ndata remove storage gm4_bookshelf_inspector:temp new_enchant\n\n# repeat for each enchant on the book, max 3\nscoreboard players remove $enchantments_max gm4_bookshelf_inspector_data 1\ndata remove storage gm4_bookshelf_inspector:temp enchantments[0]\nexecute if score $enchantments_max gm4_bookshelf_inspector_data matches 0 store result score $enchantment_count gm4_bookshelf_inspector_data run data get storage gm4_bookshelf_inspector:temp enchantments\nexecute if score $enchantments_max gm4_bookshelf_inspector_data matches 0 if score $enchantment_count gm4_bookshelf_inspector_data matches 1 run function gm4_bookshelf_inspector:process_display/spawn/process_enchantments\nexecute if score $enchantments_max gm4_bookshelf_inspector_data matches 0 if score $enchantment_count gm4_bookshelf_inspector_data matches 2.. run data modify storage gm4_bookshelf_inspector:temp enchantment_list append value {\"translate\":\"container.shulkerBox.more\",\"with\":[{\"score\":{\"name\":\"$enchantment_count\",\"objective\":\"gm4_bookshelf_inspector_data\"}}]}\nexecute if score $enchantments_max gm4_bookshelf_inspector_data matches 1.. if data storage gm4_bookshelf_inspector:temp enchantments[0] run function gm4_bookshelf_inspector:process_display/spawn/process_enchantments\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/tick.mcfunction",
    "content": "# text_display extending tick clock\n# @s = unspecified\n# at unspecified\n# schedule from process_display/spawn/init\n# schedule from here\n\nscoreboard players set $keep_loop_active gm4_bookshelf_inspector_data 0\n\nexecute as @e[type=text_display,tag=gm4_bookshelf_inspector_display.extending] run function gm4_bookshelf_inspector:process_display/spawn/process\n\nexecute if score $keep_loop_active gm4_bookshelf_inspector_data matches 1 run schedule function gm4_bookshelf_inspector:process_display/spawn/tick 1t\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/update.mcfunction",
    "content": "# update this text_display from newly obtained data\n# @s = book reading text_display\n# at chiseled bookshelf positioned at book slot\n# run from process_display/check_location\n\nscoreboard players set $display_found gm4_bookshelf_inspector_data 1\n\nscoreboard players set @s gm4_bookshelf_inspector_keep 1\n"
  },
  {
    "path": "gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/guidebook/bookshelf_inspector.json",
    "content": "{\n  \"id\": \"bookshelf_inspector\",\n  \"name\": \"Bookshelf Inspector\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:chiseled_bookshelf\"\n  },\n  \"criteria\": {\n    \"use_chiseled_bookshelf\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:chiseled_bookshelf\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"display\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"use_chiseled_bookshelf\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.chiseled_bookshelf.description\",\n            \"fallback\": \"Looking at a book inside a chiseled bookshelf will display the book name along with some extra contents.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_bookshelf_inspector/mod.mcdoc",
    "content": "use ::java::world::item::ItemStack\nuse ::java::world::component::item::EnchantmentLevels\nuse ::java::util::text::Text\nuse ::java::util::text::TextObject\n\ndispatch minecraft:storage[gm4_bookshelf_inspector:temp] to struct {\n  book_data?: (\n    [ItemStack] |\n    ItemStack |\n  ),\n  levels?: EnchantmentLevels,\n  enchantments?: [struct {\n    id: #[id=\"enchantment\"] string,\n    lvl?: int,\n  }],\n  enchantment_list?: [Text],\n  new_enchant?: struct {\n    id: #[id=\"enchantment\"] string,\n    lvl?: int,\n  },\n  text?: (Text | [TextObject] @ 0),\n}\n"
  },
  {
    "path": "gm4_bookshelf_inspector/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.bookshelf_inspector,See what's in your Chiseled Bookshelves without having to take all the books out!\ntext.gm4.guidebook.chiseled_bookshelf.description,Looking at a book inside a chiseled bookshelf will display the book name along with some extra contents.\n"
  },
  {
    "path": "gm4_boots_of_ostara/README.md",
    "content": "# Boots of Ostara<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nMake grass appear beneath your feet!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Converts dirt-like blocks to grass when walked over and grass is in your off-hand\r\n- Coverts moss-convertible blocks to moss when walked over with moss in your off-hand\r\n- The grass conversion functionality works when on an armour stand with grass in its arm\r\n- Blocks the other Gamemode 4 data pack, [Desire Lines]($dynamicLink:gm4_desire_lines), which causes paths to form where players commonly walk\r\n"
  },
  {
    "path": "gm4_boots_of_ostara/assets/gm4_boots_of_ostara/optifine/cit/boots_of_ostara.properties",
    "content": "type=armor\nmatchItems=leather_boots\ntexture.leather_layer_1=boots_of_ostara_layer_1\ntexture.leather_layer_1_overlay=boots_of_ostara_layer_1_overlay\nnbt.CustomModelData=$item/boots_of_ostara\n"
  },
  {
    "path": "gm4_boots_of_ostara/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.boots_of_ostara.description,Wear the Boots of Ostara\nadvancement.gm4.boots_of_ostara.title,Green Feet\nitem.gm4.boots_of_ostara,Boots of Ostara\nitem.gm4.boots_of_ostara.lore,Brings abundance beneath you!\ntext.gm4.guidebook.module_desc.boots_of_ostara,\"A pair of boots every gardener would love to have! Boots of Ostara allow you to easily spread Grass and Moss, and they even stop the Desire Lines module from creating that pesky dirt.\"\ntext.gm4.guidebook.boot_of_ostara.description,Boots of Ostara can be crafted to aid in the spreading of grass and moss.\\n\\nThe boots can be crafted in a crafting table.\ntext.gm4.guidebook.boots_of_ostara.crafting,The recipe for the Boots of Ostara is as follows:\ntext.gm4.guidebook.boots_of_ostara.crafting_and_desire_lines,Boots of Ostara also prevent desire lines from forming.\ntext.gm4.guidebook.boots_of_ostara.grass,Wearing the boots and holding a grass block in the offhand will spread grass onto dirt beneath the wearer.\\n\ntext.gm4.guidebook.boots_of_ostara.moss_and_armor_stands,\"Similarly, moss will spread onto stone when held in the offhand.\\n\\nArmor stands can also spread vegetation!\"\n"
  },
  {
    "path": "gm4_boots_of_ostara/beet.yaml",
    "content": "id: gm4_boots_of_ostara\nname: Boots of Ostara\nversion: 1.9.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    model_data:\n      - item: leather_boots\n        template: generated_overlay\n        broadcast:\n          - reference: item/boots_of_ostara\n      - item: leather_boots\n        reference: gui/advancement/boots_of_ostara\n        template:\n          name: advancement\n          forward: item/boots_of_ostara\n    website:\n      description: A pair of boots every gardener would love to have! Boots of Ostara allow you to easily spread Grass and Moss, and they even stop the Desire Lines module from creating that pesky dirt.\n      recommended:\n        - gm4_resource_pack\n        - gm4_desire_lines\n        - gm4_better_armour_stands\n        - gm4_standard_crafting\n      notes: []\n    modrinth:\n      project_id: YCcs2E01\n    video: https://www.youtube.com/watch?v=H4UGM6_wGCE\n    wiki: https://wiki.gm4.co/wiki/Boots_of_Ostara\n    credits:\n      Creator:\n        - The8BitMonkey\n      Updated by:\n        - Misode\n        - catter1\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4/advancement/boots_of_ostara.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"leather_boots\",\n      \"components\": {\n        \"minecraft:dyed_color\": 3705899,\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_boots_of_ostara:gui/advancement/boots_of_ostara\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.boots_of_ostara.title\",\n      \"fallback\": \"Green Feet\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.boots_of_ostara.description\",\n      \"fallback\": \"Wear the Boots of Ostara\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"boots_of_ostara\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:leather_boots\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_boots_of_ostara:1b}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/advancement/recipes/boots_of_ostara.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_boots_of_ostara:boots_of_ostara\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:leather_boots\",\n              \"minecraft:moss_block\",\n              \"minecraft:grass_block\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_boots_of_ostara:boots_of_ostara\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/function/block_desire_lines.mcfunction",
    "content": "# @s = any survival player\n# at unspecified\n# run from #gm4_desire_lines:expansion\n\n# semi-ensure desire lines is disabled ($probability should only be modified NOT SET, as the modification order is load dependent)\nexecute if predicate gm4_boots_of_ostara:boots_equipped run scoreboard players remove $probability gm4_desire_lines 1000\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/function/convert.mcfunction",
    "content": "# checks what the player/armor stand is holding\n# @s = player or armor stand, wearing Boots of Ostara\n# at @s\n# run from main\n\n# make sure moss/mycelium checks are run before grass, so grass isn't instantly converted to either\n# this rule replaces the old \"check if grass was converted\" check\n\n# first run, check mainhand\nexecute if items entity @s weapon.mainhand moss_block if block ~ ~-0.5 ~ #gm4_boots_of_ostara:moss_replaceable run setblock ~ ~-0.5 ~ moss_block\nexecute if items entity @s weapon.mainhand mycelium if block ~ ~-0.5 ~ #gm4_boots_of_ostara:mycelium_replaceable run setblock ~ ~-0.5 ~ mycelium\nexecute if items entity @s weapon.mainhand grass_block if block ~ ~-0.5 ~ #minecraft:substrate_overworld run setblock ~ ~-0.5 ~ grass_block\nexecute if items entity @s weapon.mainhand crimson_nylium if block ~ ~-0.5 ~ minecraft:netherrack run setblock ~ ~-0.5 ~ crimson_nylium\nexecute if items entity @s weapon.mainhand warped_nylium if block ~ ~-0.5 ~ minecraft:netherrack run setblock ~ ~-0.5 ~ warped_nylium\n\n# now go through offhand\nexecute if items entity @s weapon.offhand moss_block if block ~ ~-0.5 ~ #gm4_boots_of_ostara:moss_replaceable run setblock ~ ~-0.5 ~ moss_block\nexecute if items entity @s weapon.offhand mycelium if block ~ ~-0.5 ~ #gm4_boots_of_ostara:mycelium_replaceable run setblock ~ ~-0.5 ~ mycelium\nexecute if items entity @s weapon.offhand grass_block if block ~ ~-0.5 ~ #minecraft:substrate_overworld run setblock ~ ~-0.5 ~ grass_block\nexecute if items entity @s weapon.offhand crimson_nylium if block ~ ~-0.5 ~ minecraft:netherrack run setblock ~ ~-0.5 ~ crimson_nylium\nexecute if items entity @s weapon.offhand warped_nylium if block ~ ~-0.5 ~ minecraft:netherrack run setblock ~ ~-0.5 ~ warped_nylium\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/function/init.mcfunction",
    "content": "execute unless score boots_of_ostara gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Boots Of Ostara\"}\nexecute unless score boots_of_ostara gm4_earliest_version < boots_of_ostara gm4_modules run scoreboard players operation boots_of_ostara gm4_earliest_version = boots_of_ostara gm4_modules\nscoreboard players set boots_of_ostara gm4_modules 1\n\nschedule function gm4_boots_of_ostara:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/function/main.mcfunction",
    "content": "execute as @a[gamemode=!spectator,gamemode=!adventure,predicate=gm4_boots_of_ostara:boots_equipped] at @s run function gm4_boots_of_ostara:convert\nexecute as @e[type=armor_stand,predicate=gm4_boots_of_ostara:boots_equipped] at @s run function gm4_boots_of_ostara:convert\n\n\nschedule function gm4_boots_of_ostara:main 16t\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/guidebook/boots_of_ostara.json",
    "content": "{\n  \"id\": \"boots_of_ostara\",\n  \"name\": \"Boots of Ostara\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:leather_boots\",\n    \"components\": {\n      \"minecraft:dyed_color\": 3705899\n    }\n  },\n  \"criteria\": {\n    \"obtain_leather_boots\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:leather_boots\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_grass_block\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:grass_block\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_boots_of_ostara\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:leather_boots\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_boots_of_ostara:1b}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.boot_of_ostara.description\",\n            \"fallback\": \"Boots of Ostara can be crafted to aid in the spreading of grass and moss.\\n\\nThe boots can be crafted in a crafting table.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"crafting\",\n      \"enable\": [\n        {\n          \"id\": \"gm4_desire_lines\",\n          \"load\": -1\n        }\n      ],\n      \"requirements\": [\n        [\n          \"obtain_leather_boots\"\n        ],\n        [\n          \"obtain_grass_block\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.boots_of_ostara.crafting\",\n            \"fallback\": \"The recipe for the Boots of Ostara is as follows:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_boots_of_ostara:boots_of_ostara\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"crafting-desire_lines\",\n      \"enable\": [\n        {\n          \"id\": \"gm4_desire_lines\",\n          \"load\": 1\n        }\n      ],\n      \"requirements\": [\n        [\n          \"obtain_leather_boots\"\n        ],\n        [\n          \"obtain_grass_block\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_boots_of_ostara:boots_of_ostara\"\n          },\n          \"\\n\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.boots_of_ostara.crafting_and_desire_lines\",\n            \"fallback\": \"Boots of Ostara also prevent desire lines from forming.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_boots_of_ostara\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.boots_of_ostara.grass\",\n            \"fallback\": \"Wearing the boots and holding a grass block in the offhand will spread grass onto dirt beneath the wearer.\\n\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.boots_of_ostara.moss_and_armor_stands\",\n            \"fallback\": \"Similarly, moss will spread onto stone when held in the offhand.\\n\\nArmor stands can also spread vegetation!\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"crafting\",\n        \"crafting-desire_lines\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/loot_table/items/boots_of_ostara.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:leather_boots\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:dyed_color\": 3705899,\n                \"minecraft:tooltip_display\": {\n                  \"hidden_components\": [\n                    \"minecraft:dyed_color\"\n                  ]\n                },\n                \"minecraft:custom_model_data\": {\n                  \"strings\": [\n                    \"gm4_boots_of_ostara:item/boots_of_ostara\"\n                  ]\n                }\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_boots_of_ostara:1b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.boots_of_ostara\",\n                \"fallback\": \"Boots of Ostara\",\n                \"italic\": false\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"insert\",\n              \"lore\": [\n                {\n                  \"translate\": \"item.gm4.boots_of_ostara.lore\",\n                  \"fallback\": \"Brings abundance beneath you!\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/predicate/boots_equipped.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"feet\": {\n        \"items\": [\n          \"minecraft:leather_boots\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_boots_of_ostara:1b}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/recipe/boots_of_ostara.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"pattern\": [\n    \" S \",\n    \"MLG\",\n    \" W \"\n  ],\n  \"key\": {\n    \"S\": \"minecraft:wheat_seeds\",\n    \"M\": \"minecraft:moss_block\",\n    \"L\": \"minecraft:leather_boots\",\n    \"G\": \"minecraft:grass_block\",\n    \"W\": \"minecraft:water_bucket\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:leather_boots\",\n    \"components\": {\n      \"minecraft:dyed_color\": 3705899,\n      \"minecraft:tooltip_display\": {\n        \"hidden_components\": [\n          \"minecraft:dyed_color\"\n        ]\n      },\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_boots_of_ostara:item/boots_of_ostara\"]},\n      \"minecraft:custom_data\": \"{gm4_boots_of_ostara:1b}\",\n      \"minecraft:item_name\": {\"translate\": \"item.gm4.boots_of_ostara\",\"fallback\": \"Boots of Ostara\"},\n      \"minecraft:lore\": [\n        {\"translate\":\"item.gm4.boots_of_ostara.lore\",\"fallback\":\"Brings abundance beneath you!\",\"color\":\"dark_gray\",\"italic\":false}\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/tags/block/moss_replaceable.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:base_stone_overworld\",\n    \"#minecraft:substrate_overworld\"\n  ]\n}\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/tags/block/mycelium_replaceable.json",
    "content": "{\n  \"values\": [\n    \"minecraft:dirt\",\n    \"minecraft:coarse_dirt\"\n  ]\n}\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/test/armor_stand_both.mcfunction",
    "content": "# @template gm4:test_platform\n\nsetblock ~1 ~ ~1 stone\nsummon armor_stand ~1.5 ~1 ~1.5\nitem replace entity @e[type=armor_stand,distance=..4,limit=1] weapon.mainhand with minecraft:grass_block\nitem replace entity @e[type=armor_stand,distance=..4,limit=1] weapon.offhand with minecraft:moss_block\nloot replace entity @e[type=armor_stand,distance=..4,limit=1] armor.feet loot gm4_boots_of_ostara:items/boots_of_ostara\n\nawait block ~1 ~ ~1 moss_block\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/test/armor_stand_both_backwards.mcfunction",
    "content": "# @template gm4:test_platform\n\nsetblock ~1 ~ ~1 stone\nsummon armor_stand ~1.5 ~1 ~1.5\nitem replace entity @e[type=armor_stand,distance=..4,limit=1] weapon.mainhand with minecraft:moss_block\nitem replace entity @e[type=armor_stand,distance=..4,limit=1] weapon.offhand with minecraft:grass_block\nloot replace entity @e[type=armor_stand,distance=..4,limit=1] armor.feet loot gm4_boots_of_ostara:items/boots_of_ostara\n\nawait block ~1 ~ ~1 grass_block\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/test/armor_stand_grass.mcfunction",
    "content": "# @template gm4:test_platform\n\nsetblock ~1 ~ ~1 dirt\nsummon armor_stand ~1.5 ~1 ~1.5\nitem replace entity @e[type=armor_stand,distance=..4,limit=1] weapon.mainhand with minecraft:grass_block\nloot replace entity @e[type=armor_stand,distance=..4,limit=1] armor.feet loot gm4_boots_of_ostara:items/boots_of_ostara\n\nawait block ~1 ~ ~1 grass_block\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/test/armor_stand_moss.mcfunction",
    "content": "# @template gm4:test_platform\n\nsetblock ~1 ~ ~1 stone\nsummon armor_stand ~1.5 ~1 ~1.5\nitem replace entity @e[type=armor_stand,distance=..4,limit=1] weapon.mainhand with minecraft:moss_block\nloot replace entity @e[type=armor_stand,distance=..4,limit=1] armor.feet loot gm4_boots_of_ostara:items/boots_of_ostara\n\nawait block ~1 ~ ~1 moss_block\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/test/player_grass.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~1\n\nsetblock ~1 ~ ~1 dirt\ngive @s grass_block\ndummy @s swap\nloot give @s loot gm4_boots_of_ostara:items/boots_of_ostara\n\ndummy @s use item\n\nawait block ~1 ~ ~1 grass_block\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_boots_of_ostara/test/player_moss.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~1\n\nsetblock ~1 ~ ~1 granite\ngive @s moss_block\ndummy @s swap\nloot give @s loot gm4_boots_of_ostara:items/boots_of_ostara\n\ndummy @s use item\n\nawait block ~1 ~ ~1 moss_block\n"
  },
  {
    "path": "gm4_boots_of_ostara/data/gm4_desire_lines/tags/function/expansion.json",
    "content": "{\n  \"values\": [\n    \"gm4_boots_of_ostara:block_desire_lines\"\n  ]\n}\n"
  },
  {
    "path": "gm4_calling_bell/README.md",
    "content": "# Calling Bell <!--$headerTitle--><!--$pmc:delete-->\n\nThose pesky Wandering Traders never deign to stop by your house? Let them know you've got emeralds to sell by ringing a bell, and one will appear before your eyes with their.. er.. useful trades.\n\n<img src=\"images/calling_bell.webp\" alt=\"Trader being called to market\" width=\"500\"/><!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- Once a day, ring a bell while holding an emerald to instantly summon a wandering trader\n- Each player can summon their own trader each day\n- Great in sky-block playthroughs for getting important resources\n"
  },
  {
    "path": "gm4_calling_bell/beet.yaml",
    "content": "id: gm4_calling_bell\nname: Calling Bell\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: []\n    model_data:\n      - item: emerald\n        reference: gui/advancement/calling_bell\n        template: advancement\n    website:\n      description: Summon a Wandering Trader by using an Emerald on a Bell.\n      recommended:\n        - gm4_apple_trees\n        - gm4_zauber_cauldrons\n      notes: []\n    modrinth:\n      project_id: qNzelyE3\n    smithed:\n      pack_id: gm4_calling_bell\n    wiki: https://wiki.gm4.co/wiki/Calling_Bell\n    credits:\n      Creator:\n        - TheEpyonProject\n      Updated By:\n        - runcows\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_calling_bell/data/gm4/advancement/calling_bell.json",
    "content": "{\n    \"display\": {\n      \"icon\": {\n        \"id\": \"emerald\",\n        \"components\": {\n          \"minecraft:custom_model_data\": {\"strings\":[\"gm4_calling_bell:gui/advancement/calling_bell\"]}\n        }\n      },\n      \"title\": {\n        \"translate\": \"advancement.gm4.calling_bell.title\",\n        \"fallback\": \"House Call\"\n      },\n      \"description\": {\n        \"translate\": \"advancement.gm4.calling_bell.description\",\n        \"fallback\": \"Summon a wandering trader by ringing a bell with an emerald\",\n        \"color\": \"gray\"\n      }\n    },\n    \"parent\": \"gm4:root\",\n    \"criteria\": {\n      \"calling_bell\": {\n        \"trigger\": \"minecraft:impossible\"\n      }\n    }\n  }\n"
  },
  {
    "path": "gm4_calling_bell/data/gm4_calling_bell/advancement/ring_bell.json",
    "content": "{\n  \"criteria\": {\n    \"ringbell\": {\n      \"trigger\": \"minecraft:any_block_use\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:match_tool\",\n            \"predicate\": {\n              \"items\": \"minecraft:emerald\"\n            }\n          },\n          {\n            \"condition\": \"minecraft:block_state_property\",\n            \"block\": \"minecraft:bell\"\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_calling_bell:on_bell_interact\"\n  }\n}\n"
  },
  {
    "path": "gm4_calling_bell/data/gm4_calling_bell/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_calling_bell dummy\n\nexecute unless score calling_bell gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Calling Bell\"}\nexecute unless score calling_bell gm4_earliest_version < calling_bell gm4_modules run scoreboard players operation calling_bell gm4_earliest_version = calling_bell gm4_modules\nscoreboard players set calling_bell gm4_modules 1\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_calling_bell/data/gm4_calling_bell/function/on_bell_interact.mcfunction",
    "content": "# @s = player who used an emerald on a bell\n# at @s\n# run from advancement: ring_bell\n\nadvancement revoke @s only gm4_calling_bell:ring_bell\n\n# fail if player already used today\nexecute store result score $day gm4_calling_bell run time query day repetition\nexecute if score @s gm4_calling_bell = $day gm4_calling_bell run return run playsound entity.wandering_trader.no neutral @a[distance=..16] ~ ~ ~ 1 1 0.6\n\nexecute store result score $ray gm4_calling_bell run attribute @s minecraft:block_interaction_range get 10\nexecute anchored eyes positioned ^ ^ ^ run function gm4_calling_bell:raycast\n"
  },
  {
    "path": "gm4_calling_bell/data/gm4_calling_bell/function/raycast.mcfunction",
    "content": "# @s = player right clicking bell with emerald\n# at @s anchored eyes marched forward over and over\n# run from gm4_calling_bell:on_bell_interact and self\n\nscoreboard players remove $ray gm4_calling_bell 1\n\nexecute if block ~ ~ ~ bell align xyz positioned ~0.5 ~1 ~0.5 run return run function gm4_calling_bell:summon_trader\n\nexecute if score $ray gm4_calling_bell matches 1.. positioned ^ ^ ^0.1 run function gm4_calling_bell:raycast\n"
  },
  {
    "path": "gm4_calling_bell/data/gm4_calling_bell/function/summon_trader.mcfunction",
    "content": "# summon a wandering trader if valid placement\n# @s = player right clicking bell with emerald\n# at block above bell\n# run from raycast\n\n# check for valid spawn placement, otherwise return\nexecute unless predicate gm4_calling_bell:trader_hitbox_no_collision run return run playsound entity.wandering_trader.no neutral @a[distance=..16] ~ ~ ~ 1 1 0.6\n\n# summon trader\nsummon wandering_trader ~ ~ ~ {Tags:[\"gm4_calling_bell_trader\"],DespawnDelay:24000}\nplaysound entity.wandering_trader.reappeared neutral @a[distance=..16] ~ ~ ~ 1 1 0.6\nparticle happy_villager ~ ~0.5 ~ 0.3 0.3 0.3 1 5\nparticle large_smoke ~ ~1 ~ 0.25 0.5 0.25 0 10\n\n# consume emerald\nitem modify entity @s[gamemode=!creative] weapon.mainhand gm4_calling_bell:minus_one\n\n# update player\nscoreboard players operation @s gm4_calling_bell = $day gm4_calling_bell\nadvancement grant @s only gm4:calling_bell\n"
  },
  {
    "path": "gm4_calling_bell/data/gm4_calling_bell/guidebook/calling_bell.json",
    "content": "{\n  \"id\": \"calling_bell\",\n  \"name\": \"Calling Bell\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:emerald\"\n  },\n  \"criteria\": {\n    \"obtain_emerald\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:emerald\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_bell\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:bell\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"calling\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_emerald\"\n        ],\n        [\n          \"obtain_bell\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.calling_bell.description\",\n            \"fallback\": \"Ringing a bell while holding an emerald will cause a wandering trader to appear.\\n\\nThis can be done once per day.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_calling_bell/data/gm4_calling_bell/item_modifier/minus_one.json",
    "content": "{\n    \"function\": \"minecraft:set_count\",\n    \"count\": -1,\n    \"add\": true\n}\n"
  },
  {
    "path": "gm4_calling_bell/data/gm4_calling_bell/predicate/trader_hitbox_no_collision.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n      \"block\": {\n        \"blocks\": \"#gm4:no_collision\"\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetY\": 1,\n    \"predicate\": {\n      \"block\": {\n        \"blocks\": \"#gm4:no_collision\"\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_calling_bell/data/gm4_calling_bell/test/call.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~\n# @skyaccess\n\nsetblock ~1 ~1 ~1 bell\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1 ~1\ngive @s emerald\ndummy @s use block ~1.4 ~1.25 ~1.5 north\n# any_block_use isnt triggering for   dummy @s use block\nadvancement grant @s only gm4_calling_bell:ring_bell\n\nawait entity @e[type=wandering_trader,distance=..4]\n\nassert not items entity @s weapon.mainhand minecraft:emerald\n"
  },
  {
    "path": "gm4_calling_bell/data/gm4_calling_bell/test/call_blocked.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~\n\nsetblock ~1 ~1 ~1 bell\nsetblock ~1 ~3 ~1 stone\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1 ~1\ngive @s emerald\ndummy @s use block ~1.4 ~1.25 ~1.5 north\n# any_block_use isnt triggering for   dummy @s use block\nadvancement grant @s only gm4_calling_bell:ring_bell\n\nawait delay 1s\n\nassert not entity @e[type=wandering_trader,distance=..4]\nassert items entity @s weapon.mainhand minecraft:emerald\n"
  },
  {
    "path": "gm4_calling_bell/translations.csv",
    "content": "key,en_us\nadvancement.gm4.calling_bell.title,House Call\nadvancement.gm4.calling_bell.description,Summon a wandering trader by ringing a bell with an emerald\ntext.gm4.guidebook.module_desc.calling_bell,Summon a Wandering Trader by using an Emerald on a Bell.\ntext.gm4.guidebook.calling_bell.description,Ringing a bell while holding an emerald will cause a wandering trader to appear.\\n\\nThis can be done once per day.\n"
  },
  {
    "path": "gm4_cement_mixers/README.md",
    "content": "# Cement Mixers<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nAutomating concrete conversion with a porous solution!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Builds on the Gamemode 4 data pack [Liquid Tanks]($dynamicLink:gm4_liquid_tanks)\r\n- Allows a liquid tank to convert concrete powder to concrete at the cost of 1/3 a bucket of water\r\n- Makes the whole concrete conversion process automatable without the player\r\n"
  },
  {
    "path": "gm4_cement_mixers/beet.yaml",
    "content": "id: gm4_cement_mixers\nname: Cement Mixers\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\nrequire:\n  - bolt\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_liquid_tanks: 3.1.0\n    website:\n      description: Allows Liquid Tanks to convert Concrete Powder items into Concrete, at the cost of ⅓ of a Bucket of Water per Concrete Powder.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: blBLRC4i\n    video: https://www.youtube.com/watch?v=qa9lcbii1BE\n    wiki: https://wiki.gm4.co/wiki/Liquid_Tanks/Cement_Mixers\n    credits:\n      Creator:\n        - Sparks\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_cement_mixers/data/gm4_cement_mixers/function/init.mcfunction",
    "content": "execute unless score cement_mixers gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Cement Mixers\"}\nexecute unless score cement_mixers gm4_earliest_version < cement_mixers gm4_modules run scoreboard players operation cement_mixers gm4_earliest_version = cement_mixers gm4_modules\nscoreboard players set cement_mixers gm4_modules 1\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_cement_mixers/data/gm4_cement_mixers/function/item_fill.mcfunction",
    "content": "#@s = liquid tank with item in first slot\n#run from liquid_tanks:item_process\n\nexecute if entity @s[tag=gm4_lt_water] run function gm4_cement_mixers:water_concrete\n"
  },
  {
    "path": "gm4_cement_mixers/data/gm4_cement_mixers/function/water_concrete.mcfunction",
    "content": "# run from item_fill\n# @s = liquid tank at @s\n\nconcretes_colors = (\n    \"black\",\n    \"blue\",\n    \"brown\",\n    \"cyan\",\n    \"gray\",\n    \"green\",\n    \"light_blue\",\n    \"light_gray\",\n    \"lime\",\n    \"magenta\",\n    \"orange\",\n    \"pink\",\n    \"purple\",\n    \"red\",\n    \"white\",\n    \"yellow\"\n)\nfor color in concretes_colors:\n    execute if items block ~ ~ ~ container.0 f\"minecraft:{color}_concrete_powder\" run function f\"gm4_cement_mixers:item_fill/{color}_concrete\":\n        scoreboard players set $item_value gm4_lt_value -1\n        item replace entity 00344d47-0004-0004-0004-000f04ce104d weapon.mainhand with f\"minecraft:{color}_concrete\"\n        function gm4_liquid_tanks:smart_item_fill\n        tag @s add gm4_lt_fill\n\nitem_tag gm4_cement_mixers:dirt {\n    \"values\": [\n        \"minecraft:dirt\",\n        \"minecraft:coarse_dirt\",\n        \"minecraft:rooted_dirt\"\n    ]\n}\nexecute if items block ~ ~ ~ container.0 #gm4_cement_mixers:dirt run function gm4_cement_mixers:item_fill/mud:\n    scoreboard players set $item_value gm4_lt_value -1\n    item replace entity 00344d47-0004-0004-0004-000f04ce104d weapon.mainhand with minecraft:mud\n    function gm4_liquid_tanks:smart_item_fill\n    tag @s add gm4_lt_fill\n"
  },
  {
    "path": "gm4_cement_mixers/data/gm4_cement_mixers/guidebook/cement_mixers.json",
    "content": "{\n  \"id\": \"cement_mixers\",\n  \"name\": \"Cement Mixers\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"liquid_tanks\",\n  \"icon\": {\n    \"id\": \"minecraft:light_blue_concrete_powder\"\n  },\n  \"criteria\": {\n    \"obtain_liquid_tank\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"liquid_tank\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_concrete_powder\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:black_concrete_powder\",\n              \"minecraft:blue_concrete_powder\",\n              \"minecraft:brown_concrete_powder\",\n              \"minecraft:cyan_concrete_powder\",\n              \"minecraft:gray_concrete_powder\",\n              \"minecraft:green_concrete_powder\",\n              \"minecraft:light_blue_concrete_powder\",\n              \"minecraft:light_gray_concrete_powder\",\n              \"minecraft:lime_concrete_powder\",\n              \"minecraft:magenta_concrete_powder\",\n              \"minecraft:orange_concrete_powder\",\n              \"minecraft:pink_concrete_powder\",\n              \"minecraft:purple_concrete_powder\",\n              \"minecraft:red_concrete_powder\",\n              \"minecraft:white_concrete_powder\",\n              \"minecraft:yellow_concrete_powder\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_concrete_powder\"\n        ],\n        [\n          \"obtain_liquid_tank\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.cement_mixers.usage\",\n            \"fallback\": \"A Water Tank can convert concrete powder into concrete and dirt into mud when placed inside the tank.\\n\\nThis uses 1/3 of a bucket of water.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cement_mixers/data/gm4_liquid_tanks/tags/function/item_fill.json",
    "content": "{\n    \"values\":[\n      \"gm4_cement_mixers:item_fill\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_cement_mixers/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.cement_mixers,\"Allows Liquid Tanks to convert Concrete Powder items into Concrete, at the cost of ⅓ of a Bucket of Water per Concrete Powder.\"\ntext.gm4.guidebook.cement_mixers.usage,A Water Tank can convert concrete powder into concrete and dirt into mud when placed inside the tank.\\n\\nThis uses 1/3 of a bucket of water.\n"
  },
  {
    "path": "gm4_chairs/README.md",
    "content": "# Chairs<!--$headerTitle--><!--$pmc:delete-->\n\nSince the dawn of Minecraft, stairs have been used as chairs in every house you've ever built. With this simple data pack, players can actually sit on stairs by throwing a saddle on them. <!--$pmc:headerSize-->\n\n<img src=\"images/chairs_creation_example.webp\" alt=\"Chairs Creation Example\" width=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- Throw a saddle on any stair block to turn it into a chair, which you can sit on\n- Adds two chair-related advancements\n- No texture pack required!\n\n![Chairs Any Stair Example](images/chairs_any_stair_example.png) <!--$localAssetToURL-->\n\n### Expansion Packs\n<!--- these will get links when those pages are made available-->\nWant some preset poses? Download the [Poses Pack Expansion]($dynamicLink:gm4_poses_pack)\n\nAdd particles to your builds with the [Particles Pack Expansion]($dynamicLink:gm4_particles_pack)\n"
  },
  {
    "path": "gm4_chairs/beet.yaml",
    "content": "id: gm4_chairs\nname: Chairs\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    website:\n      description: Place a saddle on a stair to have a chair to sit on!\n      recommended:\n        - gm4_display_frames\n        - gm4_better_armour_stands\n        - gm4_holographic_tags\n      notes: []\n    modrinth:\n      project_id: KLywOs5L\n    smithed:\n      pack_id: gm4_chairs\n    planetminecraft:\n      uid: 4299435\n    video: https://www.youtube.com/watch?v=7KbBw1hEKdY\n    wiki: https://wiki.gm4.co/wiki/Chairs\n    credits:\n      Creator:\n        - Denniss\n      Icon Design:\n        - DuckJr\n    model_data:\n      - item: birch_stairs\n        reference: gui/advancement/chairs_creation\n        template: advancement\n      - item: poisonous_potato\n        reference: gui/advancement/chairs_sit\n        template: advancement\n"
  },
  {
    "path": "gm4_chairs/data/gm4/advancement/chairs_creation.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"birch_stairs\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_chairs:gui/advancement/chairs_creation\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.chairs.creation.title\",\n      \"fallback\": \"A Throne, Fit for a King!\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.chairs.creation.description\",\n      \"fallback\": \"Throw a saddle on stairs to make a chair\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"create chair\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_chairs/data/gm4/advancement/chairs_sit.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"poisonous_potato\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_chairs:gui/advancement/chairs_sit\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.chairs.sit.title\",\n      \"fallback\": \"Couch Potato\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.chairs.sit.description\",\n      \"fallback\": \"Sit for over an hour!\",\n      \"color\": \"gray\"\n    },\n    \"frame\": \"goal\",\n    \"hidden\": true\n  },\n  \"parent\": \"gm4:chairs_creation\",\n  \"criteria\": {\n    \"hour_in_chair\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/advancement/hit.json",
    "content": "{\n  \"criteria\": {\n    \"punch\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:pig\",\n              \"nbt\": \"{Tags:[\\\"gm4_chairs\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_chairs:hit\"\n  }\n}\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/advancement/lightning.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:lightning_strike\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_chairs:lightning/tag\"\n  }\n}\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/function/create_chair.mcfunction",
    "content": "# Create chair from saddle item\n# @s = saddle item on top of stairs\n# at @s align xyz positioned ~.5 ~ ~.5\n# run from main\n\n# spawn chair\nsummon minecraft:pig ~ ~-10000.39 ~ {CustomName:\"gm4_chair\",Tags:[\"gm4_chairs\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"],Team:\"gm4_chairs\",NoAI:1b,equipment:{saddle:{id:\"minecraft:saddle\"}},NoGravity:1b,Silent:1b,DeathTime:19s,InLove:2147483647,attributes:[{id:\"minecraft:max_health\",base:1.0},{id:\"minecraft:movement_speed\",base:0.0}],active_effects:[{id:'minecraft:invisibility',amplifier:0,duration:2147483647,show_particles:0b},{id:'minecraft:resistance',amplifier:10b,duration:2147483647,show_particles:0b}],DeathLootTable:\"gm4:empty\"}\n\n# set chair to orientation of stairs\nexecute if block ~ ~ ~ #minecraft:stairs[facing=north] positioned ~ ~-10000 ~ as @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] at @s run tp @s ~ ~10000 ~.05 0 0\nexecute if block ~ ~ ~ #minecraft:stairs[facing=south] positioned ~ ~-10000 ~ as @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] at @s run tp @s ~ ~10000 ~-.05 180 0\nexecute if block ~ ~ ~ #minecraft:stairs[facing=east] positioned ~ ~-10000 ~ as @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] at @s run tp @s ~-.05 ~10000 ~ 90 0\nexecute if block ~ ~ ~ #minecraft:stairs[facing=west] positioned ~ ~-10000 ~ as @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] at @s run tp @s ~.05 ~10000 ~ -90 0\n\n# store saddle data in chair\nitem replace entity @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] weapon.mainhand from entity @s contents\nscoreboard players set @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] gm4_entity_version 1\n\n# place sound\nplaysound minecraft:block.wool.place block @a[distance=..5] ~ ~ ~ .5 2\n\n# advancement for creating a chair\nadvancement grant @a[distance=..3,gamemode=!spectator] only gm4:chairs_creation\n\n# kill the saddle item\nkill @s\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/function/hit.mcfunction",
    "content": "# Find pig/chair that has just been hit\n# @s = player hitting the chair\n# at @s\n# run from advancement hit\n\nadvancement revoke @s only gm4_chairs:hit\n\nexecute as @e[type=minecraft:pig,tag=gm4_chairs,nbt={HurtTime:10s}] at @s positioned ^ ^.9 ^.2 run function gm4_chairs:kill\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/function/init.mcfunction",
    "content": "team add gm4_chairs\nteam modify gm4_chairs collisionRule never\nscoreboard objectives add gm4_chairs_sit dummy\nscoreboard objectives add gm4_entity_version dummy\n\nexecute unless score chairs gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Chairs\"}\nexecute unless score chairs gm4_earliest_version < chairs gm4_modules run scoreboard players operation chairs gm4_earliest_version = chairs gm4_modules\nscoreboard players set chairs gm4_modules 1\n\nschedule function gm4_chairs:main 1t\nschedule function gm4_chairs:sit/check 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/function/kill.mcfunction",
    "content": "# Remove chair and return saddle item\n# @s = pig (chair) to be removed\n# at @s positioned ~ ~.5 ~ / ^ ^.9 ^.2\n# run from main / hit\n\n# spawn saddle item\nloot spawn ~ ~ ~ loot gm4_chairs:drop_saddle\nexecute if items entity @s weapon.mainhand minecraft:saddle run item replace entity @e[type=minecraft:item,distance=..1,limit=1,sort=nearest] contents from entity @s weapon.mainhand\ntag @e[type=minecraft:item,distance=..1,limit=1,sort=nearest] add gm4_chairs_ignore\n\n# dismount if sitting on chair\nexecute on passengers at @s align y run tp @s ~ ~1 ~\n\n# increase health to avoid visible death cloud\nattribute @s minecraft:max_health base set 5\ndata modify entity @s Health set value 5\n\n# remove chair\ntp @s ~ -10000 ~\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/function/lightning/revive_chair.mcfunction",
    "content": "# Replace zombified piglin with chair\n# @s = zombified piglin that replaced the pig/chair\n# at @s\n# runs from lightning/delay\n\n# spawn chair\nsummon minecraft:pig ~ ~-10000 ~ {Tags:[\"gm4_chairs\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"],Team:\"gm4_chairs\",NoAI:1b,equipment:{saddle:{id:\"minecraft:saddle\"}},NoGravity:1b,Silent:1b,DeathTime:19s,InLove:2147483647,attributes:[{id:\"minecraft:movement_speed\",base:0.0}],active_effects:[{id:'minecraft:invisibility',amplifier:0,duration:2147483647,show_particles:0b},{id:'minecraft:resistance',amplifier:10b,duration:2147483647,show_particles:0b}],DeathLootTable:\"gm4:empty\"}\nexecute positioned ~ ~-10000 ~ run scoreboard players set @e[type=pig,tag=gm4_chairs,limit=1,distance=..0.1] gm4_entity_version 1\n\n# copy zombified piglin rotation\nexecute rotated as @s positioned ~ ~-10000 ~ run tp @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] ~ ~10000 ~ ~ ~\n\n# kill zombified piglin\ntp @s ~ -10000 ~\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/function/lightning/tag.mcfunction",
    "content": "# Target NoAI zombified_piglin after lightning strike near player\n# @s = player\n# at @s\n# runs from advancement, gm4_chairs:lightning\n\nadvancement revoke @s only gm4_chairs:lightning\n\nexecute as @e[type=zombified_piglin,tag=gm4_chairs] at @s if block ~ ~1 ~ #minecraft:stairs run function gm4_chairs:lightning/revive_chair\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/function/main.mcfunction",
    "content": "# detect saddle item on a stairs and spawn chair\nexecute as @e[type=minecraft:item,tag=!gm4_chairs_ignore] if items entity @s contents minecraft:saddle at @s if block ~ ~ ~ #minecraft:stairs[half=bottom] align xyz positioned ~.5 ~ ~.5 unless entity @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4] run function gm4_chairs:create_chair\n\n# kill pig (saddle) if stairs broken\nexecute as @e[type=minecraft:pig,tag=gm4_chairs] at @s unless block ~ ~1 ~ #minecraft:stairs positioned ~ ~.5 ~ run function gm4_chairs:kill\n\nschedule function gm4_chairs:main 16t\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/function/sit/check.mcfunction",
    "content": "execute as @a[predicate=gm4_chairs:sitting_in_chair] run function gm4_chairs:sit/counter\n\nschedule function gm4_chairs:sit/check 10s\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/function/sit/counter.mcfunction",
    "content": "# Timer for Couch Potato\n# @s = player sitting in a chair\n# at @s\n# run from function sit/check\n\n# increase time sitting in chair\nscoreboard players add @s gm4_chairs_sit 10\n\n# sit in a chair for 1 hour\nadvancement grant @s[scores={gm4_chairs_sit=3600..3609}] only gm4:chairs_sit\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/guidebook/chairs.json",
    "content": "{\n  \"id\": \"chairs\",\n  \"name\": \"Chairs\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:saddle\"\n  },\n  \"criteria\": {\n    \"obtain_saddle\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:saddle\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"creation\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_saddle\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.chairs.creation\",\n            \"fallback\": \"Chairs can be created by throwing a saddle onto a stair block.\\n\\nBreaking the stair or hitting the saddle relieves the stair of the saddle.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/loot_table/drop_saddle.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:saddle\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/predicate/sitting_in_chair.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"vehicle\": {\n      \"type\": \"minecraft:pig\",\n      \"nbt\": \"{Tags:[\\\"gm4_chairs\\\"]}\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_chairs/data/gm4_chairs/test/create.mcfunction",
    "content": "# @skyaccess\n\nsetblock ~ ~ ~ mangrove_stairs[facing=south]\nsummon item ~0.5 ~1 ~0.25 {Item:{id:\"minecraft:saddle\",count:1}}\n\nawait items entity @e[type=pig,dx=0] saddle minecraft:saddle\n"
  },
  {
    "path": "gm4_chairs/translations.csv",
    "content": "key,en_us\nadvancement.gm4.chairs.creation.title,\"A Throne, Fit for a King!\"\nadvancement.gm4.chairs.creation.description,Throw a saddle on stairs to make a chair\nadvancement.gm4.chairs.sit.title,Couch Potato\nadvancement.gm4.chairs.sit.description,Sit for over an hour!\ntext.gm4.guidebook.module_desc.chairs,Place a saddle on a stair to have a chair to sit on!\ntext.gm4.guidebook.chairs.creation,Chairs can be created by throwing a saddle onto a stair block.\\n\\nBreaking the stair or hitting the saddle relieves the stair of the saddle.\n"
  },
  {
    "path": "gm4_cooler_caves/README.md",
    "content": "# Cooler Caves<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nModifies cave generation even further by upping the cool factor...<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- In Deserts, sandstone generates in place of stone and sand replaces gravel\r\n- Badlands generates terracotta in place of stone and red sand replaces gravel\r\n- Ice based biomes generate snow/ice related blocks in place of andesite/stone\r\n\r\nA full list of blocks replaced and in which biomes can be seen on the [Wiki](https://wiki.gm4.co/Orbis/Cooler_Caves).\r\n"
  },
  {
    "path": "gm4_cooler_caves/beet.yaml",
    "content": "id: gm4_cooler_caves\nname: Cooler Caves\nversion: 2.6.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.pfb_biome_extensions\n\nmeta:\n  gm4:\n    website:\n      description: A custom terrain expansion pack that makes biome specific caves\n      recommended:\n        - gm4_dangerous_dungeons\n        - gm4_tower_structures\n      notes: []\n    modrinth:\n      project_id: juqV05HI\n    video: https://www.youtube.com/watch?v=cAsXiwLWHFo\n    wiki: https://wiki.gm4.co/wiki/Orbis/Cooler_Caves\n    credits:\n      Creator:\n        - Sparks\n      Updated by:\n        - Misode\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/function/init.mcfunction",
    "content": "execute unless score cooler_caves gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Cooler Caves\"}\nexecute unless score cooler_caves gm4_earliest_version < cooler_caves gm4_modules run scoreboard players operation cooler_caves gm4_earliest_version = cooler_caves gm4_modules\nscoreboard players set cooler_caves gm4_modules 1\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/guidebook/cooler_caves.json",
    "content": "{\n  \"id\": \"cooler_caves\",\n  \"name\": \"Cooler Caves\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:sandstone\"\n  },\n  \"criteria\": {\n    \"in_cave_air\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"block\": {\n                  \"blocks\": [\n                    \"minecraft:cave_air\"\n                  ]\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"cave_changes\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"in_cave_air\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.cooler_caves.description\",\n            \"fallback\": \"The world has modified block compositions.\\n\\nSome biomes have different blocks compared to normal worlds.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.cooler_caves.desert_and_snow\",\n            \"fallback\": \"In the desert, sandstone and gravel generate instead of stone and gravel.\\n\\nIn snowy biomes, snow, ice, and white concrete powder can be found in caves.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.cooler_caves.badlands\",\n            \"fallback\": \"Terracotta layers extend throughout the entire underground in badland biomes. Gravel cannot be found, but red sand patches takes their place.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/tags/block/badlands_ore_replaceables.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:terracotta\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/tags/block/base_desert_overworld.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:base_stone_overworld\",\n    \"minecraft:sandstone\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/tags/block/base_snowy_overworld.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:base_stone_overworld\",\n    \"minecraft:snow_block\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/glow_lichen.json",
    "content": "{\n  \"type\": \"minecraft:multiface_growth\",\n  \"config\": {\n    \"block\": \"minecraft:glow_lichen\",\n    \"can_be_placed_on\": [\n      \"minecraft:stone\",\n      \"minecraft:andesite\",\n      \"minecraft:diorite\",\n      \"minecraft:granite\",\n      \"minecraft:dripstone_block\",\n      \"minecraft:calcite\",\n      \"minecraft:tuff\",\n      \"minecraft:deepslate\",\n      \"minecraft:terracotta\",\n      \"minecraft:white_terracotta\",\n      \"minecraft:orange_terracotta\",\n      \"minecraft:magenta_terracotta\",\n      \"minecraft:light_blue_terracotta\",\n      \"minecraft:yellow_terracotta\",\n      \"minecraft:lime_terracotta\",\n      \"minecraft:pink_terracotta\",\n      \"minecraft:gray_terracotta\",\n      \"minecraft:light_gray_terracotta\",\n      \"minecraft:cyan_terracotta\",\n      \"minecraft:purple_terracotta\",\n      \"minecraft:blue_terracotta\",\n      \"minecraft:brown_terracotta\",\n      \"minecraft:green_terracotta\",\n      \"minecraft:red_terracotta\",\n      \"minecraft:black_terracotta\"\n    ],\n    \"can_place_on_ceiling\": true,\n    \"can_place_on_floor\": false,\n    \"can_place_on_wall\": true,\n    \"chance_of_spreading\": 0.5,\n    \"search_range\": 20\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_coal.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.0,\n    \"size\": 17,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:coal_ore\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:badlands_ore_replaceables\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_coal_buried.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.5,\n    \"size\": 17,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:coal_ore\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:badlands_ore_replaceables\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_copper_small.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.0,\n    \"size\": 10,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:copper_ore\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:badlands_ore_replaceables\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_diamond_buried.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 1.0,\n    \"size\": 8,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:diamond_ore\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:badlands_ore_replaceables\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_diamond_large.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.7,\n    \"size\": 12,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:diamond_ore\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:badlands_ore_replaceables\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_diamond_small.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.5,\n    \"size\": 4,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:diamond_ore\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:badlands_ore_replaceables\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_gold.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.0,\n    \"size\": 9,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:gold_ore\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:badlands_ore_replaceables\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_gold_buried.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.5,\n    \"size\": 9,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:gold_ore\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:badlands_ore_replaceables\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_iron.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.0,\n    \"size\": 9,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:iron_ore\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:badlands_ore_replaceables\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_iron_small.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.0,\n    \"size\": 4,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:iron_ore\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:badlands_ore_replaceables\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_lapis.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.0,\n    \"size\": 7,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:lapis_ore\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:badlands_ore_replaceables\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_lapis_buried.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 1.0,\n    \"size\": 7,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:lapis_ore\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:badlands_ore_replaceables\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_redstone.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.0,\n    \"size\": 8,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:redstone_ore\",\n          \"Properties\": {\n            \"lit\": \"false\"\n          }\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:badlands_ore_replaceables\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/desert/glow_lichen.json",
    "content": "{\n  \"type\": \"minecraft:multiface_growth\",\n  \"config\": {\n    \"block\": \"minecraft:glow_lichen\",\n    \"can_be_placed_on\": [\n      \"minecraft:stone\",\n      \"minecraft:andesite\",\n      \"minecraft:diorite\",\n      \"minecraft:granite\",\n      \"minecraft:dripstone_block\",\n      \"minecraft:calcite\",\n      \"minecraft:tuff\",\n      \"minecraft:deepslate\",\n      \"minecraft:sandstone\"\n    ],\n    \"can_place_on_ceiling\": true,\n    \"can_place_on_floor\": false,\n    \"can_place_on_wall\": true,\n    \"chance_of_spreading\": 0.5,\n    \"search_range\": 20\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/desert/ore_sand.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.0,\n    \"size\": 33,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:sand\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:base_desert_overworld\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/glow_lichen.json",
    "content": "{\n  \"type\": \"minecraft:multiface_growth\",\n  \"config\": {\n    \"block\": \"minecraft:glow_lichen\",\n    \"can_be_placed_on\": [\n      \"minecraft:stone\",\n      \"minecraft:andesite\",\n      \"minecraft:diorite\",\n      \"minecraft:granite\",\n      \"minecraft:dripstone_block\",\n      \"minecraft:calcite\",\n      \"minecraft:tuff\",\n      \"minecraft:deepslate\",\n      \"minecraft:snow_block\",\n      \"minecraft:packed_ice\",\n      \"minecraft:blue_ice\"\n    ],\n    \"can_place_on_ceiling\": true,\n    \"can_place_on_floor\": false,\n    \"can_place_on_wall\": true,\n    \"chance_of_spreading\": 0.5,\n    \"search_range\": 20\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/ore_blue_ice.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.0,\n    \"size\": 64,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:blue_ice\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:base_snowy_overworld\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/ore_ice.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.0,\n    \"size\": 64,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:ice\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:base_snowy_overworld\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/ore_packed_ice.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.0,\n    \"size\": 64,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:packed_ice\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:base_snowy_overworld\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/ore_packed_ice_small.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.0,\n    \"size\": 33,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:packed_ice\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:base_snowy_overworld\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/ore_powder_snow.json",
    "content": "{\n  \"type\": \"minecraft:ore\",\n  \"config\": {\n    \"discard_chance_on_air_exposure\": 0.0,\n    \"size\": 33,\n    \"targets\": [\n      {\n        \"state\": {\n          \"Name\": \"minecraft:powder_snow\"\n        },\n        \"target\": {\n          \"predicate_type\": \"minecraft:tag_match\",\n          \"tag\": \"gm4_cooler_caves:base_snowy_overworld\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/trees.json",
    "content": "{\n  \"type\": \"minecraft:random_selector\",\n  \"config\": {\n    \"default\": \"minecraft:spruce_on_snow\",\n    \"features\": [\n      {\n        \"chance\": 0.33333334,\n        \"feature\": \"minecraft:pine_on_snow\"\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/glow_lichen.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/glow_lichen\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": 157,\n        \"min_inclusive\": 104\n      }\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": 256\n        },\n        \"min_inclusive\": {\n          \"above_bottom\": 0\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"max_inclusive\": -13\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_coal_lower.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_coal_buried\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 20\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:trapezoid\",\n        \"max_inclusive\": {\n          \"absolute\": 192\n        },\n        \"min_inclusive\": {\n          \"absolute\": 0\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_coal_upper.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_coal\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 30\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"below_top\": 0\n        },\n        \"min_inclusive\": {\n          \"absolute\": 136\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_copper.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_copper_small\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 16\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:trapezoid\",\n        \"max_inclusive\": {\n          \"absolute\": 112\n        },\n        \"min_inclusive\": {\n          \"absolute\": -16\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_diamond.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_diamond_small\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 7\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:trapezoid\",\n        \"max_inclusive\": {\n          \"above_bottom\": 80\n        },\n        \"min_inclusive\": {\n          \"above_bottom\": -80\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_diamond_buried.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_diamond_buried\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 4\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:trapezoid\",\n        \"max_inclusive\": {\n          \"above_bottom\": 80\n        },\n        \"min_inclusive\": {\n          \"above_bottom\": -80\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_diamond_large.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_diamond_large\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:rarity_filter\",\n      \"chance\": 9\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:trapezoid\",\n        \"max_inclusive\": {\n          \"above_bottom\": 80\n        },\n        \"min_inclusive\": {\n          \"above_bottom\": -80\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_gold.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_gold_buried\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 4\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:trapezoid\",\n        \"max_inclusive\": {\n          \"absolute\": 32\n        },\n        \"min_inclusive\": {\n          \"absolute\": -64\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_gold_lower.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_gold_buried\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": 1,\n        \"min_inclusive\": 0\n      }\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": -48\n        },\n        \"min_inclusive\": {\n          \"absolute\": -64\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_iron_middle.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_iron\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 10\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:trapezoid\",\n        \"max_inclusive\": {\n          \"absolute\": 56\n        },\n        \"min_inclusive\": {\n          \"absolute\": -24\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_iron_small.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_iron_small\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 10\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": 72\n        },\n        \"min_inclusive\": {\n          \"above_bottom\": 0\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_iron_upper.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_iron\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 90\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:trapezoid\",\n        \"max_inclusive\": {\n          \"absolute\": 384\n        },\n        \"min_inclusive\": {\n          \"absolute\": 80\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_lapis.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_lapis\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 2\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:trapezoid\",\n        \"max_inclusive\": {\n          \"absolute\": 32\n        },\n        \"min_inclusive\": {\n          \"absolute\": -32\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_lapis_buried.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_lapis_buried\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 4\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": 64\n        },\n        \"min_inclusive\": {\n          \"above_bottom\": 0\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_redstone.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_redstone\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 4\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": 15\n        },\n        \"min_inclusive\": {\n          \"above_bottom\": 0\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_redstone_lower.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:badlands/ore_redstone\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 8\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:trapezoid\",\n        \"max_inclusive\": {\n          \"above_bottom\": 32\n        },\n        \"min_inclusive\": {\n          \"above_bottom\": -32\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"min_inclusive\": -384,\n      \"max_inclusive\": -5\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/desert/glow_lichen.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:desert/glow_lichen\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": 157,\n        \"min_inclusive\": 104\n      }\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": 256\n        },\n        \"min_inclusive\": {\n          \"above_bottom\": 0\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"max_inclusive\": -13\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/desert/ore_sand.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:desert/ore_sand\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 14\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"below_top\": 0\n        },\n        \"min_inclusive\": {\n          \"above_bottom\": 0\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/glow_lichen.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:snowy/glow_lichen\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": 157,\n        \"min_inclusive\": 104\n      }\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": 256\n        },\n        \"min_inclusive\": {\n          \"above_bottom\": 0\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:surface_relative_threshold_filter\",\n      \"heightmap\": \"OCEAN_FLOOR_WG\",\n      \"max_inclusive\": -13\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_blue_ice_lower.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:snowy/ore_blue_ice\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 2\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": 60\n        },\n        \"min_inclusive\": {\n          \"absolute\": 0\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_blue_ice_upper.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:snowy/ore_blue_ice\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:rarity_filter\",\n      \"chance\": 6\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": 128\n        },\n        \"min_inclusive\": {\n          \"absolute\": 64\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_ice_lower.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:snowy/ore_ice\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 2\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": 60\n        },\n        \"min_inclusive\": {\n          \"absolute\": 0\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_ice_upper.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:snowy/ore_ice\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:rarity_filter\",\n      \"chance\": 6\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": 128\n        },\n        \"min_inclusive\": {\n          \"absolute\": 64\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_packed_ice_lower.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:snowy/ore_packed_ice\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 2\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": 60\n        },\n        \"min_inclusive\": {\n          \"absolute\": 0\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_packed_ice_small.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:snowy/ore_packed_ice_small\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 7\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": 160\n        },\n        \"min_inclusive\": {\n          \"absolute\": 0\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_packed_ice_upper.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:snowy/ore_packed_ice\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:rarity_filter\",\n      \"chance\": 6\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"absolute\": 128\n        },\n        \"min_inclusive\": {\n          \"absolute\": 64\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_powder_snow.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:snowy/ore_powder_snow\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 14\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:height_range\",\n      \"height\": {\n        \"type\": \"minecraft:uniform\",\n        \"max_inclusive\": {\n          \"below_top\": 0\n        },\n        \"min_inclusive\": {\n          \"above_bottom\": 0\n        }\n      }\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/patch_berry_rare.json",
    "content": "{\n  \"feature\": {\n    \"type\": \"minecraft:simple_block\",\n    \"config\": {\n      \"to_place\": {\n        \"type\": \"minecraft:simple_state_provider\",\n        \"state\": {\n          \"Name\": \"minecraft:sweet_berry_bush\",\n          \"Properties\": {\n            \"age\": \"3\"\n          }\n        }\n      }\n    }\n  },\n  \"placement\": [\n    {\n      \"type\": \"minecraft:rarity_filter\",\n      \"chance\": 38\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:heightmap\",\n      \"heightmap\": \"WORLD_SURFACE_WG\"\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    },\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 96\n    },\n    {\n      \"type\": \"minecraft:random_offset\",\n      \"xz_spread\": {\n        \"type\": \"minecraft:uniform\",\n        \"min_inclusive\": 0,\n        \"max_inclusive\": 7\n      },\n      \"y_spread\": {\n        \"type\": \"minecraft:uniform\",\n        \"min_inclusive\": 0,\n        \"max_inclusive\": 3\n      }\n    },\n    {\n      \"type\": \"minecraft:block_predicate_filter\",\n      \"predicate\": {\n        \"type\": \"minecraft:all_of\",\n        \"predicates\": [\n          {\n            \"type\": \"minecraft:matching_blocks\",\n            \"blocks\": \"minecraft:air\"\n          },\n          {\n            \"type\": \"minecraft:matching_blocks\",\n            \"blocks\": [\n              \"minecraft:snow_block\",\n              \"minecraft:powder_snow\"\n            ],\n            \"offset\": [\n              0,\n              -1,\n              0\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/patch_snow_layer.json",
    "content": "{\n  \"feature\": {\n    \"type\": \"minecraft:simple_block\",\n    \"config\": {\n      \"to_place\": {\n        \"type\": \"minecraft:simple_state_provider\",\n        \"state\": {\n          \"Name\": \"minecraft:snow\",\n          \"Properties\": {\n            \"layers\": \"2\"\n          }\n        }\n      }\n    }\n  },\n  \"placement\": [\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:heightmap\",\n      \"heightmap\": \"WORLD_SURFACE_WG\"\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    },\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": 32\n    },\n    {\n      \"type\": \"minecraft:random_offset\",\n      \"xz_spread\": {\n        \"type\": \"minecraft:uniform\",\n        \"min_inclusive\": 0,\n        \"max_inclusive\": 7\n      },\n      \"y_spread\": {\n        \"type\": \"minecraft:uniform\",\n        \"min_inclusive\": 0,\n        \"max_inclusive\": 3\n      }\n    },\n    {\n      \"type\": \"minecraft:block_predicate_filter\",\n      \"predicate\": {\n        \"type\": \"minecraft:matching_blocks\",\n        \"blocks\": \"minecraft:air\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/trees.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:snowy/trees\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": {\n        \"type\": \"minecraft:weighted_list\",\n        \"distribution\": [\n          {\n            \"data\": 0,\n            \"weight\": 9\n          },\n          {\n            \"data\": 1,\n            \"weight\": 1\n          }\n        ]\n      }\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:surface_water_depth_filter\",\n      \"max_water_depth\": 0\n    },\n    {\n      \"type\": \"minecraft:heightmap\",\n      \"heightmap\": \"OCEAN_FLOOR\"\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/trees_taiga.json",
    "content": "{\n  \"feature\": \"gm4_cooler_caves:snowy/trees\",\n  \"placement\": [\n    {\n      \"type\": \"minecraft:count\",\n      \"count\": {\n        \"type\": \"minecraft:weighted_list\",\n        \"distribution\": [\n          {\n            \"data\": 10,\n            \"weight\": 9\n          },\n          {\n            \"data\": 11,\n            \"weight\": 1\n          }\n        ]\n      }\n    },\n    {\n      \"type\": \"minecraft:in_square\"\n    },\n    {\n      \"type\": \"minecraft:surface_water_depth_filter\",\n      \"max_water_depth\": 0\n    },\n    {\n      \"type\": \"minecraft:heightmap\",\n      \"heightmap\": \"OCEAN_FLOOR\"\n    },\n    {\n      \"type\": \"minecraft:biome\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/block/stone_ore_replaceables.json",
    "content": "{\n  \"values\": [\n    \"minecraft:blue_ice\",\n    \"minecraft:packed_ice\",\n    \"minecraft:sandstone\",\n    \"minecraft:snow_block\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/badlands.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:badlands/ore_coal_upper\",\n    \"gm4_cooler_caves:badlands/ore_coal_lower\",\n    \"gm4_cooler_caves:badlands/ore_iron_upper\",\n    \"gm4_cooler_caves:badlands/ore_iron_middle\",\n    \"gm4_cooler_caves:badlands/ore_iron_small\",\n    \"gm4_cooler_caves:badlands/ore_gold\",\n    \"gm4_cooler_caves:badlands/ore_gold_lower\",\n    \"gm4_cooler_caves:badlands/ore_redstone\",\n    \"gm4_cooler_caves:badlands/ore_redstone_lower\",\n    \"gm4_cooler_caves:badlands/ore_diamond\",\n    \"gm4_cooler_caves:badlands/ore_diamond_large\",\n    \"gm4_cooler_caves:badlands/ore_diamond_buried\",\n    \"gm4_cooler_caves:badlands/ore_lapis\",\n    \"gm4_cooler_caves:badlands/ore_lapis_buried\",\n    \"gm4_cooler_caves:badlands/ore_copper\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/desert.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:desert/ore_sand\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/eroded_badlands.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:badlands/ore_coal_upper\",\n    \"gm4_cooler_caves:badlands/ore_coal_lower\",\n    \"gm4_cooler_caves:badlands/ore_iron_upper\",\n    \"gm4_cooler_caves:badlands/ore_iron_middle\",\n    \"gm4_cooler_caves:badlands/ore_iron_small\",\n    \"gm4_cooler_caves:badlands/ore_gold\",\n    \"gm4_cooler_caves:badlands/ore_gold_lower\",\n    \"gm4_cooler_caves:badlands/ore_redstone\",\n    \"gm4_cooler_caves:badlands/ore_redstone_lower\",\n    \"gm4_cooler_caves:badlands/ore_diamond\",\n    \"gm4_cooler_caves:badlands/ore_diamond_large\",\n    \"gm4_cooler_caves:badlands/ore_diamond_buried\",\n    \"gm4_cooler_caves:badlands/ore_lapis\",\n    \"gm4_cooler_caves:badlands/ore_lapis_buried\",\n    \"gm4_cooler_caves:badlands/ore_copper\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/frozen_peaks.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/ore_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_small\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_powder_snow\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/frozen_river.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/ore_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_small\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_powder_snow\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/grove.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/ore_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_small\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_powder_snow\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/ice_spikes.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/ore_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_small\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_powder_snow\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_beach.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/ore_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_small\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_powder_snow\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_plains.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/ore_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_small\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_powder_snow\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_slopes.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/ore_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_small\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_powder_snow\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_taiga.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/ore_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_packed_ice_small\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_upper\",\n    \"gm4_cooler_caves:snowy/ore_blue_ice_lower\",\n    \"gm4_cooler_caves:snowy/ore_powder_snow\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/wooded_badlands.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:badlands/ore_coal_upper\",\n    \"gm4_cooler_caves:badlands/ore_coal_lower\",\n    \"gm4_cooler_caves:badlands/ore_iron_upper\",\n    \"gm4_cooler_caves:badlands/ore_iron_middle\",\n    \"gm4_cooler_caves:badlands/ore_iron_small\",\n    \"gm4_cooler_caves:badlands/ore_gold\",\n    \"gm4_cooler_caves:badlands/ore_gold_lower\",\n    \"gm4_cooler_caves:badlands/ore_redstone\",\n    \"gm4_cooler_caves:badlands/ore_redstone_lower\",\n    \"gm4_cooler_caves:badlands/ore_diamond\",\n    \"gm4_cooler_caves:badlands/ore_diamond_large\",\n    \"gm4_cooler_caves:badlands/ore_diamond_buried\",\n    \"gm4_cooler_caves:badlands/ore_lapis\",\n    \"gm4_cooler_caves:badlands/ore_lapis_buried\",\n    \"gm4_cooler_caves:badlands/ore_copper\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/badlands.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:badlands/glow_lichen\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/desert.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:desert/glow_lichen\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/eroded_badlands.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:badlands/glow_lichen\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/frozen_peaks.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/glow_lichen\",\n    \"gm4_cooler_caves:snowy/patch_snow_layer\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/frozen_river.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/glow_lichen\",\n    \"gm4_cooler_caves:snowy/patch_snow_layer\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/grove.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/glow_lichen\",\n    \"gm4_cooler_caves:snowy/patch_snow_layer\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/ice_spikes.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/glow_lichen\",\n    \"gm4_cooler_caves:snowy/trees\",\n    \"gm4_cooler_caves:snowy/patch_snow_layer\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_beach.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/glow_lichen\",\n    \"gm4_cooler_caves:snowy/patch_snow_layer\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_plains.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/glow_lichen\",\n    \"gm4_cooler_caves:snowy/trees\",\n    \"gm4_cooler_caves:snowy/patch_snow_layer\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_slopes.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/glow_lichen\",\n    \"gm4_cooler_caves:snowy/patch_snow_layer\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_taiga.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:snowy/glow_lichen\",\n    \"gm4_cooler_caves:snowy/trees_taiga\",\n    \"gm4_cooler_caves:snowy/patch_snow_layer\",\n    \"gm4_cooler_caves:snowy/patch_berry_rare\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/wooded_badlands.json",
    "content": "{\n  \"values\": [\n    \"gm4_cooler_caves:badlands/glow_lichen\"\n  ]\n}\n"
  },
  {
    "path": "gm4_cooler_caves/data/minecraft/worldgen/noise_settings/overworld.json",
    "content": "{\n  \"sea_level\": 63,\n  \"disable_mob_generation\": false,\n  \"aquifers_enabled\": true,\n  \"ore_veins_enabled\": true,\n  \"legacy_random_source\": false,\n  \"default_block\": {\n    \"Name\": \"minecraft:stone\"\n  },\n  \"default_fluid\": {\n    \"Name\": \"minecraft:water\",\n    \"Properties\": {\n      \"level\": \"0\"\n    }\n  },\n  \"noise\": {\n    \"min_y\": -64,\n    \"height\": 384,\n    \"size_horizontal\": 1,\n    \"size_vertical\": 2\n  },\n  \"noise_router\": {\n    \"barrier\": {\n      \"type\": \"minecraft:noise\",\n      \"noise\": \"minecraft:aquifer_barrier\",\n      \"xz_scale\": 1,\n      \"y_scale\": 0.5\n    },\n    \"fluid_level_floodedness\": {\n      \"type\": \"minecraft:noise\",\n      \"noise\": \"minecraft:aquifer_fluid_level_floodedness\",\n      \"xz_scale\": 1,\n      \"y_scale\": 0.67\n    },\n    \"fluid_level_spread\": {\n      \"type\": \"minecraft:noise\",\n      \"noise\": \"minecraft:aquifer_fluid_level_spread\",\n      \"xz_scale\": 1,\n      \"y_scale\": 0.7142857142857143\n    },\n    \"lava\": {\n      \"type\": \"minecraft:noise\",\n      \"noise\": \"minecraft:aquifer_lava\",\n      \"xz_scale\": 1,\n      \"y_scale\": 1\n    },\n    \"temperature\": {\n      \"type\": \"minecraft:shifted_noise\",\n      \"noise\": \"minecraft:temperature\",\n      \"xz_scale\": 0.25,\n      \"y_scale\": 0,\n      \"shift_x\": \"minecraft:shift_x\",\n      \"shift_y\": 0,\n      \"shift_z\": \"minecraft:shift_z\"\n    },\n    \"vegetation\": {\n      \"type\": \"minecraft:shifted_noise\",\n      \"noise\": \"minecraft:vegetation\",\n      \"xz_scale\": 0.25,\n      \"y_scale\": 0,\n      \"shift_x\": \"minecraft:shift_x\",\n      \"shift_y\": 0,\n      \"shift_z\": \"minecraft:shift_z\"\n    },\n    \"continents\": \"minecraft:overworld/continents\",\n    \"erosion\": \"minecraft:overworld/erosion\",\n    \"depth\": \"minecraft:overworld/depth\",\n    \"ridges\": \"minecraft:overworld/ridges\",\n    \"preliminary_surface_level\": {\n      \"type\": \"minecraft:find_top_surface\",\n      \"cell_height\": 8,\n      \"lower_bound\": -64,\n      \"upper_bound\": 320,\n      \"density\": {\n        \"type\": \"minecraft:add\",\n        \"argument1\": 0.1171875,\n        \"argument2\": {\n          \"type\": \"minecraft:mul\",\n          \"argument1\": {\n            \"type\": \"minecraft:y_clamped_gradient\",\n            \"from_y\": -64,\n            \"to_y\": -40,\n            \"from_value\": 0,\n            \"to_value\": 1\n          },\n          \"argument2\": {\n            \"type\": \"minecraft:add\",\n            \"argument1\": -0.1171875,\n            \"argument2\": {\n              \"type\": \"minecraft:add\",\n              \"argument1\": -0.078125,\n              \"argument2\": {\n                \"type\": \"minecraft:mul\",\n                \"argument1\": {\n                  \"type\": \"minecraft:y_clamped_gradient\",\n                  \"from_y\": 240,\n                  \"to_y\": 256,\n                  \"from_value\": 1,\n                  \"to_value\": 0\n                },\n                \"argument2\": {\n                  \"type\": \"minecraft:add\",\n                  \"argument1\": 0.078125,\n                  \"argument2\": {\n                    \"type\": \"minecraft:clamp\",\n                    \"input\": {\n                      \"type\": \"minecraft:add\",\n                      \"argument1\": -0.703125,\n                      \"argument2\": {\n                        \"type\": \"minecraft:mul\",\n                        \"argument1\": 4,\n                        \"argument2\": {\n                          \"type\": \"minecraft:quarter_negative\",\n                          \"argument\": {\n                            \"type\": \"minecraft:mul\",\n                            \"argument1\": \"minecraft:overworld/depth\",\n                            \"argument2\": {\n                              \"type\": \"minecraft:cache_2d\",\n                              \"argument\": \"minecraft:overworld/factor\"\n                            }\n                          }\n                        }\n                      }\n                    },\n                    \"min\": -64,\n                    \"max\": 64\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"final_density\": {\n      \"type\": \"minecraft:min\",\n      \"argument1\": {\n        \"type\": \"minecraft:squeeze\",\n        \"argument\": {\n          \"type\": \"minecraft:mul\",\n          \"argument1\": 0.64,\n          \"argument2\": {\n            \"type\": \"minecraft:interpolated\",\n            \"argument\": {\n              \"type\": \"minecraft:blend_density\",\n              \"argument\": {\n                \"type\": \"minecraft:add\",\n                \"argument1\": 0.1171875,\n                \"argument2\": {\n                  \"type\": \"minecraft:mul\",\n                  \"argument1\": {\n                    \"type\": \"minecraft:y_clamped_gradient\",\n                    \"from_y\": -64,\n                    \"to_y\": -40,\n                    \"from_value\": 0,\n                    \"to_value\": 1\n                  },\n                  \"argument2\": {\n                    \"type\": \"minecraft:add\",\n                    \"argument1\": -0.1171875,\n                    \"argument2\": {\n                      \"type\": \"minecraft:add\",\n                      \"argument1\": -0.078125,\n                      \"argument2\": {\n                        \"type\": \"minecraft:mul\",\n                        \"argument1\": {\n                          \"type\": \"minecraft:y_clamped_gradient\",\n                          \"from_y\": 240,\n                          \"to_y\": 256,\n                          \"from_value\": 1,\n                          \"to_value\": 0\n                        },\n                        \"argument2\": {\n                          \"type\": \"minecraft:add\",\n                          \"argument1\": 0.078125,\n                          \"argument2\": {\n                            \"type\": \"minecraft:range_choice\",\n                            \"input\": \"minecraft:overworld/sloped_cheese\",\n                            \"min_inclusive\": -1000000,\n                            \"max_exclusive\": 1.5625,\n                            \"when_in_range\": {\n                              \"type\": \"minecraft:min\",\n                              \"argument1\": \"minecraft:overworld/sloped_cheese\",\n                              \"argument2\": {\n                                \"type\": \"minecraft:mul\",\n                                \"argument1\": 5,\n                                \"argument2\": \"minecraft:overworld/caves/entrances\"\n                              }\n                            },\n                            \"when_out_of_range\": {\n                              \"type\": \"minecraft:max\",\n                              \"argument1\": {\n                                \"type\": \"minecraft:min\",\n                                \"argument1\": {\n                                  \"type\": \"minecraft:min\",\n                                  \"argument1\": {\n                                    \"type\": \"minecraft:add\",\n                                    \"argument1\": {\n                                      \"type\": \"minecraft:mul\",\n                                      \"argument1\": 4,\n                                      \"argument2\": {\n                                        \"type\": \"minecraft:square\",\n                                        \"argument\": {\n                                          \"type\": \"minecraft:noise\",\n                                          \"noise\": \"minecraft:cave_layer\",\n                                          \"xz_scale\": 1,\n                                          \"y_scale\": 8\n                                        }\n                                      }\n                                    },\n                                    \"argument2\": {\n                                      \"type\": \"minecraft:add\",\n                                      \"argument1\": {\n                                        \"type\": \"minecraft:clamp\",\n                                        \"input\": {\n                                          \"type\": \"minecraft:add\",\n                                          \"argument1\": 0.27,\n                                          \"argument2\": {\n                                            \"type\": \"minecraft:noise\",\n                                            \"noise\": \"minecraft:cave_cheese\",\n                                            \"xz_scale\": 1,\n                                            \"y_scale\": 0.6666666666666666\n                                          }\n                                        },\n                                        \"min\": -1,\n                                        \"max\": 1\n                                      },\n                                      \"argument2\": {\n                                        \"type\": \"minecraft:clamp\",\n                                        \"input\": {\n                                          \"type\": \"minecraft:add\",\n                                          \"argument1\": 1.5,\n                                          \"argument2\": {\n                                            \"type\": \"minecraft:mul\",\n                                            \"argument1\": -0.64,\n                                            \"argument2\": \"minecraft:overworld/sloped_cheese\"\n                                          }\n                                        },\n                                        \"min\": 0,\n                                        \"max\": 0.5\n                                      }\n                                    }\n                                  },\n                                  \"argument2\": \"minecraft:overworld/caves/entrances\"\n                                },\n                                \"argument2\": {\n                                  \"type\": \"minecraft:add\",\n                                  \"argument1\": \"minecraft:overworld/caves/spaghetti_2d\",\n                                  \"argument2\": \"minecraft:overworld/caves/spaghetti_roughness_function\"\n                                }\n                              },\n                              \"argument2\": {\n                                \"type\": \"minecraft:range_choice\",\n                                \"input\": \"minecraft:overworld/caves/pillars\",\n                                \"min_inclusive\": -1000000,\n                                \"max_exclusive\": 0.03,\n                                \"when_in_range\": -1000000,\n                                \"when_out_of_range\": \"minecraft:overworld/caves/pillars\"\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      \"argument2\": \"minecraft:overworld/caves/noodle\"\n    },\n    \"vein_toggle\": {\n      \"type\": \"minecraft:interpolated\",\n      \"argument\": {\n        \"type\": \"minecraft:range_choice\",\n        \"input\": \"minecraft:y\",\n        \"min_inclusive\": -60,\n        \"max_exclusive\": 51,\n        \"when_in_range\": {\n          \"type\": \"minecraft:noise\",\n          \"noise\": \"minecraft:ore_veininess\",\n          \"xz_scale\": 1.5,\n          \"y_scale\": 1.5\n        },\n        \"when_out_of_range\": 0\n      }\n    },\n    \"vein_ridged\": {\n      \"type\": \"minecraft:add\",\n      \"argument1\": -0.07999999821186066,\n      \"argument2\": {\n        \"type\": \"minecraft:max\",\n        \"argument1\": {\n          \"type\": \"minecraft:abs\",\n          \"argument\": {\n            \"type\": \"minecraft:interpolated\",\n            \"argument\": {\n              \"type\": \"minecraft:range_choice\",\n              \"input\": \"minecraft:y\",\n              \"min_inclusive\": -60,\n              \"max_exclusive\": 51,\n              \"when_in_range\": {\n                \"type\": \"minecraft:noise\",\n                \"noise\": \"minecraft:ore_vein_a\",\n                \"xz_scale\": 4,\n                \"y_scale\": 4\n              },\n              \"when_out_of_range\": 0\n            }\n          }\n        },\n        \"argument2\": {\n          \"type\": \"minecraft:abs\",\n          \"argument\": {\n            \"type\": \"minecraft:interpolated\",\n            \"argument\": {\n              \"type\": \"minecraft:range_choice\",\n              \"input\": \"minecraft:y\",\n              \"min_inclusive\": -60,\n              \"max_exclusive\": 51,\n              \"when_in_range\": {\n                \"type\": \"minecraft:noise\",\n                \"noise\": \"minecraft:ore_vein_b\",\n                \"xz_scale\": 4,\n                \"y_scale\": 4\n              },\n              \"when_out_of_range\": 0\n            }\n          }\n        }\n      }\n    },\n    \"vein_gap\": {\n      \"type\": \"minecraft:noise\",\n      \"noise\": \"minecraft:ore_gap\",\n      \"xz_scale\": 1,\n      \"y_scale\": 1\n    }\n  },\n  \"spawn_target\": [\n    {\n      \"temperature\": [\n        -1,\n        1\n      ],\n      \"humidity\": [\n        -1,\n        1\n      ],\n      \"continentalness\": [\n        -0.11,\n        1\n      ],\n      \"erosion\": [\n        -1,\n        1\n      ],\n      \"weirdness\": [\n        -1,\n        -0.16\n      ],\n      \"depth\": 0,\n      \"offset\": 0\n    },\n    {\n      \"temperature\": [\n        -1,\n        1\n      ],\n      \"humidity\": [\n        -1,\n        1\n      ],\n      \"continentalness\": [\n        -0.11,\n        1\n      ],\n      \"erosion\": [\n        -1,\n        1\n      ],\n      \"weirdness\": [\n        0.16,\n        1\n      ],\n      \"depth\": 0,\n      \"offset\": 0\n    }\n  ],\n  \"surface_rule\": {\n    \"type\": \"minecraft:sequence\",\n    \"sequence\": [\n      {\n        \"type\": \"minecraft:condition\",\n        \"if_true\": {\n          \"type\": \"minecraft:vertical_gradient\",\n          \"random_name\": \"minecraft:bedrock_floor\",\n          \"true_at_and_below\": {\n            \"above_bottom\": 0\n          },\n          \"false_at_and_above\": {\n            \"above_bottom\": 5\n          }\n        },\n        \"then_run\": {\n          \"type\": \"minecraft:block\",\n          \"result_state\": {\n            \"Name\": \"minecraft:bedrock\"\n          }\n        }\n      },\n      {\n        \"type\": \"minecraft:condition\",\n        \"if_true\": {\n          \"type\": \"minecraft:above_preliminary_surface\"\n        },\n        \"then_run\": {\n          \"type\": \"minecraft:sequence\",\n          \"sequence\": [\n            {\n              \"type\": \"minecraft:condition\",\n              \"if_true\": {\n                \"type\": \"minecraft:stone_depth\",\n                \"offset\": 0,\n                \"surface_type\": \"floor\",\n                \"add_surface_depth\": false,\n                \"secondary_depth_range\": 0\n              },\n              \"then_run\": {\n                \"type\": \"minecraft:sequence\",\n                \"sequence\": [\n                  {\n                    \"type\": \"minecraft:condition\",\n                    \"if_true\": {\n                      \"type\": \"minecraft:biome\",\n                      \"biome_is\": [\n                        \"minecraft:wooded_badlands\"\n                      ]\n                    },\n                    \"then_run\": {\n                      \"type\": \"minecraft:condition\",\n                      \"if_true\": {\n                        \"type\": \"minecraft:y_above\",\n                        \"anchor\": {\n                          \"absolute\": 97\n                        },\n                        \"surface_depth_multiplier\": 2,\n                        \"add_stone_depth\": false\n                      },\n                      \"then_run\": {\n                        \"type\": \"minecraft:sequence\",\n                        \"sequence\": [\n                          {\n                            \"type\": \"minecraft:condition\",\n                            \"if_true\": {\n                              \"type\": \"minecraft:noise_threshold\",\n                              \"noise\": \"minecraft:surface\",\n                              \"min_threshold\": -0.909,\n                              \"max_threshold\": -0.5454\n                            },\n                            \"then_run\": {\n                              \"type\": \"minecraft:block\",\n                              \"result_state\": {\n                                \"Name\": \"minecraft:coarse_dirt\"\n                              }\n                            }\n                          },\n                          {\n                            \"type\": \"minecraft:condition\",\n                            \"if_true\": {\n                              \"type\": \"minecraft:noise_threshold\",\n                              \"noise\": \"minecraft:surface\",\n                              \"min_threshold\": -0.1818,\n                              \"max_threshold\": 0.1818\n                            },\n                            \"then_run\": {\n                              \"type\": \"minecraft:block\",\n                              \"result_state\": {\n                                \"Name\": \"minecraft:coarse_dirt\"\n                              }\n                            }\n                          },\n                          {\n                            \"type\": \"minecraft:condition\",\n                            \"if_true\": {\n                              \"type\": \"minecraft:noise_threshold\",\n                              \"noise\": \"minecraft:surface\",\n                              \"min_threshold\": 0.5454,\n                              \"max_threshold\": 0.909\n                            },\n                            \"then_run\": {\n                              \"type\": \"minecraft:block\",\n                              \"result_state\": {\n                                \"Name\": \"minecraft:coarse_dirt\"\n                              }\n                            }\n                          },\n                          {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:water\",\n                                  \"offset\": 0,\n                                  \"surface_depth_multiplier\": 0,\n                                  \"add_stone_depth\": false\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:grass_block\",\n                                    \"Properties\": {\n                                      \"snowy\": \"false\"\n                                    }\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:block\",\n                                \"result_state\": {\n                                  \"Name\": \"minecraft:dirt\"\n                                }\n                              }\n                            ]\n                          }\n                        ]\n                      }\n                    }\n                  },\n                  {\n                    \"type\": \"minecraft:condition\",\n                    \"if_true\": {\n                      \"type\": \"minecraft:biome\",\n                      \"biome_is\": [\n                        \"minecraft:swamp\"\n                      ]\n                    },\n                    \"then_run\": {\n                      \"type\": \"minecraft:condition\",\n                      \"if_true\": {\n                        \"type\": \"minecraft:y_above\",\n                        \"anchor\": {\n                          \"absolute\": 62\n                        },\n                        \"surface_depth_multiplier\": 0,\n                        \"add_stone_depth\": false\n                      },\n                      \"then_run\": {\n                        \"type\": \"minecraft:condition\",\n                        \"if_true\": {\n                          \"type\": \"minecraft:not\",\n                          \"invert\": {\n                            \"type\": \"minecraft:y_above\",\n                            \"anchor\": {\n                              \"absolute\": 63\n                            },\n                            \"surface_depth_multiplier\": 0,\n                            \"add_stone_depth\": false\n                          }\n                        },\n                        \"then_run\": {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:noise_threshold\",\n                            \"noise\": \"minecraft:surface_swamp\",\n                            \"min_threshold\": 0,\n                            \"max_threshold\": 1.7976931348623157e+308\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:block\",\n                            \"result_state\": {\n                              \"Name\": \"minecraft:water\",\n                              \"Properties\": {\n                                \"level\": \"0\"\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  },\n                  {\n                    \"type\": \"minecraft:condition\",\n                    \"if_true\": {\n                      \"type\": \"minecraft:biome\",\n                      \"biome_is\": [\n                        \"minecraft:mangrove_swamp\"\n                      ]\n                    },\n                    \"then_run\": {\n                      \"type\": \"minecraft:condition\",\n                      \"if_true\": {\n                        \"type\": \"minecraft:y_above\",\n                        \"anchor\": {\n                          \"absolute\": 60\n                        },\n                        \"surface_depth_multiplier\": 0,\n                        \"add_stone_depth\": false\n                      },\n                      \"then_run\": {\n                        \"type\": \"minecraft:condition\",\n                        \"if_true\": {\n                          \"type\": \"minecraft:not\",\n                          \"invert\": {\n                            \"type\": \"minecraft:y_above\",\n                            \"anchor\": {\n                              \"absolute\": 63\n                            },\n                            \"surface_depth_multiplier\": 0,\n                            \"add_stone_depth\": false\n                          }\n                        },\n                        \"then_run\": {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:noise_threshold\",\n                            \"noise\": \"minecraft:surface_swamp\",\n                            \"min_threshold\": 0,\n                            \"max_threshold\": 1.7976931348623157e+308\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:block\",\n                            \"result_state\": {\n                              \"Name\": \"minecraft:water\",\n                              \"Properties\": {\n                                \"level\": \"0\"\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                ]\n              }\n            },\n            {\n              \"type\": \"minecraft:condition\",\n              \"if_true\": {\n                \"type\": \"minecraft:biome\",\n                \"biome_is\": [\n                  \"minecraft:badlands\",\n                  \"minecraft:eroded_badlands\",\n                  \"minecraft:wooded_badlands\"\n                ]\n              },\n              \"then_run\": {\n                \"type\": \"minecraft:sequence\",\n                \"sequence\": [\n                  {\n                    \"type\": \"minecraft:condition\",\n                    \"if_true\": {\n                      \"type\": \"minecraft:stone_depth\",\n                      \"offset\": 0,\n                      \"surface_type\": \"floor\",\n                      \"add_surface_depth\": false,\n                      \"secondary_depth_range\": 0\n                    },\n                    \"then_run\": {\n                      \"type\": \"minecraft:sequence\",\n                      \"sequence\": [\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:y_above\",\n                            \"anchor\": {\n                              \"absolute\": 256\n                            },\n                            \"surface_depth_multiplier\": 0,\n                            \"add_stone_depth\": false\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:block\",\n                            \"result_state\": {\n                              \"Name\": \"minecraft:orange_terracotta\"\n                            }\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:y_above\",\n                            \"anchor\": {\n                              \"absolute\": 74\n                            },\n                            \"surface_depth_multiplier\": 1,\n                            \"add_stone_depth\": true\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": -0.909,\n                                  \"max_threshold\": -0.5454\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:terracotta\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": -0.1818,\n                                  \"max_threshold\": 0.1818\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:terracotta\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": 0.5454,\n                                  \"max_threshold\": 0.909\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:terracotta\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:bandlands\"\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:water\",\n                            \"offset\": -1,\n                            \"surface_depth_multiplier\": 0,\n                            \"add_stone_depth\": false\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:stone_depth\",\n                                  \"offset\": 0,\n                                  \"surface_type\": \"ceiling\",\n                                  \"add_surface_depth\": false,\n                                  \"secondary_depth_range\": 0\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:red_sandstone\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:block\",\n                                \"result_state\": {\n                                  \"Name\": \"minecraft:red_sand\"\n                                }\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:not\",\n                            \"invert\": {\n                              \"type\": \"minecraft:hole\"\n                            }\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:block\",\n                            \"result_state\": {\n                              \"Name\": \"minecraft:orange_terracotta\"\n                            }\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:water\",\n                            \"offset\": -6,\n                            \"surface_depth_multiplier\": -1,\n                            \"add_stone_depth\": true\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:block\",\n                            \"result_state\": {\n                              \"Name\": \"minecraft:white_terracotta\"\n                            }\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:sequence\",\n                          \"sequence\": [\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:stone_depth\",\n                                \"offset\": 0,\n                                \"surface_type\": \"ceiling\",\n                                \"add_surface_depth\": false,\n                                \"secondary_depth_range\": 0\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:block\",\n                                \"result_state\": {\n                                  \"Name\": \"minecraft:stone\"\n                                }\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:block\",\n                              \"result_state\": {\n                                \"Name\": \"minecraft:gravel\"\n                              }\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"type\": \"minecraft:condition\",\n                    \"if_true\": {\n                      \"type\": \"minecraft:y_above\",\n                      \"anchor\": {\n                        \"absolute\": 63\n                      },\n                      \"surface_depth_multiplier\": -1,\n                      \"add_stone_depth\": true\n                    },\n                    \"then_run\": {\n                      \"type\": \"minecraft:sequence\",\n                      \"sequence\": [\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:y_above\",\n                            \"anchor\": {\n                              \"absolute\": 63\n                            },\n                            \"surface_depth_multiplier\": 0,\n                            \"add_stone_depth\": false\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:condition\",\n                            \"if_true\": {\n                              \"type\": \"minecraft:not\",\n                              \"invert\": {\n                                \"type\": \"minecraft:y_above\",\n                                \"anchor\": {\n                                  \"absolute\": 74\n                                },\n                                \"surface_depth_multiplier\": 1,\n                                \"add_stone_depth\": true\n                              }\n                            },\n                            \"then_run\": {\n                              \"type\": \"minecraft:block\",\n                              \"result_state\": {\n                                \"Name\": \"minecraft:orange_terracotta\"\n                              }\n                            }\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:bandlands\"\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"type\": \"minecraft:condition\",\n                    \"if_true\": {\n                      \"type\": \"minecraft:stone_depth\",\n                      \"offset\": 0,\n                      \"surface_type\": \"floor\",\n                      \"add_surface_depth\": true,\n                      \"secondary_depth_range\": 0\n                    },\n                    \"then_run\": {\n                      \"type\": \"minecraft:condition\",\n                      \"if_true\": {\n                        \"type\": \"minecraft:water\",\n                        \"offset\": -6,\n                        \"surface_depth_multiplier\": -1,\n                        \"add_stone_depth\": true\n                      },\n                      \"then_run\": {\n                        \"type\": \"minecraft:block\",\n                        \"result_state\": {\n                          \"Name\": \"minecraft:white_terracotta\"\n                        }\n                      }\n                    }\n                  }\n                ]\n              }\n            },\n            {\n              \"type\": \"minecraft:condition\",\n              \"if_true\": {\n                \"type\": \"minecraft:stone_depth\",\n                \"offset\": 0,\n                \"surface_type\": \"floor\",\n                \"add_surface_depth\": false,\n                \"secondary_depth_range\": 0\n              },\n              \"then_run\": {\n                \"type\": \"minecraft:condition\",\n                \"if_true\": {\n                  \"type\": \"minecraft:water\",\n                  \"offset\": -1,\n                  \"surface_depth_multiplier\": 0,\n                  \"add_stone_depth\": false\n                },\n                \"then_run\": {\n                  \"type\": \"minecraft:sequence\",\n                  \"sequence\": [\n                    {\n                      \"type\": \"minecraft:condition\",\n                      \"if_true\": {\n                        \"type\": \"minecraft:biome\",\n                        \"biome_is\": [\n                          \"minecraft:frozen_ocean\",\n                          \"minecraft:deep_frozen_ocean\"\n                        ]\n                      },\n                      \"then_run\": {\n                        \"type\": \"minecraft:condition\",\n                        \"if_true\": {\n                          \"type\": \"minecraft:hole\"\n                        },\n                        \"then_run\": {\n                          \"type\": \"minecraft:sequence\",\n                          \"sequence\": [\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:water\",\n                                \"offset\": 0,\n                                \"surface_depth_multiplier\": 0,\n                                \"add_stone_depth\": false\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:block\",\n                                \"result_state\": {\n                                  \"Name\": \"minecraft:air\"\n                                }\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:temperature\"\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:block\",\n                                \"result_state\": {\n                                  \"Name\": \"minecraft:ice\"\n                                }\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:block\",\n                              \"result_state\": {\n                                \"Name\": \"minecraft:water\",\n                                \"Properties\": {\n                                  \"level\": \"0\"\n                                }\n                              }\n                            }\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"type\": \"minecraft:sequence\",\n                      \"sequence\": [\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:frozen_peaks\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:steep\"\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:packed_ice\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:packed_ice\",\n                                  \"min_threshold\": 0,\n                                  \"max_threshold\": 0.2\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:packed_ice\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:ice\",\n                                  \"min_threshold\": 0,\n                                  \"max_threshold\": 0.025\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:ice\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:water\",\n                                  \"offset\": 0,\n                                  \"surface_depth_multiplier\": 0,\n                                  \"add_stone_depth\": false\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:snow_block\"\n                                  }\n                                }\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:snowy_slopes\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:steep\"\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:stone\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:powder_snow\",\n                                  \"min_threshold\": 0.35,\n                                  \"max_threshold\": 0.6\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:condition\",\n                                  \"if_true\": {\n                                    \"type\": \"minecraft:water\",\n                                    \"offset\": 0,\n                                    \"surface_depth_multiplier\": 0,\n                                    \"add_stone_depth\": false\n                                  },\n                                  \"then_run\": {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:powder_snow\"\n                                    }\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:water\",\n                                  \"offset\": 0,\n                                  \"surface_depth_multiplier\": 0,\n                                  \"add_stone_depth\": false\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:snow_block\"\n                                  }\n                                }\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:jagged_peaks\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:steep\"\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:stone\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:water\",\n                                  \"offset\": 0,\n                                  \"surface_depth_multiplier\": 0,\n                                  \"add_stone_depth\": false\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:snow_block\"\n                                  }\n                                }\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:grove\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:powder_snow\",\n                                  \"min_threshold\": 0.35,\n                                  \"max_threshold\": 0.6\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:condition\",\n                                  \"if_true\": {\n                                    \"type\": \"minecraft:water\",\n                                    \"offset\": 0,\n                                    \"surface_depth_multiplier\": 0,\n                                    \"add_stone_depth\": false\n                                  },\n                                  \"then_run\": {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:powder_snow\"\n                                    }\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:water\",\n                                  \"offset\": 0,\n                                  \"surface_depth_multiplier\": 0,\n                                  \"add_stone_depth\": false\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:snow_block\"\n                                  }\n                                }\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:sequence\",\n                          \"sequence\": [\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:biome\",\n                                \"biome_is\": [\n                                  \"minecraft:stony_peaks\"\n                                ]\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:sequence\",\n                                \"sequence\": [\n                                  {\n                                    \"type\": \"minecraft:condition\",\n                                    \"if_true\": {\n                                      \"type\": \"minecraft:noise_threshold\",\n                                      \"noise\": \"minecraft:calcite\",\n                                      \"min_threshold\": -0.0125,\n                                      \"max_threshold\": 0.0125\n                                    },\n                                    \"then_run\": {\n                                      \"type\": \"minecraft:block\",\n                                      \"result_state\": {\n                                        \"Name\": \"minecraft:calcite\"\n                                      }\n                                    }\n                                  },\n                                  {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:stone\"\n                                    }\n                                  }\n                                ]\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:biome\",\n                                \"biome_is\": [\n                                  \"minecraft:stony_shore\"\n                                ]\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:sequence\",\n                                \"sequence\": [\n                                  {\n                                    \"type\": \"minecraft:condition\",\n                                    \"if_true\": {\n                                      \"type\": \"minecraft:noise_threshold\",\n                                      \"noise\": \"minecraft:gravel\",\n                                      \"min_threshold\": -0.05,\n                                      \"max_threshold\": 0.05\n                                    },\n                                    \"then_run\": {\n                                      \"type\": \"minecraft:sequence\",\n                                      \"sequence\": [\n                                        {\n                                          \"type\": \"minecraft:condition\",\n                                          \"if_true\": {\n                                            \"type\": \"minecraft:stone_depth\",\n                                            \"offset\": 0,\n                                            \"surface_type\": \"ceiling\",\n                                            \"add_surface_depth\": false,\n                                            \"secondary_depth_range\": 0\n                                          },\n                                          \"then_run\": {\n                                            \"type\": \"minecraft:block\",\n                                            \"result_state\": {\n                                              \"Name\": \"minecraft:stone\"\n                                            }\n                                          }\n                                        },\n                                        {\n                                          \"type\": \"minecraft:block\",\n                                          \"result_state\": {\n                                            \"Name\": \"minecraft:gravel\"\n                                          }\n                                        }\n                                      ]\n                                    }\n                                  },\n                                  {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:stone\"\n                                    }\n                                  }\n                                ]\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:biome\",\n                                \"biome_is\": [\n                                  \"minecraft:windswept_hills\"\n                                ]\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": 0.12121212121212122,\n                                  \"max_threshold\": 1.7976931348623157e+308\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:stone\"\n                                  }\n                                }\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:biome\",\n                                \"biome_is\": [\n                                  \"minecraft:warm_ocean\",\n                                  \"minecraft:beach\",\n                                  \"minecraft:snowy_beach\"\n                                ]\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:sequence\",\n                                \"sequence\": [\n                                  {\n                                    \"type\": \"minecraft:condition\",\n                                    \"if_true\": {\n                                      \"type\": \"minecraft:stone_depth\",\n                                      \"offset\": 0,\n                                      \"surface_type\": \"ceiling\",\n                                      \"add_surface_depth\": false,\n                                      \"secondary_depth_range\": 0\n                                    },\n                                    \"then_run\": {\n                                      \"type\": \"minecraft:block\",\n                                      \"result_state\": {\n                                        \"Name\": \"minecraft:sandstone\"\n                                      }\n                                    }\n                                  },\n                                  {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:sand\"\n                                    }\n                                  }\n                                ]\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:biome\",\n                                \"biome_is\": [\n                                  \"minecraft:desert\"\n                                ]\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:sequence\",\n                                \"sequence\": [\n                                  {\n                                    \"type\": \"minecraft:condition\",\n                                    \"if_true\": {\n                                      \"type\": \"minecraft:stone_depth\",\n                                      \"offset\": 0,\n                                      \"surface_type\": \"ceiling\",\n                                      \"add_surface_depth\": false,\n                                      \"secondary_depth_range\": 0\n                                    },\n                                    \"then_run\": {\n                                      \"type\": \"minecraft:block\",\n                                      \"result_state\": {\n                                        \"Name\": \"minecraft:sandstone\"\n                                      }\n                                    }\n                                  },\n                                  {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:sand\"\n                                    }\n                                  }\n                                ]\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:biome\",\n                                \"biome_is\": [\n                                  \"minecraft:dripstone_caves\"\n                                ]\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:block\",\n                                \"result_state\": {\n                                  \"Name\": \"minecraft:stone\"\n                                }\n                              }\n                            }\n                          ]\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:windswept_savanna\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": 0.21212121212121213,\n                                  \"max_threshold\": 1.7976931348623157e+308\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:stone\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": -0.06060606060606061,\n                                  \"max_threshold\": 1.7976931348623157e+308\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:coarse_dirt\"\n                                  }\n                                }\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:windswept_gravelly_hills\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": 0.24242424242424243,\n                                  \"max_threshold\": 1.7976931348623157e+308\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:sequence\",\n                                  \"sequence\": [\n                                    {\n                                      \"type\": \"minecraft:condition\",\n                                      \"if_true\": {\n                                        \"type\": \"minecraft:stone_depth\",\n                                        \"offset\": 0,\n                                        \"surface_type\": \"ceiling\",\n                                        \"add_surface_depth\": false,\n                                        \"secondary_depth_range\": 0\n                                      },\n                                      \"then_run\": {\n                                        \"type\": \"minecraft:block\",\n                                        \"result_state\": {\n                                          \"Name\": \"minecraft:stone\"\n                                        }\n                                      }\n                                    },\n                                    {\n                                      \"type\": \"minecraft:block\",\n                                      \"result_state\": {\n                                        \"Name\": \"minecraft:gravel\"\n                                      }\n                                    }\n                                  ]\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": 0.12121212121212122,\n                                  \"max_threshold\": 1.7976931348623157e+308\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:stone\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": -0.12121212121212122,\n                                  \"max_threshold\": 1.7976931348623157e+308\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:sequence\",\n                                  \"sequence\": [\n                                    {\n                                      \"type\": \"minecraft:condition\",\n                                      \"if_true\": {\n                                        \"type\": \"minecraft:water\",\n                                        \"offset\": 0,\n                                        \"surface_depth_multiplier\": 0,\n                                        \"add_stone_depth\": false\n                                      },\n                                      \"then_run\": {\n                                        \"type\": \"minecraft:block\",\n                                        \"result_state\": {\n                                          \"Name\": \"minecraft:grass_block\",\n                                          \"Properties\": {\n                                            \"snowy\": \"false\"\n                                          }\n                                        }\n                                      }\n                                    },\n                                    {\n                                      \"type\": \"minecraft:block\",\n                                      \"result_state\": {\n                                        \"Name\": \"minecraft:dirt\"\n                                      }\n                                    }\n                                  ]\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:sequence\",\n                                \"sequence\": [\n                                  {\n                                    \"type\": \"minecraft:condition\",\n                                    \"if_true\": {\n                                      \"type\": \"minecraft:stone_depth\",\n                                      \"offset\": 0,\n                                      \"surface_type\": \"ceiling\",\n                                      \"add_surface_depth\": false,\n                                      \"secondary_depth_range\": 0\n                                    },\n                                    \"then_run\": {\n                                      \"type\": \"minecraft:block\",\n                                      \"result_state\": {\n                                        \"Name\": \"minecraft:stone\"\n                                      }\n                                    }\n                                  },\n                                  {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:gravel\"\n                                    }\n                                  }\n                                ]\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:old_growth_pine_taiga\",\n                              \"minecraft:old_growth_spruce_taiga\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": 0.21212121212121213,\n                                  \"max_threshold\": 1.7976931348623157e+308\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:coarse_dirt\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": -0.11515151515151514,\n                                  \"max_threshold\": 1.7976931348623157e+308\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:podzol\",\n                                    \"Properties\": {\n                                      \"snowy\": \"false\"\n                                    }\n                                  }\n                                }\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:frozen_river\",\n                              \"minecraft:grove\",\n                              \"minecraft:ice_spikes\",\n                              \"minecraft:snowy_beach\",\n                              \"minecraft:snowy_plains\",\n                              \"minecraft:snowy_slopes\",\n                              \"minecraft:snowy_taiga\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:condition\",\n                            \"if_true\": {\n                              \"type\": \"minecraft:water\",\n                              \"offset\": 0,\n                              \"surface_depth_multiplier\": 0,\n                              \"add_stone_depth\": false\n                            },\n                            \"then_run\": {\n                              \"type\": \"minecraft:block\",\n                              \"result_state\": {\n                                \"Name\": \"minecraft:snow_block\"\n                              }\n                            }\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:mangrove_swamp\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:block\",\n                            \"result_state\": {\n                              \"Name\": \"minecraft:mud\"\n                            }\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:mushroom_fields\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:block\",\n                            \"result_state\": {\n                              \"Name\": \"minecraft:mycelium\",\n                              \"Properties\": {\n                                \"snowy\": \"false\"\n                              }\n                            }\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:sequence\",\n                          \"sequence\": [\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:water\",\n                                \"offset\": 0,\n                                \"surface_depth_multiplier\": 0,\n                                \"add_stone_depth\": false\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:block\",\n                                \"result_state\": {\n                                  \"Name\": \"minecraft:grass_block\",\n                                  \"Properties\": {\n                                    \"snowy\": \"false\"\n                                  }\n                                }\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:block\",\n                              \"result_state\": {\n                                \"Name\": \"minecraft:dirt\"\n                              }\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  ]\n                }\n              }\n            },\n            {\n              \"type\": \"minecraft:condition\",\n              \"if_true\": {\n                \"type\": \"minecraft:water\",\n                \"offset\": -6,\n                \"surface_depth_multiplier\": -1,\n                \"add_stone_depth\": true\n              },\n              \"then_run\": {\n                \"type\": \"minecraft:sequence\",\n                \"sequence\": [\n                  {\n                    \"type\": \"minecraft:condition\",\n                    \"if_true\": {\n                      \"type\": \"minecraft:stone_depth\",\n                      \"offset\": 0,\n                      \"surface_type\": \"floor\",\n                      \"add_surface_depth\": false,\n                      \"secondary_depth_range\": 0\n                    },\n                    \"then_run\": {\n                      \"type\": \"minecraft:condition\",\n                      \"if_true\": {\n                        \"type\": \"minecraft:biome\",\n                        \"biome_is\": [\n                          \"minecraft:frozen_ocean\",\n                          \"minecraft:deep_frozen_ocean\"\n                        ]\n                      },\n                      \"then_run\": {\n                        \"type\": \"minecraft:condition\",\n                        \"if_true\": {\n                          \"type\": \"minecraft:hole\"\n                        },\n                        \"then_run\": {\n                          \"type\": \"minecraft:block\",\n                          \"result_state\": {\n                            \"Name\": \"minecraft:water\",\n                            \"Properties\": {\n                              \"level\": \"0\"\n                            }\n                          }\n                        }\n                      }\n                    }\n                  },\n                  {\n                    \"type\": \"minecraft:condition\",\n                    \"if_true\": {\n                      \"type\": \"minecraft:stone_depth\",\n                      \"offset\": 0,\n                      \"surface_type\": \"floor\",\n                      \"add_surface_depth\": true,\n                      \"secondary_depth_range\": 0\n                    },\n                    \"then_run\": {\n                      \"type\": \"minecraft:sequence\",\n                      \"sequence\": [\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:frozen_peaks\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:steep\"\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:packed_ice\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:packed_ice\",\n                                  \"min_threshold\": -0.5,\n                                  \"max_threshold\": 0.2\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:packed_ice\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:ice\",\n                                  \"min_threshold\": -0.0625,\n                                  \"max_threshold\": 0.025\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:ice\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:water\",\n                                  \"offset\": 0,\n                                  \"surface_depth_multiplier\": 0,\n                                  \"add_stone_depth\": false\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:snow_block\"\n                                  }\n                                }\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:snowy_slopes\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:steep\"\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:stone\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:powder_snow\",\n                                  \"min_threshold\": 0.45,\n                                  \"max_threshold\": 0.58\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:condition\",\n                                  \"if_true\": {\n                                    \"type\": \"minecraft:water\",\n                                    \"offset\": 0,\n                                    \"surface_depth_multiplier\": 0,\n                                    \"add_stone_depth\": false\n                                  },\n                                  \"then_run\": {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:powder_snow\"\n                                    }\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:water\",\n                                  \"offset\": 0,\n                                  \"surface_depth_multiplier\": 0,\n                                  \"add_stone_depth\": false\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:snow_block\"\n                                  }\n                                }\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:jagged_peaks\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:block\",\n                            \"result_state\": {\n                              \"Name\": \"minecraft:stone\"\n                            }\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:grove\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:powder_snow\",\n                                  \"min_threshold\": 0.45,\n                                  \"max_threshold\": 0.58\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:condition\",\n                                  \"if_true\": {\n                                    \"type\": \"minecraft:water\",\n                                    \"offset\": 0,\n                                    \"surface_depth_multiplier\": 0,\n                                    \"add_stone_depth\": false\n                                  },\n                                  \"then_run\": {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:powder_snow\"\n                                    }\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:block\",\n                                \"result_state\": {\n                                  \"Name\": \"minecraft:packed_ice\"\n                                }\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:sequence\",\n                          \"sequence\": [\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:biome\",\n                                \"biome_is\": [\n                                  \"minecraft:stony_peaks\"\n                                ]\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:sequence\",\n                                \"sequence\": [\n                                  {\n                                    \"type\": \"minecraft:condition\",\n                                    \"if_true\": {\n                                      \"type\": \"minecraft:noise_threshold\",\n                                      \"noise\": \"minecraft:calcite\",\n                                      \"min_threshold\": -0.0125,\n                                      \"max_threshold\": 0.0125\n                                    },\n                                    \"then_run\": {\n                                      \"type\": \"minecraft:block\",\n                                      \"result_state\": {\n                                        \"Name\": \"minecraft:calcite\"\n                                      }\n                                    }\n                                  },\n                                  {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:stone\"\n                                    }\n                                  }\n                                ]\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:biome\",\n                                \"biome_is\": [\n                                  \"minecraft:stony_shore\"\n                                ]\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:sequence\",\n                                \"sequence\": [\n                                  {\n                                    \"type\": \"minecraft:condition\",\n                                    \"if_true\": {\n                                      \"type\": \"minecraft:noise_threshold\",\n                                      \"noise\": \"minecraft:gravel\",\n                                      \"min_threshold\": -0.05,\n                                      \"max_threshold\": 0.05\n                                    },\n                                    \"then_run\": {\n                                      \"type\": \"minecraft:sequence\",\n                                      \"sequence\": [\n                                        {\n                                          \"type\": \"minecraft:condition\",\n                                          \"if_true\": {\n                                            \"type\": \"minecraft:stone_depth\",\n                                            \"offset\": 0,\n                                            \"surface_type\": \"ceiling\",\n                                            \"add_surface_depth\": false,\n                                            \"secondary_depth_range\": 0\n                                          },\n                                          \"then_run\": {\n                                            \"type\": \"minecraft:block\",\n                                            \"result_state\": {\n                                              \"Name\": \"minecraft:stone\"\n                                            }\n                                          }\n                                        },\n                                        {\n                                          \"type\": \"minecraft:block\",\n                                          \"result_state\": {\n                                            \"Name\": \"minecraft:gravel\"\n                                          }\n                                        }\n                                      ]\n                                    }\n                                  },\n                                  {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:stone\"\n                                    }\n                                  }\n                                ]\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:biome\",\n                                \"biome_is\": [\n                                  \"minecraft:windswept_hills\"\n                                ]\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": 0.12121212121212122,\n                                  \"max_threshold\": 1.7976931348623157e+308\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:stone\"\n                                  }\n                                }\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:biome\",\n                                \"biome_is\": [\n                                  \"minecraft:warm_ocean\",\n                                  \"minecraft:beach\",\n                                  \"minecraft:snowy_beach\"\n                                ]\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:sequence\",\n                                \"sequence\": [\n                                  {\n                                    \"type\": \"minecraft:condition\",\n                                    \"if_true\": {\n                                      \"type\": \"minecraft:stone_depth\",\n                                      \"offset\": 0,\n                                      \"surface_type\": \"ceiling\",\n                                      \"add_surface_depth\": false,\n                                      \"secondary_depth_range\": 0\n                                    },\n                                    \"then_run\": {\n                                      \"type\": \"minecraft:block\",\n                                      \"result_state\": {\n                                        \"Name\": \"minecraft:sandstone\"\n                                      }\n                                    }\n                                  },\n                                  {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:sand\"\n                                    }\n                                  }\n                                ]\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:biome\",\n                                \"biome_is\": [\n                                  \"minecraft:desert\"\n                                ]\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:sequence\",\n                                \"sequence\": [\n                                  {\n                                    \"type\": \"minecraft:condition\",\n                                    \"if_true\": {\n                                      \"type\": \"minecraft:stone_depth\",\n                                      \"offset\": 0,\n                                      \"surface_type\": \"ceiling\",\n                                      \"add_surface_depth\": false,\n                                      \"secondary_depth_range\": 0\n                                    },\n                                    \"then_run\": {\n                                      \"type\": \"minecraft:block\",\n                                      \"result_state\": {\n                                        \"Name\": \"minecraft:sandstone\"\n                                      }\n                                    }\n                                  },\n                                  {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:sand\"\n                                    }\n                                  }\n                                ]\n                              }\n                            },\n                            {\n                              \"type\": \"minecraft:condition\",\n                              \"if_true\": {\n                                \"type\": \"minecraft:biome\",\n                                \"biome_is\": [\n                                  \"minecraft:dripstone_caves\"\n                                ]\n                              },\n                              \"then_run\": {\n                                \"type\": \"minecraft:block\",\n                                \"result_state\": {\n                                  \"Name\": \"minecraft:stone\"\n                                }\n                              }\n                            }\n                          ]\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:windswept_savanna\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:condition\",\n                            \"if_true\": {\n                              \"type\": \"minecraft:noise_threshold\",\n                              \"noise\": \"minecraft:surface\",\n                              \"min_threshold\": 0.21212121212121213,\n                              \"max_threshold\": 1.7976931348623157e+308\n                            },\n                            \"then_run\": {\n                              \"type\": \"minecraft:block\",\n                              \"result_state\": {\n                                \"Name\": \"minecraft:stone\"\n                              }\n                            }\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:windswept_gravelly_hills\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:sequence\",\n                            \"sequence\": [\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": 0.24242424242424243,\n                                  \"max_threshold\": 1.7976931348623157e+308\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:sequence\",\n                                  \"sequence\": [\n                                    {\n                                      \"type\": \"minecraft:condition\",\n                                      \"if_true\": {\n                                        \"type\": \"minecraft:stone_depth\",\n                                        \"offset\": 0,\n                                        \"surface_type\": \"ceiling\",\n                                        \"add_surface_depth\": false,\n                                        \"secondary_depth_range\": 0\n                                      },\n                                      \"then_run\": {\n                                        \"type\": \"minecraft:block\",\n                                        \"result_state\": {\n                                          \"Name\": \"minecraft:stone\"\n                                        }\n                                      }\n                                    },\n                                    {\n                                      \"type\": \"minecraft:block\",\n                                      \"result_state\": {\n                                        \"Name\": \"minecraft:gravel\"\n                                      }\n                                    }\n                                  ]\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": 0.12121212121212122,\n                                  \"max_threshold\": 1.7976931348623157e+308\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:stone\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:condition\",\n                                \"if_true\": {\n                                  \"type\": \"minecraft:noise_threshold\",\n                                  \"noise\": \"minecraft:surface\",\n                                  \"min_threshold\": -0.12121212121212122,\n                                  \"max_threshold\": 1.7976931348623157e+308\n                                },\n                                \"then_run\": {\n                                  \"type\": \"minecraft:block\",\n                                  \"result_state\": {\n                                    \"Name\": \"minecraft:dirt\"\n                                  }\n                                }\n                              },\n                              {\n                                \"type\": \"minecraft:sequence\",\n                                \"sequence\": [\n                                  {\n                                    \"type\": \"minecraft:condition\",\n                                    \"if_true\": {\n                                      \"type\": \"minecraft:stone_depth\",\n                                      \"offset\": 0,\n                                      \"surface_type\": \"ceiling\",\n                                      \"add_surface_depth\": false,\n                                      \"secondary_depth_range\": 0\n                                    },\n                                    \"then_run\": {\n                                      \"type\": \"minecraft:block\",\n                                      \"result_state\": {\n                                        \"Name\": \"minecraft:stone\"\n                                      }\n                                    }\n                                  },\n                                  {\n                                    \"type\": \"minecraft:block\",\n                                    \"result_state\": {\n                                      \"Name\": \"minecraft:gravel\"\n                                    }\n                                  }\n                                ]\n                              }\n                            ]\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:mangrove_swamp\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:block\",\n                            \"result_state\": {\n                              \"Name\": \"minecraft:mud\"\n                            }\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:biome\",\n                            \"biome_is\": [\n                              \"minecraft:frozen_river\",\n                              \"minecraft:ice_spikes\",\n                              \"minecraft:snowy_beach\",\n                              \"minecraft:snowy_plains\",\n                              \"minecraft:snowy_taiga\"\n                            ]\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:block\",\n                            \"result_state\": {\n                              \"Name\": \"minecraft:packed_ice\"\n                            }\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:block\",\n                          \"result_state\": {\n                            \"Name\": \"minecraft:dirt\"\n                          }\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"type\": \"minecraft:condition\",\n                    \"if_true\": {\n                      \"type\": \"minecraft:biome\",\n                      \"biome_is\": [\n                        \"minecraft:warm_ocean\",\n                        \"minecraft:beach\",\n                        \"minecraft:snowy_beach\"\n                      ]\n                    },\n                    \"then_run\": {\n                      \"type\": \"minecraft:condition\",\n                      \"if_true\": {\n                        \"type\": \"minecraft:stone_depth\",\n                        \"offset\": 0,\n                        \"surface_type\": \"floor\",\n                        \"add_surface_depth\": true,\n                        \"secondary_depth_range\": 6\n                      },\n                      \"then_run\": {\n                        \"type\": \"minecraft:block\",\n                        \"result_state\": {\n                          \"Name\": \"minecraft:sandstone\"\n                        }\n                      }\n                    }\n                  },\n                  {\n                    \"type\": \"minecraft:condition\",\n                    \"if_true\": {\n                      \"type\": \"minecraft:biome\",\n                      \"biome_is\": [\n                        \"minecraft:desert\"\n                      ]\n                    },\n                    \"then_run\": {\n                      \"type\": \"minecraft:condition\",\n                      \"if_true\": {\n                        \"type\": \"minecraft:stone_depth\",\n                        \"offset\": 0,\n                        \"surface_type\": \"floor\",\n                        \"add_surface_depth\": true,\n                        \"secondary_depth_range\": 30\n                      },\n                      \"then_run\": {\n                        \"type\": \"minecraft:block\",\n                        \"result_state\": {\n                          \"Name\": \"minecraft:sandstone\"\n                        }\n                      }\n                    }\n                  }\n                ]\n              }\n            },\n            {\n              \"type\": \"minecraft:condition\",\n              \"if_true\": {\n                \"type\": \"minecraft:stone_depth\",\n                \"offset\": 0,\n                \"surface_type\": \"floor\",\n                \"add_surface_depth\": false,\n                \"secondary_depth_range\": 0\n              },\n              \"then_run\": {\n                \"type\": \"minecraft:sequence\",\n                \"sequence\": [\n                  {\n                    \"type\": \"minecraft:condition\",\n                    \"if_true\": {\n                      \"type\": \"minecraft:biome\",\n                      \"biome_is\": [\n                        \"minecraft:frozen_peaks\",\n                        \"minecraft:jagged_peaks\"\n                      ]\n                    },\n                    \"then_run\": {\n                      \"type\": \"minecraft:block\",\n                      \"result_state\": {\n                        \"Name\": \"minecraft:stone\"\n                      }\n                    }\n                  },\n                  {\n                    \"type\": \"minecraft:condition\",\n                    \"if_true\": {\n                      \"type\": \"minecraft:biome\",\n                      \"biome_is\": [\n                        \"minecraft:warm_ocean\",\n                        \"minecraft:lukewarm_ocean\",\n                        \"minecraft:deep_lukewarm_ocean\"\n                      ]\n                    },\n                    \"then_run\": {\n                      \"type\": \"minecraft:sequence\",\n                      \"sequence\": [\n                        {\n                          \"type\": \"minecraft:condition\",\n                          \"if_true\": {\n                            \"type\": \"minecraft:stone_depth\",\n                            \"offset\": 0,\n                            \"surface_type\": \"ceiling\",\n                            \"add_surface_depth\": false,\n                            \"secondary_depth_range\": 0\n                          },\n                          \"then_run\": {\n                            \"type\": \"minecraft:block\",\n                            \"result_state\": {\n                              \"Name\": \"minecraft:sandstone\"\n                            }\n                          }\n                        },\n                        {\n                          \"type\": \"minecraft:block\",\n                          \"result_state\": {\n                            \"Name\": \"minecraft:sand\"\n                          }\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"type\": \"minecraft:sequence\",\n                    \"sequence\": [\n                      {\n                        \"type\": \"minecraft:condition\",\n                        \"if_true\": {\n                          \"type\": \"minecraft:stone_depth\",\n                          \"offset\": 0,\n                          \"surface_type\": \"ceiling\",\n                          \"add_surface_depth\": false,\n                          \"secondary_depth_range\": 0\n                        },\n                        \"then_run\": {\n                          \"type\": \"minecraft:block\",\n                          \"result_state\": {\n                            \"Name\": \"minecraft:stone\"\n                          }\n                        }\n                      },\n                      {\n                        \"type\": \"minecraft:block\",\n                        \"result_state\": {\n                          \"Name\": \"minecraft:gravel\"\n                        }\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      },\n      {\n        \"type\": \"minecraft:condition\",\n        \"if_true\": {\n          \"type\": \"minecraft:vertical_gradient\",\n          \"random_name\": \"minecraft:deepslate\",\n          \"true_at_and_below\": {\n            \"absolute\": 0\n          },\n          \"false_at_and_above\": {\n            \"absolute\": 8\n          }\n        },\n        \"then_run\": {\n          \"type\": \"minecraft:block\",\n          \"result_state\": {\n            \"Name\": \"minecraft:deepslate\",\n            \"Properties\": {\n              \"axis\": \"y\"\n            }\n          }\n        }\n      },\n      {\n        \"type\": \"minecraft:condition\",\n        \"if_true\": {\n          \"type\": \"minecraft:biome\",\n          \"biome_is\": [\n            \"minecraft:desert\"\n          ]\n        },\n        \"then_run\": {\n          \"type\": \"minecraft:block\",\n          \"result_state\": {\n            \"Name\": \"minecraft:sandstone\"\n          }\n        }\n      },\n      {\n        \"type\": \"minecraft:condition\",\n        \"if_true\": {\n          \"type\": \"minecraft:biome\",\n          \"biome_is\": [\n            \"minecraft:frozen_peaks\",\n            \"minecraft:frozen_river\",\n            \"minecraft:grove\",\n            \"minecraft:ice_spikes\",\n            \"minecraft:snowy_beach\",\n            \"minecraft:snowy_plains\",\n            \"minecraft:snowy_slopes\",\n            \"minecraft:snowy_taiga\"\n          ]\n        },\n        \"then_run\": {\n          \"type\": \"minecraft:block\",\n          \"result_state\": {\n            \"Name\": \"minecraft:snow_block\"\n          }\n        }\n      },\n      {\n        \"type\": \"minecraft:condition\",\n        \"if_true\": {\n          \"type\": \"minecraft:biome\",\n          \"biome_is\": [\n            \"minecraft:badlands\",\n            \"minecraft:eroded_badlands\",\n            \"minecraft:wooded_badlands\"\n          ]\n        },\n        \"then_run\": {\n          \"type\": \"minecraft:block\",\n          \"result_state\": {\n            \"Name\": \"minecraft:terracotta\"\n          }\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_cooler_caves/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.cooler_caves,A custom terrain expansion pack that makes biome specific caves\ntext.gm4.guidebook.cooler_caves.description,The world has modified block compositions.\\n\\nSome biomes have different blocks compared to normal worlds.\ntext.gm4.guidebook.cooler_caves.desert_and_snow,\"In the desert, sandstone and gravel generate instead of stone and gravel.\\n\\nIn snowy biomes, snow, ice, and white concrete powder can be found in caves.\"\ntext.gm4.guidebook.cooler_caves.badlands,\"Terracotta layers extend throughout the entire underground in badland biomes. Gravel cannot be found, but red sand patches takes their place.\"\n"
  },
  {
    "path": "gm4_cozy_campfires/README.md",
    "content": "# Cozy Campfires<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nCampfires now can heal... as well as harm.<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Lit campfires boost health of nearby players by 4 hearts\r\n- If a player leaves the range of a campfire, they keep they effect for 12 minutes\r\n"
  },
  {
    "path": "gm4_cozy_campfires/beet.yaml",
    "content": "id: gm4_cozy_campfires\nname: Cozy Campfires\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    website:\n      description: Allows Campfires to grant you up to 4 extra hearts that last for more than half of a Minecraft day. Perfect for those scary first nights in a Minecraft world.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: BKQjQlSY\n    video: https://www.youtube.com/watch?v=nvAbzAtDFhw\n    wiki: https://wiki.gm4.co/wiki/Cozy_Campfires\n    credits:\n      Creator:\n        - Bloo\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_cozy_campfires/data/gm4_cozy_campfires/advancement/place_campfire.json",
    "content": "{\n  \"criteria\": {\n    \"place_campfire\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": \"#minecraft:campfires\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_cozy_campfires:placement/place\"\n  }\n}\n"
  },
  {
    "path": "gm4_cozy_campfires/data/gm4_cozy_campfires/function/cozy_campfire.mcfunction",
    "content": "# @s = gm4_cozy_campfire marker\n# run from gm4_cozy_campfires:main\n\n# kill markers without campfire, and branch to players near lit cozy campfires\nexecute unless block ~ ~ ~ #minecraft:campfires run kill @s\nexecute if block ~ ~ ~ #minecraft:campfires[lit=true] as @a[distance=..3,gamemode=!spectator] at @s run function gm4_cozy_campfires:cozy_player\n"
  },
  {
    "path": "gm4_cozy_campfires/data/gm4_cozy_campfires/function/cozy_player.mcfunction",
    "content": "# @s = player near a campfire\n# run from gm4_cozy_campfires:cozy_campfire\n\n# apply effect\neffect give @s absorption 720 1 true\n\n# particle using RGB\nparticle minecraft:entity_effect{color:[1.0,0.773,0.208,0.15]} ~.3 ~.8 ~.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[1.0,0.773,0.208,0.15]} ~.3 ~.8 ~-.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[1.0,0.773,0.208,0.15]} ~-.3 ~.8 ~-.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[1.0,0.773,0.208,0.15]} ~-.3 ~.8 ~.3 0 0 0 1 1\n"
  },
  {
    "path": "gm4_cozy_campfires/data/gm4_cozy_campfires/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_count dummy\n\nexecute unless score cozy_campfires gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Cozy Campfires\"}\nexecute unless score cozy_campfires gm4_earliest_version < cozy_campfires gm4_modules run scoreboard players operation cozy_campfires gm4_earliest_version = cozy_campfires gm4_modules\nscoreboard players set cozy_campfires gm4_modules 1\n\nschedule function gm4_cozy_campfires:main 10t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_cozy_campfires/data/gm4_cozy_campfires/function/main.mcfunction",
    "content": "# run checks on campfires and apply effect to players\nexecute as @e[type=marker,tag=gm4_campfire] at @s run function gm4_cozy_campfires:cozy_campfire\n\nschedule function gm4_cozy_campfires:main 80t\n"
  },
  {
    "path": "gm4_cozy_campfires/data/gm4_cozy_campfires/function/placement/place.mcfunction",
    "content": "# @s = players that have placed any type of campfire\n# called by advancement gm4_cozy_campfires:place_campfire\n\n# revoke advancement\nadvancement revoke @s only gm4_cozy_campfires:place_campfire\n\n# start raycast to locate campfire\nscoreboard players set ray_step gm4_count 0\nscoreboard players set success gm4_count 0\nexecute anchored eyes positioned ^ ^ ^ run function gm4_cozy_campfires:placement/ray\n"
  },
  {
    "path": "gm4_cozy_campfires/data/gm4_cozy_campfires/function/placement/ray.mcfunction",
    "content": "# run from placement/place and placement/ray\n\nscoreboard players add ray_step gm4_count 1\nexecute store success score success gm4_count if block ~ ~ ~ #minecraft:campfires unless entity @e[type=marker,tag=gm4_campfire,dx=0] align xyz run summon marker ~0.5 ~0.5 ~0.5 {CustomName:\"gm4_campfire\",Tags:[\"gm4_campfire\"]}\nexecute if score ray_step gm4_count matches 0..500 if score success gm4_count matches 0 positioned ^ ^ ^0.01 run function gm4_cozy_campfires:placement/ray\n"
  },
  {
    "path": "gm4_cozy_campfires/data/gm4_cozy_campfires/guidebook/cozy_campfires.json",
    "content": "{\n  \"id\": \"cozy_campfires\",\n  \"name\": \"Cozy Campfires\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:campfire\"\n  },\n  \"criteria\": {\n    \"place_campfire\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": \"#minecraft:campfires\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"absorption\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"place_campfire\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.cozy_campfires.description\",\n            \"fallback\": \"Standing near a campfire temporarily gives four hearts of absorption.\\n\\nThese extra hearts last 12 minutes once one leaves the campfire area.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_cozy_campfires/data/gm4_cozy_campfires/test/regeneration.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~\n\ngive @s campfire\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1.5\ndummy @s use block ~1 ~ ~1\n\nawait entity @s[nbt={active_effects:[{id:\"minecraft:absorption\",amplifier:1b}]}]\n"
  },
  {
    "path": "gm4_cozy_campfires/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.cozy_campfires,Allows Campfires to grant you up to 4 extra hearts that last for more than half of a Minecraft day. Perfect for those scary first nights in a Minecraft world.\ntext.gm4.guidebook.cozy_campfires.description,Standing near a campfire temporarily gives four hearts of absorption.\\n\\nThese extra hearts last 12 minutes once one leaves the campfire area.\n"
  },
  {
    "path": "gm4_crossbow_cartridges/README.md",
    "content": "# Crossbow Cartridges<!--$headerTitle--><!--$pmc:delete-->\n\nShoot more than just arrows! Crossbow Cartridges allows your crossbow to fire a variety of projectiles; Shoot Pufferfish, Tripwires, Torches, and many more <!--$pmc:headerSize-->\n\n<img src=\"images/crossbow_cartridges.webp\" alt=\"Crossbow Cartridges Example\" width=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- Hold new projectiles in your offhand to shoot them from your crossbow\n- Shoot fish buckets, splash potions, tnt, fire charges, torches and string!\n- Adds two new crossbow advancements\n"
  },
  {
    "path": "gm4_crossbow_cartridges/beet.yaml",
    "content": "id: gm4_crossbow_cartridges\nname: Crossbow Cartridges\nversion: 1.9.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    website:\n      description: Shoot more than just arrows! Crossbow Cartridges allows your crossbow to fire a variety of projectiles; Shoot Pufferfish, Tripwires, Torches, and many more. Synergizes nicely with the Ziprails Module for easy Ziprail construction.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: E7M57BNU\n    smithed:\n      pack_id: gm4_crossbow_cartridges\n    video: https://www.youtube.com/watch?v=XJiGvX7l-pI\n    wiki: https://wiki.gm4.co/wiki/Crossbow_Cartridges\n    credits:\n      Creators:\n        - Denniss\n        - Nik3141\n      Icon Design:\n        - Sparks\n    model_data:\n      - item: tropical_fish_bucket\n        reference: gui/advancement/crossbow_cartridges_bucket\n        template: advancement\n      - item: tripwire_hook\n        reference: gui/advancement/crossbow_cartridges_string\n        template: advancement\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4/advancement/crossbow_cartridges_bucket.json",
    "content": "{\n    \"display\": {\n        \"icon\": {\n            \"id\": \"tropical_fish_bucket\",\n            \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_crossbow_cartridges:gui/advancement/crossbow_cartridges_bucket\"]}\n            }\n        },\n        \"title\": {\n            \"translate\": \"advancement.gm4.crossbow_cartridges_fish.title\",\n            \"fallback\": \"Sealife Slingshot\"\n        },\n        \"description\": {\n            \"translate\": \"advancement.gm4.crossbow_cartridges_fish.description\",\n            \"fallback\": \"Launch an aquatic animal using a crossbow\",\n            \"color\": \"gray\"\n        }\n    },\n    \"parent\": \"gm4:root\",\n    \"criteria\": {\n        \"exterior_trigger\": {\n            \"trigger\": \"minecraft:impossible\"\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4/advancement/crossbow_cartridges_string.json",
    "content": "{\n    \"display\": {\n        \"icon\": {\n            \"id\": \"minecraft:tripwire_hook\",\n            \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_crossbow_cartridges:gui/advancement/crossbow_cartridges_string\"]}\n            }\n        },\n        \"title\": {\n            \"translate\": \"advancement.gm4.crossbow_cartridges_string.title\",\n            \"fallback\": \"Almost a Grappling Hook\"\n        },\n        \"description\": {\n            \"translate\": \"advancement.gm4.crossbow_cartridges_string.description\",\n            \"fallback\": \"Create a 40-block long tripwire circuit using a crossbow\",\n            \"color\": \"gray\"\n        }\n    },\n    \"parent\": \"gm4:crossbow_cartridges_bucket\",\n    \"criteria\": {\n        \"shoot_fish\": {\n            \"trigger\": \"minecraft:impossible\"\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/advancement/shoot_crossbow.json",
    "content": "{\n  \"criteria\": {\n    \"crossbow_arrow\": {\n      \"trigger\": \"minecraft:shot_crossbow\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"equipment\": {\n                \"offhand\": {\n                  \"items\": \"#gm4_crossbow_cartridges:valid_items\"\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_crossbow_cartridges:shoot/any_arrow\"\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/cables/determine_direction.mcfunction",
    "content": "# Determine direction of tripwire\n# @s = player using the crossbow\n# at tripwire_hook, align xyz positioned ~0.5 ~ ~0.5\n# run from cables/shoot_arrow\n\n# check if player is facing roughly in one of the cardinal directions, unspool string if this is true\nexecute if entity @s[y_rotation=170..190] rotated 180 0 positioned ^ ^ ^1 if block ~ ~ ~ #gm4_crossbow_cartridges:string_replaceable run function gm4_crossbow_cartridges:cables/unspool_string\nexecute if entity @s[y_rotation=-100..-80] rotated -90 0 positioned ^ ^ ^1 if block ~ ~ ~ #gm4_crossbow_cartridges:string_replaceable run function gm4_crossbow_cartridges:cables/unspool_string\nexecute if entity @s[y_rotation=-10..10] rotated 0 0 positioned ^ ^ ^1 if block ~ ~ ~ #gm4_crossbow_cartridges:string_replaceable run function gm4_crossbow_cartridges:cables/unspool_string\nexecute if entity @s[y_rotation=80..100] rotated 90 0 positioned ^ ^ ^1 if block ~ ~ ~ #gm4_crossbow_cartridges:string_replaceable run function gm4_crossbow_cartridges:cables/unspool_string\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/cables/hook_success.mcfunction",
    "content": "# Place tripwire hook at end of tripwire\n# @s = player using the crossbow\n# at end of tripwire circuit in tripwire_hook, align xyz positioned ~0.5 ~ ~0.5\n# run from cables/unspool_string\n\n# take tripwire hook\nplaysound minecraft:block.stone.place block @a[distance=..15]\nclear @s[gamemode=!creative] minecraft:tripwire_hook 1\n\n# reset string count\nscoreboard players set @s gm4_cb_string 0\n\n# advancement for creating a 40 block long tripwire circuit\nexecute if score @s gm4_cb_tw_length matches 40 run advancement grant @s only gm4:crossbow_cartridges_string\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/cables/place_hook.mcfunction",
    "content": "# Place tripwire hook at end of tripwire\n# @s = player using the crossbow\n# at end of tripwire line, align xyz positioned ~0.5 ~ ~0.5\n# run from cables/unspool_string\n\n# check direction and place tripwire hook\nexecute if block ~1 ~ ~ minecraft:tripwire[east=true,attached=false] positioned ~-1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/west run setblock ~1 ~ ~ minecraft:tripwire_hook[facing=east] destroy\nexecute if block ~-1 ~ ~ minecraft:tripwire[west=true,attached=false] positioned ~1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/east run setblock ~-1 ~ ~ minecraft:tripwire_hook[facing=west] destroy\nexecute if block ~ ~ ~1 minecraft:tripwire[south=true,attached=false] positioned ~ ~ ~-1 if predicate gm4_crossbow_cartridges:check_block/north run setblock ~ ~ ~1 minecraft:tripwire_hook[facing=south] destroy\nexecute if block ~ ~ ~-1 minecraft:tripwire[north=true,attached=false] positioned ~ ~ ~1 if predicate gm4_crossbow_cartridges:check_block/south run setblock ~ ~ ~-1 minecraft:tripwire_hook[facing=north] destroy\n\nexecute if block ~ ~ ~ tripwire_hook run function gm4_crossbow_cartridges:cables/hook_success\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/cables/place_tripwire.mcfunction",
    "content": "# Place tripwire\n# @s = player using the crossbow\n# at end of tripwire line, align xyz positioned ~0.5 ~ ~0.5, up to 40 blocks in one of the cardinal directions\n# run from cables/unspool_string\n\n# place tripwire\nsetblock ~ ~ ~ minecraft:tripwire destroy\n\n# remove string from player\nitem modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item\nscoreboard players remove @s[gamemode=!creative] gm4_cb_string 1\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/cables/shoot_arrow.mcfunction",
    "content": "# Checks to shoot tripwire\n# @s = player using the crossbow\n# at arrow, align xyz positioned ~0.5 ~ ~0.5\n# run from check_projectile\n\ntag @s add gm4_cb_use\n\n# store amount of string on the player, with max value of 40\nexecute store result score @s gm4_cb_string run data get entity @s equipment.offhand.count\n\n# check for tripwire hook on the player\nexecute store success score @s gm4_cb_tw_hook run clear @s minecraft:tripwire_hook 0\n\n# reset score for string placed \nscoreboard players set @s gm4_cb_tw_length 0\n\n# check for tripwire hook in player hitbox\nexecute if block ~ ~ ~ minecraft:tripwire_hook run function gm4_crossbow_cartridges:cables/determine_direction\nexecute unless block ~ ~ ~ minecraft:tripwire_hook positioned ~ ~-1 ~ if block ~ ~ ~ minecraft:tripwire_hook run function gm4_crossbow_cartridges:cables/determine_direction\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/cables/unspool_string.mcfunction",
    "content": "# Place tripwire, move 1 block forward, repeat\n# @s = player using the crossbow\n# at end of tripwire line, align xyz positioned ~0.5 ~ ~0.5, up to 40 blocks in one of the cardinal directions\n# run from cables/determine_direction and cables/unspool_string\n\n# place tripwire\nexecute unless block ~ ~ ~ minecraft:tripwire run function gm4_crossbow_cartridges:cables/place_tripwire\nparticle minecraft:dust{color:[1,1,1],scale:1} ~ ~ ~ .1 .1 .1 1 5 normal\nscoreboard players add @s gm4_cb_tw_length 1\n\n# kill arrow\nexecute if score @s gm4_cb_tw_length matches 1 run kill @e[tag=gm4_cb_arrow,distance=..2,limit=1,sort=nearest]\n\n# place hook if possible\nexecute if score @s gm4_cb_tw_hook matches 1 unless block ^ ^ ^2 #gm4_crossbow_cartridges:string_replaceable positioned ^ ^ ^1 if block ~ ~ ~ #gm4_crossbow_cartridges:string_replaceable run function gm4_crossbow_cartridges:cables/place_hook\n\n# recursion\nexecute unless score @s gm4_cb_string matches 0 unless score @s gm4_cb_tw_length matches 40.. positioned ^ ^ ^1 if block ~ ~ ~ #gm4_crossbow_cartridges:string_replaceable run function gm4_crossbow_cartridges:cables/unspool_string\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/check_projectile.mcfunction",
    "content": "# Check item in offhand to shoot\n# @s = player using the crossbow\n# at arrow\n# run from shoot/any_arrow\n\n# tripwire\nexecute if entity @s[gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/string,x_rotation=-15..15] align xyz positioned ~0.5 ~ ~0.5 run function gm4_crossbow_cartridges:cables/shoot_arrow\n\n# bucket with fish/axolotl\nexecute if entity @s[tag=!gm4_cb_use,predicate=gm4_crossbow_cartridges:items/bucket] run function gm4_crossbow_cartridges:projectile/bucket\n\n# torch\nexecute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/torch] run function gm4_crossbow_cartridges:projectile/torch\nexecute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/redstone_torch] run function gm4_crossbow_cartridges:projectile/redstone_torch\nexecute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/soul_torch] run function gm4_crossbow_cartridges:projectile/soul_torch\nexecute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/copper_torch] run function gm4_crossbow_cartridges:projectile/copper_torch\n\n# potions\nexecute if entity @s[tag=!gm4_cb_use,predicate=gm4_crossbow_cartridges:items/potions] run function gm4_crossbow_cartridges:projectile/potions\n\n# fireball\nexecute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/fire_charge] run function gm4_crossbow_cartridges:projectile/fireball\n\n# wind charge\nexecute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/wind_charge] run function gm4_crossbow_cartridges:projectile/wind_charge\n\n# tnt\nexecute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/tnt] run function gm4_crossbow_cartridges:projectile/tnt\n\n# beehive\nexecute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/beehive] run function gm4_crossbow_cartridges:projectile/beehive\n\ntag @s remove gm4_cb_use\ndata remove storage gm4_crossbow_cartridges:temp projectile\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_cb_string dummy\nscoreboard objectives add gm4_cb_tw_hook dummy\nscoreboard objectives add gm4_cb_tw_length dummy\nscoreboard objectives add gm4_cb_misc dummy\n\nexecute unless score crossbow_cartridges gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Crossbow Cartridges\"}\nexecute unless score crossbow_cartridges gm4_earliest_version < crossbow_cartridges gm4_modules run scoreboard players operation crossbow_cartridges gm4_earliest_version = crossbow_cartridges gm4_modules\nscoreboard players set crossbow_cartridges gm4_modules 1\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/arrow_motion.mcfunction",
    "content": "# Copy motion, effects, and owner from arrow to projectile\n# @s = projectile shot from crossbow\n# at @s\n# run from functions in projectile/\n\n# copy data from arrow to projectile\ndata modify entity @s Motion set from entity @e[tag=gm4_cb_arrow,distance=..0.1,sort=nearest,limit=1] Motion\ndata modify entity @s {} merge from storage gm4_crossbow_cartridges:temp projectile\n\n# remove arrow\nkill @e[tag=gm4_cb_arrow,distance=..0.1,sort=nearest,limit=1]\n\n# remove tag\ntag @s remove gm4_cb_projectile\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/beehive.mcfunction",
    "content": "# Shoot beehive\n# @s = player using the crossbow\n# at arrow\n# run from check_projectile\n\ntag @s add gm4_cb_use\ndata modify storage gm4_crossbow_cartridges:temp bees set from entity @s equipment.offhand.components.\"minecraft:bees\"\nexecute unless data storage gm4_crossbow_cartridges:temp bees run return fail\ndata modify storage gm4_crossbow_cartridges:temp projectile set from storage gm4_crossbow_cartridges:temp bees[0].entity_data\ndata remove storage gm4_crossbow_cartridges:temp bees[0]\n\n# replace arrow with bee and copy data\nsummon minecraft:bee ~ ~ ~ {Tags:[\"gm4_cb_projectile\"]}\nexecute as @e[type=minecraft:bee,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# remove bee from beehive\nexecute if entity @s[gamemode=!creative] run function gm4_crossbow_cartridges:projectile/set_bees with storage gm4_crossbow_cartridges:temp\ndata remove storage gm4_crossbow_cartridges:temp bees\n\n# bee sting sound\nplaysound minecraft:entity.bee.hurt player @a[distance=..15] ^ ^ ^1 .5\n\n# repeat for multishot\nexecute if entity @e[tag=gm4_cb_arrow,limit=1,distance=..1] if predicate gm4_crossbow_cartridges:items/beehive run function gm4_crossbow_cartridges:projectile/beehive\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/axolotl.mcfunction",
    "content": "# Summon axolotl\n# @s = player using the crossbow\n# at arrow\n# run from projectile/bucket\n\n# replace arrow with axolotl and copy data\nsummon minecraft:axolotl ~ ~ ~ {FromBucket:1b,Tags:[\"gm4_cb_projectile\"],active_effects:[{id:'minecraft:regeneration',amplifier:10,duration:200,show_particles:0b}]}\n\n# TODO 1.20.5: changed to copy all bucket entity data, check if this causes problems\ndata modify storage gm4_crossbow_cartridges:temp projectile merge from entity @s equipment.offhand.components.\"minecraft:bucket_entity_data\"\nexecute as @e[type=minecraft:axolotl,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# axolotl sound\nplaysound minecraft:entity.axolotl.idle_air player @a[distance=..15] ^ ^ ^1 2 .5\n\n# shoot 2 more if using multishot\nexecute at @e[tag=gm4_cb_arrow,distance=..1,limit=2] run function gm4_crossbow_cartridges:projectile/bucket/multishot/axolotl\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/cod.mcfunction",
    "content": "# Summon cod\n# @s = player using the crossbow\n# at arrow\n# run from projectile/bucket\n\n# replace arrow with cod and copy data\nsummon minecraft:cod ~ ~ ~ {FromBucket:1b,Tags:[\"gm4_cb_projectile\"],active_effects:[{id:'minecraft:regeneration',amplifier:10,duration:200,show_particles:0b}]}\n\ndata modify storage gm4_crossbow_cartridges:temp projectile merge from entity @s equipment.offhand.components.\"minecraft:bucket_entity_data\"\nexecute as @e[type=minecraft:cod,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# fish flop sound\nplaysound minecraft:entity.cod.flop player @a[distance=..15] ^ ^ ^1 2 .5\n\n# shoot 2 more if using multishot\nexecute at @e[tag=gm4_cb_arrow,distance=..1,limit=2] run function gm4_crossbow_cartridges:projectile/bucket/multishot/cod\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/multishot/axolotl.mcfunction",
    "content": "# Summon axolotl\n# @s = player using the crossbow\n# at @s\n# run from projectile/bucket\n\n# replace arrow with axolotl and copy data\nsummon minecraft:axolotl ~ ~ ~ {FromBucket:1b,Tags:[\"gm4_cb_projectile\"],active_effects:[{id:'minecraft:instant_damage',amplifier:10,duration:1}],Silent:1b,DeathLootTable:\"gm4:empty\"}\n\nexecute as @e[type=minecraft:axolotl,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# axolotl sound\nplaysound minecraft:entity.axolotl.idle_air player @a[distance=..15] ^ ^ ^1 2 .5\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/multishot/cod.mcfunction",
    "content": "# Summon cod\n# @s = player using the crossbow\n# at @s\n# run from projectile/bucket\n\n# replace arrow with cod and copy data\nsummon minecraft:cod ~ ~ ~ {FromBucket:1b,Tags:[\"gm4_cb_projectile\"],active_effects:[{id:'minecraft:instant_damage',amplifier:10,duration:1}],Silent:1b,DeathLootTable:\"gm4:empty\"}\n\nexecute as @e[type=minecraft:cod,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# fish flop sound\nplaysound minecraft:entity.cod.flop player @a[distance=..15] ^ ^ ^1 2 .5\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/multishot/pufferfish.mcfunction",
    "content": "# Summon pufferfish\n# @s = player using the crossbow\n# at @s\n# run from projectile/bucket\n\n# replace arrow with pufferfish and copy data\nsummon minecraft:pufferfish ~ ~ ~ {FromBucket:1b,Tags:[\"gm4_cb_projectile\"],active_effects:[{id:'minecraft:instant_damage',amplifier:10,duration:1}],Silent:1b,DeathLootTable:\"gm4:empty\"}\n\nexecute as @e[type=minecraft:pufferfish,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# fish flop sound\nplaysound minecraft:entity.puffer_fish.flop player @a[distance=..15] ^ ^ ^1 2 .5\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/multishot/salmon.mcfunction",
    "content": "# Summon salmon\n# @s = player using the crossbow\n# at @s\n# run from projectile/bucket\n\n# replace arrow with salmon and copy data\nsummon minecraft:salmon ~ ~ ~ {FromBucket:1b,Tags:[\"gm4_cb_projectile\"],active_effects:[{id:'minecraft:instant_damage',amplifier:10,duration:1}],Silent:1b,DeathLootTable:\"gm4:empty\"}\n\nexecute as @e[type=minecraft:salmon,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# fish flop sound\nplaysound minecraft:entity.salmon.flop player @a[distance=..15] ^ ^ ^1 2 .5\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/multishot/tadpole.mcfunction",
    "content": "# Summon tadpole\n# @s = player using the crossbow\n# at @s\n# run from projectile/bucket\n\n# replace arrow with tadpole and copy data\nsummon minecraft:tadpole ~ ~ ~ {FromBucket:1b,Tags:[\"gm4_cb_projectile\"],active_effects:[{id:'minecraft:instant_damage',amplifier:10,duration:1}],Silent:1b,DeathLootTable:\"gm4:empty\"}\n\nexecute as @e[type=minecraft:tadpole,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# fish flop sound\nplaysound minecraft:entity.tadpole.flop player @a[distance=..15] ^ ^ ^1 2 .5\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/multishot/tropical.mcfunction",
    "content": "# Summon tropical fish\n# @s = player using the crossbow\n# at @s\n# run from projectile/bucket\n\n# replace arrow with tropical fish and copy data\nsummon minecraft:tropical_fish ~ ~ ~ {FromBucket:1b,Tags:[\"gm4_cb_projectile\"],active_effects:[{id:'minecraft:instant_damage',amplifier:10,duration:1}],Silent:1b,DeathLootTable:\"gm4:empty\"}\n\nexecute as @e[type=minecraft:tropical_fish,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# fish flop sound\nplaysound minecraft:entity.tropical_fish.flop player @a[distance=..15] ^ ^ ^1 2 .5\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/pufferfish.mcfunction",
    "content": "# Summon pufferfish\n# @s = player using the crossbow\n# at arrow\n# run from projectile/bucket\n\n# replace arrow with pufferfish and copy data\nsummon minecraft:pufferfish ~ ~ ~ {FromBucket:1b,Tags:[\"gm4_cb_projectile\"],active_effects:[{id:'minecraft:regeneration',amplifier:10,duration:200,show_particles:0b}]}\n\ndata modify storage gm4_crossbow_cartridges:temp projectile merge from entity @s equipment.offhand.components.\"minecraft:bucket_entity_data\"\nexecute as @e[type=minecraft:pufferfish,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# fish flop sound\nplaysound minecraft:entity.puffer_fish.flop player @a[distance=..15] ^ ^ ^1 2 .5\n\n# shoot 2 more if using multishot\nexecute at @e[tag=gm4_cb_arrow,distance=..1,limit=2] run function gm4_crossbow_cartridges:projectile/bucket/multishot/pufferfish\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/salmon.mcfunction",
    "content": "# Summon salmon\n# @s = player using the crossbow\n# at arrow\n# run from projectile/bucket\n\n# replace arrow with salmon and copy data\nsummon minecraft:salmon ~ ~ ~ {FromBucket:1b,Tags:[\"gm4_cb_projectile\"],active_effects:[{id:'minecraft:regeneration',amplifier:10,duration:200,show_particles:0b}]}\n\ndata modify storage gm4_crossbow_cartridges:temp projectile merge from entity @s equipment.offhand.components.\"minecraft:bucket_entity_data\"\ndata modify storage gm4_crossbow_cartridges:temp projectile.type set from entity @s equipment.offhand.components.\"minecraft:salmon/size\"\nexecute as @e[type=minecraft:salmon,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# fish flop sound\nplaysound minecraft:entity.salmon.flop player @a[distance=..15] ^ ^ ^1 2 .5\n\n# shoot 2 more if using multishot\nexecute at @e[tag=gm4_cb_arrow,distance=..1,limit=2] run function gm4_crossbow_cartridges:projectile/bucket/multishot/salmon\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/tadpole.mcfunction",
    "content": "# Summon tadpole\n# @s = player using the crossbow\n# at arrow\n# run from projectile/bucket\n\n# replace arrow with tadpole and copy data\nsummon minecraft:tadpole ~ ~ ~ {FromBucket:1b,Tags:[\"gm4_cb_projectile\"],active_effects:[{id:'minecraft:regeneration',amplifier:10,duration:200,show_particles:0b}]}\n\ndata modify storage gm4_crossbow_cartridges:temp projectile merge from entity @s equipment.offhand.components.\"minecraft:bucket_entity_data\"\nexecute as @e[type=minecraft:tadpole,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# fish flop sound\nplaysound minecraft:entity.tadpole.flop player @a[distance=..15] ^ ^ ^1 2 .5\n\n# shoot 2 more if using multishot\nexecute at @e[tag=gm4_cb_arrow,distance=..1,limit=2] run function gm4_crossbow_cartridges:projectile/bucket/multishot/tadpole\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/tropical.mcfunction",
    "content": "# Summon tropical fish\n# @s = player using the crossbow\n# at arrow\n# run from projectile/bucket\n\n# replace arrow with tropical fish and copy data\nsummon minecraft:tropical_fish ~ ~ ~ {FromBucket:1b,Tags:[\"gm4_cb_projectile\"],active_effects:[{id:'minecraft:regeneration',amplifier:10,duration:200,show_particles:0b}]}\n\ndata modify storage gm4_crossbow_cartridges:temp projectile merge from entity @s equipment.offhand.components.\"minecraft:bucket_entity_data\"\nexecute as @e[type=minecraft:tropical_fish,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# fish flop sound\nplaysound minecraft:entity.tropical_fish.flop player @a[distance=..15] ^ ^ ^1 2 .5\n\n# shoot 2 more if using multishot\nexecute at @e[tag=gm4_cb_arrow,distance=..1,limit=2] run function gm4_crossbow_cartridges:projectile/bucket/multishot/tropical\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket.mcfunction",
    "content": "# Check fish/axolotl and shoot\n# @s = player using the crossbow\n# at arrow\n# run from check_projectile\n\ntag @s add gm4_cb_use\n\nexecute if predicate gm4_crossbow_cartridges:items/cod run function gm4_crossbow_cartridges:projectile/bucket/cod\nexecute if predicate gm4_crossbow_cartridges:items/salmon run function gm4_crossbow_cartridges:projectile/bucket/salmon\nexecute if predicate gm4_crossbow_cartridges:items/pufferfish run function gm4_crossbow_cartridges:projectile/bucket/pufferfish\nexecute if predicate gm4_crossbow_cartridges:items/tropical run function gm4_crossbow_cartridges:projectile/bucket/tropical\nexecute if predicate gm4_crossbow_cartridges:items/axolotl run function gm4_crossbow_cartridges:projectile/bucket/axolotl\nexecute if predicate gm4_crossbow_cartridges:items/tadpole run function gm4_crossbow_cartridges:projectile/bucket/tadpole\n\n# replace filled bucket in player's offhand with water bucket\nitem replace entity @s[gamemode=!creative] weapon.offhand with minecraft:water_bucket\n\n# give advancement for launching mob in a bucket\nadvancement grant @s only gm4:crossbow_cartridges_bucket\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/copper_torch/check.mcfunction",
    "content": "# Check blocks, to place or drop copper torch\n# @s = arrow with tag gm4_cb_ctorch, in a block\n# at @s\n# run from projectile/copper_torch/loop\n\n# place torch if possible\nexecute if block ~ ~ ~ #gm4:replaceable run function gm4_crossbow_cartridges:projectile/copper_torch/place\n\n# summon torch item if placing torch failed\nexecute unless score $torch_placed gm4_cb_misc matches 1 run loot spawn ~ ~ ~ loot minecraft:blocks/copper_torch\nexecute unless score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:entity.item.pickup block @a[distance=..15]\n\n# clean up\nscoreboard players reset $torch_placed gm4_cb_misc\nkill @s\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/copper_torch/loop.mcfunction",
    "content": "# Check arrow with tag gm4_cb_ctorch\n# run from projectile/copper_torch\n# scheduled by projectile/copper_torch/loop\n\nexecute as @e[tag=gm4_cb_ctorch,nbt={inGround:1b}] at @s run function gm4_crossbow_cartridges:projectile/copper_torch/check\nexecute if entity @e[tag=gm4_cb_ctorch,limit=1] run schedule function gm4_crossbow_cartridges:projectile/copper_torch/loop 4t\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/copper_torch/place.mcfunction",
    "content": "# Place copper torch on a valid adjacent block\n# @s = arrow with tag gm4_cb_ctorch, in a block\n# at @s\n# run from projectile/copper_torch/check\n\nexecute positioned ~.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/east run setblock ~-.15 ~ ~ minecraft:copper_wall_torch[facing=west]\nexecute positioned ~ ~ ~.1 if predicate gm4_crossbow_cartridges:check_block/south run setblock ~ ~ ~-.15 minecraft:copper_wall_torch[facing=north]\nexecute positioned ~-.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/west run setblock ~.15 ~ ~ minecraft:copper_wall_torch[facing=east]\nexecute positioned ~ ~ ~-.1 if predicate gm4_crossbow_cartridges:check_block/north run setblock ~ ~ ~.15 minecraft:copper_wall_torch[facing=south]\nexecute positioned ~ ~-.1 ~ if predicate gm4_crossbow_cartridges:check_block/below run setblock ~ ~.15 ~ minecraft:copper_torch\n\n# place block sound\nexecute if block ~ ~ ~ #gm4_crossbow_cartridges:torch run scoreboard players set $torch_placed gm4_cb_misc 1\nexecute if score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:block.wood.place block @a[distance=..15]\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/copper_torch.mcfunction",
    "content": "# Shoot copper torch\n# @s = player using the crossbow\n# at arrow\n# run from check_projectile and projectile/copper_torch\n\ntag @s add gm4_cb_use\n\n# add tag to arrow\ntag @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] add gm4_cb_ctorch\n\n# add fire to arrow\ndata merge entity @e[tag=gm4_cb_arrow,tag=gm4_cb_ctorch,distance=..1,sort=nearest,limit=1] {Fire:2000s}\ntag @e[tag=gm4_cb_arrow,tag=gm4_cb_ctorch,distance=..1,sort=nearest,limit=1] remove gm4_cb_arrow\n\n# clear copper torch from player\nitem modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item\n\n# repeat\nexecute if entity @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] if entity @s[predicate=gm4_crossbow_cartridges:items/copper_torch] run function gm4_crossbow_cartridges:projectile/copper_torch\n\n# start loop to check if arrow is in ground\nschedule function gm4_crossbow_cartridges:projectile/copper_torch/loop 4t\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/fireball.mcfunction",
    "content": "# Shoot fire charge\n# @s = player using the crossbow\n# at arrow\n# run from check_projectile\n\ntag @s add gm4_cb_use\ndata modify storage gm4_crossbow_cartridges:temp projectile.UUID set from entity @s UUID\n\n# replace arrow with small_fireball and copy data\nsummon minecraft:small_fireball ~ ~ ~ {Tags:[\"gm4_cb_projectile\",\"gm4_cb_fireball\"]}\nexecute as @e[type=minecraft:small_fireball,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# remove fire charge from player\nitem modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item\n\n# fire charge sound\nplaysound minecraft:item.firecharge.use player @a[distance=..15] ^ ^ ^1\n\n# repeat for multishot\nexecute if entity @e[tag=gm4_cb_arrow,limit=1,distance=..1] if predicate gm4_crossbow_cartridges:items/fire_charge run function gm4_crossbow_cartridges:projectile/fireball\n\n# remove floating fireballs\nschedule function gm4_crossbow_cartridges:projectile/fireball_kill 5s\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/fireball_kill.mcfunction",
    "content": "# Remove floating fireballs\n# scheduled from projectile/fireball\n\nkill @e[type=minecraft:small_fireball,tag=gm4_cb_fireball]\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/potions.mcfunction",
    "content": "# Shoot splash/lingering potion\n# @s = player using the crossbow\n# at arrow\n# run from check_projectile\n\ntag @s add gm4_cb_use\ndata modify storage gm4_crossbow_cartridges:temp projectile.Item.components set from entity @s equipment.offhand.components\ndata modify storage gm4_crossbow_cartridges:temp projectile.Owner set from entity @s UUID\n\n# replace arrow with splash/lingering potion and copy data\nexecute if predicate gm4_crossbow_cartridges:items/splash_potion run summon minecraft:splash_potion ~ ~ ~ {Tags:[\"gm4_cb_projectile\"],Item:{id:\"minecraft:splash_potion\",count:1,components:{\"minecraft:potion_contents\":\"minecraft:water\"}}}\nexecute if predicate gm4_crossbow_cartridges:items/lingering_potion run summon minecraft:lingering_potion ~ ~ ~ {Tags:[\"gm4_cb_projectile\"],Item:{id:\"minecraft:lingering_potion\",count:1,components:{\"minecraft:potion_contents\":\"minecraft:water\"}}}\nexecute as @e[tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# remove potion from player's offhand\nitem modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item\n\n# potion throw sound\nplaysound minecraft:entity.splash_potion.throw player @a[distance=..15] ^ ^ ^1 .5 0\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/redstone_torch/check.mcfunction",
    "content": "# Check blocks, to place or drop redstone torch\n# @s = arrow with tag gm4_cb_rtorch, in a block\n# at @s\n# run from projectile/redstone_torch/loop\n\n# place torch if possible\nexecute if block ~ ~ ~ #gm4:replaceable run function gm4_crossbow_cartridges:projectile/redstone_torch/place\n\n# summon torch item if placing torch failed\nexecute unless score $torch_placed gm4_cb_misc matches 1 run loot spawn ~ ~ ~ loot minecraft:blocks/redstone_torch\nexecute unless score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:entity.item.pickup block @a[distance=..15]\n\n# clean up\nscoreboard players reset $torch_placed gm4_cb_misc\nkill @s\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/redstone_torch/loop.mcfunction",
    "content": "# Check arrow with tag gm4_cb_rtorch\n# run from projectile/redstone_torch\n# scheduled by projectile/redstone_torch/loop\n\nexecute as @e[tag=gm4_cb_rtorch,nbt={inGround:1b}] at @s run function gm4_crossbow_cartridges:projectile/redstone_torch/check\nexecute if entity @e[tag=gm4_cb_rtorch,limit=1] run schedule function gm4_crossbow_cartridges:projectile/redstone_torch/loop 4t\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/redstone_torch/place.mcfunction",
    "content": "# Place redstone torch on a valid adjacent block\n# @s = arrow with tag gm4_cb_rtorch, in a block\n# at @s\n# run from projectile/redstone_torch/check\n\nexecute positioned ~.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/east run setblock ~-.15 ~ ~ minecraft:redstone_wall_torch[facing=west]\nexecute positioned ~ ~ ~.1 if predicate gm4_crossbow_cartridges:check_block/south run setblock ~ ~ ~-.15 minecraft:redstone_wall_torch[facing=north]\nexecute positioned ~-.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/west run setblock ~.15 ~ ~ minecraft:redstone_wall_torch[facing=east]\nexecute positioned ~ ~ ~-.1 if predicate gm4_crossbow_cartridges:check_block/north run setblock ~ ~ ~.15 minecraft:redstone_wall_torch[facing=south]\nexecute positioned ~ ~-.1 ~ if predicate gm4_crossbow_cartridges:check_block/below run setblock ~ ~.15 ~ minecraft:redstone_torch\n\n# place block sound\nexecute if block ~ ~ ~ #gm4_crossbow_cartridges:torch run scoreboard players set $torch_placed gm4_cb_misc 1\nexecute if score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:block.wood.place block @a[distance=..15]\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/redstone_torch.mcfunction",
    "content": "# Shoot redstone torch\n# @s = player using the crossbow\n# at arrow\n# run from check_projectile and projectile/redstone_torch\n\ntag @s add gm4_cb_use\n\n# add tag to arrow\ntag @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] add gm4_cb_rtorch\n\n# add fire to arrow\ndata merge entity @e[tag=gm4_cb_arrow,tag=gm4_cb_rtorch,distance=..1,sort=nearest,limit=1] {Fire:2000s}\ntag @e[tag=gm4_cb_arrow,tag=gm4_cb_rtorch,distance=..1,sort=nearest,limit=1] remove gm4_cb_arrow\n\n# clear redstone torch from player\nitem modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item\n\n# repeat\nexecute if entity @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] if entity @s[predicate=gm4_crossbow_cartridges:items/redstone_torch] run function gm4_crossbow_cartridges:projectile/redstone_torch\n\n# start loop to check if arrow is in ground\nschedule function gm4_crossbow_cartridges:projectile/redstone_torch/loop 4t\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/set_bees.mcfunction",
    "content": "\n$item modify entity @s weapon.offhand {function:\"minecraft:set_components\",components:{\"minecraft:bees\":$(bees)}}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/soul_torch/check.mcfunction",
    "content": "# Check blocks, to place or drop soul torch\n# @s = arrow with tag gm4_cb_storch, in a block\n# at @s\n# run from projectile/soul_torch/loop\n\n# place torch if possible\nexecute if block ~ ~ ~ #gm4:replaceable run function gm4_crossbow_cartridges:projectile/soul_torch/place\n\n# summon torch item if placing torch failed\nexecute unless score $torch_placed gm4_cb_misc matches 1 run loot spawn ~ ~ ~ loot minecraft:blocks/soul_torch\nexecute unless score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:entity.item.pickup block @a[distance=..15]\n\n# clean up\nscoreboard players reset $torch_placed gm4_cb_misc\nkill @s\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/soul_torch/loop.mcfunction",
    "content": "# Check arrow with tag gm4_cb_storch\n# run from projectile/soul_torch\n# scheduled by projectile/soul_torch/loop\n\nexecute as @e[tag=gm4_cb_storch,nbt={inGround:1b}] at @s run function gm4_crossbow_cartridges:projectile/soul_torch/check\nexecute if entity @e[tag=gm4_cb_storch,limit=1] run schedule function gm4_crossbow_cartridges:projectile/soul_torch/loop 4t\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/soul_torch/place.mcfunction",
    "content": "# Place soul torch on a valid adjacent block\n# @s = arrow with tag gm4_cb_storch, in a block\n# at @s\n# run from projectile/soul_torch/check\n\nexecute positioned ~.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/east run setblock ~-.15 ~ ~ minecraft:soul_wall_torch[facing=west]\nexecute positioned ~ ~ ~.1 if predicate gm4_crossbow_cartridges:check_block/south run setblock ~ ~ ~-.15 minecraft:soul_wall_torch[facing=north]\nexecute positioned ~-.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/west run setblock ~.15 ~ ~ minecraft:soul_wall_torch[facing=east]\nexecute positioned ~ ~ ~-.1 if predicate gm4_crossbow_cartridges:check_block/north run setblock ~ ~ ~.15 minecraft:soul_wall_torch[facing=south]\nexecute positioned ~ ~-.1 ~ if predicate gm4_crossbow_cartridges:check_block/below run setblock ~ ~.15 ~ minecraft:soul_torch\n\n# place block sound\nexecute if block ~ ~ ~ #gm4_crossbow_cartridges:torch run scoreboard players set $torch_placed gm4_cb_misc 1\nexecute if score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:block.wood.place block @a[distance=..15]\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/soul_torch.mcfunction",
    "content": "# Shoot soul torch\n# @s = player using the crossbow\n# at arrow\n# run from check_projectile and projectile/soul_torch\n\ntag @s add gm4_cb_use\n\n# add tag to arrow\ntag @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] add gm4_cb_storch\n\n# add fire to arrow\ndata merge entity @e[tag=gm4_cb_arrow,tag=gm4_cb_storch,distance=..1,sort=nearest,limit=1] {Fire:2000s}\ntag @e[tag=gm4_cb_arrow,tag=gm4_cb_storch,distance=..1,sort=nearest,limit=1] remove gm4_cb_arrow\n\n# clear soul torch from player\nitem modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item\n\n# repeat\nexecute if entity @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] if entity @s[predicate=gm4_crossbow_cartridges:items/soul_torch] run function gm4_crossbow_cartridges:projectile/soul_torch\n\n# start loop to check if arrow is in ground\nschedule function gm4_crossbow_cartridges:projectile/soul_torch/loop 4t\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/tnt.mcfunction",
    "content": "# Shoot tnt\n# @s = player using the crossbow\n# at arrow\n# run from check_projectile\n\ntag @s add gm4_cb_use\n\n# replace arrow with tnt and copy data\nsummon minecraft:tnt ~ ~ ~ {Tags:[\"gm4_cb_projectile\"],fuse:80s}\nexecute as @e[type=minecraft:tnt,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# remove tnt from player\nitem modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item\n\n# primed tnt sound\nplaysound minecraft:entity.tnt.primed block @a[distance=..15] ^ ^ ^1\n\n# repeat for multishot\nexecute if entity @e[tag=gm4_cb_arrow,limit=1,distance=..1] if predicate gm4_crossbow_cartridges:items/tnt run function gm4_crossbow_cartridges:projectile/tnt\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/torch/check.mcfunction",
    "content": "# Check blocks, to place or drop torch\n# @s = arrow with tag gm4_cb_torch, in a block\n# at @s\n# run from projectile/torch/loop\n\n# place torch if possible\nexecute if block ~ ~ ~ #gm4:replaceable run function gm4_crossbow_cartridges:projectile/torch/place\n\n# summon torch item if placing torch failed\nexecute unless score $torch_placed gm4_cb_misc matches 1 run loot spawn ~ ~ ~ loot minecraft:blocks/torch\nexecute unless score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:entity.item.pickup block @a[distance=..15]\n\n# clean up\nscoreboard players reset $torch_placed gm4_cb_misc\nkill @s\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/torch/loop.mcfunction",
    "content": "# Check arrow with tag gm4_cb_torch\n# run from projectile/torch\n# scheduled by projectile/torch/loop\n\nexecute as @e[tag=gm4_cb_torch,nbt={inGround:1b}] at @s run function gm4_crossbow_cartridges:projectile/torch/check\nexecute if entity @e[tag=gm4_cb_torch,limit=1] run schedule function gm4_crossbow_cartridges:projectile/torch/loop 4t\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/torch/place.mcfunction",
    "content": "# Place torch on a valid adjacent block\n# @s = arrow with tag gm4_cb_torch, in a block\n# at @s\n# run from projectile/torch/check\n\nexecute positioned ~.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/east run setblock ~-.15 ~ ~ minecraft:wall_torch[facing=west]\nexecute positioned ~ ~ ~.1 if predicate gm4_crossbow_cartridges:check_block/south run setblock ~ ~ ~-.15 minecraft:wall_torch[facing=north]\nexecute positioned ~-.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/west run setblock ~.15 ~ ~ minecraft:wall_torch[facing=east]\nexecute positioned ~ ~ ~-.1 if predicate gm4_crossbow_cartridges:check_block/north run setblock ~ ~ ~.15 minecraft:wall_torch[facing=south]\nexecute positioned ~ ~-.1 ~ if predicate gm4_crossbow_cartridges:check_block/below run setblock ~ ~.15 ~ minecraft:torch\n\n# place block sound\nexecute if block ~ ~ ~ #gm4_crossbow_cartridges:torch run scoreboard players set $torch_placed gm4_cb_misc 1\nexecute if score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:block.wood.place block @a[distance=..15]\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/torch.mcfunction",
    "content": "# Shoot torch\n# @s = player using the crossbow\n# at arrow\n# run from check_projectile and projectile/torch\n\ntag @s add gm4_cb_use\n\n# add tag to arrow\ntag @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] add gm4_cb_torch\n\n# add fire to arrow\ndata merge entity @e[tag=gm4_cb_arrow,tag=gm4_cb_torch,distance=..1,sort=nearest,limit=1] {Fire:2000s}\ntag @e[tag=gm4_cb_arrow,tag=gm4_cb_torch,distance=..1,sort=nearest,limit=1] remove gm4_cb_arrow\n\n# clear torch from player\nitem modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item\n\n# repeat\nexecute if entity @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] if entity @s[predicate=gm4_crossbow_cartridges:items/torch] run function gm4_crossbow_cartridges:projectile/torch\n\n# start loop to check if arrow is in ground\nschedule function gm4_crossbow_cartridges:projectile/torch/loop 4t\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/wind_charge.mcfunction",
    "content": "# Shoot wind charge\n# @s = player using the crossbow\n# at arrow\n# run from check_projectile\n\ntag @s add gm4_cb_use\ndata modify storage gm4_crossbow_cartridges:temp projectile.UUID set from entity @s UUID\n\n# replace arrow with wind_charge and copy data\nsummon minecraft:wind_charge ~ ~ ~ {Tags:[\"gm4_cb_projectile\",\"gm4_cb_wind_charge\"]}\nexecute as @e[type=minecraft:wind_charge,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion\n\n# remove wind charge from player\nitem modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item\n\n# wind charge sound\nplaysound minecraft:entity.wind_charge.throw player @a[distance=..15] ^ ^ ^1\n\n# repeat for multishot\nexecute if entity @e[tag=gm4_cb_arrow,limit=1,distance=..1] if predicate gm4_crossbow_cartridges:items/wind_charge run function gm4_crossbow_cartridges:projectile/wind_charge\n\n# remove floating wind charges\nschedule function gm4_crossbow_cartridges:projectile/wind_charge_kill 5s\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/wind_charge_kill.mcfunction",
    "content": "# Remove floating wind charges\n# scheduled from projectile/wind_charge\n\nkill @e[type=minecraft:wind_charge,tag=gm4_cb_wind_charge]\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/shoot/any_arrow.mcfunction",
    "content": "# @s = player using the crossbow with a normal arrow\n# at @s\n# run from advancement shoot_crossbow\n\nadvancement revoke @s only gm4_crossbow_cartridges:shoot_crossbow\n\nexecute anchored eyes positioned ^ ^ ^ if entity @e[type=minecraft:spectral_arrow,distance=..0.2,nbt={inGround:0b}] run function gm4_crossbow_cartridges:shoot/spectral\n\n# tag arrow, 3 if multishot\nexecute anchored eyes positioned ^ ^ ^ run tag @e[type=minecraft:arrow,nbt={inGround:0b},distance=..0.2,sort=nearest,limit=3] add gm4_cb_arrow\n\n# check if arrow was tipped\nexecute anchored eyes positioned ^ ^ ^ run data modify storage gm4_crossbow_cartridges:temp potion_contents set from entity @e[type=minecraft:arrow,tag=gm4_cb_arrow,distance=..0.2,limit=1] item.components.\"minecraft:potion_contents\"\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents run function gm4_crossbow_cartridges:shoot/tipped\ndata remove storage gm4_crossbow_cartridges:temp potion_contents\n\n# check offhand item and replace arrow by projectile\nexecute positioned as @e[tag=gm4_cb_arrow,limit=1,distance=..2,sort=nearest] run function gm4_crossbow_cartridges:check_projectile\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/shoot/potion_effect.mcfunction",
    "content": "# @s = player using the crossbow with a tipped arrow\n# at @s\n# run from shoot/tipped\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:swiftness\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:speed',amplifier:0b,duration:440}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:long_swiftness\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:speed',amplifier:0b,duration:1200}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:strong_swiftness\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:speed',amplifier:1b,duration:220}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:slowness\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slowness',amplifier:0b,duration:220}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:long_slowness\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slowness',amplifier:0b,duration:600}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:strong_slowness\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slowness',amplifier:3b,duration:40}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:strength\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:strength',amplifier:0b,duration:440}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:long_strength\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:strength',amplifier:0b,duration:1200}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:strong_strength\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:strength',amplifier:1b,duration:220}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:healing\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:instant_health',amplifier:0b,duration:1}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:strong_healing\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:instant_health',amplifier:1b,duration:1}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:harming\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:instant_damage',amplifier:0b,duration:1}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:strong_harming\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:instant_damage',amplifier:1b,duration:1}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:leaping\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:jump_boost',amplifier:0b,duration:440}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:long_leaping\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:jump_boost',amplifier:0b,duration:1200}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:strong_leaping\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:jump_boost',amplifier:1b,duration:220}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:regeneration\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:regeneration',amplifier:0b,duration:100}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:long_regeneration\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:regeneration',amplifier:0b,duration:220}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:strong_regeneration\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:regeneration',amplifier:1b,duration:40}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:fire_resistance\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:fire_resistance',amplifier:0b,duration:440}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:long_fire_resistance\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:fire_resistance',amplifier:0b,duration:1200}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:water_breathing\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:water_breathing',amplifier:0b,duration:440}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:long_water_breathing\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:water_breathing',amplifier:0b,duration:1200}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:invisibility\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:invisibility',amplifier:0b,duration:440}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:long_invisibility\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:invisibility',amplifier:0b,duration:1200}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:night_vision\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:night_vision',amplifier:0b,duration:440}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:long_night_vision\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:night_vision',amplifier:0b,duration:1200}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:weakness\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:weakness',amplifier:0b,duration:220}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:long_weakness\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:weakness',amplifier:0b,duration:600}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:poison\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:poison',amplifier:0b,duration:100}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:long_poison\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:poison',amplifier:0b,duration:220}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:strong_poison\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:poison',amplifier:1b,duration:40}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:slow_falling\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slow_falling',amplifier:0b,duration:220}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:long_slow_falling\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slow_falling',amplifier:0b,duration:600}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:turtle_master\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slowness',amplifier:3b,duration:40},{id:'minecraft:resistance',amplifier:2b,duration:40}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:long_turtle_master\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slowness',amplifier:3b,duration:100},{id:'minecraft:resistance',amplifier:2b,duration:100}]\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:strong_turtle_master\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slowness',amplifier:5b,duration:40},{id:'minecraft:resistance',amplifier:3b,duration:40}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:luck\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:luck',amplifier:0b,duration:740}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:wind_charged\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:wind_charged',amplifier:0b,duration:440}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:weaving\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:weaving',amplifier:0b,duration:440}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:ozzing\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:ozzing',amplifier:0b,duration:440}]\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:\"minecraft:infestation\"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:infestation',amplifier:0b,duration:440}]\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/shoot/spectral.mcfunction",
    "content": "# @s = player using the crossbow with a spectral arrow\n# at @s\n# run from function shoot/any_arrow\n\n# store type of glowing\nexecute if predicate gm4_crossbow_cartridges:items/bucket run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:glowing',amplifier:0b,duration:200}]\nexecute unless predicate gm4_crossbow_cartridges:items/bucket run data modify storage gm4_crossbow_cartridges:temp projectile.Glowing set value 1\n\n# tag arrow, 3 if multishot\ntag @e[type=minecraft:spectral_arrow,nbt={inGround:0b},distance=..0.2,sort=nearest,limit=3] add gm4_cb_arrow\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/shoot/tipped.mcfunction",
    "content": "# @s = tipped arrow\n# at @s\n# run from function shoot/any_arrow\n\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents.potion run function gm4_crossbow_cartridges:shoot/potion_effect\nexecute if data storage gm4_crossbow_cartridges:temp potion_contents.custom_effects run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set from entity @s item.components.\"minecraft:potion_contents\".custom_effects\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/guidebook/crossbow_cartridges.json",
    "content": "{\n  \"id\": \"crossbow_cartridges\",\n  \"name\": \"Crossbow Cartridges\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:crossbow\"\n  },\n  \"criteria\": {\n    \"shot_crossbow\": {\n      \"trigger\": \"minecraft:shot_crossbow\",\n      \"conditions\": {}\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"available_ammo\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"shot_crossbow\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.crossbow_cartridges.description\",\n            \"fallback\": \"Shooting a crossbow with certain items in the offhand will launch that item instead of the arrow.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.crossbow_cartridges.ammo\",\n            \"fallback\": \"When held in the offhand, these items can be shot from crossbows:\"\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"translate\": \"block.minecraft.tnt\",\n            \"hover_event\": {\n              \"action\": \"show_item\",\n              \"id\": \"minecraft:tnt\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"translate\": \"item.minecraft.fire_charge\",\n            \"hover_event\": {\n              \"action\": \"show_item\",\n              \"id\": \"minecraft:fire_charge\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"translate\": \"item.minecraft.wind_charge\",\n            \"hover_event\": {\n              \"action\": \"show_item\",\n              \"id\": \"minecraft:wind_charge\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"translate\": \"item.minecraft.potion\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"item.minecraft.splash_potion\"\n                },\n                {\n                  \"text\": \"\\n\"\n                },\n                {\n                  \"translate\": \"item.minecraft.lingering_potion\"\n                }\n              ]\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"translate\": \"block.minecraft.torch\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"block.minecraft.torch\"\n                },\n                {\n                  \"text\": \"\\n\"\n                },\n                {\n                  \"translate\": \"block.minecraft.soul_torch\"\n                },\n                {\n                  \"text\": \"\\n\"\n                },\n                {\n                  \"translate\": \"block.minecraft.redstone_torch\"\n                }\n              ]\n            }\n          },\n          {\n            \"text\": \"* \",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.crossbow_cartridges.torch\",\n                  \"fallback\": \"Torch is placed on the block the arrow hits.\\nIf the torch cannot be placed here, it is dropped.\",\n                  \"color\": \"gray\"\n                }\n              ]\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"translate\": \"item.minecraft.string\",\n            \"hover_event\": {\n              \"action\": \"show_item\",\n              \"id\": \"minecraft:string\"\n            }\n          },\n          {\n            \"text\": \"* \",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.crossbow_cartridges.string\",\n                  \"fallback\": \"Stand in a tripwire hook and look in one of the\\ncardinal directions to create a tripwire line.\\n\\nA tripwire hook can be placed automatically at the end.\",\n                  \"color\": \"gray\"\n                }\n              ]\n            }\n          },\n          {\n            \"text\": \"(\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.crossbow_cartridges.tripwire\",\n            \"fallback\": \"Tripwire\"\n          },\n          {\n            \"text\": \")\"\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.crossbow_cartridges.bucket.1\",\n            \"fallback\": \"Mob in a Bucket\"\n          },\n          {\n            \"text\": \"* \",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.crossbow_cartridges.bucket.2\",\n                  \"fallback\": \"The water bucket will be kept\",\n                  \"color\": \"gray\"\n                }\n              ]\n            }\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/item_modifier/remove_item.json",
    "content": "{\n  \"function\": \"minecraft:set_count\",\n  \"count\": -1,\n  \"add\": true\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/check_block/below.json",
    "content": "{\n\t\"condition\": \"minecraft:any_of\",\n\t\"terms\": [\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#gm4_crossbow_cartridges:torch_placeable_top\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:slabs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"type\": \"top\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:slabs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"type\": \"double\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"half\": \"top\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:trapdoors\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"half\": \"top\",\n\t\t\t\t\t\t\"open\": \"false\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:grindstone\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"face\": \"floor\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:end_portal_frame\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"eye\": \"true\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"offsetY\": -1,\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:walls\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"offsetY\": -1,\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:fences\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston_head\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"up\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/check_block/east.json",
    "content": "{\n\t\"condition\": \"minecraft:any_of\",\n\t\"terms\": [\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#gm4:full_collision\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:slabs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"type\": \"double\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"west\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"south\",\n\t\t\t\t\t\t\"shape\": \"inner_right\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"north\",\n\t\t\t\t\t\t\"shape\": \"inner_left\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:trapdoors\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"east\",\n\t\t\t\t\t\t\"open\": \"true\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston\",\n\t\t\t\t\t\t\"minecraft:sticky_piston\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"extended\": \"false\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston\",\n\t\t\t\t\t\t\"minecraft:sticky_piston\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"extended\": \"true\",\n\t\t\t\t\t\t\"facing\": \"east\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston_head\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"west\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/check_block/north.json",
    "content": "{\n\t\"condition\": \"minecraft:any_of\",\n\t\"terms\": [\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#gm4:full_collision\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:slabs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"type\": \"double\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"south\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"east\",\n\t\t\t\t\t\t\"shape\": \"inner_right\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"west\",\n\t\t\t\t\t\t\"shape\": \"inner_left\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:trapdoors\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"north\",\n\t\t\t\t\t\t\"open\": \"true\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston\",\n\t\t\t\t\t\t\"minecraft:sticky_piston\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"extended\": \"false\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston\",\n\t\t\t\t\t\t\"minecraft:sticky_piston\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"extended\": \"true\",\n\t\t\t\t\t\t\"facing\": \"north\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston_head\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"south\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/check_block/south.json",
    "content": "{\n\t\"condition\": \"minecraft:any_of\",\n\t\"terms\": [\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#gm4:full_collision\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:slabs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"type\": \"double\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"north\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"west\",\n\t\t\t\t\t\t\"shape\": \"inner_right\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"east\",\n\t\t\t\t\t\t\"shape\": \"inner_left\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:trapdoors\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"south\",\n\t\t\t\t\t\t\"open\": \"true\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston\",\n\t\t\t\t\t\t\"minecraft:sticky_piston\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"extended\": \"false\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston\",\n\t\t\t\t\t\t\"minecraft:sticky_piston\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"extended\": \"true\",\n\t\t\t\t\t\t\"facing\": \"south\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston_head\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"north\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/check_block/west.json",
    "content": "{\n\t\"condition\": \"minecraft:any_of\",\n\t\"terms\": [\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#gm4:full_collision\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:slabs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"type\": \"double\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"east\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"north\",\n\t\t\t\t\t\t\"shape\": \"inner_right\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"south\",\n\t\t\t\t\t\t\"shape\": \"inner_left\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:trapdoors\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"west\",\n\t\t\t\t\t\t\"open\": \"true\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston\",\n\t\t\t\t\t\t\"minecraft:sticky_piston\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"extended\": \"false\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston\",\n\t\t\t\t\t\t\"minecraft:sticky_piston\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"extended\": \"true\",\n\t\t\t\t\t\t\"facing\": \"west\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston_head\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"east\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/axolotl.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:axolotl_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/beehive.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:beehive\",\n          \"minecraft:bee_nest\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/bucket.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:cod_bucket\",\n          \"minecraft:salmon_bucket\",\n          \"minecraft:pufferfish_bucket\",\n          \"minecraft:tropical_fish_bucket\",\n          \"minecraft:axolotl_bucket\",\n          \"minecraft:tadpole_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/cod.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:cod_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/copper_torch.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:copper_torch\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/fire_charge.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:fire_charge\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/lingering_potion.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:lingering_potion\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/potions.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:splash_potion\",\n          \"minecraft:lingering_potion\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/pufferfish.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:pufferfish_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/redstone_torch.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:redstone_torch\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/salmon.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:salmon_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/soul_torch.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:soul_torch\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/splash_potion.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:splash_potion\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/string.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:string\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/tadpole.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:tadpole_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/tnt.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:tnt\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/torch.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:torch\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/tropical.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:tropical_fish_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/wind_charge.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:wind_charge\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/tags/block/string_replaceable.json",
    "content": "{\n\t\"values\": [\n\t\t\"#gm4:replaceable\",\n\t\t\"minecraft:tripwire\"\n\t]\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/tags/block/torch.json",
    "content": "{\n\t\"values\": [\n\t\t\"minecraft:torch\",\n\t\t\"minecraft:soul_torch\",\n\t\t\"minecraft:redstone_torch\",\n\t\t\"minecraft:copper_torch\",\n\t\t\"minecraft:wall_torch\",\n\t\t\"minecraft:soul_wall_torch\",\n\t\t\"minecraft:redstone_wall_torch\",\n\t\t\"minecraft:copper_wall_torch\"\n\t]\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/tags/block/torch_placeable_top.json",
    "content": "{\n\t\"values\": [\n\t\t\"#gm4:full_collision\",\n\t\t\"#minecraft:anvil\",\n\t\t\"#minecraft:fences\",\n\t\t\"#minecraft:walls\",\n\t\t\"minecraft:azalea\",\n\t\t\"minecraft:flowering_azalea\",\n\t\t\"minecraft:end_rod\",\n\t\t\"minecraft:glass_pane\",\n\t\t\"minecraft:iron_bars\",\n\t\t\"minecraft:scaffolding\",\n\t\t\"minecraft:piston\",\n\t\t\"minecraft:sticky_piston\",\n\t\t\"minecraft:white_stained_glass_pane\",\n\t\t\"minecraft:orange_stained_glass_pane\",\n\t\t\"minecraft:magenta_stained_glass_pane\",\n\t\t\"minecraft:light_blue_stained_glass_pane\",\n\t\t\"minecraft:yellow_stained_glass_pane\",\n\t\t\"minecraft:lime_stained_glass_pane\",\n\t\t\"minecraft:pink_stained_glass_pane\",\n\t\t\"minecraft:gray_stained_glass_pane\",\n\t\t\"minecraft:light_gray_stained_glass_pane\",\n\t\t\"minecraft:cyan_stained_glass_pane\",\n\t\t\"minecraft:purple_stained_glass_pane\",\n\t\t\"minecraft:blue_stained_glass_pane\",\n\t\t\"minecraft:brown_stained_glass_pane\",\n\t\t\"minecraft:red_stained_glass_pane\",\n\t\t\"minecraft:black_stained_glass_pane\"\n\t]\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/tags/item/bucket.json",
    "content": "{\n\t\"values\": [\n\t\t\"minecraft:cod_bucket\",\n\t\t\"minecraft:salmon_bucket\",\n\t\t\"minecraft:pufferfish_bucket\",\n\t\t\"minecraft:tropical_fish_bucket\",\n\t\t\"minecraft:axolotl_bucket\",\n\t\t\"minecraft:tadpole_bucket\"\n\t]\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/tags/item/valid_items.json",
    "content": "{\n\t\"values\": [\n\t\t\"#gm4_crossbow_cartridges:bucket\",\n\t\t\"minecraft:string\",\n\t\t\"minecraft:torch\",\n\t\t\"minecraft:soul_torch\",\n\t\t\"minecraft:redstone_torch\",\n\t\t\"minecraft:copper_torch\",\n\t\t\"minecraft:splash_potion\",\n\t\t\"minecraft:lingering_potion\",\n\t\t\"minecraft:fire_charge\",\n\t\t\"minecraft:tnt\",\n\t\t\"minecraft:beehive\",\n\t\t\"minecraft:bee_nest\",\n\t\t\"minecraft:wind_charge\"\n\t]\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/mod.mcdoc",
    "content": "use ::java::world::entity::AnyEntity\nuse ::java::world::component::block::Occupant\nuse ::java::world::component::item::PotionContents\n\ndispatch minecraft:storage[gm4_crossbow_cartridges:temp] to struct {\n  projectile?: AnyEntity,\n  bees?: [Occupant],\n  potion_contents?: PotionContents\n}\n"
  },
  {
    "path": "gm4_crossbow_cartridges/translations.csv",
    "content": "key,en_us\nadvancement.gm4.crossbow_cartridges_fish.title,Sealife Slingshot\nadvancement.gm4.crossbow_cartridges_fish.description,Launch an aquatic animal using a crossbow\nadvancement.gm4.crossbow_cartridges_string.title,Almost a Grappling Hook\nadvancement.gm4.crossbow_cartridges_string.description,Create a 40-block long tripwire circuit using a crossbow\ntext.gm4.guidebook.module_desc.crossbow_cartridges,\"Shoot more than just arrows! Crossbow Cartridges allows your crossbow to fire a variety of projectiles; Shoot Pufferfish, Tripwires, Torches, and many more. Synergizes nicely with the Ziprails Module for easy Ziprail construction.\"\ntext.gm4.guidebook.crossbow_cartridges.description,Shooting a crossbow with certain items in the offhand will launch that item instead of the arrow.\ntext.gm4.guidebook.crossbow_cartridges.ammo,\"When held in the offhand, these items can be shot from crossbows:\"\ntext.gm4.guidebook.crossbow_cartridges.torch,\"Torch is placed on the block the arrow hits.\\nIf the torch cannot be placed here, it is dropped.\"\ntext.gm4.guidebook.crossbow_cartridges.string,Stand in a tripwire hook and look in one of the\\ncardinal directions to create a tripwire line.\\n\\nA tripwire hook can be placed automatically at the end.\ntext.gm4.guidebook.crossbow_cartridges.tripwire,Tripwire\ntext.gm4.guidebook.crossbow_cartridges.bucket.1,Mob in a Bucket\ntext.gm4.guidebook.crossbow_cartridges.bucket.2,The water bucket will be kept\n"
  },
  {
    "path": "gm4_dangerous_dungeons/README.md",
    "content": "# Dangerous Dungeons<!--$headerTitle--><!--$pmc:delete-->\n\nA custom terrain expansion pack that adds 10 new dungeon variants to the world. <!--$pmc:headerSize-->\n\n### Features\n- Dungeons can spawn in all Overworld biomes\n- Each dungeon can have a variety of spawners and loot\n- The quality of loot in dungeons depends on the depth of the dungeon\n"
  },
  {
    "path": "gm4_dangerous_dungeons/beet.yaml",
    "content": "id: gm4_dangerous_dungeons\nname: Dangerous Dungeons\nversion: 2.6.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.pfb_orbis\n  - gm4.plugins.prefabs.module_asset_rename\n\nmeta:\n  gm4:\n    prefabs:\n      - gm4_orbis\n    website:\n      description: A custom terrain expansion pack that adds new types of dungeons underground.\n      recommended:\n        - gm4_tower_structures\n        - gm4_cooler_caves\n      notes: []\n    modrinth:\n      project_id: Go9VJGOZ\n    wiki: https://wiki.gm4.co/wiki/Orbis/Dangerous_Dungeons\n    credits:\n      Creator:\n        - Sparks\n      Updated by:\n        - Misode\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/function/init.mcfunction",
    "content": "execute unless score dangerous_dungeons gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Dangerous Dungeons\"}\nexecute unless score dangerous_dungeons gm4_earliest_version < dangerous_dungeons gm4_modules run scoreboard players operation dangerous_dungeons gm4_earliest_version = dangerous_dungeons gm4_modules\nscoreboard players set dangerous_dungeons gm4_modules 1\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/guidebook/dangerous_dungeons.json",
    "content": "{\n  \"id\": \"dangerous_dungeons\",\n  \"name\": \"Dangerous Dungeons\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:spawner\"\n  },\n  \"criteria\": {\n    \"enter_badlands_dungeon\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:any_of\",\n            \"terms\": [\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"location\": {\n                    \"structures\": \"gm4_dangerous_dungeons:badlands/upper\"\n                  }\n                }\n              },\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"location\": {\n                    \"structures\": \"gm4_dangerous_dungeons:badlands/lower\"\n                  }\n                }\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"enter_deep_slate_dungeon\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_dangerous_dungeons:deep_slate\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_desert_dungeon\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_dangerous_dungeons:desert\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_lush_dungeon\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_dangerous_dungeons:lush\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_ocean_dungeon\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:any_of\",\n            \"terms\": [\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"location\": {\n                    \"structures\": \"gm4_dangerous_dungeons:ocean/default\"\n                  }\n                }\n              },\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"location\": {\n                    \"structures\": \"gm4_dangerous_dungeons:ocean/surface\"\n                  }\n                }\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"enter_snowy_dungeon\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_dangerous_dungeons:snowy\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_stone_dungeon\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:any_of\",\n            \"terms\": [\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"location\": {\n                    \"structures\": \"gm4_dangerous_dungeons:stone/default\"\n                  }\n                }\n              },\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"location\": {\n                    \"structures\": \"gm4_dangerous_dungeons:stone/ocean\"\n                  }\n                }\n              }\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"enter_badlands_dungeon\",\n          \"enter_deep_slate_dungeon\",\n          \"enter_desert_dungeon\",\n          \"enter_lush_dungeon\",\n          \"enter_ocean_dungeon\",\n          \"enter_snowy_dungeon\",\n          \"enter_stone_dungeon\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.dangerous_dungeons.description\",\n            \"fallback\": \"Extra dungeons can be found in cave systems.\\n\\nThese dungeons contain rare loot and special spawners.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.dangerous_dungeons.locations\",\n            \"fallback\": \"Stone and deepslate dungeons can be found in most biomes.\\n\\nThe Badlands, Desert, Lush, Ocean, and Snowy biomes have special dungeons that match the terrain.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/tags/worldgen/biome/is_desert.json",
    "content": "{\n  \"values\": [\n    \"minecraft:desert\"\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/tags/worldgen/biome/is_lush.json",
    "content": "{\n  \"values\": [\n    \"minecraft:lush_caves\"\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/tags/worldgen/biome/is_snowy.json",
    "content": "{\n  \"values\": [\n    \"minecraft:snowy_plains\",\n    \"minecraft:snowy_beach\",\n    \"minecraft:snowy_slopes\",\n    \"minecraft:snowy_taiga\",\n    \"minecraft:frozen_peaks\",\n    \"minecraft:frozen_river\",\n    \"minecraft:grove\",\n    \"minecraft:ice_spikes\"\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/tags/worldgen/biome/is_stone_base.json",
    "content": "{\n  \"values\": [\n    \"minecraft:mushroom_fields\",\n    \"minecraft:bamboo_jungle\",\n    \"minecraft:beach\",\n    \"minecraft:stony_shore\",\n    \"minecraft:swamp\",\n    \"minecraft:mangrove_swamp\",\n    \"minecraft:windswept_gravelly_hills\",\n    \"minecraft:windswept_hills\",\n    \"minecraft:windswept_forest\",\n    \"minecraft:taiga\",\n    \"minecraft:plains\",\n    \"minecraft:meadow\",\n    \"minecraft:forest\",\n    \"minecraft:old_growth_spruce_taiga\",\n    \"minecraft:flower_forest\",\n    \"minecraft:birch_forest\",\n    \"minecraft:dark_forest\",\n    \"minecraft:savanna_plateau\",\n    \"minecraft:savanna\",\n    \"minecraft:jungle\",\n    \"minecraft:jagged_peaks\",\n    \"minecraft:stony_peaks\",\n    \"minecraft:river\",\n    \"minecraft:old_growth_pine_taiga\",\n    \"minecraft:sunflower_plains\",\n    \"minecraft:old_growth_birch_forest\",\n    \"minecraft:sparse_jungle\",\n    \"minecraft:windswept_savanna\",\n    \"minecraft:frozen_peaks\",\n    \"minecraft:pale_garden\",\n    \"#gm4_dangerous_dungeons:is_snowy\",\n    \"minecraft:dripstone_caves\"\n  ]\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/badlands/lower.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#minecraft:is_badlands\",\n  \"step\": \"underground_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_dangerous_dungeons:dungeon/badlands\",\n  \"size\": 7,\n  \"start_height\": {\n    \"type\": \"minecraft:uniform\",\n    \"min_inclusive\": {\n      \"absolute\": 0\n    },\n    \"max_inclusive\": {\n      \"absolute\": 50\n    }\n  },\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/badlands/upper.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#minecraft:is_badlands\",\n  \"step\": \"underground_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_dangerous_dungeons:dungeon/badlands\",\n  \"size\": 7,\n  \"start_height\": {\n    \"type\": \"minecraft:uniform\",\n    \"min_inclusive\": {\n      \"absolute\": -60\n    },\n    \"max_inclusive\": {\n      \"absolute\": -15\n    }\n  },\n  \"project_start_to_heightmap\": \"OCEAN_FLOOR_WG\",\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/deep_slate.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#minecraft:is_overworld\",\n  \"step\": \"underground_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_dangerous_dungeons:dungeon/deep_slate\",\n  \"size\": 7,\n  \"start_height\": {\n    \"type\": \"minecraft:uniform\",\n    \"min_inclusive\": {\n      \"absolute\": -60\n    },\n    \"max_inclusive\": {\n      \"absolute\": -7\n    }\n  },\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/desert.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_dangerous_dungeons:is_desert\",\n  \"step\": \"underground_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_dangerous_dungeons:dungeon/desert\",\n  \"size\": 7,\n  \"start_height\": {\n    \"type\": \"minecraft:uniform\",\n    \"min_inclusive\": {\n      \"absolute\": 0\n    },\n    \"max_inclusive\": {\n      \"absolute\": 50\n    }\n  },\n  \"max_distance_from_center\": 80,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/lush.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_dangerous_dungeons:is_lush\",\n  \"step\": \"underground_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_dangerous_dungeons:dungeon/lush\",\n  \"size\": 7,\n  \"start_height\": {\n    \"type\": \"minecraft:uniform\",\n    \"min_inclusive\": {\n      \"absolute\": -60\n    },\n    \"max_inclusive\": {\n      \"absolute\": 50\n    }\n  },\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/ocean/default.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#minecraft:is_ocean\",\n  \"step\": \"underground_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_dangerous_dungeons:dungeon/ocean/default\",\n  \"size\": 7,\n  \"start_height\": {\n    \"type\": \"minecraft:uniform\",\n    \"min_inclusive\": {\n      \"absolute\": -20\n    },\n    \"max_inclusive\": {\n      \"absolute\": -5\n    }\n  },\n  \"project_start_to_heightmap\": \"OCEAN_FLOOR_WG\",\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/ocean/surface.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#minecraft:is_ocean\",\n  \"step\": \"underground_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_dangerous_dungeons:dungeon/ocean/surface\",\n  \"size\": 7,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"project_start_to_heightmap\": \"OCEAN_FLOOR_WG\",\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/snowy.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_dangerous_dungeons:is_snowy\",\n  \"step\": \"underground_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_dangerous_dungeons:dungeon/snowy\",\n  \"size\": 7,\n  \"start_height\": {\n    \"type\": \"minecraft:uniform\",\n    \"min_inclusive\": {\n      \"absolute\": 0\n    },\n    \"max_inclusive\": {\n      \"absolute\": 50\n    }\n  },\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/stone/default.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_dangerous_dungeons:is_stone_base\",\n  \"step\": \"underground_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_dangerous_dungeons:dungeon/stone\",\n  \"size\": 7,\n  \"start_height\": {\n    \"type\": \"minecraft:uniform\",\n    \"min_inclusive\": {\n      \"absolute\": -10\n    },\n    \"max_inclusive\": {\n      \"absolute\": 50\n    }\n  },\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/stone/ocean.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#minecraft:is_ocean\",\n  \"step\": \"underground_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_dangerous_dungeons:dungeon/stone\",\n  \"size\": 7,\n  \"start_height\": {\n    \"type\": \"minecraft:uniform\",\n    \"min_inclusive\": {\n      \"absolute\": -50\n    },\n    \"max_inclusive\": {\n      \"absolute\": -15\n    }\n  },\n  \"project_start_to_heightmap\": \"OCEAN_FLOOR_WG\",\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure_set/dungeons_lower.json",
    "content": "{\n  \"structures\": [\n    {\n      \"structure\": \"gm4_dangerous_dungeons:deep_slate\",\n      \"weight\": 1\n    },\n    {\n      \"structure\": \"gm4_dangerous_dungeons:lush\",\n      \"weight\": 4\n    }\n  ],\n  \"placement\": {\n    \"type\": \"minecraft:random_spread\",\n    \"salt\": 1115141679,\n    \"spacing\": 7,\n    \"separation\": 3\n  }\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure_set/dungeons_upper.json",
    "content": "{\n  \"structures\": [\n    {\n      \"structure\": \"gm4_dangerous_dungeons:badlands/lower\",\n      \"weight\": 8\n    },\n    {\n      \"structure\": \"gm4_dangerous_dungeons:badlands/upper\",\n      \"weight\": 10\n    },\n    {\n      \"structure\": \"gm4_dangerous_dungeons:stone/default\",\n      \"weight\": 10\n    },\n    {\n      \"structure\": \"gm4_dangerous_dungeons:stone/ocean\",\n      \"weight\": 10\n    },\n    {\n      \"structure\": \"gm4_dangerous_dungeons:desert\",\n      \"weight\": 10\n    },\n    {\n      \"structure\": \"gm4_dangerous_dungeons:ocean/default\",\n      \"weight\": 8\n    },\n    {\n      \"structure\": \"gm4_dangerous_dungeons:snowy\",\n      \"weight\": 12\n    }\n  ],\n  \"placement\": {\n    \"type\": \"minecraft:random_spread\",\n    \"salt\": 350397626,\n    \"spacing\": 6,\n    \"separation\": 3\n  }\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure_set/ocean_surface.json",
    "content": "{\n  \"structures\": [\n    {\n      \"structure\": \"gm4_dangerous_dungeons:ocean/surface\",\n      \"weight\": 1\n    }\n  ],\n  \"placement\": {\n    \"type\": \"minecraft:random_spread\",\n    \"salt\": 1301289086,\n    \"spacing\": 12,\n    \"separation\": 3\n  }\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/badlands.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:badlands\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 8,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/default\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cobweb\",\n                    \"probability\": 0.97\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:air\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:terracotta\",\n                    \"probability\": 0.25\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:red_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:terracotta\",\n                    \"probability\": 0.30\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cut_red_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:terracotta\",\n                    \"probability\": 0.35\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:smooth_red_sandstone\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/tiny/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:red_sandstone\",\n                    \"probability\": 0.1\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:red_sand\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:red_sandstone\",\n                    \"probability\": 0.333\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:smooth_red_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:red_concrete_powder\",\n                    \"probability\": 0.25\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:red_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:block_match\",\n                    \"block\": \"minecraft:red_concrete_powder\"\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:red_sand\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/medium_1/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:red_sandstone\",\n                    \"probability\": 0.1\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:red_sand\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:red_sandstone\",\n                    \"probability\": 0.333\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:smooth_red_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:red_concrete_powder\",\n                    \"probability\": 0.25\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:red_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:block_match\",\n                    \"block\": \"minecraft:red_concrete_powder\"\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:red_sand\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/medium_2/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cobweb\",\n                    \"probability\": 0.75\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:air\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:red_sandstone\",\n                    \"probability\": 0.1\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:red_sand\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:red_sandstone\",\n                    \"probability\": 0.333\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:smooth_red_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:red_concrete_powder\",\n                    \"probability\": 0.25\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:red_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:block_match\",\n                    \"block\": \"minecraft:red_concrete_powder\"\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:red_sand\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/large/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:red_sandstone\",\n                    \"probability\": 0.1\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:red_sand\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:red_sandstone\",\n                    \"probability\": 0.333\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:smooth_red_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:red_concrete_powder\",\n                    \"probability\": 0.25\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:red_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:block_match\",\n                    \"block\": \"minecraft:red_concrete_powder\"\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:red_sand\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/deep_slate.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:dungeon/deep_slate\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/medium/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:cobweb\",\n                    \"probability\": 0.9\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:air\" }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"deepslate_bricks\",\n                    \"probability\": 0.2\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cracked_deepslate_bricks\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"deepslate_bricks\",\n                    \"probability\": 0.125\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cobbled_deepslate\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"deepslate_tiles\",\n                    \"probability\": 0.3\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cracked_deepslate_tiles\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/small/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:cobweb\",\n                    \"probability\": 0.9\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:air\" }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"deepslate_bricks\",\n                    \"probability\": 0.2\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cracked_deepslate_bricks\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"deepslate_bricks\",\n                    \"probability\": 0.125\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cobbled_deepslate\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"deepslate_tiles\",\n                    \"probability\": 0.3\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cracked_deepslate_tiles\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_1/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:cobweb\",\n                    \"probability\": 0.9\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:air\" }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"deepslate_bricks\",\n                    \"probability\": 0.2\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cracked_deepslate_bricks\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"deepslate_bricks\",\n                    \"probability\": 0.125\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cobbled_deepslate\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"deepslate_tiles\",\n                    \"probability\": 0.3\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cracked_deepslate_tiles\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_2/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:cobweb\",\n                    \"probability\": 0.9\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:air\" }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"deepslate_bricks\",\n                    \"probability\": 0.2\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cracked_deepslate_bricks\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"deepslate_bricks\",\n                    \"probability\": 0.125\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cobbled_deepslate\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"deepslate_tiles\",\n                    \"probability\": 0.3\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cracked_deepslate_tiles\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/desert.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:desert\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 8,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/default\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cobweb\",\n                    \"probability\": 0.97\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:air\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:smooth_sandstone\",\n                    \"probability\": 0.30\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cut_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:smooth_sandstone\",\n                    \"probability\": 0.60\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:sandstone\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/tiny/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:sandstone\",\n                    \"probability\": 0.1\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:sand\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:sandstone\",\n                    \"probability\": 0.333\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:smooth_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:yellow_concrete_powder\",\n                    \"probability\": 0.25\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:block_match\",\n                    \"block\": \"minecraft:yellow_concrete_powder\"\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:sand\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/medium_1/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:sandstone\",\n                    \"probability\": 0.1\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:sand\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:sandstone\",\n                    \"probability\": 0.333\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:smooth_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:yellow_concrete_powder\",\n                    \"probability\": 0.25\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:block_match\",\n                    \"block\": \"minecraft:yellow_concrete_powder\"\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:sand\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/medium_2/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cobweb\",\n                    \"probability\": 0.75\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:air\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:sandstone\",\n                    \"probability\": 0.1\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:sand\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:sandstone\",\n                    \"probability\": 0.333\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:smooth_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:yellow_concrete_powder\",\n                    \"probability\": 0.25\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:block_match\",\n                    \"block\": \"minecraft:yellow_concrete_powder\"\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:sand\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/large/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:sandstone\",\n                    \"probability\": 0.1\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:sand\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:sandstone\",\n                    \"probability\": 0.333\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:smooth_sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:yellow_concrete_powder\",\n                    \"probability\": 0.25\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:sandstone\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:block_match\",\n                    \"block\": \"minecraft:yellow_concrete_powder\"\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:sand\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/lush.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:dungeon/lush\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/lush/grid_small/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"stone\",\n                    \"probability\": 0.5\n                  },\n                  \"output_state\": {\n                    \"Name\": \"cobblestone\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/lush/grid_1/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"stone\",\n                    \"probability\": 0.5\n                  },\n                  \"output_state\": {\n                    \"Name\": \"cobblestone\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/lush/grid_2/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"stone\",\n                    \"probability\": 0.5\n                  },\n                  \"output_state\": {\n                    \"Name\": \"cobblestone\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/lush/grid_large/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"stone\",\n                    \"probability\": 0.5\n                  },\n                  \"output_state\": {\n                    \"Name\": \"cobblestone\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/ocean/default.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:ocean/default\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 9,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/default\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/ocean/surface.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:ocean/surface\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/medium_1/base\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/small/base\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/medium_2/base\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/large/base\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/snowy.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:snowy\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/snowy/default\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cobweb\",\n                    \"probability\": 0.97\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:air\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.20\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:cracked_stone_bricks\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.20\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:polished_andesite\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/stone.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:default\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 8,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/default\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cobweb\",\n                    \"probability\": 0.93\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:air\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.30\n                  },\n                  \"output_state\": {\n                      \"Name\": \"minecraft:cracked_stone_bricks\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.40\n                  },\n                  \"output_state\": {\n                      \"Name\": \"minecraft:mossy_stone_bricks\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 8,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/default2\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cobweb\",\n                    \"probability\": 0.94\n                  },\n                  \"output_state\": {\n                    \"Name\": \"minecraft:air\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.30\n                  },\n                  \"output_state\": {\n                      \"Name\": \"minecraft:polished_andesite\"\n                  }\n                },\n                {\n                  \"location_predicate\": {\n                    \"predicate_type\": \"minecraft:always_true\"\n                  },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.40\n                  },\n                  \"output_state\": {\n                      \"Name\": \"minecraft:cracked_stone_bricks\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_1/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.2\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:cracked_stone_bricks\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.1875\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:mossy_stone_bricks\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.0833\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:cobblestone\" }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/large/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.2\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:cracked_stone_bricks\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.1875\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:mossy_stone_bricks\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.0833\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:cobblestone\" }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/temple/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.2\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:cracked_stone_bricks\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.1875\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:mossy_stone_bricks\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.0833\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:cobblestone\" }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 10,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_2/base\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.2\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:cracked_stone_bricks\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.1875\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:mossy_stone_bricks\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": { \n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.0833\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:cobblestone\" }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/badlands/large/lower_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/badlands/large/lower_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/large/decor/lower/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/large/decor/lower/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/large/decor/lower/c\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/badlands/large/upper_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/badlands/large/upper_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/large/decor/upper/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/large/decor/upper/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/large/decor/upper/c\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/badlands/medium_1_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/badlands/medium_1_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/medium_1/decor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/medium_1/decor/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/medium_1/decor/c\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/medium_1/decor/d\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/badlands/medium_2_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/badlands/medium_2_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/medium_2/decor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/medium_2/decor/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/medium_2/decor/c\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/badlands/tiny_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/badlands/tiny_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/tiny/decor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/tiny/decor/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/tiny/decor/c\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/tiny/decor/d\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/badlands/tiny/decor/e\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/large_1/chests.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/deep_slate/large_1/chests\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_1/decor/chests/a\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_1/decor/chests/b\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/large_1/spawners.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/deep_slate/large_1/spawners\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_1/decor/spawners/a\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_1/decor/spawners/b\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/large_2/liquid.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/deep_slate/large_2/liquid\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/liquid/lava_1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/liquid/lava_2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/liquid/lava_3\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/liquid/water\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/large_2/upper.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/deep_slate/large_2/chest_sets\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/upper/a\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/upper/b\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/upper/c\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/upper/d\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/medium_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/deep_slate/medium_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/a\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/b\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/c\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/d\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/e\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/f\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/g\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/h\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/small/chest_sets.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/deep_slate/small/chest_sets\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/chests/a\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/chests/b\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/chests/c\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/chests/d\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/small/spawner_sets.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/deep_slate/small/spawner_sets\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/spawners/a\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/spawners/b\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/spawners/c\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/spawners/d\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/desert/large/lower_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/desert/large/lower_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/large/decor/lower/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/large/decor/lower/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/large/decor/lower/c\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/desert/large/upper_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/desert/large/upper_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/large/decor/upper/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/large/decor/upper/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/large/decor/upper/c\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/desert/medium_1_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/desert/medium_1_features\",\n  \"fallback\": \"gm4_dangerous_dungeons:subpart/desert/medium_1_features\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/medium_1/decor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/medium_1/decor/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/medium_1/decor/c\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/medium_1/decor/d\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/desert/medium_2_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/desert/medium_2_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/medium_2/decor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/medium_2/decor/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/medium_2/decor/c\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/desert/tiny_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/desert/tiny_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/tiny/decor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/tiny/decor/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/tiny/decor/c\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/tiny/decor/d\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/desert/tiny/decor/e\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/lush/grid_large_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/lush/grid_large_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/lush/grid_large/decor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/lush/grid_large/decor/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/lush/grid_large/decor/c\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/lush/grid_large/decor/d\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/ocean/large_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/ocean/large_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/large/decor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/large/decor/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/large/decor/c\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/large/decor/d\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/ocean/medium_1_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/ocean/medium_1_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/medium_1/decor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/medium_1/decor/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/medium_1/decor/c\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/medium_1/decor/d\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/medium_1/decor/e\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/ocean/medium_2_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/ocean/medium_2_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/medium_2/decor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/medium_2/decor/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/medium_2/decor/c\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/medium_2/decor/d\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/medium_2/decor/e\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/ocean/small_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/ocean/small_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/small/decor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/small/decor/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/small/decor/c\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/ocean/small/decor/d\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/large/center_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/stone/large/center_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/large/decor/center/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/large/decor/center/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/large/decor/center/c\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/large/decor/center/d\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/large/corner_features.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/stone/large/corner_features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/large/decor/corner/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/large/decor/corner/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/large/decor/corner/c\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/medium_1/long_side.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/stone/medium_1/long_side\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_1/decor/long/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_1/decor/long/b\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/medium_1/short_side.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/stone/medium_1/short_side\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_1/decor/short/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_1/decor/short/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_1/decor/short/c\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_1/decor/short/d\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/medium_2/lower_floor.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/stone/medium_2/lower_floor\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/lower_floor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/lower_floor/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/lower_floor/c\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/lower_floor/d\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/lower_floor/e\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/medium_2/upper_floor.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/stone/medium_2/upper_floor\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/upper_floor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/upper_floor/b\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/upper_floor/c\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/temple_side.json",
    "content": "{\n  \"name\": \"gm4_dangerous_dungeons:subpart/stone/temple_side\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/temple/decor/a\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_dangerous_dungeons:dungeon/stone/temple/decor/b\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_dangerous_dungeons/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.dangerous_dungeons,A custom terrain expansion pack that adds new types of dungeons underground.\ntext.gm4.guidebook.dangerous_dungeons.description,Extra dungeons can be found in cave systems.\\n\\nThese dungeons contain rare loot and special spawners.\ntext.gm4.guidebook.dangerous_dungeons.locations,\"Stone and deepslate dungeons can be found in most biomes.\\n\\nThe Badlands, Desert, Lush, Ocean, and Snowy biomes have special dungeons that match the terrain.\"\n"
  },
  {
    "path": "gm4_desire_lines/README.md",
    "content": "# Desire Lines<!--$headerTitle--><!--$pmc:delete-->\n\nEver felt like minecraft could do with a bit more immersion? This modular data pack adds a new cool interaction to your survival world in the form of self generating paths! When you walk between two places enough, a desire line will form transforming your grass into coarse dirt all on its own! <!--$pmc:headerSize-->\n\n<img src=\"images/desire_line.png\" alt=\"A natural desire line\" height=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- When grass or dirt is stepped on it has a chance of turning into dirt or coarse dirt respectively.\n- Flowers, grass and other plants will be trampled and break if walked on enough.\n- Adds two new custom advancements to be obtained by trampling enough blocks.\n\n### Compatability \nWhen playing with other Gamemode 4 data packs, adds some bonus features:\n- Adds the Celaro shamir when used with the [Metallurgy]($dynamicLink:gm4_metallurgy) data pack.\n- Use the [Boots of Ostara]($dynamicLink:gm4_boots_of_ostara) data pack to spread nature instead of trampling it.\n"
  },
  {
    "path": "gm4_desire_lines/beet.yaml",
    "content": "id: gm4_desire_lines\nname: Desire Lines\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: ../gm4_metallurgy\n\npipeline:\n  - gm4_metallurgy.shamir_model_template\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [tick]\n    model_data:\n      - item: boots\n        reference: shamir/celaro\n        template:\n          name: shamir\n          metal: aluminium\n          textures_path: gm4_metallurgy:item/shamir/aluminium\n      - item: coarse_dirt\n        reference: gui/advancement/desire_lines_10000\n        template: advancement\n      - item: oak_planks\n        reference: gui/advancement/desire_lines_8000\n        template: advancement\n    website:\n      description: Creates natural looking trodden paths in high traffic areas, but be careful not to ruin your neighbour's lawn!\n      recommended:\n        - gm4_boots_of_ostara\n      notes: []\n    modrinth:\n      project_id: cx5dX4ug\n    smithed:\n      pack_id: gm4_desire_lines\n    video: https://www.youtube.com/watch?v=wmGaatfekfs\n    wiki: https://wiki.gm4.co/wiki/Desire_Lines\n    credits:\n      Creator:\n        - Sparks\n      Updated by:\n        - Bloo\n        - SpecialBuilder32\n        - Misode\n        - dvitski\n      Icon Design:\n        - JonPot\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4/advancement/desire_lines_10000.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"coarse_dirt\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_desire_lines:gui/advancement/desire_lines_10000\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.desire_lines.walk_10000.title\",\n      \"fallback\": \"That's a Lot of Damage\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.desire_lines.walk_10000.description\",\n      \"fallback\": \"Ruin 10000 blocks to coarse dirt; how about a little more?\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:desire_lines_8000\",\n  \"criteria\": {\n    \"ruin_blocks\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4/advancement/desire_lines_8000.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"oak_planks\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_desire_lines:gui/advancement/desire_lines_8000\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.desire_lines.walk_8000.title\",\n      \"fallback\": \"And I Would Walk 500 Chunks...\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.desire_lines.walk_8000.description\",\n      \"fallback\": \"Ruin 8000 blocks to coarse dirt; you'll find those oak planks\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"ruin_blocks\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_celaro_shamir/function/active.mcfunction",
    "content": "# Effects of the Celaro Shamir\n# @s = player with Celaro on their armor\n# at unspecified\n# run from tick\n\n# semi-ensure desire lines is disabled ($probability should only be modified NOT SET, as the modification order is load dependent)\nscoreboard players remove $probability gm4_desire_lines 1000\n\n# secondary celaro effect: invisibility inside foliage\nexecute at @s if predicate gm4_celaro_shamir:stealth_active run effect give @s invisibility 1 0 true\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_celaro_shamir/function/check_item_validity.mcfunction",
    "content": "#@s = band is trying to apply to\n#run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'celaro'}}] if items entity @s contents #gm4_celaro_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_celaro_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/aluminium via #gm4_metallurgy:summon_band/aluminium\n\nloot spawn ~ ~ ~ loot gm4_celaro_shamir:band\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_celaro_shamir/function/tick.mcfunction",
    "content": "execute if predicate gm4_celaro_shamir:shamir_active run function gm4_celaro_shamir:active\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_celaro_shamir/guidebook/celaro_shamir.json",
    "content": "{\n  \"id\": \"celaro_shamir\",\n  \"name\": \"Celaro Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"desire_lines\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Celaro_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_celaro_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'celaro'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_celaro_boots\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'celaro'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.celaro_shamir.description\",\n            \"fallback\": \"Celaro negates desire lines and causes invisibility when sneaking in shrubbery.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"shamir_use\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_celaro_shamir\",\n          \"obtain_celaro_boots\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.celaro_shamir.usage\",\n            \"fallback\": \"The Celaro Shamir is found on Aluminium Bands. It can be placed onto boots.\\n\\nDesire Lines will not activate while wearing these boots.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.celaro_shamir.invisibility\",\n            \"fallback\": \"Sneaking in double-tall shrubbery (e.g. Tall Grass, Large Fern, Peony) with celaro will grant invisibility.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_celaro_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:aluminium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_desire_lines:shamir/celaro\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'celaro'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.celaro\",\n                                    \"fallback\": \"Celaro Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_celaro_shamir/predicate/shamir_active.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"feet\": {\n        \"items\": \"#minecraft:foot_armor\",\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"celaro\\\"}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_celaro_shamir/predicate/stealth_active.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"flags\": {\n      \"is_sneaking\": true\n    },\n    \"location\": {\n      \"block\": {\n        \"blocks\": \"#gm4_celaro_shamir:tall_plants\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_celaro_shamir/tags/block/tall_plants.json",
    "content": "{\n  \"values\": [\n    \"minecraft:sunflower\",\n    \"minecraft:lilac\",\n    \"minecraft:peony\",\n    \"minecraft:rose_bush\",\n    \"minecraft:pitcher_plant\",\n    \"minecraft:tall_grass\",\n    \"minecraft:large_fern\"\n  ]\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_celaro_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:foot_armor\"\n  ]\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_desire_lines/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_desire_lines dummy\nscoreboard objectives add gm4_dl_affcoarse dummy\n\n# constants\nscoreboard players set #base_probability gm4_desire_lines 1\nscoreboard players set #sneak_penality gm4_desire_lines -5\nscoreboard players set #sprint_penalty gm4_desire_lines 1\nscoreboard players set #impact_penalty gm4_desire_lines 31\n\n# considerations\n# walking speed = 4.317 blocks/s ~ 4.63 ticks / block\n# sprinting speed = 5.612 blocks/s ~ 3.56 ticks / block\n# walking ~ 1 - (0.99)^4.63 = 0.045 ~ 5% chance to convert each block\n# sprinting ~ 1 - (0.98)^3.56 = 0.069 ~ 7% chance to convert each block\n\nexecute unless score desire_lines gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Desire Lines\"}\nexecute unless score desire_lines gm4_earliest_version < desire_lines gm4_modules run scoreboard players operation desire_lines gm4_earliest_version = desire_lines gm4_modules\nscoreboard players set desire_lines gm4_modules 1\n\nschedule function gm4_desire_lines:tick 1t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_desire_lines/function/path.mcfunction",
    "content": "# converts the block the player is stepping on\n# @s = survival player who initiated a desire lines block conversion\n# at @s\n# run from player\n\n# check blocks\nexecute positioned ~ ~-0.06 ~ if predicate gm4_desire_lines:can_coarse_dirt run fill ~ ~ ~ ~ ~ ~ coarse_dirt replace dirt\nfill ~ ~-0.06 ~ ~ ~-0.06 ~ dirt replace grass_block\nfill ~ ~ ~ ~ ~ ~ air replace snow[layers=1]\nfill ~ ~ ~ ~ ~ ~ snow[layers=1] replace snow[layers=2]\nfill ~ ~-0.06 ~ ~ ~-0.06 ~ water replace frosted_ice[age=3]\nfill ~ ~-0.06 ~ ~ ~-0.06 ~ frosted_ice[age=3] replace frosted_ice[age=2]\nfill ~ ~-0.06 ~ ~ ~-0.06 ~ frosted_ice[age=2] replace frosted_ice[age=1]\nfill ~ ~-0.06 ~ ~ ~-0.06 ~ frosted_ice[age=1] replace frosted_ice[age=0]\n\n# remove foliage if coarse dirt\nexecute if block ~ ~-0.07 ~ coarse_dirt if block ~ ~ ~ #gm4:foliage unless block ~ ~ ~ moss_carpet run setblock ~ ~ ~ air destroy\n\n# advancement check\nexecute if block ~ ~-0.07 ~ coarse_dirt run scoreboard players add @s gm4_dl_affcoarse 1\nadvancement grant @s[scores={gm4_dl_affcoarse=8000}] only gm4:desire_lines_8000\nadvancement grant @s[scores={gm4_dl_affcoarse=10000}] only gm4:desire_lines_10000\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_desire_lines/function/player.mcfunction",
    "content": "# checks the player's current state to decide whether or not to trigger a block conversion\n# @s = any survival player\n# at unspecified\n# run from tick\n\n# terminate if player is not able to create a desire line\nexecute unless predicate gm4_desire_lines:is_affected run return fail\n\n# determine trigger probability\nscoreboard players operation $probability gm4_desire_lines = #base_probability gm4_desire_lines\nexecute if predicate {\"condition\":\"minecraft:entity_properties\",\"entity\":\"this\",\"predicate\":{\"flags\":{\"is_sneaking\":true}}} run scoreboard players operation $probability gm4_desire_lines += #sneak_penality gm4_desire_lines\nexecute if predicate {\"condition\":\"minecraft:entity_properties\",\"entity\":\"this\",\"predicate\":{\"flags\":{\"is_sprinting\":true}}} run scoreboard players operation $probability gm4_desire_lines += #sprint_penalty gm4_desire_lines\nexecute if predicate {\"condition\":\"minecraft:entity_properties\",\"entity\":\"this\",\"predicate\":{\"movement\":{\"vertical_speed\":{\"min\":2}}}} if predicate gm4_desire_lines:feather_falling_fail run scoreboard players operation $probability gm4_desire_lines += #impact_penalty gm4_desire_lines\nfunction #gm4_desire_lines:expansion\n\n# | NOTE: if you are writing an expansion, do NOT 'set' $probability, as the order in which expansions are called is arbitrary.\n# | Instead, modify $probability by addition or subtraction. Do NOT subtract max_int, as that may cause over or underflows.\n\n# trigger block conversion\nexecute if predicate {\"condition\":\"minecraft:random_chance\",\"chance\":{\"type\":\"minecraft:score\",\"target\":{\"type\":\"minecraft:fixed\",\"name\":\"$probability\"},\"score\":\"gm4_desire_lines\",\"scale\":0.01}} at @s run function gm4_desire_lines:path\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_desire_lines/function/tick.mcfunction",
    "content": "execute as @a[gamemode=survival] run function gm4_desire_lines:player\n\nschedule function gm4_desire_lines:tick 1t\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_desire_lines/guidebook/desire_lines.json",
    "content": "{\n  \"id\": \"desire_lines\",\n  \"name\": \"Desire Lines\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:coarse_dirt\"\n  },\n  \"criteria\": {\n    \"eroded_land\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": \"this\",\n              \"score\": \"gm4_dl_affcoarse\"\n            },\n            \"range\": {\n              \"min\": 1\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.desire_lines.description\",\n            \"fallback\": \"Walking or sprinting over grass and dirt will trample blocks.\\n\\nGrass blocks will trample into dirt and dirt into coarse dirt.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"trampling_foliage\",\n      \"enable\": [\n        {\n          \"id\": \"gm4_boots_of_ostara\",\n          \"load\": -1\n        },\n        {\n          \"id\": \"gm4_metallurgy\",\n          \"load\": -1\n        }\n      ],\n      \"requirements\": [\n        [\n          \"eroded_land\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.desire_lines.effects\",\n            \"fallback\": \"Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"trampling_foliage-boots_of_ostara\",\n      \"enable\": [\n        {\n          \"id\": \"gm4_boots_of_ostara\",\n          \"load\": 1\n        },\n        {\n          \"id\": \"gm4_metallurgy\",\n          \"load\": -1\n        }\n      ],\n      \"requirements\": [\n        [\n          \"eroded_land\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.desire_lines.effects_and_boots_of_ostara\",\n            \"fallback\": \"Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\\n\\nThe Boots of Ostara can prevent desire lines.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"trampling_foliage-metallurgy\",\n      \"enable\": [\n        {\n          \"id\": \"gm4_boots_of_ostara\",\n          \"load\": -1\n        },\n        {\n          \"id\": \"gm4_metallurgy\",\n          \"load\": 1\n        }\n      ],\n      \"requirements\": [\n        [\n          \"eroded_land\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.desire_lines.effects_and_celaro\",\n            \"fallback\": \"Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\\n\\nBoots with the Celaro Shamir can prevent desire lines\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"trampling_foliage-boots_of_ostara-metallurgy\",\n      \"enable\": [\n        {\n          \"id\": \"gm4_boots_of_ostara\",\n          \"load\": 1\n        },\n        {\n          \"id\": \"gm4_metallurgy\",\n          \"load\": 1\n        }\n      ],\n      \"requirements\": [\n        [\n          \"eroded_land\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.desire_lines.effects_and_boots_of_ostara_and_celaro\",\n            \"fallback\": \"Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\\n\\nBoots with the Celaro Shamir, or normal Boots of Ostara can prevent desire lines.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_desire_lines/predicate/can_coarse_dirt.json",
    "content": "{\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n        {\n            \"condition\": \"minecraft:location_check\",\n            \"offsetX\": 1,\n            \"predicate\": {\n                \"block\": {\n                    \"blocks\": \"#dirt\"\n                }\n            }\n        },\n        {\n            \"condition\": \"minecraft:location_check\",\n            \"offsetX\": -1,\n            \"predicate\": {\n                \"block\": {\n                    \"blocks\": \"#dirt\"\n                }\n            }\n        },\n        {\n            \"condition\": \"minecraft:location_check\",\n            \"offsetZ\": 1,\n            \"predicate\": {\n                \"block\": {\n                    \"blocks\": \"#dirt\"\n                }\n            }\n        },\n        {\n            \"condition\": \"minecraft:location_check\",\n            \"offsetZ\": -1,\n            \"predicate\": {\n                \"block\": {\n                    \"blocks\": \"#dirt\"\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_desire_lines/predicate/feather_falling_fail.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:inverted\",\n      \"term\": {\n        \"condition\": \"minecraft:entity_properties\",\n        \"entity\": \"this\",\n        \"predicate\": {\n          \"equipment\": {\n            \"feet\": {\n              \"predicates\": {\n                \"minecraft:enchantments\": [\n                  {\n                    \"enchantments\": \"minecraft:feather_falling\"\n                  }\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:all_of\",\n      \"terms\": [\n        {\n          \"condition\": \"minecraft:entity_properties\",\n          \"entity\": \"this\",\n          \"predicate\": {\n            \"equipment\": {\n              \"feet\": {\n                \"predicates\": {\n                  \"minecraft:enchantments\": [\n                    {\n                      \"enchantments\": \"minecraft:feather_falling\",\n                      \"levels\": 1\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        },\n        {\n          \"condition\": \"minecraft:random_chance\",\n          \"chance\": 0.7\n        }\n      ]\n    },\n    {\n      \"condition\": \"minecraft:all_of\",\n      \"terms\": [\n        {\n          \"condition\": \"minecraft:entity_properties\",\n          \"entity\": \"this\",\n          \"predicate\": {\n            \"equipment\": {\n              \"feet\": {\n                \"predicates\": {\n                  \"minecraft:enchantments\": [\n                    {\n                      \"enchantments\": \"minecraft:feather_falling\",\n                      \"levels\": 2\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        },\n        {\n          \"condition\": \"minecraft:random_chance\",\n          \"chance\": 0.5\n        }\n      ]\n    },\n    {\n      \"condition\": \"minecraft:all_of\",\n      \"terms\": [\n        {\n          \"condition\": \"minecraft:entity_properties\",\n          \"entity\": \"this\",\n          \"predicate\": {\n            \"equipment\": {\n              \"feet\": {\n                \"predicates\": {\n                  \"minecraft:enchantments\": [\n                    {\n                      \"enchantments\": \"minecraft:feather_falling\",\n                      \"levels\": 3\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        },\n        {\n          \"condition\": \"minecraft:random_chance\",\n          \"chance\": 0.3\n        }\n      ]\n    },\n    {\n      \"condition\": \"minecraft:all_of\",\n      \"terms\": [\n        {\n          \"condition\": \"minecraft:entity_properties\",\n          \"entity\": \"this\",\n          \"predicate\": {\n            \"equipment\": {\n              \"feet\": {\n                \"predicates\": {\n                  \"minecraft:enchantments\": [\n                    {\n                      \"enchantments\": \"minecraft:feather_falling\",\n                      \"levels\": {\n                        \"min\": 4,\n                        \"max\": 255\n                      }\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        },\n        {\n          \"condition\": \"minecraft:random_chance\",\n          \"chance\": 0.1\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_desire_lines/predicate/is_affected.json",
    "content": "{\n    \"condition\": \"minecraft:all_of\",\n    \"terms\": [\n        {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n                \"type_specific\": {\n                    \"type\": \"minecraft:player\",\n                    \"gamemode\": [\n                        \"survival\"\n                    ]\n                },\n                \"flags\": {\n                    \"is_on_ground\": true\n                },\n                \"movement\": {\n                    \"speed\": {\n                        \"min\": 0.01\n                    }\n                }\n            }\n        },\n        {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                    \"effects\": {\n                        \"minecraft:slow_falling\": {}\n                    }\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_desire_lines/tags/function/expansion.json",
    "content": "{\n  \"values\": [\n    \"gm4_celaro_shamir:tick\"\n  ]\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_desire_lines/tags/function/load.json",
    "content": "{\n    \"values\": [\n        \"gm4_desire_lines:load\"\n    ]\n}\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_metallurgy/tags/function/check_item_validity.json",
    "content": "{\n    \"values\": [\n      \"gm4_celaro_shamir:check_item_validity\"\n    ]\n  }\n"
  },
  {
    "path": "gm4_desire_lines/data/gm4_metallurgy/tags/function/summon_band/aluminium.json",
    "content": "{\n    \"values\":[\n      \"gm4_celaro_shamir:summon_band\"\n    ]\n  }\n"
  },
  {
    "path": "gm4_desire_lines/translations.csv",
    "content": "key,en_us\nitem.gm4.shamir.celaro,Celaro Shamir\nadvancement.gm4.desire_lines.walk_8000.title,And I Would Walk 500 Chunks...\nadvancement.gm4.desire_lines.walk_8000.description,Ruin 8000 blocks to coarse dirt; you'll find those oak planks\nadvancement.gm4.desire_lines.walk_10000.title,That's a Lot of Damage\nadvancement.gm4.desire_lines.walk_10000.description,Ruin 10000 blocks to coarse dirt; how about a little more?\ntext.gm4.guidebook.module_desc.celaro_shamir,\"Creates natural looking trodden paths in high traffic areas, but be careful not to ruin your neighbour's lawn!\"\ntext.gm4.guidebook.celaro_shamir.description,Celaro negates desire lines and causes invisibility when sneaking in shrubbery.\ntext.gm4.guidebook.celaro_shamir.usage,The Celaro Shamir is found on Aluminium Bands. It can be placed onto boots.\\n\\nDesire Lines will not activate while wearing these boots.\ntext.gm4.guidebook.celaro_shamir.invisibility,\"Sneaking in double-tall shrubbery (e.g. Tall Grass, Large Fern, Peony) with celaro will grant invisibility.\"\ntext.gm4.guidebook.module_desc.desire_lines,\"Creates natural looking trodden paths in high traffic areas, but be careful not to ruin your neighbour's lawn!\"\ntext.gm4.guidebook.desire_lines.description,Walking or sprinting over grass and dirt will trample blocks.\\n\\nGrass blocks will trample into dirt and dirt into coarse dirt.\ntext.gm4.guidebook.desire_lines.effects,\"Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\"\ntext.gm4.guidebook.desire_lines.effects_and_boots_of_ostara,\"Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\\n\\nThe Boots of Ostara can prevent desire lines.\"\ntext.gm4.guidebook.desire_lines.effects_and_celaro,\"Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\\n\\nBoots with the Celaro Shamir can prevent desire lines\"\ntext.gm4.guidebook.desire_lines.effects_and_boots_of_ostara_and_celaro,\"Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\\n\\nBoots with the Celaro Shamir, or normal Boots of Ostara can prevent desire lines.\"\n"
  },
  {
    "path": "gm4_disassemblers/README.md",
    "content": "# Disassemblers<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nBreak apart tools and armour for their materials.<!--$pmc:headerSize-->\r\n\r\n<img src=\"images/disassembler_gui.png\" alt=\"Damaged Iron Leggings are disassembled into 5 Iron Ingots\" width=\"350\"/> <!--$localAssetToURL--> <!--$pmc:delete-->\r\n\r\n### Features\r\n- Place items inside the disassembler block to get back their materials\r\n- Works on leather, iron, gold tiers, shears and flint & steal.\r\n- The more damaged an item, the less of the base material is returned\r\n- Can be added to mob farms like Zombified Piglin farms to process their dropped tools\r\n\r\n### Configuration\r\nIf you also want to allow diamond armour and tools to be disassembled, run the following command:\r\n```\r\n/scoreboard players set disassemble_diamonds gm4_disassembler 1\r\n```\r\n"
  },
  {
    "path": "gm4_disassemblers/assets/translations.csv",
    "content": "key,en_us\nblock.gm4.disassembler,Disassembler\ncontainer.gm4.disassembler,Disassembler\nadvancement.gm4.disassemblers.title,Clever Decrafting\nadvancement.gm4.disassemblers.description,Craft a Disassembler\ntext.gm4.guidebook.module_desc.disassemblers,Break apart gold and iron tools and weapons for materials. Attach this to a mob farm to finally make use of those extra armour sets!\ntext.gm4.guidebook.disassmeblers.description,\"Disassmeblers can be crafted in a crafting table.\\n\\nDisassemblers can take apart metal armour, tools, and weapons and return ingots based on the item's durability.\"\ntext.gm4.guidebook.disassemblers.crafting,A Disassembler can be crafted in a crafting table:\ntext.gm4.guidebook.disassemblers.usage,Items placed inside a disassembler will be broken into its base ingots.\\n\\nThe return is based on the percent durability left on the item.\n"
  },
  {
    "path": "gm4_disassemblers/beet.yaml",
    "content": "id: gm4_disassemblers\nname: Disassemblers\nversion: 2.6.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4_disassemblers.generate_disassembly\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_machines\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_machines: 1.5.0\n        lib_forceload: 1.6.0\n      schedule_loops: [main]\n    model_data:\n      - item: player_head\n        reference: item/disassembler\n        model: block/disassembler\n      - item: tnt\n        template: legacy_machine_block\n        broadcast:\n          - reference: block/disassembler\n            textures:\n              bottom: block/disassembler_bottom\n              top: block/disassembler_top_out\n              front: block/disassembler_side\n              side: block/disassembler_side\n          - reference: block/disassembler_side\n            textures:\n              bottom: block/disassembler_bottom\n              top: block/disassembler_top\n              front: block/disassembler_side_front\n              side: block/disassembler_side\n          - reference: block/disassembler_down\n            textures:\n              bottom: block/disassembler_bottom_out\n              top: block/disassembler_top\n              front: block/disassembler_side\n              side: block/disassembler_side\n      - item: tnt\n        reference: gui/advancement/disassemblers\n        template:\n          name: advancement\n          forward: block/disassembler\n    gui_fonts:\n      - translation: gui.gm4.disassembler\n        container: dropper\n        texture: gui/container/disassembler\n    website:\n      description: Break apart gold and iron tools and weapons for materials. Attach this to a mob farm to finally make use of those extra armour sets!\n      recommended:\n        - gm4_resource_pack\n        - gm4_standard_crafting\n        - gm4_ender_hoppers\n        - gm4_enchantment_extractors\n        - gm4_forming_press\n        - gm4_block_compressors\n        - gm4_tunnel_bores\n        - gm4_boots_of_ostara\n        - gm4_heart_canisters\n        - gm4_smelteries\n        - gm4_liquid_tanks\n      notes: []\n    modrinth:\n      project_id: Cg5FQaTk\n    wiki: https://wiki.gm4.co/wiki/Disassemblers\n    credits:\n      Creator:\n        - Sparks\n      Updated by:\n        - Federick90\n        - BPR\n        - runcows\n      Textures by:\n        - Kyrius\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4/advancement/disassemblers.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"tnt\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_disassemblers:gui/advancement/disassemblers\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.disassemblers.title\",\n      \"fallback\": \"Clever Decrafting\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.disassemblers.description\",\n      \"fallback\": \"Craft a Disassembler\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"obtain_disassembler\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"disassembler\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/advancement/recipes/disassembler.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_disassemblers:disassembler\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:tnt\",\n              \"minecraft:stonecutter\",\n              \"minecraft:obsidian\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_disassemblers:disassembler\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/function/check_disassemble_recipe.mcfunction",
    "content": "# processes each item\n# @s = force load chunk armor stand (we need the hand)\n# located at the disassembler block\n# run from gm4_disassemblers:check_item (#gm4_disassemblers:during_base)\n\n# generated loot table\nexecute if score $dropped gm4_disassembler matches 0 store result score $dropped gm4_disassembler run loot replace block ~ ~ ~ container.0 fish gm4_disassemblers:caller ~ ~ ~ mainhand\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/function/check_item.mcfunction",
    "content": "# processes each item\n# @s = force load chunk armor stand (we need the hand)\n# located at the disassembler block\n# run from process\n\ndata modify entity @s equipment.mainhand set from storage gm4_disassemblers:temp Items[0]\nexecute store result score $damage gm4_disassembler run data get storage gm4_disassemblers:temp Items[0].components.\"minecraft:damage\"\nscoreboard players set $dropped gm4_disassembler 0\nfunction #gm4_disassemblers:before_base\nexecute if score $dropped gm4_disassembler matches 0 run function #gm4_disassemblers:during_base\nexecute if score $dropped gm4_disassembler matches 0 run function #gm4_disassemblers:after_base\nitem replace entity @s weapon.mainhand with minecraft:air\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_disassembler dummy\nscoreboard players add disassemble_diamonds gm4_disassembler 0\n\nexecute unless score disassemblers gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Disassemblers\"}\nexecute unless score disassemblers gm4_earliest_version < disassemblers gm4_modules run scoreboard players operation disassemblers gm4_earliest_version = disassemblers gm4_modules\nscoreboard players set disassemblers gm4_modules 1\n\nschedule function gm4_disassemblers:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/function/machine/create.mcfunction",
    "content": "# places the disassembler down\n# @s = player who placed the disassembler\n# located at the center of the placed block\n# run from gm4_disassemblers:machine/verify_place_down\n\n# place block depending on rotation\nexecute if score $rotation gm4_machine_data matches 1 run data modify storage gm4_disassemblers:temp placement set value {facing:\"down\",rotation:[180.0f,0.0f],model:\"gm4_disassemblers:block/disassembler_down\"}\nexecute if score $rotation gm4_machine_data matches 2 run data modify storage gm4_disassemblers:temp placement set value {facing:\"up\",rotation:[0.0f,0.0f],model:\"gm4_disassemblers:block/disassembler\"}\nexecute if score $rotation gm4_machine_data matches 3 run data modify storage gm4_disassemblers:temp placement set value {facing:\"south\",rotation:[0.0f,0.0f],model:\"gm4_disassemblers:block/disassembler_side\"}\nexecute if score $rotation gm4_machine_data matches 4 run data modify storage gm4_disassemblers:temp placement set value {facing:\"west\",rotation:[90.0f,0.0f],model:\"gm4_disassemblers:block/disassembler_side\"}\nexecute if score $rotation gm4_machine_data matches 5 run data modify storage gm4_disassemblers:temp placement set value {facing:\"north\",rotation:[180.0f,0.0f],model:\"gm4_disassemblers:block/disassembler_side\"}\nexecute if score $rotation gm4_machine_data matches 6 run data modify storage gm4_disassemblers:temp placement set value {facing:\"east\",rotation:[-90.0f,0.0f],model:\"gm4_disassemblers:block/disassembler_side\"}\n\nfunction gm4_disassemblers:machine/place_rotated with storage gm4_disassemblers:temp placement\n\ndata remove storage gm4_disassemblers:temp placement\n\n# mark block as placed\nplaysound minecraft:block.anvil.place master @a ~ ~ ~ 0.9 0.1\nscoreboard players set $placed_block gm4_machine_data 1\nscoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2\ntag @e[distance=..2] remove gm4_new_machine\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/function/machine/destroy.mcfunction",
    "content": "# destroys the disassembler\n# @s = disassembler marker\n# located at @s\n# run from gm4_disassemblers:machine/verify_destroy\n\n# kill legacy armor stand - TODO: remove this when we no longer support the upgrade path\nexecute positioned ~ ~-0.4 ~ run kill @e[type=armor_stand,tag=gm4_disassembler_stand,limit=1,distance=..0.01]\n# kill entities related to machine block\nkill @e[type=item_display,tag=gm4_disassembler_display,limit=1,distance=..0.01]\nexecute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:\"minecraft:dropper\",count:1,components:{}}},limit=1,sort=nearest]\nkill @s\n\n# drop item (unless broken in creative mode)\nparticle minecraft:block{block_state:\"minecraft:tnt\"} ~ ~ ~ .1 .25 .1 .05 30 normal @a\nexecute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_disassemblers:items/disassembler\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/function/machine/place_rotated.mcfunction",
    "content": "# places the disassembler down based on rotation\n# @s = player who placed the disassembler\n# located at the center of the placed block\n# with {facing, rotation, model}\n# run from gm4_disassemblers:machine/create\n\n# place dropper\n$setblock ~ ~ ~ dropper[facing=$(facing)]\ndata merge block ~ ~ ~ {CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.disassembler\",\"fallback\":\"Disassembler\"},[{\"text\":\" \",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.disassembler\",\"fallback\":\"Disassembler\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.disassembler\",\"fallback\":\"Disassembler\",\"font\":\"gm4:offscreen\"},{\"translate\":\"gui.gm4.disassembler\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"text\":\" \",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.disassembler\",\"fallback\":\"Disassembler\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.disassembler\",\"fallback\":\"Disassembler\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon display and marker entity\n$summon item_display ~ ~ ~ {\\\n  CustomName:\"gm4_disassembler_display\",\\\n  Tags:[\"gm4_no_edit\",\"gm4_disassembler_display\",\"gm4_machine_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],\\\n  item:{id:\"minecraft:tnt\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"$(model)\"]}}},\\\n  item_display:head,\\\n  brightness:{sky:15,block:15},\\\n  Rotation:$(rotation),\\\n  transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.501f,0f],scale:[0.438,0.438,0.438]}\\\n}\n\n$summon marker ~ ~ ~ {Tags:[\"gm4_disassembler\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_disassembler\",Rotation:$(rotation)}\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/function/machine/verify_destroy.mcfunction",
    "content": "# verifies that the destroyed machine was from this module\n# @s = machine block marker\n# located at @s\n# run from #gm4_machines:destroy\n\nexecute if entity @s[tag=gm4_disassembler] run function gm4_disassemblers:machine/destroy\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/function/machine/verify_place_down.mcfunction",
    "content": "# verifies that the placed down machine was from this module\n# @s = player who placed down the machine\n# located at the machine block marker (at the center of the placed down block)\n# run from #gm4_machines:place_down\n\nexecute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:\"disassembler\"} run function gm4_disassemblers:machine/create\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/function/main.mcfunction",
    "content": "# process machine\nexecute as @e[type=marker,tag=gm4_disassembler] at @s if block ~ ~ ~ dropper[triggered=false] run function gm4_disassemblers:process\n\nschedule function gm4_disassemblers:main 16t\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/function/process.mcfunction",
    "content": "# checks for a single item in the dropper\n# @s = disassembler marker [tag=gm4_disassembler]\n# located at the dissasembler block\n# run from main\n\ndata modify storage gm4_disassemblers:temp Items set from block ~ ~ ~ Items\nexecute if data storage gm4_disassemblers:temp Items[0] unless data storage gm4_disassemblers:temp Items[1] as 344d47-4-4-4-f04ce104d run function gm4_disassemblers:check_item\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/function/upgrade_paths/2.6/item_display.mcfunction",
    "content": "# @s = gm4_disassembler_stand armor stand\n# at center of disassembler\n# run from upgrade_paths/2.6\n\nsummon item_display ~ ~ ~ {\\\n  CustomName:\"gm4_disassembler_display\",\\\n  Tags:[\"gm4_no_edit\",\"gm4_disassembler_display\",\"gm4_machine_display\",\"smithed.entity\",\"smithed.strict\"],\\\n  item:{id:\"minecraft:tnt\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_disassemblers:block/disassembler_down\"]}}},\\\n  item_display:head,\\\n  brightness:{sky:15,block:15},\\\n  Rotation:[0.0f,0.0f],\\\n  transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.501f,0f],scale:[0.438,0.438,0.438]}\\\n}\n# transfer data, increment entity version number\ndata modify entity @e[type=item_display,tag=gm4_disassembler_display,limit=1,distance=..0.01] item.components.\"minecraft:custom_model_data\" set from entity @s equipment.head.components.\"minecraft:custom_model_data\"\ndata modify entity @e[type=item_display,tag=gm4_disassembler_display,limit=1,distance=..0.01] Rotation set from entity @s Rotation\nscoreboard players set @e[type=item_display,tag=gm4_disassembler_display,limit=1,distance=..0.01] gm4_entity_version 2\nscoreboard players set @e[type=marker,tag=gm4_disassembler,limit=1,distance=..0.01] gm4_entity_version 2\n\nkill @s\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/function/upgrade_paths/2.6.mcfunction",
    "content": "# @s = player\n# at @s\n# run via upgrade paths util\n\nexecute as @e[type=armor_stand,tag=gm4_disassembler_stand] at @s positioned ~ ~0.4 ~ \\\n  run function gm4_disassemblers:upgrade_paths/2.6/item_display\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/guidebook/disassemblers.json",
    "content": "{\n  \"id\": \"disassemblers\",\n  \"name\": \"Disassemblers\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:tnt\"\n  },\n  \"criteria\": {\n    \"obtain_tnt\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:tnt\"\n            ]\n          }\n        ]\n      }\n    },\n    \"open_disassembler\": {\n      \"trigger\": \"minecraft:default_block_use\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:dropper\"\n                ],\n                \"nbt\": \"{CustomName:{\\\"translate\\\":\\\"gm4.second\\\",\\\"fallback\\\":\\\"%1$s\\\",\\\"with\\\":[{\\\"translate\\\":\\\"container.gm4.disassembler\\\",\\\"fallback\\\":\\\"Disassembler\\\"},{\\\"text\\\":\\\" \\\",\\\"extra\\\":[{\\\"translate\\\":\\\"container.gm4.disassembler\\\",\\\"fallback\\\":\\\"Disassembler\\\",\\\"font\\\":\\\"gm4:half_invert\\\"},{\\\"translate\\\":\\\"container.gm4.disassembler\\\",\\\"fallback\\\":\\\"Disassembler\\\",\\\"font\\\":\\\"gm4:offscreen\\\"},{\\\"translate\\\":\\\"gui.gm4.disassembler\\\",\\\"fallback\\\":\\\"\\\",\\\"font\\\":\\\"gm4:container_gui\\\",\\\"color\\\":\\\"white\\\"},{\\\"text\\\":\\\" \\\",\\\"font\\\":\\\"gm4:half_invert\\\"},{\\\"translate\\\":\\\"container.gm4.disassembler\\\",\\\"fallback\\\":\\\"Disassembler\\\",\\\"font\\\":\\\"gm4:half_invert\\\"},{\\\"translate\\\":\\\"container.gm4.disassembler\\\",\\\"fallback\\\":\\\"Disassembler\\\",\\\"font\\\":\\\"gm4:default\\\",\\\"color\\\":\\\"#404040\\\"}],\\\"font\\\":\\\"gm4:half_invert\\\"}]}}\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.disassmeblers.description\",\n            \"fallback\": \"Disassmeblers can be crafted in a crafting table.\\n\\nDisassemblers can take apart metal armour, tools, and weapons and return ingots based on the item's durability.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"crafting\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_tnt\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.disassemblers.crafting\",\n            \"fallback\": \"A Disassembler can be crafted in a crafting table:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_disassemblers:disassembler\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"description\"\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"open_disassembler\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.disassemblers.usage\",\n            \"fallback\": \"Items placed inside a disassembler will be broken into its base ingots.\\n\\nThe return is based on the percent durability left on the item.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"description\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/loot_table/items/disassembler.json",
    "content": "{\n  \"type\": \"block\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_disassemblers:item/disassembler\"]},\n                \"minecraft:profile\": \"$disassembler\"\n              }\n            },\n            {\n              \"function\": \"set_custom_data\",\n              \"tag\": \"{gm4_machines:{id:'disassembler'}}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"translate\": \"block.gm4.disassembler\",\n                  \"fallback\": \"Disassembler\",\n                  \"color\": \"white\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/recipe/disassembler.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"redstone\",\n  \"pattern\": [\n    \"ITI\",\n    \"OSO\",\n    \"CCC\"\n  ],\n  \"key\": {\n    \"I\": \"minecraft:iron_ingot\",\n    \"T\": \"minecraft:tnt\",\n    \"O\": \"minecraft:obsidian\",\n    \"S\": \"minecraft:stonecutter\",\n    \"C\": \"minecraft:cobblestone\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:player_head\",\n    \"components\": {\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_disassemblers:item/disassembler\"]},\n      \"minecraft:profile\": \"$disassembler\",\n      \"minecraft:custom_data\": \"{gm4_machines:{id:'disassembler'}}\",\n      \"minecraft:custom_name\": {\"translate\":\"block.gm4.disassembler\",\"fallback\":\"Disassembler\",\"color\":\"white\",\"italic\":false}\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/tags/function/after_base.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/tags/function/before_base.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/tags/function/during_base.json",
    "content": "{\n  \"values\": [\n    \"gm4_disassemblers:check_disassemble_recipe\"\n  ]\n}\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/test/disassemble.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n\nloot give @s loot gm4_disassemblers:items/disassembler\nexecute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1\ndummy @s use block ~1 ~ ~1\n\nassert block ~1 ~1 ~1 dropper\nassert entity @e[tag=gm4_disassembler,distance=..3]\n\nitem replace block ~1 ~1 ~1 container.0 with minecraft:iron_chestplate\n\nawait items block ~1 ~1 ~1 container.0 minecraft:iron_ingot[count=1]\nassert items block ~1 ~1 ~1 container.2 minecraft:iron_ingot[count=1]\nassert items block ~1 ~1 ~1 container.3 minecraft:iron_ingot[count=1]\nassert items block ~1 ~1 ~1 container.4 minecraft:iron_ingot[count=1]\nassert items block ~1 ~1 ~1 container.5 minecraft:iron_ingot[count=1]\nassert items block ~1 ~1 ~1 container.6 minecraft:iron_ingot[count=1]\nassert items block ~1 ~1 ~1 container.7 minecraft:iron_ingot[count=1]\nassert items block ~1 ~1 ~1 container.8 minecraft:iron_ingot[count=1]\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_disassemblers/test/place.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n\nloot give @s loot gm4_disassemblers:items/disassembler\nexecute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1\ndummy @s use block ~1 ~ ~1\n\nassert block ~1 ~1 ~1 dropper\nassert entity @e[tag=gm4_disassembler,distance=..3]\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_machines/tags/function/destroy.json",
    "content": "{\n    \"values\": [\n        \"gm4_disassemblers:machine/verify_destroy\"\n    ]\n}\n"
  },
  {
    "path": "gm4_disassemblers/data/gm4_machines/tags/function/place_down.json",
    "content": "{\n    \"values\": [\n        \"gm4_disassemblers:machine/verify_place_down\"\n    ]\n}\n"
  },
  {
    "path": "gm4_disassemblers/data/minecraft/tags/item/gold_tool_materials.json",
    "content": "{\n  \"values\": [\n    \"minecraft:gold_ingot\"\n  ]\n}\n"
  },
  {
    "path": "gm4_disassemblers/data/minecraft/tags/item/iron_tool_materials.json",
    "content": "{\n  \"values\": [\n    \"minecraft:iron_ingot\"\n  ]\n}\n"
  },
  {
    "path": "gm4_disassemblers/generate_disassembly.py",
    "content": "from beet import Context, LootTable\nfrom beet.contrib.vanilla import Vanilla\nimport itertools\nfrom typing import Any\n\nITEMS = {\n  \"copper_spear\": 191,\n  \"copper_sword\": 191,\n  \"copper_pickaxe\": 191, \n  \"copper_axe\": 191,\n  \"copper_shovel\": 191,\n  \"copper_hoe\": 191,\n  \"copper_helmet\": 122,\n  \"copper_chestplate\": 177,\n  \"copper_leggings\": 166,\n  \"copper_boots\": 144,\n\n  \"diamond_spear\": 1562,\n  \"diamond_sword\": 1562,\n  \"diamond_pickaxe\": 1562,\n  \"diamond_axe\": 1562,\n  \"diamond_shovel\": 1562,\n  \"diamond_hoe\": 1562,\n  \"diamond_helmet\": 364,\n  \"diamond_chestplate\": 529,\n  \"diamond_leggings\": 496,\n  \"diamond_boots\": 430,\n\n  \"iron_spear\": 251,\n  \"iron_sword\": 251,\n  \"iron_pickaxe\": 251,\n  \"iron_axe\": 251,\n  \"iron_shovel\": 251,\n  \"iron_hoe\": 251,\n  \"iron_helmet\": 166,\n  \"iron_chestplate\": 241,\n  \"iron_leggings\": 226,\n  \"iron_boots\": 196,\n\n  \"golden_spear\": 33,\n  \"golden_sword\": 33,\n  \"golden_pickaxe\": 33,\n  \"golden_axe\": 33,\n  \"golden_shovel\": 33,\n  \"golden_hoe\": 33,\n  \"golden_helmet\": 78,\n  \"golden_chestplate\": 113,\n  \"golden_leggings\": 106,\n  \"golden_boots\": 92,\n\n  \"leather_helmet\": 56,\n  \"leather_chestplate\": 81,\n  \"leather_leggings\": 76,\n  \"leather_boots\": 66,\n\n  \"turtle_helmet\": 276,\n  \"bow\": 385,\n  \"crossbow\": 466,\n  \"shears\": 239,\n  \"fishing_rod\": 65,\n  \"flint_and_steel\": 65,\n  \"shield\": 336,\n}\n\n\ndef beet_default(ctx: Context):\n  \"\"\"Creates a loot table for dropping the 9 result items when disassembling an item.\"\"\"\n  vanilla = ctx.inject(Vanilla)\n  vanilla.minecraft_version = '26.1'\n  recipes = vanilla.data.recipes\n\n  for item, durability in ITEMS.items():\n    recipe = recipes[f\"minecraft:{item}\"].data\n    ingredients: list[tuple[str, int]] = []\n    if recipe[\"type\"] == \"minecraft:crafting_shaped\":\n      pattern = \"\".join([\n        (\" \" + r if len(r) == 1 else r).ljust(3, \" \")\n        for r in recipe[\"pattern\"]\n      ]).rjust(9, \" \")\n      ingredient_groups = [\"\".join(g) for _, g in itertools.groupby(pattern)]\n      ingredients = [\n        (\"minecraft:air\" if p[0] == \" \" else recipe[\"key\"][p[0]], len(p))\n        for p in ingredient_groups\n      ]\n    else:\n      for ingredient in recipe[\"ingredients\"]:\n        ingredients.append((ingredient, 1))\n      if len(ingredients) < 9:\n        ingredients.append((\"minecraft:air\", 9-len(ingredients)))\n\n    pools: Any = []\n    for ingredient, count in ingredients:\n      if ingredient == \"minecraft:air\":\n        pools.append({\n          \"rolls\": count,\n          \"entries\": [{\"type\": \"minecraft:loot_table\", \"value\": \"gm4:air\"}]\n        })\n        continue\n\n      if \"wooden_tool_materials\" in ingredient:\n        entry: Any = {\"type\": \"minecraft:item\", \"name\": \"minecraft:stick\"}\n      elif ingredient.startswith(\"#\"):\n        entry: Any = {\"type\": \"minecraft:tag\", \"name\": ingredient[1:], \"expand\": True}\n      else:\n        entry: Any = {\"type\": \"minecraft:item\", \"name\": ingredient}\n\n      entry[\"conditions\"] = [{\n        \"condition\": \"value_check\",\n        \"value\": {\n          \"type\": \"score\",\n          \"target\": {\n            \"type\": \"fixed\",\n            \"name\": \"$damage\"\n          },\n          \"score\": \"gm4_disassembler\"\n        },\n        \"range\": {\n          \"min\": 0,\n          \"max\": {\n            \"type\": \"uniform\",\n            \"min\": 0,\n            \"max\": durability\n          }\n        }\n      }]\n      pools.append({\n        \"rolls\": count,\n        \"entries\": [{\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            entry,\n            { \"type\": \"minecraft:loot_table\", \"value\": \"gm4:air\" }\n          ]\n        }]\n      })\n\n    ctx.data[f\"{ctx.project_id}:disassembleables/{item}\"] = LootTable({\n      \"__comment\": \"Generated by generate_disassembly.py\",\n      \"type\": \"minecraft:generic\",\n      \"pools\": pools\n    })\n\n  # base pack\n  caller: dict[str, Any] = {\n    \"__comment\": \"Generated by generate_disassembly.py\",\n    \"type\": \"minecraft:fishing\",\n    \"pools\": [{\n      \"rolls\": 1,\n      \"entries\": [{\"type\":\"minecraft:alternatives\",\"children\":[]}]\n    }]\n  }  \n  for item in ITEMS:\n    caller[\"pools\"][0][\"entries\"][0][\"children\"].append({\n      \"type\": \"minecraft:loot_table\",\n      \"value\": f'gm4_disassemblers:disassembleables/{item}',\n      \"conditions\": [{\n        \"condition\": \"match_tool\",\n        \"predicate\": {\n          \"items\": [f\"minecraft:{item}\"]\n        }\n      }]\n    })\n    if item.startswith(\"diamond_\"):\n      caller[\"pools\"][0][\"entries\"][0][\"children\"][-1][\"conditions\"].append({\n        \"condition\": \"value_check\",\n        \"range\": 1,\n        \"value\": {\"type\":\"score\",\"target\":{\"type\":\"fixed\",\"name\":\"disassemble_diamonds\"},\"score\":\"gm4_disassembler\"}\n      })\n\n  ctx.data[f\"{ctx.project_id}:caller\"] = LootTable(caller)\n"
  },
  {
    "path": "gm4_disassemblers/mod.mcdoc",
    "content": "use ::java::world::item::ItemStack\n\ndispatch minecraft:storage[gm4_disassemblers:temp] to struct {\n  Items?: [ItemStack]\n}\n"
  },
  {
    "path": "gm4_display_frames/README.md",
    "content": "# Display Frames<!--$headerTitle--><!--$pmc:delete-->\n\nHave you ever wanted to add invisible item frames to your survival world without feeling like you're cheating? This data pack will let you splash your item frames with invisibility potions to make them permanently invisible when displaying an item! <!--$pmc:headerSize-->\n\n<img src=\"images/display_frames_example.png\" alt=\"Display frames in use\" height=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- When an invisibility potion is thrown in the vicinity of an item frame, it makes the item frame go invisible when displaying an item.\n- When an invisible item frame is holding no item it will turn visible but show invisible potion effect particles to indicate that it is still able to turn invisible again.\n- Adds a new custom advancement for turning an item frame invisible.\n"
  },
  {
    "path": "gm4_display_frames/beet.yaml",
    "content": "id: gm4_display_frames\nname: Display Frames\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_potion_tracking\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_potion_tracking: 1.4.0\n      schedule_loops: [main]\n    website:\n      description: Splash item frames with invisibilty to make invisible item frames! Great for interior decor!\n      recommended:\n        - gm4_chairs\n        - gm4_better_armour_stands\n        - gm4_holographic_tags\n      notes: []\n    modrinth:\n      project_id: u59ticCz\n    wiki: https://wiki.gm4.co/wiki/Display_Frames\n    credits:\n      Creators:\n        - BPR\n        - TheEpyonProject\n      Icon Design:\n        - BPR\n    model_data:\n      - item: splash_potion\n        reference: gui/advancement/display_frames\n        template: advancement\n"
  },
  {
    "path": "gm4_display_frames/data/gm4/advancement/display_frames.json",
    "content": "{\n    \"display\": {\n        \"icon\": {\n            \"id\": \"minecraft:splash_potion\",\n            \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_display_frames:gui/advancement/display_frames\"]},\n                \"minecraft:potion_contents\": \"minecraft:invisibility\"\n            }\n        },\n        \"title\": {\n            \"translate\": \"advancement.gm4.display_frames.title\",\n            \"fallback\": \"Where Did It Go?\"\n        },\n        \"description\": {\n            \"translate\": \"advancement.gm4.display_frames.description\",\n            \"fallback\": \"Make an item frame invisible with a splash potion of invisibility\",\n            \"color\": \"gray\"\n        }\n    },\n    \"parent\": \"gm4:root\",\n    \"criteria\": {\n        \"impossible\": {\n            \"trigger\": \"minecraft:impossible\"\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_display_frames/function/frame/invisible/apply_invisibility.mcfunction",
    "content": "# @s = display frame with a new item\n# run from frame/invisible/process\n\ntag @s add gm4_df_invisible\ndata modify entity @s Invisible set value 1b\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_display_frames/function/frame/invisible/clear_invisibility.mcfunction",
    "content": "# @s = display frame that lost its item\n# run from frame/invisible/process\n\ntag @s remove gm4_df_invisible\ndata modify entity @s Invisible set value 0b\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_display_frames/function/frame/invisible/create.mcfunction",
    "content": "# checks for item frames once the splash potion of invisibility has despawned\n# @s = potion tracker AEC\n# run from thrown_potion_tracking/check_splash\n\ntag @e[type=item_frame,tag=!smithed.entity,distance=..2] add gm4_df_invis_frame\ntag @e[type=glow_item_frame,tag=!smithed.entity,distance=..2] add gm4_df_invis_frame\nscoreboard players set @e[tag=gm4_df_invis_frame,distance=..2] gm4_entity_version 1\nadvancement grant @a[distance=..4,gamemode=!spectator] only gm4:display_frames\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_display_frames/function/frame/invisible/process.mcfunction",
    "content": "# @s = display frame within 8 blocks of a player\n# run from main\n\nexecute if items entity @s contents * run tag @s add gm4_df_has_item\nexecute if entity @s[tag=gm4_df_invisible,tag=!gm4_df_has_item] run function gm4_display_frames:frame/invisible/clear_invisibility\nexecute if entity @s[tag=!gm4_df_invisible,tag=gm4_df_has_item] run function gm4_display_frames:frame/invisible/apply_invisibility\nexecute if entity @s[tag=!gm4_df_invisible,tag=!gm4_df_has_item] at @s run particle minecraft:entity_effect{color:[0.8,0.8,0.8,0.6]} ^ ^ ^.2 0 0 0 0.6 0\ntag @s remove gm4_df_has_item\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_display_frames/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_df_time dummy\nscoreboard objectives add gm4_entity_version dummy\n\nexecute unless score gm4_display_frames gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Display Frames\"}\nexecute unless score gm4_display_frames gm4_earliest_version < gm4_display_frames gm4_modules run scoreboard players operation gm4_display_frames gm4_earliest_version = gm4_display_frames gm4_modules\nscoreboard players set gm4_display_frames gm4_modules 1\n\nschedule function gm4_display_frames:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_display_frames/function/main.mcfunction",
    "content": "execute as @e[type=item_frame,tag=gm4_df_invis_frame] unless score @s gm4_entity_version = @s gm4_entity_version run scoreboard players set @s gm4_entity_version 1\nexecute as @e[type=glow_item_frame,tag=gm4_df_invis_frame] unless score @s gm4_entity_version = @s gm4_entity_version run scoreboard players set @s gm4_entity_version 1\n\nexecute as @e[type=item_frame,tag=gm4_df_invis_frame] at @s if entity @a[gamemode=!spectator,distance=..8,limit=1] run function gm4_display_frames:frame/invisible/process\n\nexecute as @e[type=glow_item_frame,tag=gm4_df_invis_frame] at @s if entity @a[gamemode=!spectator,distance=..8,limit=1] run function gm4_display_frames:frame/invisible/process\n\nschedule function gm4_display_frames:main 16t\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_display_frames/function/potion_tracking/splash_item_frames.mcfunction",
    "content": "# @s = invisibility potion that landed\n# run from potion_tracking/verify_landed_potion\n\nexecute if entity @e[type=item_frame,tag=!smithed.entity,tag=!gm4_df_invis_frame,distance=..2.5,limit=1] run function gm4_display_frames:frame/invisible/create\nexecute if entity @e[type=glow_item_frame,tag=!smithed.entity,tag=!gm4_df_invis_frame,distance=..2.5,limit=1] run function gm4_display_frames:frame/invisible/create\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_display_frames/function/potion_tracking/tag_potion.mcfunction",
    "content": "# @s = any potion entity\n# run from #gm4_potion_tracking:tag_potion\n\ntag @s[tag=!gm4_potion,nbt={Item:{components:{\"minecraft:potion_contents\":{potion:\"minecraft:invisibility\"}}}}] add gm4_potion\ntag @s[tag=!gm4_potion,nbt={Item:{components:{\"minecraft:potion_contents\":{potion:\"minecraft:long_invisibility\"}}}}] add gm4_potion\ntag @s[tag=!gm4_potion,nbt={Item:{components:{\"minecraft:potion_contents\":{custom_effects:[{id:'minecraft:invisibility'}]}}}}] add gm4_potion\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_display_frames/function/potion_tracking/verify_landed_potion.mcfunction",
    "content": "# @s = any potion tracker marker that landed\n# run from #gm4_potion_tracking:potion_landed\n\nexecute if data storage gm4_potion_tracking:temp entity_data.Item.components{\"minecraft:potion_contents\":{potion:\"minecraft:invisibility\"}} run function gm4_display_frames:potion_tracking/splash_item_frames\nexecute if data storage gm4_potion_tracking:temp entity_data.Item.components{\"minecraft:potion_contents\":{potion:\"minecraft:long_invisibility\"}} run function gm4_display_frames:potion_tracking/splash_item_frames\nexecute if data storage gm4_potion_tracking:temp entity_data.Item.components{\"minecraft:potion_contents\":{custom_effects:[{id:'minecraft:invisibility'}]}} run function gm4_display_frames:potion_tracking/splash_item_frames\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_display_frames/guidebook/display_frames.json",
    "content": "{\n  \"id\": \"display_frames\",\n  \"name\": \"Display Frames\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:splash_potion\",\n    \"components\": {\n      \"minecraft:potion_contents\": \"minecraft:invisibility\"\n    }\n  },\n  \"criteria\": {\n    \"obtain_invisibility_potion\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:lingering_potion\",\n              \"minecraft:potion\",\n              \"minecraft:splash_potion\"\n            ],\n            \"components\": {\n              \"minecraft:potion_contents\": \"minecraft:invisibility\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_invisibility_potion\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.display_frames.description\",\n            \"fallback\": \"Splashing item frames and glow item frames with invisibility causes them to become display frames.\\n\\nDisplay frames become invisible when holding with an item.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_display_frames/tags/entity_type/potion_tracker.json",
    "content": "{\n    \"values\": [\n        \"minecraft:marker\",\n        \"minecraft:lingering_potion\",\n        \"minecraft:splash_potion\"\n    ]\n}\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_display_frames/test/splash.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n\nfill ~2 ~1 ~ ~2 ~1 ~2 gray_concrete\ngive @s item_frame\nexecute at @s run tp @s ~ ~ ~ facing ~2 ~-1.5 ~1\ndummy @s use block ~2 ~1 ~1 west\n\ngive @s minecraft:splash_potion[potion_contents=\"minecraft:invisibility\"]\ndummy @s use item\n\nawait delay 5t\ngive @s diamond_pickaxe\ndummy @s use entity @e[type=item_frame,distance=..3,limit=1]\n\nawait entity @s[advancements={gm4:display_frames=true}]\nawait entity @e[type=item_frame,distance=..3,nbt={Invisible:1b}]\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_potion_tracking/tags/function/potion_landed.json",
    "content": "{\n    \"values\": [\n        \"gm4_display_frames:potion_tracking/verify_landed_potion\"\n    ]\n}\n"
  },
  {
    "path": "gm4_display_frames/data/gm4_potion_tracking/tags/function/tag_potion.json",
    "content": "{\n    \"values\": [\n        \"gm4_display_frames:potion_tracking/tag_potion\"\n    ]\n}\n"
  },
  {
    "path": "gm4_display_frames/translations.csv",
    "content": "key,en_us\nadvancement.gm4.display_frames.title,Where Did It Go?\nadvancement.gm4.display_frames.description,Make an item frame invisible with a splash potion of invisibility\ntext.gm4.guidebook.module_desc.display_frames,Splash item frames with invisibilty to make invisible item frames! Great for interior decor!\ntext.gm4.guidebook.display_frames.description,Splashing item frames and glow item frames with invisibility causes them to become display frames.\\n\\nDisplay frames become invisible when holding with an item.\n"
  },
  {
    "path": "gm4_double_doors/README.md",
    "content": "# Double Doors<!--$headerTitle--><!--$pmc:delete-->\n\nTired of clicking twice to open a double door?\nAnnoyed by the fact that doors are only two blocks tall?\nPressure Plates just don't cut it for closing doors behind you?\nThis data pack **automatically opens adjacent doors**, making double doors fully functional! Additionally, bottom **trapdoors** of matching wood type placed above a door **are opened alongside** the door when it is opened by a player. And maybe best of all, **doors close automatically** behind you! <!--$pmc:headerSize-->\n\n<img src=\"images/double_doors.webp\" alt=\"Double Doors Example\" width=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n\n### Features\n- When a player interacts with a door that is part of a double door, both doors are opened/closed automatically!\n- Open bottom-half trapdoors placed above a door will open/close alongside the door!\n- Only doors and trapdoors which are of the same type and adjacent show this behavior.\n- Doors are automatically closed behind the player!\n- Hold shift or power a door with Redstone to enforce normal 'vanilla' door behavior!\n"
  },
  {
    "path": "gm4_double_doors/beet.yaml",
    "content": "id: gm4_double_doors\nname: Double Doors\nversion: 1.4.X\n\ndata_pack:\n  load: .\n\nrequire:\n  - bolt\n\npipeline:\n  - gm4_double_doors.generate\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: []\n    website:\n      description: Tired of clicking twice to open a double door? Annoyed by the fact that doors are only two blocks tall? This data pack automatically opens adjacent doors, making double doors fully functional! Additionally, bottom trapdoors of matching wood type placed above a door are opened alongside the door when it is opened by a player.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: Vx4zJ1Np\n    smithed:\n      pack_id: gm4_double_doors\n    wiki: https://wiki.gm4.co/wiki/Double_Doors\n    credits:\n      Creator:\n        - Bloo\n      Icon Design:\n        - venomousbirds\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/function/auto_toggle_marker/find.mcfunction",
    "content": "# Ensures this 1t clock runs unless there are no auto toggle markers remaining\n# @s = none\n# at world spawn\n# scheduled from gm4_double_doors:<wood type>/door/<hinge>/<facing>/initialize_auto_toggle_marker functions when an auto toggle marker is spawned\n\n# maintain auto toggle markers\nexecute as @e[type=marker,tag=gm4_double_doors_auto_toggle_marker] at @s align xyz run function gm4_double_doors:auto_toggle_marker/maintain\n\n# reschedule if an auto toggle marker was found\nexecute if score $found_auto_toggle_marker gm4_double_doors_data matches 1.. run schedule function gm4_double_doors:auto_toggle_marker/find 1t\nscoreboard players reset $found_auto_toggle_marker gm4_double_doors_data\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/function/auto_toggle_marker/maintain.mcfunction",
    "content": "# manages the lifetime and functionality of auto toggle markers\n# @s = marker entity with the gm4_double_doors_auto_toggle_marker tag\n# at @s align xyz\n# run from gm4_double_doors:auto_toggle_marker/find\n\n# decay marker\nscoreboard players remove @s gm4_double_doors_auto_toggle_liftime 1\n\n# an auto toggle marker has three states stored in the gm4_double_doors_auto_toggle_state scoreboard: 0='waiting_for_player', 1='player_present', 2='player_departed'\n# depending on the state the marker is handled differently:\n# - 'waiting_for_player' markers look for the presence of a player every tick, if one is found the state is set to 'player_present'\n# - 'player_present' markers look for the disappearance if the present player every tick, if so the state is set to 'player_departed' and the lifetime is reduced to 60 ticks\n# - 'player_departed' markers do not check for players\n# all states decay at 1 score per tick\nexecute if score @s gm4_double_doors_auto_toggle_state matches ..0 if function gm4_double_doors:auto_toggle_marker/player_present run scoreboard players set @s gm4_double_doors_auto_toggle_state 1\nexecute if score @s gm4_double_doors_auto_toggle_state matches 1 unless function gm4_double_doors:auto_toggle_marker/player_present run function gm4_double_doors:auto_toggle_marker/player_departed\nexecute if score @s gm4_double_doors_auto_toggle_state matches 2.. if score @s gm4_double_doors_auto_toggle_liftime matches 0 run function gm4_double_doors:auto_toggle_marker/select_material\n\n# kill old auto toggle markers\nexecute if score @s gm4_double_doors_auto_toggle_liftime matches ..0 run kill @s\n\n# kill auto toggle markers which are not in a door anymore\nexecute unless block ~ ~ ~ #minecraft:doors run kill @s\n\n# set flag that an auto toggle marker was found\nscoreboard players set $found_auto_toggle_marker gm4_double_doors_data 1\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/function/auto_toggle_marker/player_departed.mcfunction",
    "content": "# changes the state of an auto toggle marker from player_present to player_departed\n# @s = marker entity with the gm4_double_doors_auto_toggle_marker tag\n# at @s align xyz\n# run from gm4_double_doors:auto_toggle_marker/maintain\n\n# update state\nscoreboard players set @s gm4_double_doors_auto_toggle_state 2\n\n# skip lifetime forwards\nscoreboard players set @s gm4_double_doors_auto_toggle_liftime 10\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/function/auto_toggle_marker/player_present.mcfunction",
    "content": "# test if a player has entered the space previously occupied by the door's collision box\n# @s = marker entity with the gm4_double_doors_auto_toggle_marker tag\n# at @s align xyz\n# run as conditional check from gm4_double_doors:auto_toggle_marker/maintain\n\nexecute if entity @s[tag=gm4_double_doors_collision_box_east] as @a[dx=0,dy=1,dz=0,limit=1,gamemode=!spectator] positioned ~0.8125 ~ ~ if entity @s[dx=0,dy=1,dz=0] run return 1\nexecute if entity @s[tag=gm4_double_doors_collision_box_north] as @a[dx=0,dy=1,dz=0,limit=1,gamemode=!spectator] positioned ~ ~ ~-0.8125 if entity @s[dx=0,dy=1,dz=0] run return 1\nexecute if entity @s[tag=gm4_double_doors_collision_box_south] as @a[dx=0,dy=1,dz=0,limit=1,gamemode=!spectator] positioned ~ ~ ~0.8125 if entity @s[dx=0,dy=1,dz=0] run return 1\nexecute if entity @s[tag=gm4_double_doors_collision_box_west] as @a[dx=0,dy=1,dz=0,limit=1,gamemode=!spectator] positioned ~-0.8125 ~ ~ if entity @s[dx=0,dy=1,dz=0] run return 1\n\n# no match -> no player has entered the space\nreturn fail\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/function/auto_toggle_marker/select_material.mcfunction",
    "content": "# selects the material of the toggle marker in question\n# @s = marker entity with the gm4_double_doors_auto_toggle_marker tag\n# at @s align xyz\n# run from gm4_double_doors:auto_toggle_marker/maintain\n\n# load target state from marker (this was stored when the door was opened by a player and therefore stores the state the door should be returned to)\nexecute store result score $target_door_state gm4_double_doors_data run scoreboard players get @s gm4_double_doors_auto_toggle_target_state\n\n# check if desired target door state was already achieved (this can happen if the door was triggered by redstone or sneak-clicked by the player)\n# if so, i.e. if a $target_door_state 0 [1] (to be closed [opened]) marker is already in a a closed [open] door or a non-door block, return\nexecute if score $target_door_state gm4_double_doors_data matches 0 unless block ~ ~ ~ #minecraft:doors[open=true] run return 0\nexecute if score $target_door_state gm4_double_doors_data matches 1 unless block ~ ~ ~ #minecraft:doors[open=false] run return 0\n\n# set flag which marks this toggle action as being executed via an auto toggle marker\nscoreboard players set $triggered_by_auto_toggle gm4_double_doors_data 1\n\n# select material type to run block actions & sound event\nfor material_name in ctx.meta['door_materials']:\n    execute unless score $toggled_door gm4_double_doors_data matches 1.. if entity @s[tag=f\"gm4_double_doors_{material_name}\",tag=gm4_double_doors_left] run function f\"gm4_double_doors:{material_name}/door/left_hinge/get_facing\"\n    execute unless score $toggled_door gm4_double_doors_data matches 1.. if entity @s[tag=f\"gm4_double_doors_{material_name}\",tag=gm4_double_doors_right] run function f\"gm4_double_doors:{material_name}/door/right_hinge/get_facing\"\n    execute if score $play_sound gm4_double_doors_data matches 1 if score $target_door_state gm4_double_doors_data matches 0 run playsound ctx.meta['sound_ids'][material_name].close block @a[distance=..16] ~ ~ ~\n    execute if score $play_sound gm4_double_doors_data matches 1 if score $target_door_state gm4_double_doors_data matches 1 run playsound ctx.meta['sound_ids'][material_name].open block @a[distance=..16] ~ ~ ~\n    execute if score $play_sound gm4_double_doors_data matches 1 run scoreboard players reset $play_sound gm4_double_doors_data\n\nscoreboard players reset $toggled_door gm4_double_doors_data\nscoreboard players reset $triggered_by_auto_toggle gm4_double_doors_data\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/function/init.mcfunction",
    "content": "execute unless score double_doors gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Double Doors\"}\nexecute unless score double_doors gm4_earliest_version < double_doors gm4_modules run scoreboard players operation double_doors gm4_earliest_version = double_doors gm4_modules\nscoreboard players set double_doors gm4_modules 1\n\nscoreboard objectives add gm4_double_doors_data dummy\nscoreboard objectives add gm4_double_doors_auto_toggle_target_state dummy\nscoreboard objectives add gm4_double_doors_auto_toggle_liftime dummy\nscoreboard objectives add gm4_double_doors_auto_toggle_state dummy\nexecute unless score $trap_door_limit gm4_double_doors_data matches 0.. run scoreboard players set $trap_door_limit gm4_double_doors_data 2\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/guidebook/double_doors.json",
    "content": "{\n  \"id\": \"double_doors\",\n  \"name\": \"Double Doors\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:acacia_door\"\n  },\n  \"criteria\": {\n    \"obtain_door\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:doors\"\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_door\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.double_doors.description\",\n            \"fallback\": \"Placing two doors adjacent to each other will link them together, so they open together.\\n\\nTrapdoors placed above doors will also act as part of the door, opening when the doors open.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/advancement/use_left_hinge_door.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:default_block_use\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:entity_properties\",\n                        \"entity\": \"this\",\n                        \"predicate\": {\n                            \"flags\": {\n                                \"is_sneaking\": false\n                            }\n                        }\n                    }\n                ],\n                \"location\": [\n                    {\n                        \"condition\": \"minecraft:location_check\",\n                        \"predicate\": {\n                            \"block\": {\n                                \"blocks\": [\n                                    \"minecraft:{{ material_name }}_door\"\n                                ],\n                                \"state\": {\n                                    \"powered\": \"false\",\n                                    \"hinge\": \"left\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_double_doors:{{ material_name }}/door/left_hinge/use\"\n    }\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/advancement/use_right_hinge_door.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:default_block_use\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:entity_properties\",\n                        \"entity\": \"this\",\n                        \"predicate\": {\n                            \"flags\": {\n                                \"is_sneaking\": false\n                            }\n                        }\n                    }\n                ],\n                \"location\": [\n                    {\n                        \"condition\": \"minecraft:location_check\",\n                        \"predicate\": {\n                            \"block\": {\n                                \"blocks\": [\n                                    \"minecraft:{{ material_name }}_door\"\n                                ],\n                                \"state\": {\n                                    \"powered\": \"false\",\n                                    \"hinge\": \"right\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_double_doors:{{ material_name }}/door/right_hinge/use\"\n    }\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/east/find_neighbors.mcfunction",
    "content": "# Checks for neighboring doors which may also have to be opened alongside this door.\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/left_hinge/get_facing\n\n# open this door\nfunction gm4_double_doors:{{ material_name }}/door/left_hinge/east/toggle\n\n# check for potential neighbouring doors which should also be opened\nexecute positioned ~ ~ ~1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=east] run function gm4_double_doors:{{ material_name }}/door/right_hinge/east/toggle\nexecute positioned ~1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=west] run function gm4_double_doors:{{ material_name }}/door/right_hinge/west/toggle\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/east/initialize_auto_toggle_marker.mcfunction",
    "content": "# Initializes a freshly spawned auto toggle marker\n# @s = newly spawned auto toggle marker\n# at @s\n# run from toggle functions in gm4_double_doors:{{ material_name }}/door/...\n\n# set name\ndata modify entity @s CustomName set value \"gm4_double_doors_auto_toggle_marker\"\n\n# store inverted target door state onto marker\nexecute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0\nexecute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1\n\n# store hitbox orientation\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_west\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_north\n\n# set tags\ntag @s add gm4_double_doors_auto_toggle_marker\ntag @s add gm4_double_doors_left\ntag @s add gm4_double_doors_{{ material_name }}\n\n# set default lifetime in ticks\nscoreboard players set @s gm4_double_doors_auto_toggle_liftime 60\n\n# set starting state to 'waiting_for_player'\nscoreboard players set @s gm4_double_doors_auto_toggle_state 0\n\n# schedule auto toggle marker handling\nschedule function gm4_double_doors:auto_toggle_marker/find 1t\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/east/toggle.mcfunction",
    "content": "# Toggles the double door the player has interacted with.\n# @s = player that interacted with a door\n# at location of the lower half of the left door of the double door the player has interacted with\n# run from check_neighbours functions in gm4_double_doors:{{ material_name }}/door/left_hinge/.../find_neighbors\n\n# player just closed a door\nexecute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/east/left/closed ~ ~ ~\n\n# player just opened a door\nexecute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/east/left/open ~ ~ ~\n\n# get target trapdoor state (0->1, 1->0 for this direction)\nexecute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 0\n\n# check for potential trapdoors which should also be opened\nscoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data\nexecute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=west] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=north] run function gm4_double_doors:{{ material_name }}/trapdoor/south_east/check_neighbours\n\n# prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers\nexecute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0]\nexecute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/left_hinge/east/initialize_auto_toggle_marker\nexecute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1\n\n# reset fake player\nscoreboard players reset $found_prexisting_marker gm4_double_doors_data\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/get_facing.mcfunction",
    "content": "# Checks the facing block state of the door which was clicked.\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/left_hinge/get_lower_half\n\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=east] run function gm4_double_doors:{{ material_name }}/door/left_hinge/east/find_neighbors\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=north] run function gm4_double_doors:{{ material_name }}/door/left_hinge/north/find_neighbors\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=south] run function gm4_double_doors:{{ material_name }}/door/left_hinge/south/find_neighbors\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=west] run function gm4_double_doors:{{ material_name }}/door/left_hinge/west/find_neighbors\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/get_lower_half.mcfunction",
    "content": "# Forces the block selected by the raycast to be the lower half of a door\n# @s = player that interacted with a door\n# at location of the door the player has interacted with\n# run from gm4_double_doors:{{material_name}}/door/left_hinge/ray\n\nscoreboard players set $found gm4_double_doors_data 1\n\n# store whether the player opened a door (=1) or closed a door (=0)\nscoreboard players set $target_door_state gm4_double_doors_data 0\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[open=true] run scoreboard players set $target_door_state gm4_double_doors_data 1\n\n# if the targeted block is an upper half, get the lower half and reposition execution location\n# also ensure that the door is not broken (aka actually has both blocks present)\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[half=upper] positioned ~ ~-1 ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[half=lower] run function gm4_double_doors:{{ material_name }}/door/left_hinge/get_facing\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[half=lower] if block ~ ~1 ~ minecraft:{{ material_name }}_door[half=upper] run function gm4_double_doors:{{ material_name }}/door/left_hinge/get_facing\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/north/find_neighbors.mcfunction",
    "content": "# Checks for neighboring doors which may also have to be opened alongside this door.\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/left_hinge/get_facing\n\n# open this door\nfunction gm4_double_doors:{{ material_name }}/door/left_hinge/north/toggle\n\n# check for potential neighbouring doors which should also be opened, this neighbor has to be of the opposite hinge\nexecute positioned ~1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=north] run function gm4_double_doors:{{ material_name }}/door/right_hinge/north/toggle\nexecute positioned ~ ~ ~-1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=south] run function gm4_double_doors:{{ material_name }}/door/right_hinge/south/toggle\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/north/initialize_auto_toggle_marker.mcfunction",
    "content": "# Initializes a freshly spawned auto toggle marker\n# @s = newly spawned auto toggle marker\n# at @s\n# run from toggle functions in gm4_double_doors:{{ material_name }}/door/...\n\n# set name\ndata modify entity @s CustomName set value \"gm4_double_doors_auto_toggle_marker\"\n\n# store inverted target door state onto marker\nexecute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0\nexecute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1\n\n# store hitbox orientation\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_south\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_west\n\n# set tags\ntag @s add gm4_double_doors_auto_toggle_marker\ntag @s add gm4_double_doors_left\ntag @s add gm4_double_doors_{{ material_name }}\n\n# set default lifetime in ticks\nscoreboard players set @s gm4_double_doors_auto_toggle_liftime 60\n\n# set starting state to 'waiting_for_player'\nscoreboard players set @s gm4_double_doors_auto_toggle_state 0\n\n# schedule auto toggle marker handling\nschedule function gm4_double_doors:auto_toggle_marker/find 1t\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/north/toggle.mcfunction",
    "content": "# Toggles the double door the player has interacted with.\n# @s = player that interacted with a door\n# at location of the lower half of the left door of the double door the player has interacted with\n# run from check_neighbours functions in gm4_double_doors:{{ material_name }}/door/left_hinge/.../find_neighbors\n\n# player just closed a door\nexecute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/north/left/closed ~ ~ ~\n\n# player just opened a door\nexecute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/north/left/open ~ ~ ~\n\n# get target trapdoor state (0->0, 1->1 for this direction)\nexecute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 1\n\n# check for potential trapdoors which should also be opened\nscoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data\nexecute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=west] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=south] run function gm4_double_doors:{{ material_name }}/trapdoor/north_east/check_neighbours\n\n# prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers\nexecute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0]\nexecute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/left_hinge/north/initialize_auto_toggle_marker\nexecute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1\n\n# reset fake player\nscoreboard players reset $found_prexisting_marker gm4_double_doors_data\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/ray.mcfunction",
    "content": "# ray cast to find door\n# @s = player that interacted with a door\n# at @s anchored eyes positioned ^ ^ ^0.X where X = step count\n# run from gm4_double_doors:{{ material_name }}/door/left_hinge/use or self\n\n# check block\nscoreboard players set $found gm4_double_doors_data 0\nexecute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left] run function gm4_double_doors:{{ material_name }}/door/left_hinge/get_lower_half\n\n# runs the loop again\nscoreboard players remove $ray gm4_double_doors_data 1\nexecute unless score $found gm4_double_doors_data matches 1 if score $ray gm4_double_doors_data matches 1.. positioned ^ ^ ^0.1 run function gm4_double_doors:{{ material_name }}/door/left_hinge/ray\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/south/find_neighbors.mcfunction",
    "content": "# Checks for neighboring doors which may also have to be opened alongside this door.\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/left_hinge/get_facing\n\n# open this door\nfunction gm4_double_doors:{{ material_name }}/door/left_hinge/south/toggle\n\n# check for potential neighbouring doors which should also be opened, this neighbor has to be of the opposite hinge\nexecute positioned ~-1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=south] run function gm4_double_doors:{{ material_name }}/door/right_hinge/south/toggle\nexecute positioned ~ ~ ~1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=north] run function gm4_double_doors:{{ material_name }}/door/right_hinge/north/toggle\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/south/initialize_auto_toggle_marker.mcfunction",
    "content": "# Initializes a freshly spawned auto toggle marker\n# @s = newly spawned auto toggle marker\n# at @s\n# run from toggle functions in gm4_double_doors:{{ material_name }}/door/...\n\n# set name\ndata modify entity @s CustomName set value \"gm4_double_doors_auto_toggle_marker\"\n\n# store inverted target door state onto marker\nexecute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0\nexecute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1\n\n# store hitbox orientation\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_north\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_east\n\n# set tags\ntag @s add gm4_double_doors_auto_toggle_marker\ntag @s add gm4_double_doors_left\ntag @s add gm4_double_doors_{{ material_name }}\n\n# set default lifetime in ticks\nscoreboard players set @s gm4_double_doors_auto_toggle_liftime 60\n\n# set starting state to 'waiting_for_player'\nscoreboard players set @s gm4_double_doors_auto_toggle_state 0\n\n# schedule auto toggle marker handling\nschedule function gm4_double_doors:auto_toggle_marker/find 1t\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/south/toggle.mcfunction",
    "content": "# Toggles the double door the player has interacted with.\n# @s = player that interacted with a door\n# at location of the lower half of the left door of the double door the player has interacted with\n# run from check_neighbours functions in gm4_double_doors:{{ material_name }}/door/left_hinge/.../find_neighbors\n\n# player just closed a door\nexecute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/south/left/closed ~ ~ ~\n\n# player just opened a door\nexecute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/south/left/open ~ ~ ~\n\n# get target trapdoor state (0->0, 1->1 for this direction)\nexecute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 1\n\n# check for potential trapdoors which should also be opened\nscoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data\nexecute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=east] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=north] run function gm4_double_doors:{{ material_name }}/trapdoor/south_west/check_neighbours\n\n# prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers\nexecute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0]\nexecute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/left_hinge/south/initialize_auto_toggle_marker\nexecute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1\n\n# reset fake player\nscoreboard players reset $found_prexisting_marker gm4_double_doors_data\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/use.mcfunction",
    "content": "# Raycasts to the door that was clicked by the player.\n# @s = a player who has clicked a door and is not sneaking\n# at @s of the player\n# run from advancement gm4_double_doors:{{ material_name }}/use_left_hinge_door\n\n# revoke advancement\nadvancement revoke @s only gm4_double_doors:{{ material_name }}/use_left_hinge_door\n\n# raycast\nscoreboard players set $ray gm4_double_doors_data 50\nscoreboard players set $found gm4_double_doors_data 0\nexecute anchored eyes positioned ^ ^ ^ run function gm4_double_doors:{{ material_name }}/door/left_hinge/ray\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/west/find_neighbors.mcfunction",
    "content": "# Checks for neighboring doors which may also have to be opened alongside this door.\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/left_hinge/get_facing\n\n# open this door\nfunction gm4_double_doors:{{ material_name }}/door/left_hinge/west/toggle\n\n# check for potential neighbouring doors which should also be opened, this neighbor has to be of the opposite hinge\nexecute positioned ~ ~ ~-1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=west] run function gm4_double_doors:{{ material_name }}/door/right_hinge/west/toggle\nexecute positioned ~-1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=east] run function gm4_double_doors:{{ material_name }}/door/right_hinge/east/toggle\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/west/initialize_auto_toggle_marker.mcfunction",
    "content": "# Initializes a freshly spawned auto toggle marker\n# @s = newly spawned auto toggle marker\n# at @s\n# run from toggle functions in gm4_double_doors:{{ material_name }}/door/...\n\n# set name\ndata modify entity @s CustomName set value \"gm4_double_doors_auto_toggle_marker\"\n\n# store inverted target door state onto marker\nexecute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0\nexecute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1\n\n# store hitbox orientation\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_east\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_south\n\n# set tags\ntag @s add gm4_double_doors_auto_toggle_marker\ntag @s add gm4_double_doors_left\ntag @s add gm4_double_doors_{{ material_name }}\n\n# set default lifetime in ticks\nscoreboard players set @s gm4_double_doors_auto_toggle_liftime 60\n\n# set starting state to 'waiting_for_player'\nscoreboard players set @s gm4_double_doors_auto_toggle_state 0\n\n# schedule auto toggle marker handling\nschedule function gm4_double_doors:auto_toggle_marker/find 1t\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/west/toggle.mcfunction",
    "content": "# Toggles the double door the player has interacted with.\n# @s = player that interacted with a door\n# at location of the lower half of the left door of the double door the player has interacted with\n# run from check_neighbours functions in gm4_double_doors:{{ material_name }}/door/left_hinge/.../find_neighbors\n\n# player just closed a door\nexecute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/west/left/closed ~ ~ ~\n\n# player just opened a door\nexecute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/west/left/open ~ ~ ~\n\n# get target trapdoor state (0->1, 1->0 for this direction)\nexecute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 0\n\n# check for potential trapdoors which should also be opened\nscoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data\nexecute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=east] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=south] run function gm4_double_doors:{{ material_name }}/trapdoor/north_west/check_neighbours\n\n# prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers\nexecute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0]\nexecute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/left_hinge/west/initialize_auto_toggle_marker\nexecute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1\n\n# reset fake player\nscoreboard players reset $found_prexisting_marker gm4_double_doors_data\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/east/find_neighbors.mcfunction",
    "content": "# Checks for neighboring doors which may also have to be opened alongside this door.\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/right_hinge/east/get_facing\n\n# open this door\nfunction gm4_double_doors:{{ material_name }}/door/right_hinge/east/toggle\n\n# check for potential neighbouring doors which should also be opened\nexecute positioned ~ ~ ~-1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=east] run function gm4_double_doors:{{ material_name }}/door/left_hinge/east/toggle\nexecute positioned ~1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=west] run function gm4_double_doors:{{ material_name }}/door/left_hinge/west/toggle\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/east/initialize_auto_toggle_marker.mcfunction",
    "content": "# Initializes a freshly spawned auto toggle marker\n# @s = newly spawned auto toggle marker\n# at @s\n# run from toggle functions in gm4_double_doors:{{ material_name }}/door/...\n\n# set name\ndata modify entity @s CustomName set value \"gm4_double_doors_auto_toggle_marker\"\n\n# store inverted target door state onto marker\nexecute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0\nexecute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1\n\n# store hitbox orientation\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_west\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_south\n\n# set tags\ntag @s add gm4_double_doors_auto_toggle_marker\ntag @s add gm4_double_doors_right\ntag @s add gm4_double_doors_{{ material_name }}\n\n# set default lifetime in ticks\nscoreboard players set @s gm4_double_doors_auto_toggle_liftime 60\n\n# set starting state to 'waiting_for_player'\nscoreboard players set @s gm4_double_doors_auto_toggle_state 0\n\n# schedule auto toggle marker handling\nschedule function gm4_double_doors:auto_toggle_marker/find 1t\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/east/toggle.mcfunction",
    "content": "# Toggles the double door the player has interacted with.\n# @s = player that interacted with a door\n# at location of the lower half of the left door of the double door the player has interacted with\n# run from functions in gm4_double_doors:{{ material_name }}/door/right_hinge/.../check_neighbors\n\n# player just closed a door\nexecute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/east/right/closed ~ ~ ~\n\n# player just opened a door\nexecute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/east/right/open ~ ~ ~\n\n# get target trapdoor state (0->1, 1->0 for this direction)\nexecute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 0\n\n# check for potential trapdoors which should also be opened\nscoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data\nexecute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=west] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=south] run function gm4_double_doors:{{ material_name }}/trapdoor/north_east/check_neighbours\n\n# prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers\nexecute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0]\nexecute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/right_hinge/east/initialize_auto_toggle_marker\nexecute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1\n\n# reset fake player\nscoreboard players reset $found_prexisting_marker gm4_double_doors_data\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/get_facing.mcfunction",
    "content": "# Checks the facing block state of the door which was clicked.\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/right_hinge/get_lower_half\n\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=east] run function gm4_double_doors:{{ material_name }}/door/right_hinge/east/find_neighbors\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=north] run function gm4_double_doors:{{ material_name }}/door/right_hinge/north/find_neighbors\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=south] run function gm4_double_doors:{{ material_name }}/door/right_hinge/south/find_neighbors\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=west] run function gm4_double_doors:{{ material_name }}/door/right_hinge/west/find_neighbors\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/get_lower_half.mcfunction",
    "content": "# Forces the block selected by the raycast to be the lower half of a door\n# @s = player that interacted with a door\n# at location of the door the player has interacted with\n# run from gm4_double_doors:{{material_name}}/door/right_hinge/ray\n\nscoreboard players set $found gm4_double_doors_data 1\n\n# store whether the player opened a door (=1) or closed a door (=0)\nscoreboard players set $target_door_state gm4_double_doors_data 0\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[open=true] run scoreboard players set $target_door_state gm4_double_doors_data 1\n\n# if the targeted block is an upper half, get the lower half and reposition execution location\n# also ensure that the door is not broken (aka actually has both blocks present)\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[half=upper] positioned ~ ~-1 ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[half=lower] run function gm4_double_doors:{{ material_name }}/door/right_hinge/get_facing\nexecute if block ~ ~ ~ minecraft:{{ material_name }}_door[half=lower] if block ~ ~1 ~ minecraft:{{ material_name }}_door[half=upper] run function gm4_double_doors:{{ material_name }}/door/right_hinge/get_facing\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/north/find_neighbors.mcfunction",
    "content": "# Checks for neighboring doors which may also have to be opened alongside this door.\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/right_hinge/north/get_facing\n\n# open this door\nfunction gm4_double_doors:{{ material_name }}/door/right_hinge/north/toggle\n\n# check for potential neighbouring doors which should also be opened\nexecute positioned ~-1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=north] run function gm4_double_doors:{{ material_name }}/door/left_hinge/north/toggle\nexecute positioned ~ ~ ~-1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=south] run function gm4_double_doors:{{ material_name }}/door/left_hinge/south/toggle\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/north/initialize_auto_toggle_marker.mcfunction",
    "content": "# Initializes a freshly spawned auto toggle marker\n# @s = newly spawned auto toggle marker\n# at @s\n# run from toggle functions in gm4_double_doors:{{ material_name }}/door/...\n\n# set name\ndata modify entity @s CustomName set value \"gm4_double_doors_auto_toggle_marker\"\n\n# store inverted target door state onto marker\nexecute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0\nexecute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1\n\n# store hitbox orientation\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_south\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_east\n\n# set tags\ntag @s add gm4_double_doors_auto_toggle_marker\ntag @s add gm4_double_doors_right\ntag @s add gm4_double_doors_{{ material_name }}\n\n# set default lifetime in ticks\nscoreboard players set @s gm4_double_doors_auto_toggle_liftime 60\n\n# set starting state to 'waiting_for_player'\nscoreboard players set @s gm4_double_doors_auto_toggle_state 0\n\n# schedule auto toggle marker handling\nschedule function gm4_double_doors:auto_toggle_marker/find 1t\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/north/toggle.mcfunction",
    "content": "# Toggles the double door the player has interacted with.\n# @s = player that interacted with a door\n# at location of the lower half of the left door of the double door the player has interacted with\n# run from functions in gm4_double_doors:{{ material_name }}/door/right_hinge/.../check_neighbors\n\n# player just closed a door\nexecute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/north/right/closed ~ ~ ~\n\n# player just opened a door\nexecute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/north/right/open ~ ~ ~\n\n# get target trapdoor state (0->0, 1->1 for this direction)\nexecute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 1\n\n# check for potential trapdoors which should also be opened\nscoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data\nexecute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=east] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=south] run function gm4_double_doors:{{ material_name }}/trapdoor/north_west/check_neighbours\n\n# prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers\nexecute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0]\nexecute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/right_hinge/north/initialize_auto_toggle_marker\nexecute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1\n\n# reset fake player\nscoreboard players reset $found_prexisting_marker gm4_double_doors_data\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/ray.mcfunction",
    "content": "# ray cast to find door\n# @s = player that interacted with a door\n# at @s anchored eyes positioned ^ ^ ^0.X where X = step count\n# run from gm4_double_doors:{{ material_name }}/door/right_hinge/use or self\n\n# check block\nscoreboard players set $found gm4_double_doors_data 0\nexecute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right] run function gm4_double_doors:{{ material_name }}/door/right_hinge/get_lower_half\n\n# runs the loop again\nscoreboard players remove $ray gm4_double_doors_data 1\nexecute unless score $found gm4_double_doors_data matches 1 if score $ray gm4_double_doors_data matches 1.. positioned ^ ^ ^0.1 run function gm4_double_doors:{{ material_name }}/door/right_hinge/ray\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/south/find_neighbors.mcfunction",
    "content": "# Checks for neighboring doors which may also have to be opened alongside this door.\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/right_hinge/south/get_hinge\n\n# open this door\nfunction gm4_double_doors:{{ material_name }}/door/right_hinge/south/toggle\n\n# check for potential neighbouring doors which should also be opened\nexecute positioned ~1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=south] run function gm4_double_doors:{{ material_name }}/door/left_hinge/south/toggle\nexecute positioned ~ ~ ~1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=north] run function gm4_double_doors:{{ material_name }}/door/left_hinge/north/toggle\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/south/initialize_auto_toggle_marker.mcfunction",
    "content": "# Initializes a freshly spawned auto toggle marker\n# @s = newly spawned auto toggle marker\n# at @s\n# run from toggle functions in gm4_double_doors:{{ material_name }}/door/...\n\n# set name\ndata modify entity @s CustomName set value \"gm4_double_doors_auto_toggle_marker\"\n\n# store inverted target door state onto marker\nexecute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0\nexecute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1\n\n# store hitbox orientation\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_north\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_west\n\n# set tags\ntag @s add gm4_double_doors_auto_toggle_marker\ntag @s add gm4_double_doors_right\ntag @s add gm4_double_doors_{{ material_name }}\n\n# set default lifetime in ticks\nscoreboard players set @s gm4_double_doors_auto_toggle_liftime 60\n\n# set starting state to 'waiting_for_player'\nscoreboard players set @s gm4_double_doors_auto_toggle_state 0\n\n# schedule auto toggle marker handling\nschedule function gm4_double_doors:auto_toggle_marker/find 1t\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/south/toggle.mcfunction",
    "content": "# Toggles the double door the player has interacted with.\n# @s = player that interacted with a door\n# at location of the lower half of the left door of the double door the player has interacted with\n# run from functions in gm4_double_doors:{{ material_name }}/door/right_hinge/.../check_neighbors\n\n# player just closed a door\nexecute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/south/right/closed ~ ~ ~\n\n# player just opened a door\nexecute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/south/right/open ~ ~ ~\n\n# get target trapdoor state (0->0, 1->1 for this direction)\nexecute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 1\n\n# check for potential trapdoors which should also be opened\nscoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data\nexecute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=west] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=north] run function gm4_double_doors:{{ material_name }}/trapdoor/south_east/check_neighbours\n\n# prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers\nexecute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0]\nexecute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/right_hinge/south/initialize_auto_toggle_marker\nexecute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1\n\n# reset fake player\nscoreboard players reset $found_prexisting_marker gm4_double_doors_data\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/use.mcfunction",
    "content": "# Raycasts to the door that was clicked by the player.\n# @s = a player who has clicked a door and is not sneaking\n# at @s of the player\n# run from advancement gm4_double_doors:{{ material_name }}/use_right_hinge_door\n\n# revoke advancement\nadvancement revoke @s only gm4_double_doors:{{ material_name }}/use_right_hinge_door\n\n# raycast\nscoreboard players set $ray gm4_double_doors_data 50\nscoreboard players set $found gm4_double_doors_data 0\nexecute anchored eyes positioned ^ ^ ^ run function gm4_double_doors:{{ material_name }}/door/right_hinge/ray\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/west/find_neighbors.mcfunction",
    "content": "# Checks for neighbouring doors which may also have to be opened alongside this door.\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/right_hinge/west/get_hinge\n\n# open this door\nfunction gm4_double_doors:{{ material_name }}/door/right_hinge/west/toggle\n\n# check for potential neighbouring doors which should also be opened\nexecute positioned ~ ~ ~1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=west] run function gm4_double_doors:{{ material_name }}/door/left_hinge/west/toggle\nexecute positioned ~-1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=east] run function gm4_double_doors:{{ material_name }}/door/left_hinge/east/toggle\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/west/initialize_auto_toggle_marker.mcfunction",
    "content": "# Initializes a freshly spawned auto toggle marker\n# @s = newly spawned auto toggle marker\n# at @s\n# run from toggle functions in gm4_double_doors:{{ material_name }}/door/...\n\n# set name\ndata modify entity @s CustomName set value \"gm4_double_doors_auto_toggle_marker\"\n\n# store inverted target door state onto marker\nexecute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0\nexecute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1\n\n# store hitbox orientation\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_east\nexecute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_north\n\n# set tags\ntag @s add gm4_double_doors_auto_toggle_marker\ntag @s add gm4_double_doors_right\ntag @s add gm4_double_doors_{{ material_name }}\n\n# set default lifetime in ticks\nscoreboard players set @s gm4_double_doors_auto_toggle_liftime 60\n\n# set starting state to 'waiting_for_player'\nscoreboard players set @s gm4_double_doors_auto_toggle_state 0\n\n# schedule auto toggle marker handling\nschedule function gm4_double_doors:auto_toggle_marker/find 1t\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/west/toggle.mcfunction",
    "content": "# Toggles the double door the player has interacted with.\n# @s = player that interacted with a door\n# at location of the lower half of the left door of the double door the player has interacted with\n# run from functions in gm4_double_doors:{{ material_name }}/door/right_hinge/.../check_neighbors\n\n# player just closed a door\nexecute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/west/right/closed ~ ~ ~\n\n# player just opened a door\nexecute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/west/right/open ~ ~ ~\n\n# get target trapdoor state (0->1, 1->0 for this direction)\nexecute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 0\n\n# check for potential trapdoors which should also be opened\nscoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data\nexecute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=east] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=north] run function gm4_double_doors:{{ material_name }}/trapdoor/south_west/check_neighbours\n\n# prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers\nexecute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0]\nexecute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/right_hinge/west/initialize_auto_toggle_marker\nexecute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1\n\n# reset fake player\nscoreboard players reset $found_prexisting_marker gm4_double_doors_data\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/north_east/check_neighbours.mcfunction",
    "content": "# Initiates opening (in the door opening sense) of this trapdoor and looks for additional trapdoors above this trapdoor, unless the maximum trapdoor level was exceeded\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/east/right/toggle and gm4_double_doors:{{ material_name }}/door/north/left/toggle\n\n# open this trapdoor\nfunction gm4_double_doors:{{ material_name }}/trapdoor/north_east/toggle\n\n# check for potential trapdoors which should also be opened\nscoreboard players remove $trap_door_recursion_level gm4_double_doors_data 1\nexecute if score $trap_door_recursion_level gm4_double_doors_data matches 1.. positioned ~ ~1 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=west] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=south] run function gm4_double_doors:{{ material_name }}/trapdoor/north_east/check_neighbours\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/north_east/toggle.mcfunction",
    "content": "# Toggles this trapdoor, in the sense that the trapdoor is rotated around the z-axis (like a door)\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/trapdoor/north_est/check_neighbours\n\n# player just closed a door\nexecute if score $target_trapdoor_state gm4_double_doors_data matches 0 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=north]\n\n# player just opened a door\nexecute if score $target_trapdoor_state gm4_double_doors_data matches 1 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=east]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/north_west/check_neighbours.mcfunction",
    "content": "# Initiates opening (in the door opening sense) of this trapdoor and looks for additional trapdoors above this trapdoor, unless the maximum trapdoor level was exceeded\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/north/right/toggle and gm4_double_doors:{{ material_name }}/door/west/left/toggle\n\n# open this trapdoor\nfunction gm4_double_doors:{{ material_name }}/trapdoor/north_west/toggle\n\n# check for potential trapdoors which should also be opened\nscoreboard players remove $trap_door_recursion_level gm4_double_doors_data 1\nexecute if score $trap_door_recursion_level gm4_double_doors_data matches 1.. positioned ~ ~1 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=east] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=south] run function gm4_double_doors:{{ material_name }}/trapdoor/north_west/check_neighbours\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/north_west/toggle.mcfunction",
    "content": "# Toggles this trapdoor, in the sense that the trapdoor is rotated around the z-axis (like a door)\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/trapdoor/north_west/check_neighbours\n\n# player just closed a door\nexecute if score $target_trapdoor_state gm4_double_doors_data matches 0 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=north]\n\n# player just opened a door\nexecute if score $target_trapdoor_state gm4_double_doors_data matches 1 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=west]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/south_east/check_neighbours.mcfunction",
    "content": "# Initiates opening (in the door opening sense) of this trapdoor and looks for additional trapdoors above this trapdoor, unless the maximum trapdoor level was exceeded\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/east/left/toggle and gm4_double_doors:{{ material_name }}/door/south/right/toggle\n\n# open this trapdoor\nfunction gm4_double_doors:{{ material_name }}/trapdoor/south_east/toggle\n\n# check for potential trapdoors which should also be opened\nscoreboard players remove $trap_door_recursion_level gm4_double_doors_data 1\nexecute if score $trap_door_recursion_level gm4_double_doors_data matches 1.. positioned ~ ~1 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=west] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=north] run function gm4_double_doors:{{ material_name }}/trapdoor/south_east/check_neighbours\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/south_east/toggle.mcfunction",
    "content": "# Toggles this trapdoor, in the sense that the trapdoor is rotated around the z-axis (like a door)\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/trapdoor/south_east/check_neighbours\n\n# player just closed a door\nexecute if score $target_trapdoor_state gm4_double_doors_data matches 0 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=south]\n\n# player just opened a door\nexecute if score $target_trapdoor_state gm4_double_doors_data matches 1 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=east]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/south_west/check_neighbours.mcfunction",
    "content": "# Initiates opening (in the door opening sense) of this trapdoor and looks for additional trapdoors above this trapdoor, unless the maximum trapdoor level was exceeded\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/door/west/right/toggle and gm4_double_doors:{{ material_name }}/door/south/left/toggle\n\n# open this trapdoor\nfunction gm4_double_doors:{{ material_name }}/trapdoor/south_west/toggle\n\n# check for potential trapdoors which should also be opened\nscoreboard players remove $trap_door_recursion_level gm4_double_doors_data 1\nexecute if score $trap_door_recursion_level gm4_double_doors_data matches 1.. positioned ~ ~1 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=east] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=north] run function gm4_double_doors:{{ material_name }}/trapdoor/south_west/check_neighbours\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/south_west/toggle.mcfunction",
    "content": "# Toggles this trapdoor, in the sense that the trapdoor is rotated around the z-axis (like a door)\n# @s = player that interacted with a door\n# at location of the lower half of the door the player has interacted with\n# run from gm4_double_doors:{{ material_name }}/trapdoor/south_west/check_neighbours\n\n# player just closed a door\nexecute if score $target_trapdoor_state gm4_double_doors_data matches 0 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=south]\n\n# player just opened a door\nexecute if score $target_trapdoor_state gm4_double_doors_data matches 1 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=west]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/east/left/closed.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"east\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"east\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/east/left/open.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"east\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"east\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/east/right/closed.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"east\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"east\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/east/right/open.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"east\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"east\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/north/left/closed.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"north\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"north\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/north/left/open.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"north\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"north\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/north/right/closed.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"north\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"north\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/north/right/open.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"north\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"north\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/south/left/closed.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"south\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"south\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/south/left/open.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"south\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"south\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/south/right/closed.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"south\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"south\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/south/right/open.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"south\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"south\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/west/left/closed.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"west\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"west\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/west/left/open.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"west\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"left\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"west\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/west/right/closed.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"west\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"west\",\n        open: \"false\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/templates/structure/door/west/right/open.snbt",
    "content": "{\n  size: [\n    1,\n    2,\n    1\n  ],\n  entities: [],\n  blocks: [\n    {\n      pos: [\n        0,\n        0,\n        0\n      ],\n      state: 0\n    },\n    {\n      pos: [\n        0,\n        1,\n        0\n      ],\n      state: 1\n    }\n  ],\n  palette: [\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"lower\",\n        powered: \"false\",\n        facing: \"west\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    },\n    {\n      Properties: {\n        hinge: \"right\",\n        half: \"upper\",\n        powered: \"false\",\n        facing: \"west\",\n        open: \"true\"\n      },\n      Name: \"minecraft:{{ material_name }}_door\"\n    }\n  ],\n  DataVersion: 3465\n}\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/auto_toggle_east_inverted.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_east_inverted\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~1.5 -90 0\n\n# open door\ndummy @s use block ~2 ~2 ~1\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=false,facing=south,hinge=right,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=false,facing=south,hinge=right,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# move dummy into door and chech that it is still open\nexecute at @s run tp @s ^ ^ ^0.75\nawait delay 10t\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=false,facing=south,hinge=right,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=false,facing=south,hinge=right,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# move dummy behind door and check that it is closed again\nexecute at @s run tp @s ^ ^ ^1\nawait delay 20t\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=true,facing=south,hinge=right,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=true,facing=south,hinge=right,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/auto_toggle_east_normal.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_east_normal\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~1.5 -90 0\n\n# open door\ndummy @s use block ~2 ~2 ~1\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=true,facing=east,hinge=left,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=true,facing=east,hinge=left,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# move dummy into door and chech that it is still open\nexecute at @s run tp @s ^ ^ ^0.75\nawait delay 10t\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=true,facing=east,hinge=left,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=true,facing=east,hinge=left,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# move dummy behind door and check that it is closed again\nexecute at @s run tp @s ^ ^ ^1\nawait delay 20t\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=false,facing=east,hinge=left,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=false,facing=east,hinge=left,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=east,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=east,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/auto_toggle_north_inverted.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_north_inverted\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~3.5 180 0\n\n# open door\ndummy @s use block ~1 ~2 ~2\n\n# left column\nassert block ~1 ~1 ~2 oak_door[open=false,facing=east,hinge=right,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=false,facing=east,hinge=right,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# move dummy into door and chech that it is still open\nexecute at @s run tp @s ^ ^ ^0.75\nawait delay 10t\n\n# left column\nassert block ~1 ~1 ~2 oak_door[open=false,facing=east,hinge=right,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=false,facing=east,hinge=right,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# move dummy behind door and check that it is closed again\nexecute at @s run tp @s ^ ^ ^1\nawait delay 20t\n\n# left column\nassert block ~1 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=west,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=west,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/auto_toggle_north_normal.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_north_normal\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~3.5 180 0\n\n# open door\ndummy @s use block ~1 ~2 ~2\n\n# left column\nassert block ~1 ~1 ~2 oak_door[open=true,facing=north,hinge=left,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=true,facing=north,hinge=left,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# move dummy into door and chech that it is still open\nexecute at @s run tp @s ^ ^ ^0.75\nawait delay 10t\n\n# left column\nassert block ~1 ~1 ~2 oak_door[open=true,facing=north,hinge=left,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=true,facing=north,hinge=left,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# move dummy behind door and check that it is closed again\nexecute at @s run tp @s ^ ^ ^1\nawait delay 20t\n\n# left column\nassert block ~1 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/auto_toggle_south_inverted.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_south_inverted\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~1.5 0 0\n\n# open door\ndummy @s use block ~1 ~2 ~2\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# right column\nassert block ~1 ~1 ~2 oak_door[open=false,facing=east,hinge=left,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=false,facing=east,hinge=left,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# move dummy into door and chech that it is still open\nexecute at @s run tp @s ^ ^ ^0.75\nawait delay 10t\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# right column\nassert block ~1 ~1 ~2 oak_door[open=false,facing=east,hinge=left,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=false,facing=east,hinge=left,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# move dummy behind door and check that it is closed again\nexecute at @s run tp @s ^ ^ ^1\nawait delay 20t\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=west,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=west,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# right column\nassert block ~1 ~1 ~2 oak_door[open=true,facing=east,hinge=left,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=true,facing=east,hinge=left,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/auto_toggle_south_normal.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_south_normal\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~1.5 0 0\n\n# open door\ndummy @s use block ~1 ~2 ~2\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=south,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=south,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# right column\nassert block ~1 ~1 ~2 oak_door[open=true,facing=south,hinge=right,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=true,facing=south,hinge=right,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# move dummy into door and chech that it is still open\nexecute at @s run tp @s ^ ^ ^0.75\nawait delay 10t\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=south,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=south,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# right column\nassert block ~1 ~1 ~2 oak_door[open=true,facing=south,hinge=right,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=true,facing=south,hinge=right,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# move dummy behind door and check that it is closed again\nexecute at @s run tp @s ^ ^ ^1\nawait delay 20t\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=south,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=south,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# right column\nassert block ~1 ~1 ~2 oak_door[open=false,facing=south,hinge=right,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=false,facing=south,hinge=right,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/auto_toggle_west_inverted.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_east_inverted\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~1.5 -90 0\n\n# open door\ndummy @s use block ~2 ~2 ~1\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=false,facing=south,hinge=right,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=false,facing=south,hinge=right,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# move dummy into door and chech that it is still open\nexecute at @s run tp @s ^ ^ ^0.75\nawait delay 10t\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=false,facing=south,hinge=right,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=false,facing=south,hinge=right,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# move dummy behind door and check that it is closed again\nexecute at @s run tp @s ^ ^ ^1\nawait delay 20t\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=true,facing=south,hinge=right,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=true,facing=south,hinge=right,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/auto_toggle_west_normal.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_east_normal\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~1.5 -90 0\n\n# open door\ndummy @s use block ~2 ~2 ~1\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=true,facing=east,hinge=left,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=true,facing=east,hinge=left,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# move dummy into door and chech that it is still open\nexecute at @s run tp @s ^ ^ ^0.75\nawait delay 10t\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=true,facing=east,hinge=left,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=true,facing=east,hinge=left,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# move dummy behind door and check that it is closed again\nexecute at @s run tp @s ^ ^ ^1\nawait delay 20t\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=false,facing=east,hinge=left,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=false,facing=east,hinge=left,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=east,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=east,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/toggle_east_inverted.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_east_inverted\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~1.5 -90 0\n\n# open door\ndummy @s use block ~2 ~2 ~1\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=false,facing=south,hinge=right,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=false,facing=south,hinge=right,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# close door\ndummy @s use block ~2 ~2 ~1\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=true,facing=south,hinge=right,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=true,facing=south,hinge=right,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/toggle_east_normal.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_east_normal\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~1.5 -90 0\n\n# open door\ndummy @s use block ~2 ~2 ~1\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=true,facing=east,hinge=left,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=true,facing=east,hinge=left,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# close door\ndummy @s use block ~2 ~2 ~1\n\n# left column\nassert block ~2 ~1 ~1 oak_door[open=false,facing=east,hinge=left,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=false,facing=east,hinge=left,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=east,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=east,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/toggle_north_inverted.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_north_inverted\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~3.5 180 0\n\n# open door\ndummy @s use block ~1 ~2 ~2\n\n# left column\nassert block ~1 ~1 ~2 oak_door[open=false,facing=east,hinge=right,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=false,facing=east,hinge=right,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# close door\ndummy @s use block ~1 ~2 ~2\n\n# left column\nassert block ~1 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=west,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=west,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/toggle_north_normal.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_north_normal\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~3.5 180 0\n\n# open door\ndummy @s use block ~1 ~2 ~2\n\n# left column\nassert block ~1 ~1 ~2 oak_door[open=true,facing=north,hinge=left,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=true,facing=north,hinge=left,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# close door\ndummy @s use block ~1 ~2 ~2\n\n# left column\nassert block ~1 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n\n# right column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/toggle_south_inverted.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_south_inverted\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~1.5 0 0\n\n# open door\ndummy @s use block ~1 ~2 ~2\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# right column\nassert block ~1 ~1 ~2 oak_door[open=false,facing=east,hinge=left,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=false,facing=east,hinge=left,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# close door\ndummy @s use block ~1 ~2 ~2\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=west,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=west,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# right column\nassert block ~1 ~1 ~2 oak_door[open=true,facing=east,hinge=left,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=true,facing=east,hinge=left,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/toggle_south_normal.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_south_normal\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~1.5 ~1 ~1.5 0 0\n\n# open door\ndummy @s use block ~1 ~2 ~2\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=south,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=south,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# right column\nassert block ~1 ~1 ~2 oak_door[open=true,facing=south,hinge=right,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=true,facing=south,hinge=right,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# close door\ndummy @s use block ~1 ~2 ~2\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=south,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=south,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n\n# right column\nassert block ~1 ~1 ~2 oak_door[open=false,facing=south,hinge=right,half=lower]\nassert block ~1 ~2 ~2 oak_door[open=false,facing=south,hinge=right,half=upper]\nassert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/toggle_west_inverted.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_west_inverted\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~3.5 ~1 ~1.5 90 0\n\n# open door\ndummy @s use block ~2 ~2 ~1\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\n\n# right column\nassert block ~2 ~1 ~1 oak_door[open=false,facing=south,hinge=left,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=false,facing=south,hinge=left,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=west,half=bottom]\n\n# close door\ndummy @s use block ~2 ~2 ~1\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=right,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=right,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\n\n# right column\nassert block ~2 ~1 ~1 oak_door[open=true,facing=south,hinge=left,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=true,facing=south,hinge=left,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=west,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/data/gm4_double_doors/test/toggle_west_normal.mcfunction",
    "content": "# @template gm4_double_doors:test/valid_door_west_normal\n# @dummy\n\n# position dummy and make it face the right way\ntp @s ~3.5 ~1 ~1.5 90 0\n\n# open door\ndummy @s use block ~2 ~2 ~1\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=true,facing=west,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=true,facing=west,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\n\n# right column\nassert block ~2 ~1 ~1 oak_door[open=true,facing=west,hinge=right,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=true,facing=west,hinge=right,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=west,half=bottom]\n\n# close door\ndummy @s use block ~2 ~2 ~1\n\n# left column\nassert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=left,half=lower]\nassert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=left,half=upper]\nassert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=west,half=bottom]\n\n# right column\nassert block ~2 ~1 ~1 oak_door[open=false,facing=west,hinge=right,half=lower]\nassert block ~2 ~2 ~1 oak_door[open=false,facing=west,hinge=right,half=upper]\nassert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=west,half=bottom]\nassert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=west,half=bottom]\n"
  },
  {
    "path": "gm4_double_doors/generate.py",
    "content": "from typing import ClassVar, List\nfrom pathlib import Path\nimport csv\nfrom dataclasses import dataclass\nimport logging\n\nfrom beet import Context, Structure, TextFile, subproject\nfrom beet.contrib.vanilla import Vanilla\nfrom nbtlib import parse_nbt\nfrom gm4.plugins.manifest import repro_structure_to_bytes\n\nlogger = logging.getLogger(__name__)\n\nclass StringStructure(TextFile):\n    \"\"\"Create class that loads .snbt files into the beet project\"\"\"\n    scope: ClassVar[tuple[str, ...]] = (\"structure\",)\n    extension: ClassVar[str] = \".snbt\"\n\n    def serialize_to_structure(self) -> Structure:\n        return Structure(parse_nbt(self.text), serializer=repro_structure_to_bytes)\n\n\ndef register_snbt_files(ctx: Context):\n    # register the custom file-type with beet so those files are mounted\n    ctx.data.extend_namespace.append(StringStructure)\n\n\ndef read_sound_id_from_csv():\n    with open(Path('gm4_double_doors', 'raw', 'sound_names.csv'), mode='r') as file:\n        csv_file = csv.reader(file)\n        next(csv_file)  # skip header line\n        return {row[0]: DoorSound(open=row[1],close=row[2]) for row in csv_file}\n    \ndef resolve_blocktag(ctx: Context, minecraft_version: str, tag_name: str) -> List[str]:\n    \"\"\"\n    Traverses the given block tag depth-first, replacing all mentions of vanilla block tags with their contents.\n    Returns a flat list of all block ids contained in the block tag and any sub-tags.\n    Raises a `ValueError` if a block tag can not be resolved.\n    \"\"\"\n    vanilla = ctx.inject(Vanilla)\n    vanilla.minecraft_version = minecraft_version\n    tag_name = tag_name.removeprefix(\"#\")  # hash-symbol is not needed for lookup\n    if tag_name not in vanilla.data.block_tags:  # ensure block tag exists\n        raise ValueError(f\"Unknown block tag '{tag_name}' for Minecraft version '{minecraft_version}'!\")\n    \n    entries: List[str] = vanilla.data.block_tags[tag_name].data[\"values\"]\n    out: List[str] = []\n    for entry in entries:\n        if entry.startswith(\"#minecraft:\"):  # found another block tag, resolve it first\n            out += resolve_blocktag(ctx, minecraft_version, entry)\n        else:\n            out.append(entry)  # block id, append to out\n    return out\n\n@dataclass\nclass DoorSound():\n    open: str\n    close: str\n\n\ndef beet_default(ctx: Context):\n\n    # prepare list of door materials\n    door_materials = [\n        door.removeprefix(\"minecraft:\").removesuffix(\"_door\")\n        for door in resolve_blocktag(ctx, \"26.1\", \"minecraft:mob_interactable_doors\")\n    ]\n    # make list of wood types accessible for bolt\n    ctx.meta['door_materials'] = door_materials\n\n    # store door opening/closing sounds to dict\n    sound_ids = read_sound_id_from_csv()\n    for wood in door_materials:\n        if not wood in sound_ids: # if sound is not specified in csv, default to normal wooden door sound\n            logger.info(f\"{wood} door has no sound effect configured in sound_names.json! Using the default instead.\")\n            sound_ids[wood] = DoorSound(open='minecraft:block.wooden_door.open', close='minecraft:block.wooden_door.close')\n    ctx.meta['sound_ids'] = sound_ids  # make sound dict accessible to bolt\n\n    # for each wood type in the vanilla doors tag, render a copy of the \"templates\" directory with the appropiate wood-type\n    for wood in door_materials:\n        subproject_config = {\n            \"require\": [\n                \"gm4_double_doors.generate.register_snbt_files\"\n            ],\n            \"data_pack\": {\n                \"load\": [\n                    {\n                        f\"data/gm4_double_doors/advancement/{wood}\": \"data/gm4_double_doors/templates/advancement\",\n                        f\"data/gm4_double_doors/function/{wood}\": \"data/gm4_double_doors/templates/function\",\n                        f\"data/gm4_double_doors/structure/{wood}\": \"data/gm4_double_doors/templates/structure\",\n                    }\n                ],\n                \"render\": {\n                    \"advancement\": \"*\",\n                    \"function\": \"*\",\n                    \"string_structure\": \"*\"  # renders all mounted files of the StringStructure container\n                }\n            },\n            \"meta\": {\n                \"material_name\": wood\n            }\n        }\n\n        ctx.require(subproject(subproject_config))\n\n    # transform the \"string-structure\" files into actual binary files\n    for name, struct in ctx.data[StringStructure].items():\n        ctx.data[Structure][name] = struct.serialize_to_structure()\n    ctx.data[StringStructure].clear()\n"
  },
  {
    "path": "gm4_double_doors/raw/sound_names.csv",
    "content": "wood_type, open_sound_id, close_sound_id\nacacia,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close\nbamboo,minecraft:block.bamboo_wood_door.open,minecraft:block.bamboo_wood_door.close\nbirch,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close\ncherry,minecraft:block.cherry_wood_door.open,minecraft:block.cherry_wood_door.close\ncopper,minecraft:block.copper_door.open,minecraft:block.copper_door.close\ncrimson,minecraft:block.nether_wood_door.open,minecraft:block.nether_wood_door.close\ndark_oak,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close\nexposed_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close\njungle,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close\nmangrove,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close\noak,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close\noxidized_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close\npale_oak,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close\nspruce,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close\nwarped,minecraft:block.nether_wood_door.open,minecraft:block.nether_wood_door.close\nwaxed_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close\nwaxed_exposed_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close\nwaxed_oxidized_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close\nwaxed_weathered_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close\nweathered_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close\n"
  },
  {
    "path": "gm4_double_doors/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.double_doors,\"Tired of clicking twice to open a double door? Annoyed by the fact that doors are only two blocks tall? This data pack automatically opens adjacent doors, making double doors fully functional! Additionally, bottom trapdoors of matching wood type placed above a door are opened alongside the door when it is opened by a player.\"\ntext.gm4.guidebook.double_doors.description,\"Placing two doors adjacent to each other will link them together, so they open together.\\n\\nTrapdoors placed above doors will also act as part of the door, opening when the doors open.\"\n"
  },
  {
    "path": "gm4_dripleaf_filters/README.md",
    "content": "# Dripleaf Filters<!--$headerTitle--><!--$pmc:delete-->\r\nSort streams of items out with Big Dripleafs spitting items out that match the pattern.<!--$pmc:headerSize-->\r\n\r\n<img src=\"images/dripleaf_filters.webp\" alt=\"Items being filtered with a Dripleaf\" width=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\r\n\r\n### Features\r\n- Create a filter by placing a hopper in front of the dripleaf, with any matching items being moved into it\r\n- Any other item will pass through the big dripleaf, so can be captured with a hopper underneath it\r\n"
  },
  {
    "path": "gm4_dripleaf_filters/beet.yaml",
    "content": "id: gm4_dripleaf_filters\nname: Dripleaf Filters\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    website:\n      description: Dripleaves will flick items that match a hopper's contents into the hopper for you!\n      recommended:\n        - gm4_book_binders\n      notes: []\n    modrinth:\n      project_id: WNvo6RJr\n    wiki: https://wiki.gm4.co/wiki/Dripleaf_Filters\n    credits:\n      Creator:\n        - Sparks\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_dripleaf_filters/data/gm4_dripleaf_filters/function/check_hopper_filter.mcfunction",
    "content": "# Checks if the item matches any of the items in the hopper\n# @s item on a dripleaf\n# at @s aligned xz\n# run from gm4_dripleaf_filters:on_leaf\n\n# store the item's ID in storage\ndata modify storage gm4_dripleaf_filters:cache compare_id set from entity @s Item.id\n# store the hopper's items in storage\ndata modify storage gm4_dripleaf_filters:cache whitelisted_items set from block ^ ^-1 ^1 Items\n\n# loop through the slots to see if any IDs match\nfunction gm4_dripleaf_filters:match_item\n\nexecute if score $items_are_different gm4_dripleaf_filters matches 0 run function gm4_dripleaf_filters:deposit_item\n"
  },
  {
    "path": "gm4_dripleaf_filters/data/gm4_dripleaf_filters/function/deposit_item.mcfunction",
    "content": "# Causes the item to slide off the dripleaf\n# @s an item that can go into the hopper\n# at @s aligned xz\n# run from gm4_dripleaf_filters:check_hopper_filter\n\nexecute if block ~ ~ ~ big_dripleaf[facing=west] run data modify entity @s Motion set value [-0.15d,0.07d,0.0d]\nexecute if block ~ ~ ~ big_dripleaf[facing=east] run data modify entity @s Motion set value [0.15d,0.07d,0.0d]\nexecute if block ~ ~ ~ big_dripleaf[facing=south] run data modify entity @s Motion set value [0.0d,0.07d,0.15d]\nexecute if block ~ ~ ~ big_dripleaf[facing=north] run data modify entity @s Motion set value [0.0d,0.07d,-0.15d]\n"
  },
  {
    "path": "gm4_dripleaf_filters/data/gm4_dripleaf_filters/function/init.mcfunction",
    "content": "execute unless score dripleaf_filters gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Dripleaf Filters\"}\nexecute unless score dripleaf_filters gm4_earliest_version < dripleaf_filters gm4_modules run scoreboard players operation dripleaf_filters gm4_earliest_version = dripleaf_filters gm4_modules\nscoreboard players set dripleaf_filters gm4_modules 1\n\nscoreboard objectives add gm4_dripleaf_filters dummy\n\nschedule function gm4_dripleaf_filters:main 1t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_dripleaf_filters/data/gm4_dripleaf_filters/function/main.mcfunction",
    "content": "execute as @e[type=item] at @s if block ~ ~ ~ big_dripleaf align xz positioned ~0.5 ~ ~0.5 run function gm4_dripleaf_filters:on_leaf\n\nschedule function gm4_dripleaf_filters:main 16t\n"
  },
  {
    "path": "gm4_dripleaf_filters/data/gm4_dripleaf_filters/function/match_item.mcfunction",
    "content": "# Loops through all slots in the hopper that contain items and checks if they match the item on the leaf\n# @s = item on a dripleaf\n# at @s aligned xz\n# run from gm4_dripleaf_filters:check_hopper_filter and itself\n\nexecute store success score $items_are_different gm4_dripleaf_filters run data modify storage gm4_dripleaf_filters:cache whitelisted_items[0].id set from storage gm4_dripleaf_filters:cache compare_id\nexecute if score $items_are_different gm4_dripleaf_filters matches 1 run data remove storage gm4_dripleaf_filters:cache whitelisted_items[0]\nexecute if score $items_are_different gm4_dripleaf_filters matches 1 if data storage gm4_dripleaf_filters:cache whitelisted_items[0] run function gm4_dripleaf_filters:match_item\n"
  },
  {
    "path": "gm4_dripleaf_filters/data/gm4_dripleaf_filters/function/on_leaf.mcfunction",
    "content": "# Determine leaf orientation and look for a hopper with items in front of the leaf\n# @s an item on a big dripleaf\n# at @s aligned xz\n# run from gm4_dripleaf_filters:main\n\n# determine leaf orientation\nexecute if block ~ ~ ~ big_dripleaf[facing=south] run teleport @s ~ ~ ~ 0 0\nexecute if block ~ ~ ~ big_dripleaf[facing=west] run teleport @s ~ ~ ~ 90 0\nexecute if block ~ ~ ~ big_dripleaf[facing=north] run teleport @s ~ ~ ~ 180 0\nexecute if block ~ ~ ~ big_dripleaf[facing=east] run teleport @s ~ ~ ~ -90 0\n\n#if the hopper has items in it, check if any of the items match this one\nexecute at @s if block ^ ^-1 ^1 hopper{Items:[{}]} run function gm4_dripleaf_filters:check_hopper_filter\n"
  },
  {
    "path": "gm4_dripleaf_filters/data/gm4_dripleaf_filters/guidebook/dripleaf_filters.json",
    "content": "{\n  \"id\": \"dripleaf_filters\",\n  \"name\": \"Dripleaf Filters\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:big_dripleaf\"\n  },\n  \"criteria\": {\n    \"obtain_dripleaf_and_hopper\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:big_dripleaf\"\n            ]\n          },\n          {\n            \"items\": [\n              \"minecraft:hopper\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.dripleaf_filters.description\",\n            \"fallback\": \"Big dripleaves can sort items by searching hoppers in front of them.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_dripleaf_and_hopper\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.dripleaf_filters.structure\",\n            \"fallback\": \"When an item falls onto a big dripleaf, the leaf will inspect a hopper placed on the ground in front of it.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.dripleaf_filters.filtering\",\n            \"fallback\": \"If any of the items in the hopper match the item on the leaf, it will slide the item into the hopper.\\n\\nOtherwise it will collapse and drop the item below itself like normal.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_dripleaf_filters/data/gm4_dripleaf_filters/test/fallthrough.mcfunction",
    "content": "# @template gm4_dripleaf_filters:test_setup\n# @skyaccess\n\nitem replace block ~ ~1 ~1 container.0 with minecraft:iron_ingot\nsummon item ~1.5 ~4 ~1.4 {Item:{id:\"minecraft:gold_ingot\",count:10}}\n\nawait items block ~1 ~ ~1 container.* minecraft:gold_ingot[count=10]\n"
  },
  {
    "path": "gm4_dripleaf_filters/data/gm4_dripleaf_filters/test/slide.mcfunction",
    "content": "# @template gm4_dripleaf_filters:test_setup\n# @skyaccess\n\nitem replace block ~ ~1 ~1 container.0 with minecraft:iron_ingot\nsummon item ~1.5 ~4 ~1.4 {Item:{id:\"minecraft:iron_ingot\",count:10}}\n\nawait items block ~ ~1 ~1 container.* minecraft:iron_ingot[count=11]\nassert not items block ~1 ~ ~1 container.* *\n"
  },
  {
    "path": "gm4_dripleaf_filters/mod.mcdoc",
    "content": "use ::java::world::item::ItemStack\n\ndispatch minecraft:storage[gm4_dripleaf_filters:cache] to struct {\n  compare_id?: #[id=\"item\"] string,\n  whitelisted_items?: [ItemStack] @ ..5,\n}\n"
  },
  {
    "path": "gm4_dripleaf_filters/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.dripleaf_filters,Dripleaves will flick items that match a hopper's contents into the hopper for you!\ntext.gm4.guidebook.dripleaf_filters.description,Big dripleaves can sort items by searching hoppers in front of them.\ntext.gm4.guidebook.dripleaf_filters.structure,\"When an item falls onto a big dripleaf, the leaf will inspect a hopper placed on the ground in front of it.\"\ntext.gm4.guidebook.dripleaf_filters.filtering,\"If any of the items in the hopper match the item on the leaf, it will slide the item into the hopper.\\n\\nOtherwise it will collapse and drop the item below itself like normal.\"\n"
  },
  {
    "path": "gm4_dripleaf_launchers/README.md",
    "content": "# Dripleaf Launchers<!--$headerTitle--><!--$pmc:delete-->\n\nWho wants to find the nearest cliff to deploy their Elytra? Use the power of nature and launch yourself into the air with just a Dripleaf plant (and some redstone)!<!--$pmc:headerSize-->\n\n### Features\n- Stand on a tilted Big Dripleaf and power it with redstone to launch into the air.\n- Use an Observer and 4 ticks of Repeater delay for the perfect launch!\n"
  },
  {
    "path": "gm4_dripleaf_launchers/beet.yaml",
    "content": "id: gm4_dripleaf_launchers\nname: Dripleaf Launchers\nversion: 1.5.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: \n        - main\n        - tick\n    website:\n      description: Start your own Dripleaf Space Program!\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: kUn3Z6gZ\n    smithed:\n      pack_id: gm4_dripleaf_launchers\n    wiki: https://wiki.gm4.co/wiki/Dripleaf_Launchers\n    credits:\n      Creator:\n        - Djones\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/function/check.mcfunction",
    "content": "# check players on dripleafs\n# @s = player\n# at @s\n# run from tick\n\n# dripleaf needs partial tilt before launch is possible\ntag @s[predicate=gm4_dripleaf_launchers:dripleaf_tilted] add gm4_dl_dripleaf_ready\n# if launch is possible and dripleaf is reset to no tilt through redstone launch player\nexecute if entity @s[tag=gm4_dl_dripleaf_ready,predicate=gm4_dripleaf_launchers:dripleaf_no_tilt] run function gm4_dripleaf_launchers:launch\n# if dripleaf goes either full tilt or back to no tilt before launch is ready remove tag\ntag @s[predicate=!gm4_dripleaf_launchers:dripleaf_triggered] remove gm4_dl_on_dripleaf\ntag @s[tag=!gm4_dl_on_dripleaf] remove gm4_dl_dripleaf_ready\n"
  },
  {
    "path": "gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/function/init.mcfunction",
    "content": "execute unless score dripleaf_launchers gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Dripleaf Launchers\"}\nscoreboard players set dripleaf_launchers gm4_modules 1\n\nschedule function gm4_dripleaf_launchers:main 1t\nschedule function gm4_dripleaf_launchers:tick 1t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/function/launch.mcfunction",
    "content": "# launch into the air!\n# @s = player\n# at @s\n# run from check\n\ntag @s remove gm4_dl_on_dripleaf\n\n# vfx\nplaysound minecraft:block.big_dripleaf.tilt_up player @s ~ ~1 ~ 3 0 1\nplaysound minecraft:block.beehive.enter player @s ~ ~1 ~ 1 1.6 1\nexecute align xyz run particle minecraft:block{block_state:\"minecraft:big_dripleaf\"} ~.5 ~.93751 ~.5 0.25 0.01 0.25 0 12\n\n# grant levitation for 4 ticks\nsummon minecraft:area_effect_cloud ~ ~ ~ {custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"},ReapplicationDelay:0,Age:-1,Radius:0.5f,RadiusPerTick:0f,RadiusOnUse:-0.5f,Duration:4,WaitTime:0,potion_contents:{custom_effects:[{id:'minecraft:levitation',amplifier:40b,duration:4,show_particles:0b,show_icon:0b,ambient:1b}]}}\n"
  },
  {
    "path": "gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/function/main.mcfunction",
    "content": "schedule function gm4_dripleaf_launchers:main 4t\n\n# tag players on dripleaf (with no or partial tilt)\nexecute as @a[gamemode=!spectator] at @s[predicate=gm4_dripleaf_launchers:dripleaf_triggered] run tag @s add gm4_dl_on_dripleaf\n"
  },
  {
    "path": "gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/function/tick.mcfunction",
    "content": "schedule function gm4_dripleaf_launchers:tick 1t\n\n# process players on dripleaf\nexecute as @a[gamemode=!spectator,tag=gm4_dl_on_dripleaf] at @s run function gm4_dripleaf_launchers:check\n"
  },
  {
    "path": "gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/guidebook/dripleaf_launchers.json",
    "content": "{\n  \"id\": \"dripleaf_launchers\",\n  \"name\": \"Dripleaf Launchers\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:big_dripleaf\"\n  },\n  \"criteria\": {\n    \"obtain_dripleaf\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:big_dripleaf\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_dripleaf\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.dripleaf_launchers.description\",\n            \"fallback\": \"Sending a redstone signal to a big dripleaf with partial tilt will launch anyone on it into the air.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/predicate/dripleaf_no_tilt.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"location\": {\n      \"block\": {\n        \"blocks\": [\n          \"minecraft:big_dripleaf\"\n        ],\n        \"state\": {\n          \"tilt\": \"none\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/predicate/dripleaf_tilted.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"location\": {\n      \"block\": {\n        \"blocks\": [\n          \"minecraft:big_dripleaf\"\n        ],\n        \"state\": {\n          \"tilt\": \"partial\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/predicate/dripleaf_triggered.json",
    "content": "{\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n        {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n                \"location\": {\n                    \"block\": {\n                        \"blocks\": [\n                            \"minecraft:big_dripleaf\"\n                        ],\n                        \"state\": {\n                            \"tilt\": \"partial\"\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n                \"location\": {\n                    \"block\": {\n                        \"blocks\": [\n                            \"minecraft:big_dripleaf\"\n                        ],\n                        \"state\": {\n                            \"tilt\": \"unstable\"\n                        }\n                    }\n                }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/test/launch.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~2 ~1\n# @skyaccess\n\nsetblock ~1 ~ ~1 minecraft:dirt\nsetblock ~1 ~1 ~1 minecraft:big_dripleaf\n\nawait block ~1 ~1 ~1 minecraft:big_dripleaf[tilt=partial]\n\nawait delay 4t\n\nsetblock ~ ~1 ~1 minecraft:redstone_block\n\nawait entity @s[distance=7..]\n"
  },
  {
    "path": "gm4_dripleaf_launchers/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.dripleaf_launchers,Start your own Dripleaf Space Program!\ntext.gm4.guidebook.dripleaf_launchers.description,Sending a redstone signal to a big dripleaf with partial tilt will launch anyone on it into the air.\n"
  },
  {
    "path": "gm4_end_fishing/README.md",
    "content": "# End Fishing<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nYou can now fish in the Void?<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Allows the use of a fishing rod in the End Void\r\n- Fishing has loot like when casting a reel on water and is different in each end biome\r\n- Adds the rare \"Enderpuff\" which levitates the player and mitigates fall damage\r\n\r\nMore specifics on the loot available and the chances per biome can be found on the [Wiki](https://wiki.gm4.co/End_Fishing)\r\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/elytra/broken_captains_wings.json",
    "content": "{\n    \"parent\": \"minecraft:item/generated\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/elytra/broken_captains_wings\"\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/elytra/broken_ravaged_wings.json",
    "content": "{\n    \"parent\": \"minecraft:item/generated\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/elytra/broken_ravaged_wings\"\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/elytra/captains_wings.json",
    "content": "{\n    \"parent\": \"minecraft:item/generated\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/elytra/captains_wings\"\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/elytra/ravaged_wings.json",
    "content": "{\n    \"parent\": \"minecraft:item/generated\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/elytra/ravaged_wings\"\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_1.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_1\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.977,\n                0.977,\n                0.977\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.977,\n                0.977,\n                0.977\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.748,\n                0.748,\n                0.748\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.748,\n                0.748,\n                0.748\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_10.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_10\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.4,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.4,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_11.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_11\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                3.5,\n                0.65\n            ],\n            \"scale\": [\n                0.765,\n                0.765,\n                0.765\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                3.5,\n                0.65\n            ],\n            \"scale\": [\n                0.765,\n                0.765,\n                0.765\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.612,\n                0.612,\n                0.612\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.612,\n                0.612,\n                0.612\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_12.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_12\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.25,\n                0.65\n            ],\n            \"scale\": [\n                0.8755,\n                0.8755,\n                0.8755\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.25,\n                0.65\n            ],\n            \"scale\": [\n                0.8755,\n                0.8755,\n                0.8755\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7004,\n                0.7004,\n                0.7004\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7004,\n                0.7004,\n                0.7004\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_13.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_13\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.8,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.8,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_14.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_14\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.5,\n                0.5\n            ],\n            \"scale\": [\n                1.02,\n                1.02,\n                1.02\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.5,\n                0.5\n            ],\n            \"scale\": [\n                1.02,\n                1.02,\n                1.02\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.816,\n                0.816,\n                0.816\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.816,\n                0.816,\n                0.816\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_15.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_15\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_16.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_16\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.3,\n                0.5\n            ],\n            \"scale\": [\n                0.799,\n                0.799,\n                0.799\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.3,\n                0.5\n            ],\n            \"scale\": [\n                0.799,\n                0.799,\n                0.799\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.6392,\n                0.6392,\n                0.6392\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.6392,\n                0.6392,\n                0.6392\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_17.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_17\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_18.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_18\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_19.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_19\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.2,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.2,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_2.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_2\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.6,\n                0.5\n            ],\n            \"scale\": [\n                0.8755,\n                0.8755,\n                0.8755\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.6,\n                0.5\n            ],\n            \"scale\": [\n                0.8755,\n                0.8755,\n                0.8755\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7004,\n                0.7004,\n                0.7004\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7004,\n                0.7004,\n                0.7004\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_20.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_20\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_3.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_3\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.67,\n                0.5\n            ],\n            \"scale\": [\n                0.884,\n                0.884,\n                0.884\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.67,\n                0.5\n            ],\n            \"scale\": [\n                0.884,\n                0.884,\n                0.884\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7072,\n                0.7072,\n                0.7072\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7072,\n                0.7072,\n                0.7072\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_4.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_4\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.8,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.8,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_5.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_5\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.65,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.65,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_6.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_6\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.0,\n                0.2\n            ],\n            \"scale\": [\n                0.85,\n                0.85,\n                0.85\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.0,\n                0.2\n            ],\n            \"scale\": [\n                0.85,\n                0.85,\n                0.85\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.68,\n                0.68,\n                0.68\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.68,\n                0.68,\n                0.68\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_7.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_7\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                3.1,\n                0.73\n            ],\n            \"scale\": [\n                0.7395,\n                0.7395,\n                0.7395\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                3.1,\n                0.73\n            ],\n            \"scale\": [\n                0.7395,\n                0.7395,\n                0.7395\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.5916,\n                0.5916,\n                0.5916\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.5916,\n                0.5916,\n                0.5916\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_8.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_8\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.7,\n                0.5\n            ],\n            \"scale\": [\n                0.85,\n                0.85,\n                0.85\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.7,\n                0.5\n            ],\n            \"scale\": [\n                0.85,\n                0.85,\n                0.85\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.68,\n                0.68,\n                0.68\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.68,\n                0.68,\n                0.68\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_9.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/diamond_sword_9\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.2,\n                0.5\n            ],\n            \"scale\": [\n                0.8925,\n                0.8925,\n                0.8925\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.2,\n                0.5\n            ],\n            \"scale\": [\n                0.8925,\n                0.8925,\n                0.8925\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.714,\n                0.714,\n                0.714\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.714,\n                0.714,\n                0.714\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_1.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_1\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.977,\n                0.977,\n                0.977\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.977,\n                0.977,\n                0.977\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.748,\n                0.748,\n                0.748\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.748,\n                0.748,\n                0.748\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_10.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_10\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.4,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.4,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_11.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_11\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                3.5,\n                0.65\n            ],\n            \"scale\": [\n                0.765,\n                0.765,\n                0.765\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                3.5,\n                0.65\n            ],\n            \"scale\": [\n                0.765,\n                0.765,\n                0.765\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.612,\n                0.612,\n                0.612\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.612,\n                0.612,\n                0.612\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_12.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_12\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.25,\n                0.65\n            ],\n            \"scale\": [\n                0.8755,\n                0.8755,\n                0.8755\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.25,\n                0.65\n            ],\n            \"scale\": [\n                0.8755,\n                0.8755,\n                0.8755\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7004,\n                0.7004,\n                0.7004\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7004,\n                0.7004,\n                0.7004\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_13.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_13\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.8,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.8,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_14.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_14\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.5,\n                0.5\n            ],\n            \"scale\": [\n                1.02,\n                1.02,\n                1.02\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.5,\n                0.5\n            ],\n            \"scale\": [\n                1.02,\n                1.02,\n                1.02\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.816,\n                0.816,\n                0.816\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.816,\n                0.816,\n                0.816\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_15.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_15\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_16.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_16\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.3,\n                0.5\n            ],\n            \"scale\": [\n                0.799,\n                0.799,\n                0.799\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.3,\n                0.5\n            ],\n            \"scale\": [\n                0.799,\n                0.799,\n                0.799\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.6392,\n                0.6392,\n                0.6392\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.6392,\n                0.6392,\n                0.6392\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_17.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_17\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_18.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_18\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_19.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_19\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.2,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.2,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_2.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_2\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.6,\n                0.5\n            ],\n            \"scale\": [\n                0.8755,\n                0.8755,\n                0.8755\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.6,\n                0.5\n            ],\n            \"scale\": [\n                0.8755,\n                0.8755,\n                0.8755\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7004,\n                0.7004,\n                0.7004\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7004,\n                0.7004,\n                0.7004\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_20.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_20\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_3.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_3\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.67,\n                0.5\n            ],\n            \"scale\": [\n                0.884,\n                0.884,\n                0.884\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.67,\n                0.5\n            ],\n            \"scale\": [\n                0.884,\n                0.884,\n                0.884\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7072,\n                0.7072,\n                0.7072\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7072,\n                0.7072,\n                0.7072\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_4.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_4\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.8,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.8,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_5.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_5\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.65,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.65,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_6.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_6\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.0,\n                0.2\n            ],\n            \"scale\": [\n                0.85,\n                0.85,\n                0.85\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.0,\n                0.2\n            ],\n            \"scale\": [\n                0.85,\n                0.85,\n                0.85\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.68,\n                0.68,\n                0.68\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.68,\n                0.68,\n                0.68\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_7.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_7\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                3.1,\n                0.73\n            ],\n            \"scale\": [\n                0.7395,\n                0.7395,\n                0.7395\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                3.1,\n                0.73\n            ],\n            \"scale\": [\n                0.7395,\n                0.7395,\n                0.7395\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.5916,\n                0.5916,\n                0.5916\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.5916,\n                0.5916,\n                0.5916\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_8.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_8\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.7,\n                0.5\n            ],\n            \"scale\": [\n                0.85,\n                0.85,\n                0.85\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.7,\n                0.5\n            ],\n            \"scale\": [\n                0.85,\n                0.85,\n                0.85\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.68,\n                0.68,\n                0.68\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.68,\n                0.68,\n                0.68\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_9.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/iron_sword_9\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.2,\n                0.5\n            ],\n            \"scale\": [\n                0.8925,\n                0.8925,\n                0.8925\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.2,\n                0.5\n            ],\n            \"scale\": [\n                0.8925,\n                0.8925,\n                0.8925\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.714,\n                0.714,\n                0.714\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.714,\n                0.714,\n                0.714\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_1.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_1\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.977,\n                0.977,\n                0.977\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.977,\n                0.977,\n                0.977\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.748,\n                0.748,\n                0.748\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.748,\n                0.748,\n                0.748\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_10.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_10\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.4,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.4,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_11.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_11\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                3.5,\n                0.65\n            ],\n            \"scale\": [\n                0.765,\n                0.765,\n                0.765\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                3.5,\n                0.65\n            ],\n            \"scale\": [\n                0.765,\n                0.765,\n                0.765\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.612,\n                0.612,\n                0.612\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.612,\n                0.612,\n                0.612\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_12.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_12\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.25,\n                0.65\n            ],\n            \"scale\": [\n                0.8755,\n                0.8755,\n                0.8755\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.25,\n                0.65\n            ],\n            \"scale\": [\n                0.8755,\n                0.8755,\n                0.8755\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7004,\n                0.7004,\n                0.7004\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7004,\n                0.7004,\n                0.7004\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_13.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_13\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.8,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.8,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_14.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_14\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.5,\n                0.5\n            ],\n            \"scale\": [\n                1.02,\n                1.02,\n                1.02\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.5,\n                0.5\n            ],\n            \"scale\": [\n                1.02,\n                1.02,\n                1.02\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.816,\n                0.816,\n                0.816\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.816,\n                0.816,\n                0.816\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_15.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_15\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_16.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_16\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.3,\n                0.5\n            ],\n            \"scale\": [\n                0.799,\n                0.799,\n                0.799\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.3,\n                0.5\n            ],\n            \"scale\": [\n                0.799,\n                0.799,\n                0.799\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.6392,\n                0.6392,\n                0.6392\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.6392,\n                0.6392,\n                0.6392\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_17.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_17\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_18.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_18\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_19.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_19\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.2,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.2,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_2.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_2\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.6,\n                0.5\n            ],\n            \"scale\": [\n                0.8755,\n                0.8755,\n                0.8755\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.6,\n                0.5\n            ],\n            \"scale\": [\n                0.8755,\n                0.8755,\n                0.8755\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7004,\n                0.7004,\n                0.7004\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7004,\n                0.7004,\n                0.7004\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_20.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_20\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.3,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_3.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_3\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.67,\n                0.5\n            ],\n            \"scale\": [\n                0.884,\n                0.884,\n                0.884\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.67,\n                0.5\n            ],\n            \"scale\": [\n                0.884,\n                0.884,\n                0.884\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7072,\n                0.7072,\n                0.7072\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7072,\n                0.7072,\n                0.7072\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_4.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_4\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.8,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.8,\n                0.5\n            ],\n            \"scale\": [\n                0.9265,\n                0.9265,\n                0.9265\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7412,\n                0.7412,\n                0.7412\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_5.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_5\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.65,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.65,\n                0.5\n            ],\n            \"scale\": [\n                0.952,\n                0.952,\n                0.952\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.7616,\n                0.7616,\n                0.7616\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_6.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_6\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.0,\n                0.2\n            ],\n            \"scale\": [\n                0.85,\n                0.85,\n                0.85\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.0,\n                0.2\n            ],\n            \"scale\": [\n                0.85,\n                0.85,\n                0.85\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.68,\n                0.68,\n                0.68\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.68,\n                0.68,\n                0.68\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_7.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_7\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                3.1,\n                0.73\n            ],\n            \"scale\": [\n                0.7395,\n                0.7395,\n                0.7395\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                3.1,\n                0.73\n            ],\n            \"scale\": [\n                0.7395,\n                0.7395,\n                0.7395\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.5916,\n                0.5916,\n                0.5916\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.5916,\n                0.5916,\n                0.5916\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_8.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_8\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                4.7,\n                0.5\n            ],\n            \"scale\": [\n                0.85,\n                0.85,\n                0.85\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                4.7,\n                0.5\n            ],\n            \"scale\": [\n                0.85,\n                0.85,\n                0.85\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.68,\n                0.68,\n                0.68\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.68,\n                0.68,\n                0.68\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_9.json",
    "content": "{\n    \"parent\": \"minecraft:item/handheld\",\n    \"textures\": {\n        \"layer0\": \"gm4_end_fishing:item/swords/netherite_sword_9\"\n    },\n    \"display\": {\n        \"thirdperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                55\n            ],\n            \"translation\": [\n                0,\n                5.2,\n                0.5\n            ],\n            \"scale\": [\n                0.8925,\n                0.8925,\n                0.8925\n            ]\n        },\n        \"thirdperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -55\n            ],\n            \"translation\": [\n                0,\n                5.2,\n                0.5\n            ],\n            \"scale\": [\n                0.8925,\n                0.8925,\n                0.8925\n            ]\n        },\n        \"firstperson_righthand\": {\n            \"rotation\": [\n                0,\n                -90,\n                25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.714,\n                0.714,\n                0.714\n            ]\n        },\n        \"firstperson_lefthand\": {\n            \"rotation\": [\n                0,\n                90,\n                -25\n            ],\n            \"translation\": [\n                1.13,\n                3.2,\n                1.13\n            ],\n            \"scale\": [\n                0.714,\n                0.714,\n                0.714\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/optifine/cit/captains_wings.properties",
    "content": "type=elytra\nmatchItems=elytra\ntexture.elytra=elytra_10\nnbt.CustomModelData=$item/captains_wings\n"
  },
  {
    "path": "gm4_end_fishing/assets/gm4_end_fishing/optifine/cit/ravaged_wings.properties",
    "content": "type=elytra\nmatchItems=elytra\ntexture.elytra=ravaged_wings\nnbt.CustomModelData=$item/ravaged_wings\n"
  },
  {
    "path": "gm4_end_fishing/assets/translations.csv",
    "content": "key,en_us\nitem.gm4.end_fishing.ravaged_wings,Ravaged Wings\nitem.gm4.enderpuff,Enderpuff\ntext.gm4.end_city_armor.1,Lost on End City moving day\ntext.gm4.end_city_armor.2,Forged by Seppo Ilmarinen\ntext.gm4.end_city_armor.3,Belongs to Achilles\ntext.gm4.end_city_armor.4,Made by Wayland the Smith\ntext.gm4.end_city_armor.5,Worn during the battle of Ender Ender\ntext.gm4.end_city_armor.6.1,This thing's been rotting in\ntext.gm4.end_city_armor.6.2,the void for at least a century.\ntext.gm4.end_city_armor.7,Passed down over many generations\ntext.gm4.end_city_armor.8,Wear this to become invisible to nobody!\ntext.gm4.end_city_armor.9.1,I promise you can fly while wearing this.\ntext.gm4.end_city_armor.9.2,\"Trust me, just jump into the void.\"\ntext.gm4.end_city_armor.10.1,With this you shall be immortal!\ntext.gm4.end_city_armor.10.2,Or is it immoral? I can't remember.\ntext.gm4.end_city_horse_armor.1,That's some good barding!\ntext.gm4.end_city_horse_armor.2.1,There's a horse somewhere\ntext.gm4.end_city_horse_armor.2.2,that lost this armour.\ntext.gm4.end_city_horse_armor.3.1,Floating horses must be\ntext.gm4.end_city_horse_armor.3.2,\"a thing somewhere, right?\"\ntext.gm4.end_city_horse_armor.4,Too bad there's no horse weapons.\ntext.gm4.end_city_horse_armor.5,Made with the finest materials known to man\ntext.gm4.end_city_ore.1,The riches of the vast void\ntext.gm4.end_city_ore.2,Dropped from a nearby End City\ntext.gm4.end_city_ore.3,There's so much treasure down there!\ntext.gm4.end_city_ore.4,Cursed by the ancient Goddess\ntext.gm4.end_city_ore.5,This isn't real. It's fake treasure.\ntext.gm4.end_city_ore.6,Cha-Ching! We're going to be rich!\ntext.gm4.end_city_sword.1,Forged in a dragon's breath\ntext.gm4.end_city_sword.2.1,\"Life kills life all the time, so the Goddess\"\ntext.gm4.end_city_sword.2.2,sacrifices herself for her own animal.\ntext.gm4.end_city_sword.3,Blessed with Hylia's power\ntext.gm4.end_city_sword.4,Forged by Muramasa\ntext.gm4.end_city_sword.5,Powered by the living crystal within\ntext.gm4.end_city_sword.6,\"Used to decapitate the Gorgon, Medusa\"\ntext.gm4.end_city_sword.7.1,This is believed to be one of the\ntext.gm4.end_city_sword.7.2,finest Japanese swords ever made.\ntext.gm4.end_city_sword.8,Used at the Battle of the Trench\ntext.gm4.end_city_sword.9,Removed from the Garden of Eden\ntext.gm4.end_city_sword.10,Used to kill the dragon Fafnir\ntext.gm4.end_city_sword.11,Snicker-snack!\ntext.gm4.end_city_sword.12.1,Created by husband and wife magicians\ntext.gm4.end_city_sword.12.2,of the ancient Bön tradition\ntext.gm4.end_city_sword.13,Belongs to Roland\ntext.gm4.end_city_sword.14.1,\"If found, please return\"\ntext.gm4.end_city_sword.14.2,to William Wallace.\ntext.gm4.end_city_sword.15,Reforged from the shards of Narsil\ntext.gm4.end_city_sword.16,Forged by the Iron Sisters\ntext.gm4.end_city_sword.17.1,Used to lead the revolutionary\ntext.gm4.end_city_sword.17.2,army against the Telmarines\ntext.gm4.end_city_sword.18,Can only be wielded by a true Gryffindor\ntext.gm4.end_city_sword.19,Sought by Thrax\ntext.gm4.end_city_sword.20,Wielded by Lion-O\ntext.gm4.end_city_tool.1.1,It's been said only those\ntext.gm4.end_city_tool.1.2,who are worthy can wield this tool.\ntext.gm4.end_city_tool.2.1,Once there was a man named\ntext.gm4.end_city_tool.2.2,Tubal-cain who made this tool.\ntext.gm4.end_city_tool.3,\"If found, please return to Hephaestus.\"\ntext.gm4.end_city_tool.4.1,This is actually a really hard\ntext.gm4.end_city_tool.4.2,piece of bread. Don't tell anyone.\ntext.gm4.end_city_tool.5,Found in the Valley of the Fallen Kings\ntext.gm4.end_city_tool.6.1,Throw it. Maybe it'll come back!\ntext.gm4.end_city_tool.6.2,\"No, it's not a hammer, sadly.\"\ntext.gm4.end_city_tool.7,\"Thunk, Thunk, Thunk!\"\ntext.gm4.end_city_tool.8.1,Forged by the Leader of\ntext.gm4.end_city_tool.8.2,the Endermen Rebellion\ntext.gm4.end_city_tool.9,It's not a very good shield.\ntext.gm4.end_city_tool.10.1,Where'd you find this? It's been\ntext.gm4.end_city_tool.10.2,floating in the end for over a decade!\ntext.gm4.end_ship_elytra.10.1,Nobody imagined the Captain's lost\ntext.gm4.end_ship_elytra.10.2,\"wings would be seen again, ever.\"\nadvancement.gm4.end_fishing.title,I Wonder What's Down There?\nadvancement.gm4.end_fishing.description,Catch some loot from the end void\nadvancement.gm4.end_fishing_phantom.title,That's Not a Fish!\nadvancement.gm4.end_fishing_phantom.description,Fish up a phantom from the end void\nadvancement.gm4.end_fishing_swords.title,Master of the Swords\nadvancement.gm4.end_fishing_swords.description,Retrieve all of the lost swords from the void\ntext.gm4.guidebook.module_desc.end_fishing,\"Catch rare loot by fishing in the end void! The void holds many riches, from End City loot and Elytra to weapons that once belonged to explorers time forgot, collect them all!\"\ntext.gm4.guidebook.end_fishing.description,Casting a fishing rod into the end void will allow one to fish up loot from the void.\\n\\nLoot is biome dependent.\ntext.gm4.guidebook.end_fishing.end_phantom,\"End Phantoms can be fished up from the end void.\\n\\nThey are larger and stronger than normal phantoms, but have a chance to drop a broken elytra upon death.\"\n"
  },
  {
    "path": "gm4_end_fishing/beet.yaml",
    "content": "id: gm4_end_fishing\nname: End Fishing\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - register_model_data\n  - generate_optifine\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops:\n        - main\n        - tick\n    model_data:\n      # swords, armor, and tools are registered by plugin\n      - template: generated\n        item: player_head\n        reference: item/enderpuff\n      - item: elytra\n        reference: item/captains_wings\n        template:\n          name: condition\n          property: minecraft:broken\n          on_true: item/elytra/broken_captains_wings\n          on_false: item/elytra/captains_wings\n      - item: elytra\n        reference: item/ravaged_wings\n        template:\n          name: condition\n          property: minecraft:broken\n          on_true: item/elytra/broken_ravaged_wings\n          on_false: item/elytra/ravaged_wings\n      - item: fishing_rod\n        reference: gui/advancement/end_fishing\n        template: advancement\n      - item: diamond_sword\n        reference: gui/advancement/end_fishing_swords\n        template:\n          name: advancement\n          forward: item/swords/diamond_sword_12\n      - item: elytra\n        reference: gui/advancement/end_fishing_phantom\n        template:\n          name: advancement\n          forward: item/elytra/broken_ravaged_wings\n    website:\n      description: Catch rare loot by fishing in the end void! The void holds many riches, from End City loot and Elytra to weapons that once belonged to explorers time forgot, collect them all!\n      recommended:\n        - gm4_resource_pack\n        - gm4_reeling_rods\n        - gm4_live_catch\n      notes: []\n    modrinth:\n      project_id: BbEwao9o\n    wiki: https://wiki.gm4.co/wiki/End_Fishing\n    credits:\n      Creator:\n        - BPR\n      Icon Design:\n        - Sparks\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4/advancement/end_fishing.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"fishing_rod\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:gui/advancement/end_fishing\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.end_fishing.title\",\n      \"fallback\": \"I Wonder What's Down There?\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.end_fishing.description\",\n      \"fallback\": \"Catch some loot from the end void\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"fish_in_end\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4/advancement/end_fishing_phantom.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"elytra\",\n      \"components\": {\n        \"minecraft:damage\": 432,\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:gui/advancement/end_fishing_phantom\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.end_fishing_phantom.title\",\n      \"fallback\": \"That's Not a Fish!\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.end_fishing_phantom.description\",\n      \"fallback\": \"Fish up a phantom from the end void\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:end_fishing\",\n  \"criteria\": {\n    \"fish_up_phantom\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4/advancement/end_fishing_swords.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"diamond_sword\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:gui/advancement/end_fishing_swords\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.end_fishing_swords.title\",\n      \"fallback\": \"Master of the Swords\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.end_fishing_swords.description\",\n      \"fallback\": \"Retrieve all of the lost swords from the void\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:end_fishing\",\n  \"criteria\": {\n    \"end_city_sword_1\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:1b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_2\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:2b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_3\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:3b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_4\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:4b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_5\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:5b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_6\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:6b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_7\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:7b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_8\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:8b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_9\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:9b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_10\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:10b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_11\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:11b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_12\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:12b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_13\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:13b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_14\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:14b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_15\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:15b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_16\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:16b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_17\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:17b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_18\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:18b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_19\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:19b}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"end_city_sword_20\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{end_city_sword:20b}}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/advancement/check_inventory.json",
    "content": "{\n  \"criteria\": {\n    \"change_inventory\": {\n      \"trigger\": \"minecraft:inventory_changed\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_end_fishing:enderpuff/check_inventory\"\n  }\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/advancement/reel_loot.json",
    "content": "{\n    \"criteria\": {\n        \"reel_loot\": {\n            \"trigger\": \"minecraft:fishing_rod_hooked\",\n            \"conditions\": {\n                \"entity\": {\n                    \"type\": \"minecraft:armor_stand\",\n                    \"nbt\": \"{Tags:[\\\"gm4_no_edit\\\",\\\"gm4_ef_has_fish\\\"]}\",\n                    \"location\": {\n                        \"dimension\": \"the_end\"\n                    }\n                }\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_end_fishing:reel_in/reel_loot\"\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/advancement/reel_rod.json",
    "content": "{\n    \"criteria\": {\n        \"reel_in\": {\n            \"trigger\": \"minecraft:fishing_rod_hooked\",\n            \"conditions\": {\n                \"entity\": {\n                    \"type\": \"minecraft:armor_stand\",\n                    \"nbt\": \"{Tags:[\\\"gm4_no_edit\\\",\\\"gm4_end_fishing_bait\\\"]}\",\n                    \"location\": {\n                        \"dimension\": \"the_end\"\n                    }\n                }\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_end_fishing:reel_in/reel_rod\"\n    }\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/advancement/set_id.json",
    "content": "{\n  \"criteria\": {\n    \"join_world\": {\n      \"trigger\": \"location\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_end_fishing:set_id\"\n  }\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/cast_rod/marker.mcfunction",
    "content": "# @s = fishing bait armor stand to be turned into a marker\n# run from cast_rod/update_bait\n\n# make marker\ndata merge entity @s {Marker:1b}\ntag @s add gm4_ef_marker\nsummon minecraft:armor_stand ~ ~ ~ {Small:1b,Invisible:1b,Tags:[\"gm4_ef_bobber_update\"]}\nschedule function gm4_end_fishing:go_fish/update_bobber 1t\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/cast_rod/randomize_timer.mcfunction",
    "content": "# @s = fishing bait armor stand\n# run from cast_rod/summon_bait and go_fish/bobber_animation\n\nsummon marker ~ ~ ~ {Tags:[\"gm4_ef_rand\"]}\n# randomizes between 19-76\nexecute store result score $rand gm4_ef_data run data get entity @e[type=marker,tag=gm4_ef_rand,limit=1] UUID[0]\nscoreboard players operation $rand gm4_ef_data %= #57 gm4_ef_data\nscoreboard players add $rand gm4_ef_data 19\n\n# decrease time depending on lure\nscoreboard players operation $decrease gm4_ef_data = @s gm4_ef_lure\nscoreboard players operation $decrease gm4_ef_data *= #6 gm4_ef_data\nscoreboard players operation $rand gm4_ef_data -= $decrease gm4_ef_data\n\n# set score of fishing bait\nscoreboard players operation @s gm4_ef_timer = $rand gm4_ef_data\n\n# clean up\nscoreboard players reset $rand gm4_ef_data\nscoreboard players reset $decrease gm4_ef_data\nkill @e[type=marker,tag=gm4_ef_rand]\n\n# if too low, then re-randomize\nexecute if score @s gm4_ef_timer matches ..3 run function gm4_end_fishing:cast_rod/randomize_timer\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/cast_rod/store_data.mcfunction",
    "content": "# @s = fishing bobber in the end\n# run from tick\n\n# tag player that just cast the rod\ntag @p[scores={gm4_cast_rod=1..},distance=..2] add gm4_ef_cast_rod\n\n# store lure value\nexecute unless entity @a[tag=gm4_ef_cast_rod,predicate=gm4_end_fishing:holding_fishing_rod,limit=1] store result score @s gm4_ef_lure run data get entity @a[tag=gm4_ef_cast_rod,limit=1] equipment.offhand.components.\"minecraft:enchantments\".\"minecraft:lure\"\nexecute if entity @a[tag=gm4_ef_cast_rod,predicate=gm4_end_fishing:holding_fishing_rod,limit=1] store result score @s gm4_ef_lure run data get entity @a[tag=gm4_ef_cast_rod,limit=1] SelectedItem.components.\"minecraft:enchantments\".\"minecraft:lure\"\n\n# bobber id\nscoreboard players operation @s gm4_ef_id = @a[tag=gm4_ef_cast_rod,limit=1] gm4_ef_id\n\n# clean up\ntag @s add gm4_ef_set\ntag @a remove gm4_ef_cast_rod\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/cast_rod/summon_bait.mcfunction",
    "content": "# @s = fishing bobber positioned ~ ~-5 ~\n# run from tick\n\nsummon minecraft:armor_stand ~ ~ ~ {DisabledSlots:2039552,Small:1b,Invisible:1b,NoGravity:1b,Tags:[\"gm4_no_edit\",\"gm4_end_fishing_bait_new\",\"gm4_end_fishing_bait\"],CustomName:\"gm4_end_fishing_bait\"}\n\nscoreboard players operation @e[type=armor_stand,limit=1,tag=gm4_end_fishing_bait_new] gm4_ef_id = @s gm4_ef_id\nscoreboard players operation @e[type=armor_stand,limit=1,tag=gm4_end_fishing_bait_new] gm4_ef_lure = @s gm4_ef_lure\n\nexecute as @e[type=armor_stand,limit=1,tag=gm4_end_fishing_bait_new] run function gm4_end_fishing:cast_rod/randomize_timer\ntag @e[type=armor_stand,tag=gm4_end_fishing_bait] remove gm4_end_fishing_bait_new\ntag @s add gm4_ef_casted\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/cast_rod/update_bait.mcfunction",
    "content": "# @s = fishing bait armor stand (every 3 clock cycles)\n# run from process\n\nscoreboard players reset @s gm4_ef_up_bait\n\n# destruction\nexecute if entity @s[tag=gm4_ef_marker] positioned ~ ~ ~ unless entity @e[type=minecraft:fishing_bobber,distance=..0.0001] run kill @s\nexecute unless block ~ ~ ~ #gm4:no_collision run kill @s\n\n# make marker\nexecute unless entity @s[tag=gm4_ef_marker] positioned ~ ~0.79 ~ if entity @e[type=minecraft:fishing_bobber,limit=1,distance=..0.0001] run function gm4_end_fishing:cast_rod/marker\nkill @s[tag=!gm4_ef_marker]\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/durability/calc_damage.mcfunction",
    "content": "# @s = player who reeled in armor stand\n# run from durability/set_mainhand and durability/set_offhand\n\n# calculate durability\nscoreboard players set $durability gm4_ef_data 64\nscoreboard players operation $durability gm4_ef_data -= @s gm4_ef_data\nscoreboard players operation $durability gm4_ef_data *= #10000 gm4_ef_data\nscoreboard players operation $durability gm4_ef_data /= #64 gm4_ef_data\n\n# calculate unbreaking\nscoreboard players add $unbreaking_lvl gm4_ef_data 1\nscoreboard players operation $unbreaking gm4_ef_data = #100 gm4_ef_data\nscoreboard players operation $unbreaking gm4_ef_data /= $unbreaking_lvl gm4_ef_data\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/durability/check.mcfunction",
    "content": "# @s = none\n# run from durability/prep_mainhand and durability/prep_offhand\n\nexecute as @a[gamemode=!creative,tag=gm4_ef_durability_main] run function gm4_end_fishing:durability/set_mainhand\nexecute as @a[gamemode=!creative,tag=gm4_ef_durability_off] run function gm4_end_fishing:durability/set_offhand\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/durability/prep_mainhand.mcfunction",
    "content": "# @s = player who reeled in the armor stand w/ fishing rod in mainhand\n# run from reel_in/reel_rod and reel_in/reel_loot\n\nexecute store result score @s gm4_ef_data run data get entity @s SelectedItem.components.\"minecraft:damage\"\ntag @s add gm4_ef_durability_main\nschedule function gm4_end_fishing:durability/check 1t\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/durability/prep_offhand.mcfunction",
    "content": "# @s = player who reeled in the armor stand w/ fishing rod in offhand\n# run from reel_in/reel_rod and reel_in/reel_loot\n\nexecute store result score @s gm4_ef_data run data get entity @s equipment.offhand.components.\"minecraft:damage\"\ntag @s add gm4_ef_durability_off\nschedule function gm4_end_fishing:durability/check 1t\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/durability/set_mainhand.mcfunction",
    "content": "# @s = player who reeled in the armor stand w/ fishing rod in mainhand\n# run from durability/check\n\nexecute store result score $unbreaking_lvl gm4_ef_data run data get entity @s SelectedItem.components.\"minecraft:enchantments\".\"minecraft:unbreaking\"\nfunction gm4_end_fishing:durability/calc_damage\nitem modify entity @s[gamemode=!creative] weapon.mainhand gm4_end_fishing:prepare_rod\nitem modify entity @s[gamemode=!creative] weapon.mainhand gm4_end_fishing:apply_damage\nexecute if entity @s[tag=gm4_ef_looted,gamemode=!creative] run item modify entity @s weapon.mainhand gm4_end_fishing:apply_damage\nscoreboard players reset @s gm4_ef_data\nscoreboard players reset $durability gm4_ef_data\nscoreboard players reset $unbreaking_lvl gm4_ef_data\nscoreboard players reset $unbreaking gm4_ef_data\ntag @s remove gm4_ef_looted\ntag @s remove gm4_ef_durability_main\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/durability/set_offhand.mcfunction",
    "content": "# @s = player who reeled in the armor stand w/ fishing rod in offhand\n# run from durability/check\n\nexecute store result score $unbreaking_lvl gm4_ef_data run data get entity @s equipment.offhand.components.\"minecraft:enchantments\".\"minecraft:unbreaking\"\nfunction gm4_end_fishing:durability/calc_damage\nitem modify entity @s[gamemode=!creative] weapon.offhand gm4_end_fishing:prepare_rod\nitem modify entity @s[gamemode=!creative] weapon.offhand gm4_end_fishing:apply_damage\nexecute if entity @s[tag=gm4_ef_looted,gamemode=!creative] run item modify entity @s weapon.offhand gm4_end_fishing:apply_damage\nscoreboard players reset @s gm4_ef_data\nscoreboard players reset $durability gm4_ef_data\nscoreboard players reset $unbreaking_lvl gm4_ef_data\nscoreboard players reset $unbreaking gm4_ef_data\ntag @s remove gm4_ef_looted\ntag @s remove gm4_ef_durability_off\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/enderpuff/apply_levitation.mcfunction",
    "content": "# @s = player with enderpuff in hand, not having levitation or slow falling yet\n# run from enderpuff/track_inventory\n\n# sound\nexecute unless entity @s[tag=gm4_enderpuff_levitation] run playsound minecraft:entity.puffer_fish.blow_up player @a[distance=..8] ~ ~ ~ 0.7 0.3 0\n\n# effect\ntag @s add gm4_enderpuff_levitation\ntag @s add gm4_enderpuff_used\neffect give @s levitation 180 1\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/enderpuff/apply_slow_falling.mcfunction",
    "content": "# @s = player who has an enderpuff and is falling\n# run from tick\n\nexecute store result score $fall_distance gm4_ef_data run data get entity @s fall_distance 10\nexecute if score $fall_distance gm4_ef_data matches 25.. run tag @s add gm4_ef_fall\ntag @s[scores={gm4_ef_sneak=1..},nbt={FallFlying:1b}] add gm4_ef_fall\neffect give @s[tag=gm4_ef_fall] slow_falling 1 0\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/enderpuff/check_inventory.mcfunction",
    "content": "# @s = any player who has changed their inventory\n# run from advancement \"check_inventory\"\n\nadvancement revoke @s only gm4_end_fishing:check_inventory\n\ntag @s remove gm4_has_enderpuff\ntag @s[predicate=gm4_end_fishing:carries_enderpuff] add gm4_has_enderpuff\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/enderpuff/clear_levitation.mcfunction",
    "content": "# @s = player with enderpuff in inventory, but isn't holding it or is holding it, but ran out of levitation\n# run from enderpuff/process\n\neffect clear @s levitation\ntag @s remove gm4_enderpuff_levitation\n\n# sound\nplaysound minecraft:entity.puffer_fish.blow_out player @a[distance=..8] ~ ~ ~ 0.7 0.3 0\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/enderpuff/process.mcfunction",
    "content": "# @s = player with enderpuff in inventory\n# run from main\n\n# check equipment\ntag @s remove gm4_enderpuff_equipped\ntag @s[predicate=gm4_end_fishing:holding_enderpuff] add gm4_enderpuff_equipped\n\n# apply levitation\nexecute if predicate gm4_end_fishing:on_ground run tag @s remove gm4_enderpuff_used\nexecute if entity @s[tag=gm4_enderpuff_equipped,tag=!gm4_enderpuff_used] run function gm4_end_fishing:enderpuff/apply_levitation\nexecute if entity @s[tag=gm4_enderpuff_levitation,tag=!gm4_enderpuff_equipped] run function gm4_end_fishing:enderpuff/clear_levitation\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/go_fish/bobber_animation.mcfunction",
    "content": "# @s = fishing bait armor stand with fish\n# run from tick\n\nscoreboard players add @s gm4_ef_data 1\nexecute if score @s gm4_ef_data matches 1 at @s run playsound minecraft:entity.ender_dragon.flap neutral @a[distance=..16] ~ ~ ~ 4 0.7\nexecute if score @s gm4_ef_data matches 1..5 at @s run tp @s ~ ~-0.1 ~\nexecute if score @s gm4_ef_data matches 5 at @e[type=minecraft:fishing_bobber,limit=1,distance=..0.0001] run summon minecraft:armor_stand ~ ~ ~ {Small:1b,Invisible:1b,Tags:[\"gm4_ef_bobber_update\"]}\nexecute if score @s gm4_ef_data matches 5 run schedule function gm4_end_fishing:go_fish/update_bobber 1t\nexecute if score @s gm4_ef_data matches 11..15 at @s run tp @s ~ ~0.1 ~\nexecute if score @s gm4_ef_data matches 15 at @e[type=minecraft:fishing_bobber,limit=1,distance=..0.0001] run summon minecraft:armor_stand ~ ~ ~ {Small:1b,Invisible:1b,Tags:[\"gm4_ef_bobber_update\"]}\nexecute if score @s gm4_ef_data matches 15 run schedule function gm4_end_fishing:go_fish/update_bobber 1t\nexecute if score @s gm4_ef_data matches 30.. run function gm4_end_fishing:cast_rod/randomize_timer\nexecute if score @s gm4_ef_data matches 30.. run tag @s add gm4_end_fishing_bait\nexecute if score @s gm4_ef_data matches 30.. run tag @s remove gm4_ef_has_fish\nexecute if score @s gm4_ef_data matches 30.. run scoreboard players reset @s gm4_ef_data\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/go_fish/bobber_animation_clock.mcfunction",
    "content": "# @s = none\n# run from process\n\nexecute as @e[type=armor_stand,tag=gm4_ef_has_fish] unless score @s gm4_ef_data matches 31.. at @s run function gm4_end_fishing:go_fish/bobber_animation\nexecute if entity @e[type=armor_stand,tag=gm4_ef_has_fish,limit=1] run schedule function gm4_end_fishing:go_fish/bobber_animation_clock 1t\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/go_fish/fish_particle_clock.mcfunction",
    "content": "# @s = none\n# run from go_fish/summon_fish_particle\n\nexecute as @e[type=marker,tag=gm4_ef_particle] at @s run function gm4_end_fishing:go_fish/move_fish_particle\nexecute if entity @e[type=marker,tag=gm4_ef_particle,limit=1] run schedule function gm4_end_fishing:go_fish/fish_particle_clock 1t\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/go_fish/move_fish_particle.mcfunction",
    "content": "# @s = fish particle marker\n# run from go_fish/fish_particle_clock\n\nparticle minecraft:dragon_breath ~ ~ ~ 0 0 0 0.02 1\ntp @s ^ ^ ^0.1\nscoreboard players add @s gm4_ef_data 1\nkill @s[scores={gm4_ef_data=32..}]\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/go_fish/summon_fish_particle.mcfunction",
    "content": "# @s = fishing bait armor stand that is nearly ready to be reeled in\n# run from process\n\nsummon marker ~ ~ ~ {Tags:[\"gm4_ef_particle_new\",\"gm4_ef_particle\"]}\nexecute store result score $rand gm4_ef_data run data get entity @e[type=marker,tag=gm4_ef_particle_new,limit=1] UUID[0]\nscoreboard players operation $rand gm4_ef_data %= #4 gm4_ef_data\n\nexecute if score $rand gm4_ef_data matches 0 run tp @e[type=marker,tag=gm4_ef_particle_new,limit=1] ~ ~ ~3 facing entity @s eyes\nexecute if score $rand gm4_ef_data matches 1 run tp @e[type=marker,tag=gm4_ef_particle_new,limit=1] ~ ~ ~-3 facing entity @s eyes\nexecute if score $rand gm4_ef_data matches 2 run tp @e[type=marker,tag=gm4_ef_particle_new,limit=1] ~3 ~ ~ facing entity @s eyes\nexecute if score $rand gm4_ef_data matches 3 run tp @e[type=marker,tag=gm4_ef_particle_new,limit=1] ~-3 ~ ~ facing entity @s eyes\ntag @e[type=marker,tag=gm4_ef_particle] remove gm4_ef_particle_new\nscoreboard players reset $rand gm4_ef_data\n\nschedule function gm4_end_fishing:go_fish/fish_particle_clock 1t\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/go_fish/update_bobber.mcfunction",
    "content": "# @s = none\n# run from cast_rod/marker and go_fish/bobber_animation\n\nscoreboard players add @e[type=armor_stand,tag=gm4_ef_bobber_update] gm4_ef_data 1\nkill @e[type=armor_stand,tag=gm4_ef_bobber_update,scores={gm4_ef_data=2..}]\nexecute if entity @e[type=armor_stand,tag=gm4_ef_bobber_update,limit=1] run schedule function gm4_end_fishing:go_fish/update_bobber 1t\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_cast_rod minecraft.used:minecraft.fishing_rod\nscoreboard objectives add gm4_ef_timer dummy\nscoreboard objectives add gm4_ef_id dummy\nscoreboard objectives add gm4_ef_lure dummy\nscoreboard objectives add gm4_ef_data dummy\nscoreboard objectives add gm4_ef_up_bait dummy\nscoreboard objectives add gm4_ef_fall dummy\nscoreboard objectives add gm4_ef_sneak minecraft.custom:minecraft.sneak_time\n# scoreboard objectives add gm4_ef_jump minecraft.custom:minecraft.jump\n\nscoreboard players set #100 gm4_ef_data 100\nscoreboard players set #6 gm4_ef_data 6\nscoreboard players set #57 gm4_ef_data 57\nscoreboard players set #4 gm4_ef_data 4\nscoreboard players set #64 gm4_ef_data 64\nscoreboard players set #10000 gm4_ef_data 10000\n\nexecute unless score end_fishing gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"End Fishing\"}\nexecute unless score end_fishing gm4_earliest_version < end_fishing gm4_modules run scoreboard players operation end_fishing gm4_earliest_version = end_fishing gm4_modules\nscoreboard players set end_fishing gm4_modules 1\n\nschedule function gm4_end_fishing:main 1t\nschedule function gm4_end_fishing:tick 1t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/main.mcfunction",
    "content": "execute as @e[type=minecraft:armor_stand,tag=gm4_end_fishing_bait] at @s run function gm4_end_fishing:process\n\n# enderpuff mechanics\nexecute as @a[tag=gm4_enderpuff_levitation,tag=!gm4_has_enderpuff] at @s run function gm4_end_fishing:enderpuff/clear_levitation\nexecute as @a[tag=gm4_has_enderpuff] at @s run function gm4_end_fishing:enderpuff/process\n\neffect give @a[tag=gm4_ef_fall] slow_falling 1 0\ntag @a[tag=gm4_ef_fall,predicate=!gm4_end_fishing:on_ground] remove gm4_ef_fall\n\nschedule function gm4_end_fishing:main 16t\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/process.mcfunction",
    "content": "# @s = fishing bait armor stand\n# run from main\n\n# timer and loot\nscoreboard players remove @s[scores={gm4_ef_timer=0..}] gm4_ef_timer 1\nexecute if score @s gm4_ef_timer matches 2 run function gm4_end_fishing:go_fish/summon_fish_particle\ntag @s[scores={gm4_ef_timer=0}] remove gm4_end_fishing_bait\ntag @s[scores={gm4_ef_timer=0}] add gm4_ef_has_fish\nexecute if score @s gm4_ef_timer matches 0 run schedule function gm4_end_fishing:go_fish/bobber_animation_clock 1t\n\n# particle\nexecute at @e[type=minecraft:fishing_bobber,limit=1,distance=..0.0001] run particle minecraft:end_rod ~ ~ ~ 0 0 0 .02 1 force\n\nscoreboard players add @s gm4_ef_up_bait 1\nexecute if score @s gm4_ef_up_bait matches 2.. run function gm4_end_fishing:cast_rod/update_bait\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/reel_in/move_marker.mcfunction",
    "content": "# @s = marker to spawn item loot\n# run from reel_in/reel_loot\n\nscoreboard players add @s gm4_ef_data 1\ntp @s ^ ^ ^0.5\nexecute at @s if block ^ ^ ^0.5 #gm4:no_collision unless score @s gm4_ef_data matches 100.. unless entity @a[distance=..2,tag=gm4_ef_reel_loot,limit=1] run function gm4_end_fishing:reel_in/move_marker\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/reel_in/reel_loot.mcfunction",
    "content": "# @s = player who reeled in the armor stand\n# run from advancement \"reel_loot\"\n\nadvancement revoke @s only gm4_end_fishing:reel_loot\nadvancement grant @s only gm4:end_fishing\ntag @s add gm4_ef_reel_loot\ntag @s add gm4_ef_looted\nexecute if items entity @s weapon.mainhand minecraft:fishing_rod run function gm4_end_fishing:durability/prep_mainhand\nexecute unless items entity @s weapon.mainhand minecraft:fishing_rod if items entity @s weapon.offhand minecraft:fishing_rod run function gm4_end_fishing:durability/prep_offhand\n\nscoreboard players operation $current gm4_ef_id = @s gm4_ef_id\nexecute as @e[type=armor_stand,tag=gm4_ef_has_fish] if score @s gm4_ef_id = $current gm4_ef_id run tag @s add gm4_ef_reeled_in\nexecute at @e[type=armor_stand,tag=gm4_ef_reeled_in] run summon marker ~ ~ ~ {Tags:[\"gm4_ef_loot\"]}\nexecute as @e[type=marker,tag=gm4_ef_loot] at @s run function gm4_end_fishing:reel_in/set_marker_pos\nexecute if entity @s[tag=gm4_ef_durability_main] at @e[type=marker,tag=gm4_ef_loot] run loot spawn ^ ^ ^1 fish gm4_end_fishing:gameplay/fishing ~ ~ ~ mainhand\nexecute if entity @s[tag=gm4_ef_durability_off] at @e[type=marker,tag=gm4_ef_loot] run loot spawn ^ ^ ^1 fish gm4_end_fishing:gameplay/fishing ~ ~ ~ offhand\nexecute as @e[type=item] if items entity @s contents *[custom_data~{gm4_end_fishing:{set_data:{type:\"entity\"}}}] run function gm4_end_fishing:reel_in/summon_entity\n\nsummon minecraft:experience_orb ~ ~ ~ {Tags:[\"gm4_ef_set_orb\"]}\nexecute store result score $value gm4_ef_data run data get entity @e[type=experience_orb,tag=gm4_ef_set_orb,limit=1] UUID[0]\nscoreboard players operation $value gm4_ef_data %= #6 gm4_ef_data\nscoreboard players add $value gm4_ef_data 2\nexecute store result entity @e[type=experience_orb,tag=gm4_ef_set_orb,limit=1] Value int 1 run scoreboard players get $value gm4_ef_data\n\n# clean up\ntag @e[type=experience_orb] remove gm4_ef_set_orb\nscoreboard players reset $value gm4_ef_data\ntag @s remove gm4_ef_reel_loot\nkill @e[type=marker,tag=gm4_ef_loot]\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/reel_in/reel_rod.mcfunction",
    "content": "# @s = player who reeled in the armor stand\n# run from advancement \"reel_rod\"\n\nadvancement revoke @s only gm4_end_fishing:reel_rod\nexecute if entity @s[gamemode=!creative] if items entity @s weapon.mainhand minecraft:fishing_rod run function gm4_end_fishing:durability/prep_mainhand\nexecute if entity @s[gamemode=!creative] unless items entity @s weapon.mainhand minecraft:fishing_rod if items entity @s weapon.offhand minecraft:fishing_rod run function gm4_end_fishing:durability/prep_offhand\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/reel_in/set_marker_pos.mcfunction",
    "content": "# @s = marker to spawn item loot\n# run from reel_in/reel_loot\n\ntp @s ~ ~ ~ facing entity @a[tag=gm4_ef_reel_loot,limit=1] eyes\nfunction gm4_end_fishing:reel_in/move_marker\nexecute at @s if entity @a[distance=..2,tag=gm4_ef_reel_loot,limit=1] if block ^ ^ ^0.5 #gm4:no_collision run tp @s ^ ^ ^0.5\nexecute at @s if entity @a[distance=..2,tag=gm4_ef_reel_loot,limit=1] if block ^ ^ ^0.5 #gm4:no_collision run tp @s ^ ^ ^0.5\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/reel_in/spawn_phantom.mcfunction",
    "content": "# @s = item that is to summon a phantom\n# run from reel_in/summon_entity\n\nexecute as @e[type=marker,tag=gm4_ef_loot,limit=1] at @s run summon phantom ^ ^ ^-1 {Health:26f,size:3,attributes:[{id:\"minecraft:max_health\",base:26}],Tags:[\"gm4_end_phantom\"],DeathLootTable:\"gm4_end_fishing:entities/end_phantom\"}\nadvancement grant @a[tag=gm4_ef_reel_loot,limit=1] only gm4:end_fishing_phantom\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/reel_in/summon_entity.mcfunction",
    "content": "# @s = item that is to summon a special entity\n# run from reel_in/set_data\n\nexecute if items entity @s contents *[custom_data~{gm4_end_fishing:{set_data:{id:\"end_phantom\"}}}] run function gm4_end_fishing:reel_in/spawn_phantom\nexecute if items entity @s contents *[custom_data~{gm4_end_fishing:{set_data:{id:\"endermite\"}}}] as @e[type=marker,tag=gm4_ef_loot,limit=1] at @s run summon endermite ^ ^ ^1 {DeathLootTable:\"gm4_end_fishing:entities/endermite\"}\nkill @s\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/set_id.mcfunction",
    "content": "# @s = player who joined for the first time\n# run from advancement \"set_id\"\n\nexecute store result score @s gm4_ef_id run data get entity @s UUID[0]\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/function/tick.mcfunction",
    "content": "schedule function gm4_end_fishing:tick 1t\n\n# catch fishing bobber in the end\nexecute in minecraft:the_end as @e[type=minecraft:fishing_bobber,tag=!smithed.entity,tag=!gm4_ef_casted,x_rotation=-90..-85,x=0] at @s positioned ~ ~-5 ~ run function gm4_end_fishing:cast_rod/summon_bait\n\n# store bobber data\nexecute in minecraft:the_end as @e[type=minecraft:fishing_bobber,tag=!smithed.entity,tag=!gm4_ef_set,x=0] at @s run function gm4_end_fishing:cast_rod/store_data\n\n# reset cast rod score\nscoreboard players reset @a gm4_cast_rod\n\n# enderpuff slow falling\ntag @a[tag=!gm4_has_enderpuff] remove gm4_ef_fall\ntag @a[predicate=!gm4_end_fishing:slow_falling] remove gm4_ef_fall\nexecute as @a[tag=gm4_has_enderpuff,tag=!gm4_ef_fall,predicate=gm4_end_fishing:slow_falling] run function gm4_end_fishing:enderpuff/apply_slow_falling\nscoreboard players reset @a gm4_ef_sneak\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/guidebook/end_fishing.json",
    "content": "{\n  \"id\": \"end_fishing\",\n  \"name\": \"End Fishing\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:fishing_rod\"\n  },\n  \"criteria\": {\n    \"enter_end_gateway\": {\n      \"trigger\": \"minecraft:enter_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"dimension\": \"minecraft:the_end\"\n            }\n          }\n        ],\n        \"block\": \"minecraft:end_gateway\"\n      }\n    },\n    \"fish_phantom\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"player\",\n                \"advancements\": {\n                  \"gm4:end_fishing_phantom\": true\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"void_fishing\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"enter_end_gateway\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.end_fishing.description\",\n            \"fallback\": \"Casting a fishing rod into the end void will allow one to fish up loot from the void.\\n\\nLoot is biome dependent.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"end_phantoms\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"fish_phantom\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.end_fishing.end_phantom\",\n            \"fallback\": \"End Phantoms can be fished up from the end void.\\n\\nThey are larger and stronger than normal phantoms, but have a chance to drop a broken elytra upon death.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/item_modifier/apply_damage.json",
    "content": "[\n  {\n    \"function\": \"minecraft:set_damage\",\n    \"damage\": -0.015625,\n    \"add\": true,\n    \"conditions\": [\n      {\n        \"condition\": \"minecraft:value_check\",\n        \"value\": {\n          \"type\": \"minecraft:binomial\",\n          \"n\": 1,\n          \"p\": {\n            \"type\": \"minecraft:score\",\n            \"target\": {\n              \"type\": \"minecraft:fixed\",\n              \"name\": \"$unbreaking\"\n            },\n            \"score\": \"gm4_ef_data\",\n            \"scale\": 0.01\n          }\n        },\n        \"range\": 1\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/item_modifier/prepare_rod.json",
    "content": "[\n  {\n    \"function\": \"minecraft:set_damage\",\n    \"damage\": {\n      \"type\": \"minecraft:score\",\n      \"target\": {\n        \"type\": \"minecraft:fixed\",\n        \"name\": \"$durability\"\n      },\n      \"score\": \"gm4_ef_data\",\n      \"scale\": 0.0001\n    },\n    \"add\": false\n  }\n]\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/entities/end_phantom.json",
    "content": "{\n  \"type\": \"minecraft:entity\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": {\n                \"min\": 0,\n                \"max\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:enchanted_count_increase\",\n              \"enchantment\": \"minecraft:looting\",\n              \"count\": {\n                \"min\": 0,\n                \"max\": 1\n              }\n            }\n          ],\n          \"name\": \"minecraft:phantom_membrane\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:killed_by_player\"\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:items/ravaged_wings\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:killed_by_player\"\n        },\n        {\n          \"condition\": \"minecraft:random_chance_with_enchanted_bonus\",\n          \"enchantment\": \"minecraft:looting\",\n          \"unenchanted_chance\": 0.2,\n          \"enchanted_chance\": {\n            \"type\": \"minecraft:linear\",\n            \"base\": 0.215,\n            \"per_level_above_first\": 0.015\n          }\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/entities/endermite.json",
    "content": "{\n  \"type\": \"minecraft:entity\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": {\n                \"min\": 0,\n                \"max\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:enchanted_count_increase\",\n              \"enchantment\": \"minecraft:looting\",\n              \"count\": {\n                \"min\": 0,\n                \"max\": 1\n              }\n            }\n          ],\n          \"name\": \"minecraft:ender_pearl\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/debris.json",
    "content": "{\n  \"type\": \"minecraft:fishing\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:ender_pearl\",\n          \"weight\": 50\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:end_stone\",\n          \"weight\": 25\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:end_rod\",\n          \"weight\": 1\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:chorus_fruit\",\n          \"weight\": 4\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:chorus_flower\",\n          \"weight\": 2\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:chorus_fruit\",\n          \"weight\": 40,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:high\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:iron_bars\",\n          \"weight\": 10,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:center\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:end_rod\",\n          \"weight\": 14,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:mid_high\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:chorus_flower\",\n          \"weight\": 35,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:high\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:ender_pearl\",\n          \"weight\": 10,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{set_data:{type:'entity',id:'endermite'}}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:ender_pearl\",\n          \"weight\": 10,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:barrens\"\n              }\n            }\n          ],\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{set_data:{type:'entity',id:'endermite'}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/armor/generate.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_armor.1\",\n                  \"fallback\": \"Lost on End City moving day\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_armor_1\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_armor.2\",\n                  \"fallback\": \"Forged by Seppo Ilmarinen\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_armor_2\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_armor.3\",\n                  \"fallback\": \"Belongs to Achilles\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_armor_3\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_armor.4\",\n                  \"fallback\": \"Made by Wayland the Smith\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_armor_4\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_armor.5\",\n                  \"fallback\": \"Worn during the battle of Ender Ender\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_armor_5\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_armor.6.1\",\n                  \"fallback\": \"This thing's been rotting in\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_armor.6.2\",\n                  \"fallback\": \"the void for at least a century.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_armor_6\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_armor.7\",\n                  \"fallback\": \"Passed down over many generations\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_armor_7\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_armor.8\",\n                  \"fallback\": \"Wear this to become invisible to nobody!\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_armor_8\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_armor.9.1\",\n                  \"fallback\": \"I promise you can fly while wearing this.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_armor.9.2\",\n                  \"fallback\": \"Trust me, just jump into the void.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_armor_9\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_armor.10.1\",\n                  \"fallback\": \"With this you shall be immortal!\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_armor.10.2\",\n                  \"fallback\": \"Or is it immoral? I can't remember.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_armor_10\"]}\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/armor/type.json",
    "content": "{\n  \"type\": \"minecraft:fishing\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:diamond_boots\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:diamond_chestplate\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:diamond_leggings\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:diamond_helmet\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:iron_boots\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:iron_chestplate\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:iron_leggings\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:iron_helmet\"\n        }\n      ],\n      \"functions\": [\n        {\n          \"function\": \"minecraft:enchant_with_levels\",\n          \"levels\": {\n            \"min\": 20,\n            \"max\": 39,\n            \"type\": \"minecraft:uniform\"\n          },\n          \"options\": \"#minecraft:on_random_loot\"\n        },\n        {\n          \"function\": \"minecraft:set_damage\",\n          \"damage\": {\n            \"min\": 0.4,\n            \"max\": 0.7\n          }\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/base.json",
    "content": "{\n  \"type\": \"minecraft:fishing\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:beetroot_seeds\",\n          \"weight\": 15\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:saddle\",\n          \"weight\": 6\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/generate\",\n          \"weight\": 40\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/armor/generate\",\n          \"weight\": 160\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/tool/generate\",\n          \"weight\": 80\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/ore/generate\",\n          \"weight\": 65\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/horse_armor/generate\",\n          \"weight\": 3\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/horse_armor/generate.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/horse_armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_horse_armor.1\",\n                  \"fallback\": \"That's some good barding!\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_horse_armor_1\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/horse_armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_horse_armor.2.1\",\n                  \"fallback\": \"There's a horse somewhere\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_horse_armor.2.2\",\n                  \"fallback\": \"that lost this armour.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_horse_armor_2\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/horse_armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_horse_armor.3.1\",\n                  \"fallback\": \"Floating horses must be\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_horse_armor.3.2\",\n                  \"fallback\": \"a thing somewhere, right?\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_horse_armor_3\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/horse_armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_horse_armor.4\",\n                  \"fallback\": \"Too bad there's no horse weapons.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_horse_armor_4\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/horse_armor/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_horse_armor.5\",\n                  \"fallback\": \"Made with the finest materials known to man\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_horse_armor_5\"]}\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/horse_armor/type.json",
    "content": "{\n  \"type\": \"minecraft:fishing\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:iron_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:golden_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:diamond_horse_armor\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/ore/generate.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/ore/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_ore.1\",\n                  \"fallback\": \"The riches of the vast void\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_ore_1\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/ore/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_ore.2\",\n                  \"fallback\": \"Dropped from a nearby End City\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_ore_2\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/ore/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_ore.3\",\n                  \"fallback\": \"There's so much treasure down there!\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_ore_3\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/ore/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_ore.4\",\n                  \"fallback\": \"Cursed by the ancient Goddess\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_ore_4\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/ore/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_ore.5\",\n                  \"fallback\": \"This isn't real. It's fake treasure.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_ore_5\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/ore/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_ore.6\",\n                  \"fallback\": \"Cha-Ching! We're going to be rich!\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_ore_6\"]}\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/ore/type.json",
    "content": "{\n  \"type\": \"minecraft:fishing\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:diamond\",\n          \"weight\": 8\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:iron_ingot\",\n          \"weight\": 20\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:gold_ingot\",\n          \"weight\": 25\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:emerald\",\n          \"weight\": 12\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/sword/generate.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.1\",\n                  \"fallback\": \"Forged in a dragon's breath\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_1\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:1b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.2.1\",\n                  \"fallback\": \"Life kills life all the time, so the Goddess\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_sword.2.2\",\n                  \"fallback\": \"sacrifices herself for her own animal.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_2\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:2b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.3\",\n                  \"fallback\": \"Blessed with Hylia's power\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_3\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:3b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.4\",\n                  \"fallback\": \"Forged by Muramasa\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_4\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:4b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.5\",\n                  \"fallback\": \"Powered by the living crystal within\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_5\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:5b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.6\",\n                  \"fallback\": \"Used to decapitate the Gorgon, Medusa\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_6\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:6b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.7.1\",\n                  \"fallback\": \"This is believed to be one of the\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_sword.7.2\",\n                  \"fallback\": \"finest Japanese swords ever made.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_7\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:7b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.8\",\n                  \"fallback\": \"Used at the Battle of the Trench\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_8\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:8b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.9\",\n                  \"fallback\": \"Removed from the Garden of Eden\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_9\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:9b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.10\",\n                  \"fallback\": \"Used to kill the dragon Fafnir\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_10\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:10b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.11\",\n                  \"fallback\": \"Snicker-snack!\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_11\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:11b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.12.1\",\n                  \"fallback\": \"Created by husband and wife magicians\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_sword.12.2\",\n                  \"fallback\": \"of the ancient Bön tradition\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_12\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:12b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.13\",\n                  \"fallback\": \"Belongs to Roland\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_13\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:13b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.14.1\",\n                  \"fallback\": \"If found, please return\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_sword.14.2\",\n                  \"fallback\": \"to William Wallace.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_14\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:14b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.15\",\n                  \"fallback\": \"Reforged from the shards of Narsil\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_15\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:15b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.16\",\n                  \"fallback\": \"Forged by the Iron Sisters\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_16\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:16b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.17.1\",\n                  \"fallback\": \"Used to lead the revolutionary\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_sword.17.2\",\n                  \"fallback\": \"army against the Telmarines\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_17\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:17b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.18\",\n                  \"fallback\": \"Can only be wielded by a true Gryffindor\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_18\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:18b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.19\",\n                  \"fallback\": \"Sought by Thrax\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_19\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:19b}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_sword.20\",\n                  \"fallback\": \"Wielded by Lion-O\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_swords_20\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{end_city_sword:20b}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/sword/type.json",
    "content": "{\n  \"type\": \"minecraft:fishing\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:diamond_sword\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:iron_sword\"\n        }\n      ],\n      \"functions\": [\n        {\n          \"function\": \"minecraft:enchant_with_levels\",\n          \"levels\": {\n            \"min\": 20,\n            \"max\": 39,\n            \"type\": \"minecraft:uniform\"\n          },\n          \"options\": \"#minecraft:on_random_loot\"\n        },\n        {\n          \"function\": \"minecraft:set_damage\",\n          \"damage\": {\n            \"min\": 0.4,\n            \"max\": 0.7\n          }\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/tool/generate.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_tool.1.1\",\n                  \"fallback\": \"It's been said only those\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_tool.1.2\",\n                  \"fallback\": \"who are worthy can wield this tool.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_tools_1\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_tool.2.1\",\n                  \"fallback\": \"Once there was a man named\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_tool.2.2\",\n                  \"fallback\": \"Tubal-cain who made this tool.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_tools_2\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_tool.3\",\n                  \"fallback\": \"If found, please return to Hephaestus.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_tools_3\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_tool.4.1\",\n                  \"fallback\": \"This is actually a really hard\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_tool.4.2\",\n                  \"fallback\": \"piece of bread. Don't tell anyone.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_tools_4\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_tool.5\",\n                  \"fallback\": \"Found in the Valley of the Fallen Kings\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_tools_5\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_tool.6.1\",\n                  \"fallback\": \"Throw it. Maybe it'll come back!\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_tool.6.2\",\n                  \"fallback\": \"No, it's not a hammer, sadly.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_tools_6\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_tool.7\",\n                  \"fallback\": \"Thunk, Thunk, Thunk!\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_tools_7\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_tool.8.1\",\n                  \"fallback\": \"Forged by the Leader of\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_tool.8.2\",\n                  \"fallback\": \"the Endermen Rebellion\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_tools_8\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_tool.9\",\n                  \"fallback\": \"It's not a very good shield.\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_tools_9\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_city_tool.10.1\",\n                  \"fallback\": \"Where'd you find this? It's been\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                },\n                {\n                  \"translate\": \"text.gm4.end_city_tool.10.2\",\n                  \"fallback\": \"floating in the end for over a decade!\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/end_city_tools_10\"]}\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/tool/type.json",
    "content": "{\n  \"type\": \"minecraft:fishing\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:diamond_pickaxe\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:diamond_shovel\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:iron_pickaxe\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:iron_shovel\"\n        }\n      ],\n      \"functions\": [\n        {\n          \"function\": \"minecraft:enchant_with_levels\",\n          \"levels\": {\n            \"min\": 20,\n            \"max\": 39,\n            \"type\": \"minecraft:uniform\"\n          },\n          \"options\": \"#minecraft:on_random_loot\"\n        },\n        {\n          \"function\": \"minecraft:set_damage\",\n          \"damage\": {\n            \"min\": 0.4,\n            \"max\": 0.7\n          }\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/scattered_treasure.json",
    "content": "{\n  \"type\": \"minecraft:fishing\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:shulker_shell\",\n          \"weight\": 10\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:dragon_head\",\n          \"weight\": 5\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:items/enderpuff\",\n          \"weight\": 1\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:end_crystal\",\n          \"weight\": 40,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:center\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:items/enderpuff\",\n          \"weight\": 11,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:outer\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:dragon_head\",\n          \"weight\": 75,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:mid_high\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:items/captains_wings\",\n          \"weight\": 1,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:mid_high\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:items/captains_wings\",\n          \"weight\": 2,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:nullscape/crystal_peaks\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:shulker_shell\",\n          \"weight\": 110,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:mid_high\"\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/valuables.json",
    "content": "{\n  \"type\": \"minecraft:fishing\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/base\",\n          \"weight\": 10\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:shulker_shell\",\n          \"weight\": 40,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:mid_high\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:phantom_membrane\",\n          \"weight\": 20\n        },\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"minecraft:crying_obsidian\",\n              \"weight\": 8,\n              \"conditions\": [\n                {\n                  \"condition\": \"location_check\",\n                  \"predicate\": {\n                    \"biomes\": \"#gm4_end_fishing:nullscape/crystal_peaks\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"minecraft:obsidian\",\n              \"weight\": 1\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:amethyst_block\",\n          \"weight\": 16,\n          \"conditions\": [\n            {\n              \"condition\": \"location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:nullscape/crystal_peaks\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:ender_pearl\",\n          \"weight\": 10,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{set_data:{type:'entity',id:'end_phantom'}}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:dragon_breath\",\n          \"weight\": 20,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:center\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:obsidian\",\n          \"weight\": 44,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:center\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_end_fishing:gameplay/fish/end_city_treasure/base\",\n          \"weight\": 20,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:mid_high\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:ender_pearl\",\n          \"weight\": 15,\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#gm4_end_fishing:barrens\"\n              }\n            }\n          ],\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{set_data:{type:'entity',id:'end_phantom'}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fishing.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"loot_table\",\n                    \"value\": \"gm4_end_fishing:gameplay/fish/debris\",\n                    \"weight\": 60,\n                    \"quality\": -1\n                },\n                {\n                    \"type\": \"loot_table\",\n                    \"value\": \"gm4_end_fishing:gameplay/fish/valuables\",\n                    \"weight\": 33,\n                    \"quality\": 1\n                },\n                {\n                    \"type\": \"loot_table\",\n                    \"value\": \"gm4_end_fishing:gameplay/fish/scattered_treasure\",\n                    \"weight\": 7,\n                    \"quality\": 5\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/items/captains_wings.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:elytra\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/captains_wings\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.end_ship_elytra.10.1\",\n                  \"fallback\": \"Nobody imagined the Captain's lost\",\n                  \"italic\": false,\n                  \"color\": \"dark_gray\"\n                },\n                {\n                  \"translate\": \"text.gm4.end_ship_elytra.10.2\",\n                  \"fallback\": \"wings would be seen again, ever.\",\n                  \"italic\": false,\n                  \"color\": \"dark_gray\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.005\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/items/enderpuff.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:poisonous_potato\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.enderpuff\",\n                \"fallback\": \"Enderpuff\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/enderpuff\"]},\n                \"minecraft:profile\": \"$enderpuff\",\n                \"minecraft:item_model\": \"minecraft:player_head\",\n                \"!minecraft:consumable\": {}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_end_fishing:{enderpuff:1b}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/loot_table/items/ravaged_wings.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:elytra\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_end_fishing:item/ravaged_wings\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.end_fishing.ravaged_wings\",\n                \"fallback\": \"Ravaged Wings\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": 0\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/predicate/carries_enderpuff.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"#gm4_end_fishing:enderpuff\",\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{enderpuff:1b}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"#gm4_end_fishing:enderpuff\",\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{enderpuff:1b}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"player.cursor\": {\n            \"items\": \"#gm4_end_fishing:enderpuff\",\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{enderpuff:1b}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"player.crafting.*\": {\n            \"items\": \"#gm4_end_fishing:enderpuff\",\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{enderpuff:1b}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.*\": {\n            \"items\": \"#gm4_end_fishing:enderpuff\",\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_end_fishing:{enderpuff:1b}}\"\n            }\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/predicate/holding_enderpuff.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"weapon.*\": {\n        \"items\": \"#gm4_end_fishing:enderpuff\",\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_end_fishing:{enderpuff:1b}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/predicate/holding_fishing_rod.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": \"minecraft:fishing_rod\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/predicate/on_ground.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"flags\": {\n      \"is_on_ground\": true\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/predicate/slow_falling.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:entity_properties\",\n        \"entity\": \"this\",\n        \"predicate\": {\n          \"nbt\": \"{FallFlying:0b}\",\n          \"stepping_on\": {\n            \"block\": {\n              \"blocks\": \"#gm4:no_collision\"\n            }\n          },\n          \"flags\": {\n            \"is_sneaking\": false\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:any_of\",\n          \"terms\": [\n            {\n              \"condition\": \"minecraft:inverted\",\n              \"term\": {\n                \"condition\": \"minecraft:entity_scores\",\n                \"entity\": \"this\",\n                \"scores\": {\n                  \"gm4_ef_sneak\": {\n                    \"min\": 1\n                  }\n                }\n              }\n            },\n            {\n              \"condition\": \"minecraft:inverted\",\n              \"term\": {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"nbt\": \"{FallFlying:1b}\",\n                  \"stepping_on\": {\n                    \"block\": {\n                      \"blocks\": \"#gm4:no_collision\"\n                    }\n                  }\n                }\n              }\n            }\n          ]\n        }\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/tags/item/enderpuff.json",
    "content": "{\n  \"values\": [\n    \"minecraft:player_head\",\n    \"minecraft:poisonous_potato\"\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/barrens.json",
    "content": "{\n  \"values\": [\n    \"minecraft:end_barrens\",\n    \"minecraft:small_end_islands\",\n    \"#gm4_end_fishing:nullscape/void_barrens\"\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/center.json",
    "content": "{\n  \"values\": [\n    \"minecraft:the_end\"\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/high.json",
    "content": "{\n  \"values\": [\n    \"minecraft:end_highlands\"\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/mid.json",
    "content": "{\n  \"values\": [\n    \"minecraft:end_midlands\",\n    \"#gm4_end_fishing:nullscape/shadowlands\"\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/mid_high.json",
    "content": "{\n  \"values\": [\n    \"#gm4_end_fishing:mid\",\n    \"#gm4_end_fishing:high\"\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/nullscape/crystal_peaks.json",
    "content": "{\n    \"values\": [\n        {\n            \"id\": \"nullscape:crystal_peaks\",\n            \"required\": false\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/nullscape/shadowlands.json",
    "content": "{\n    \"values\": [\n        {\n            \"id\": \"nullscape:shadowlands\",\n            \"required\": false\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/nullscape/void_barrens.json",
    "content": "{\n    \"values\": [\n        {\n            \"id\": \"nullscape:void_barrens\",\n            \"required\": false\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/outer.json",
    "content": "{\n  \"values\": [\n    \"#gm4_end_fishing:barrens\",\n    \"#gm4_end_fishing:mid\",\n    \"#gm4_end_fishing:high\"\n  ]\n}\n"
  },
  {
    "path": "gm4_end_fishing/generate_optifine.py",
    "content": "from beet import Context\nfrom beet.contrib.optifine import OptifineProperties\nfrom itertools import product\n\ndef beet_default(ctx: Context):\n    \"\"\"generates the .properties files needed for optifine retextured armor\"\"\"\n\n    for material, i, part in product([\"diamond\", \"iron\", \"netherite\"], range(1,10+1), [\"boots\", \"leggings\", \"chestplate\", \"helmet\"]):\n        ctx.assets[OptifineProperties][f\"gm4_end_fishing:cit/{material}_{part}_{i}\"] = OptifineProperties(\"\\n\".join([\n        \"type=armor\",\n        f\"matchItems={material}_{part}\",\n        f\"texture.{material}_layer_{1+(part=='leggings')}={material}_{i}_layer_{1+(part=='leggings')}\",\n        f\"nbt.CustomModelData=$item/end_city_armor_{i}\"\n        ]))"
  },
  {
    "path": "gm4_end_fishing/register_model_data.py",
    "content": "from beet import Context, Model\nfrom itertools import product\n\nMATERIALS = [\"diamond\", \"iron\", \"netherite\"]\nARMORS = [\"helmet\", \"chestplate\", \"leggings\", \"boots\"]\nTOOLS = [\"pickaxe\", \"shovel\"]\nORES = [\"diamond\", \"emerald\", \"gold_ingot\", \"iron_ingot\"]\n\ndef beet_default(ctx: Context):\n    \"\"\"Registered repetitive model_data config options for fishable items\"\"\"\n    model_data_reg = ctx.meta[\"gm4\"].setdefault(\"model_data\", [])\n    for i in range(1,10+1):\n        item_models: dict[str,str] = {}\n        for material, armor in product(MATERIALS, ARMORS):\n            ctx.assets.models[f\"gm4_end_fishing:item/armor/{material}_{armor}_{i}\"] = Model({\n                \"parent\": \"item/generated\",\n                \"textures\": {\n                    \"layer0\": f\"gm4_end_fishing:item/armor/{material}_{armor}_{i}\"\n                }\n            })\n            item_models.update({f\"{material}_{armor}\": f\"item/armor/{material}_{armor}_{i}\"})\n        model_data_reg.append({\n            \"item\": list(item_models.keys()),\n            \"model\": item_models,\n            \"reference\": f\"item/end_city_armor_{i}\"\n        })\n\n    for i in range(1,10+1):\n        item_models = {}\n        for material, tool in product(MATERIALS, TOOLS):\n            ctx.assets.models[f\"gm4_end_fishing:item/tools/{material}_{tool}_{i}\"] = Model({\n                \"parent\": \"item/handheld\",\n                \"textures\": {\n                    \"layer0\": f\"gm4_end_fishing:item/tools/{material}_{tool}_{i}\"\n                }\n            })\n            item_models.update({f\"{material}_{tool}\": f\"item/tools/{material}_{tool}_{i}\"})\n        model_data_reg.append({\n            \"item\": list(item_models.keys()),\n            \"model\": item_models,\n            \"reference\": f\"item/end_city_tools_{i}\"\n        })\n\n    for i in range(1,20+1):\n        item_models = {}\n        for material in MATERIALS:\n            # item models have custom tuning, and are specified in source\n            item_models.update({f\"{material}_sword\": f\"item/swords/{material}_sword_{i}\"})\n        model_data_reg.append({\n            \"item\": list(item_models.keys()),\n            \"model\": item_models,\n            \"reference\": f\"item/end_city_swords_{i}\",\n            \"template\": \"custom\"\n        })\n\n    for i in range(1,5+1):\n        item_models = {}\n        for material in [\"diamond\", \"golden\", \"iron\"]:\n            ctx.assets.models[f\"gm4_end_fishing:item/horse_armor/{material}_horse_armor_{i}\"] = Model({\n                \"parent\": f\"minecraft:item/{material}_horse_armor\"\n            })\n            item_models.update({f\"{material}_horse_armor\": f\"item/horse_armor/{material}_horse_armor_{i}\"})\n        model_data_reg.append({\n            \"item\": list(item_models.keys()),\n            \"model\": item_models,\n            \"reference\": f\"item/end_city_horse_armor_{i}\",\n        })\n\n    for i in range(1,6+1):\n        item_models = {}\n        for ore in ORES:\n            ctx.assets.models[f\"gm4_end_fishing:item/ores/{ore}_{i}\"] = Model({\n                \"parent\": \"item/generated\",\n                \"textures\":{\n                    \"layer0\": f\"gm4_end_fishing:item/ores/end_{ore}\"\n                }\n            })\n            item_models.update({ore: f\"item/ores/{ore}_{i}\"})\n        model_data_reg.append({\n            \"item\": ORES,\n            \"model\": item_models,\n            \"reference\": f\"item/end_city_ore_{i}\",\n        })\n"
  },
  {
    "path": "gm4_ender_hoppers/README.md",
    "content": "# Ender Hoppers<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nHoppers now have a larger range and teleport items to them!<!--$pmc:headerSize-->\r\n\r\n<img src=\"images/ender_hoppers.webp\" alt=\"Creation of an Ender Hopper and it sucking in items\" width=\"350\"/> <!--$localAssetToURL--> <!--$pmc:delete-->\r\n\r\n### Features\r\n- Creates a 9x9 area centered on the hopper where items can be teleported in\r\n- Adds an Ender Hopper on rails, for mobile item collection device\r\n- The hopper is disabled when a redstone signal is applied\r\n"
  },
  {
    "path": "gm4_ender_hoppers/assets/gm4_ender_hoppers/models/block/ender_hopper.json",
    "content": "{\n\t\"textures\": {\n\t\t\"side\": \"gm4_ender_hoppers:block/ender_hopper_eye_side\",\n\t\t\"top\": \"gm4_ender_hoppers:block/ender_hopper_eye_top\",\n\t\t\"bottom\": \"gm4_ender_hoppers:block/ender_hopper_eye_bottom\",\n\t\t\"particle\": \"gm4_ender_hoppers:block/ender_hopper_eye_side\"\n\t},\n\t\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [4, 11, 4],\n\t\t\t\"to\": [12, 19, 12],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 16, 16], \"rotation\": 180, \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/assets/gm4_ender_hoppers/models/block/ender_hopper_minecart.json",
    "content": "{\n\t\"textures\": {\n\t\t\"side\": \"gm4_ender_hoppers:block/ender_hopper_eye_side\",\n\t\t\"top\": \"gm4_ender_hoppers:block/ender_hopper_eye_top\",\n\t\t\"bottom\": \"gm4_ender_hoppers:block/ender_hopper_eye_bottom\",\n\t\t\"particle\": \"gm4_ender_hoppers:block/ender_hopper_eye_side\"\t\n\t},\n\t\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [4, 11, 4],\n\t\t\t\"to\": [12, 19, 12],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 16, 16], \"rotation\": 180, \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/assets/gm4_ender_hoppers/models/block/ender_hopper_side.json",
    "content": "{\n\t\"textures\": {\n\t\t\"side\": \"gm4_ender_hoppers:block/ender_hopper_eye_side\",\n\t\t\"top\": \"gm4_ender_hoppers:block/ender_hopper_eye_top\",\n\t\t\"bottom\": \"gm4_ender_hoppers:block/ender_hopper_eye_bottom\",\n\t\t\"particle\": \"gm4_ender_hoppers:block/ender_hopper_eye_side\"\t\n\t},\n\t\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [4, 11, 4],\n\t\t\t\"to\": [12, 19, 12],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 16, 16], \"rotation\": 180, \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/assets/gm4_ender_hoppers/models/item/ender_hopper_full.json",
    "content": "{\n  \"parent\": \"minecraft:block/block\",\n  \"ambientocclusion\": false,\n  \"textures\": {\n    \"particle\": \"minecraft:block/hopper_outside\",\n    \"top\": \"minecraft:block/hopper_top\",\n    \"side\": \"minecraft:block/hopper_outside\",\n    \"inside\": \"minecraft:block/hopper_inside\",\n    \"5\": \"gm4_ender_hoppers:block/ender_hopper_eye_side\",\n    \"6\": \"gm4_ender_hoppers:block/ender_hopper_eye_top\"\n  },\n  \"elements\": [\n    {\n      \"from\": [\n        0,\n        10,\n        0\n      ],\n      \"to\": [\n        16,\n        11,\n        16\n      ],\n      \"faces\": {\n        \"down\": {\n          \"texture\": \"#side\"\n        },\n        \"up\": {\n          \"texture\": \"#inside\",\n          \"cullface\": \"up\"\n        },\n        \"north\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"north\"\n        },\n        \"south\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"south\"\n        },\n        \"west\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"west\"\n        },\n        \"east\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"east\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        0,\n        11,\n        0\n      ],\n      \"to\": [\n        2,\n        16,\n        16\n      ],\n      \"faces\": {\n        \"up\": {\n          \"texture\": \"#top\",\n          \"cullface\": \"up\"\n        },\n        \"north\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"north\"\n        },\n        \"south\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"south\"\n        },\n        \"west\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"west\"\n        },\n        \"east\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"up\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        14,\n        11,\n        0\n      ],\n      \"to\": [\n        16,\n        16,\n        16\n      ],\n      \"faces\": {\n        \"up\": {\n          \"texture\": \"#top\",\n          \"cullface\": \"up\"\n        },\n        \"north\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"north\"\n        },\n        \"south\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"south\"\n        },\n        \"west\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"up\"\n        },\n        \"east\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"east\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        2,\n        11,\n        0\n      ],\n      \"to\": [\n        14,\n        16,\n        2\n      ],\n      \"faces\": {\n        \"up\": {\n          \"texture\": \"#top\",\n          \"cullface\": \"up\"\n        },\n        \"north\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"north\"\n        },\n        \"south\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"up\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        2,\n        11,\n        14\n      ],\n      \"to\": [\n        14,\n        16,\n        16\n      ],\n      \"faces\": {\n        \"up\": {\n          \"texture\": \"#top\",\n          \"cullface\": \"up\"\n        },\n        \"north\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"up\"\n        },\n        \"south\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"south\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        4,\n        4,\n        4\n      ],\n      \"to\": [\n        12,\n        10,\n        12\n      ],\n      \"faces\": {\n        \"down\": {\n          \"texture\": \"#side\"\n        },\n        \"north\": {\n          \"texture\": \"#side\"\n        },\n        \"south\": {\n          \"texture\": \"#side\"\n        },\n        \"west\": {\n          \"texture\": \"#side\"\n        },\n        \"east\": {\n          \"texture\": \"#side\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        6,\n        0,\n        6\n      ],\n      \"to\": [\n        10,\n        4,\n        10\n      ],\n      \"faces\": {\n        \"down\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"down\"\n        },\n        \"north\": {\n          \"texture\": \"#side\"\n        },\n        \"south\": {\n          \"texture\": \"#side\"\n        },\n        \"west\": {\n          \"texture\": \"#side\"\n        },\n        \"east\": {\n          \"texture\": \"#side\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        4,\n        11,\n        4\n      ],\n      \"to\": [\n        12,\n        19,\n        12\n      ],\n      \"rotation\": {\n        \"angle\": 0,\n        \"axis\": \"y\",\n        \"origin\": [\n          4.5,\n          10.5,\n          4.5\n        ]\n      },\n      \"faces\": {\n        \"north\": {\n          \"uv\": [\n            0,\n            0,\n            16,\n            16\n          ],\n          \"texture\": \"#5\"\n        },\n        \"east\": {\n          \"uv\": [\n            0,\n            0,\n            16,\n            16\n          ],\n          \"texture\": \"#5\"\n        },\n        \"south\": {\n          \"uv\": [\n            0,\n            0,\n            16,\n            16\n          ],\n          \"texture\": \"#5\"\n        },\n        \"west\": {\n          \"uv\": [\n            0,\n            0,\n            16,\n            16\n          ],\n          \"texture\": \"#5\"\n        },\n        \"up\": {\n          \"uv\": [\n            0,\n            0,\n            16,\n            16\n          ],\n          \"texture\": \"#6\"\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/assets/translations.csv",
    "content": "key,en_us\nitem.gm4.ender_hopper_minecart,Minecart with Ender Hopper\nblock.gm4.ender_hopper,Ender Hopper\ncontainer.gm4.ender_hopper,Ender Hopper\ncontainer.gm4.ender_hopper_minecart,Minecart with Ender Hopper\ntext.gm4.guidebook.module_desc.ender_hoppers,Create special hoppers that teleport nearby items to them.\ntext.gm4.guidebook.ender_hoppers.description,\"Ender Hoppers teleport items to itself, even through walls.\\n\\nThey can also be combined with a minecart to create an Ender Hopper Minecart.\"\ntext.gm4.guidebook.ender_hoppers.crafting,Ender Hoppers can be crafted in a crafting table:\ntext.gm4.guidebook.ender_hoppers.usage,\"Ender Hoppers can pick up items in a range of 9x9 blocks, centered at itself and extending 3 blocks above itself.\\n\\nCombining a minecart with an ender hopper yields an ender hopper minecart.\"\n"
  },
  {
    "path": "gm4_ender_hoppers/beet.yaml",
    "content": "id: gm4_ender_hoppers\nname: Ender Hoppers\nversion: 1.9.X\n\ndata_pack:\n  load: .\n\nresource_pack: \n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_machines\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_machines: 1.5.0\n      schedule_loops: [main]\n    model_data:\n      - item: hopper_minecart\n        reference: item/ender_hopper_minecart\n        template: generated\n      - item: player_head\n        broadcast:\n          - reference: block/ender_hopper\n          - reference: block/ender_hopper_side\n          - reference: block/ender_hopper_minecart\n        template: custom\n        transforms: \n          - name: item_display\n            origin: [0.5,0.5,0.5]\n            scale: [0.83,0.83,0.83]\n            translation: [0,0.641,0]\n            display: head\n      - item: player_head\n        reference: item/ender_hopper\n        model: item/ender_hopper_full\n    gui_fonts:\n      - translation: gui.gm4.ender_hopper\n        container: hopper\n        texture: gui/container/ender_hopper\n      - translation: gui.gm4.ender_hopper_minecart\n        container: hopper\n        texture: gui/container/ender_hopper\n    website:\n      description: Create special hoppers that teleport nearby items to them.\n      recommended:\n        - gm4_resource_pack\n        - gm4_standard_crafting\n        - gm4_enchantment_extractors\n        - gm4_forming_press\n        - gm4_block_compressors\n        - gm4_disassemblers\n        - gm4_tunnel_bores\n        - gm4_boots_of_ostara\n        - gm4_heart_canisters\n        - gm4_smelteries\n        - gm4_liquid_tanks\n      notes: []\n    modrinth:\n      project_id: dB4zrtK8\n    video: https://www.youtube.com/watch?v=wrwg4BDgEGU\n    wiki: https://wiki.gm4.co/wiki/Ender_Hoppers\n    credits:\n      Creator:\n        - Elemend\n      Updated by:\n        - Misode\n        - BPR\n      Textures by:\n        - Kyrius\n      Icon Design:\n        - Sparks\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/advancement/recipes/ender_hopper.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_ender_hoppers:ender_hopper\"\n      }\n    },\n    \"has_the_minecart_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_ender_hoppers:ender_hopper_minecart\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:ender_eye\",\n              \"minecraft:respawn_anchor\",\n              \"minecraft:hopper\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_the_minecart_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_ender_hoppers:ender_hopper\",\n      \"gm4_ender_hoppers:ender_hopper_minecart\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/init.mcfunction",
    "content": "execute unless score ender_hoppers gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Ender Hoppers\"}\nexecute unless score ender_hoppers gm4_earliest_version < ender_hoppers gm4_modules run scoreboard players operation ender_hoppers gm4_earliest_version = ender_hoppers gm4_modules\nscoreboard players set ender_hoppers gm4_modules 1\n\nschedule function gm4_ender_hoppers:main 1t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/create.mcfunction",
    "content": "# places the ender_hopper down\n# @s = player who placed the ender_hopper\n# located at the center of the placed block\n# run from gm4_ender_hoppers:machine/verify_place_down\n\n# place block depending on face_placement\nexecute if score $face_placement gm4_machine_data matches 1..2 run function gm4_ender_hoppers:machine/rotate/down\nexecute if score $face_placement gm4_machine_data matches 3 run function gm4_ender_hoppers:machine/rotate/south\nexecute if score $face_placement gm4_machine_data matches 4 run function gm4_ender_hoppers:machine/rotate/west\nexecute if score $face_placement gm4_machine_data matches 5 run function gm4_ender_hoppers:machine/rotate/north\nexecute if score $face_placement gm4_machine_data matches 6 run function gm4_ender_hoppers:machine/rotate/east\n\n# mark block as placed\nparticle large_smoke ~ ~ ~ 0.2 0.2 0.2 0 10\nplaysound minecraft:block.respawn_anchor.charge block @a[distance=..5] ~ ~ ~ 0.3 0.7\nscoreboard players set $placed_block gm4_machine_data 1\nscoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2\ntag @e[distance=..2] remove gm4_new_machine\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/create_cart.mcfunction",
    "content": "# places the ender_hopper_minecart down\n# @s = hopper_minecart with the ender_hopper_minecart name\n# located at @s\n# run from gm4_ender_hoppers:machine/verify_place_cart\n\nscoreboard players set $placed_block gm4_machine_data 1\n\n# summon new hopper minecart\nsummon hopper_minecart ~ ~ ~ {Tags:[\"gm4_ender_hopper_minecart_new\",\"gm4_new_machine\"],Passengers:[{id:\"minecraft:item_display\",CustomName:\"gm4_ender_hopper_display\",Tags:[\"gm4_no_edit\",\"gm4_ender_hopper_display\",\"gm4_machine_cart\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_ender_hoppers:block/ender_hopper_minecart\"]},\"minecraft:profile\":\"$ender_hopper_display\"}},item_display:\"head\",transformation:{scale:[0.83,0.83,0.83],right_rotation:[0,0,0,1],left_rotation:[0,0,0,1],translation:[0.0,0.7275,0.0]}}]}\nparticle large_smoke ~ ~0.5 ~ 0.2 0.2 0.2 0 10\nplaysound minecraft:block.respawn_anchor.charge block @a[distance=..5] ~ ~ ~ 0.3 0.7\nscoreboard players set @e[tag=gm4_new_machine,distance=..2] gm4_entity_version 1\n\n# clean up\ndata modify entity @e[type=hopper_minecart,tag=gm4_ender_hopper_minecart_new,distance=..0.1,limit=1] {} merge from entity @s {}\ndata merge entity @e[type=hopper_minecart,tag=gm4_ender_hopper_minecart_new,distance=..0.1,limit=1] {CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},[{\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]},Tags:[\"gm4_ender_hopper_minecart\",\"gm4_machine_cart\"]}\ndata merge entity @s {Items:[]}\nkill @s\ntag @e[distance=..2] remove gm4_new_machine\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/destroy.mcfunction",
    "content": "# destroys the ender_hopper\n# @s = ender_hopper marker\n# located at @s\n# run from gm4_ender_hoppers:machine/verify_destroy\n\n# kill entities related to machine block\nexecute positioned ~ ~ ~ run kill @e[type=item_display,tag=gm4_ender_hopper_display,limit=1,distance=..0.01]\nexecute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:\"minecraft:hopper\",count:1,components:{}}},limit=1,sort=nearest]\nkill @s\n\n# drop item (unless broken in creative mode)\nparticle explosion ~ ~ ~\nexecute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_ender_hoppers:items/ender_hopper\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/destroy_cart/drop_item.mcfunction",
    "content": "# drops the correct item\n# @s = invalid item entity\n# located at @s\n# run from gm4_ender_hoppers:machine/destroy_cart\n\n# drop item, and set flag\nexecute store success score $dropped_item gm4_machine_data run loot spawn ~ ~ ~ loot gm4_ender_hoppers:entities/ender_hopper_minecart\nparticle explosion ~ ~ ~\n\n# kill original (invalid) item\nkill @s\n\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/destroy_cart/scan_hoppers.mcfunction",
    "content": "# searches for hoppers with invalid items\n# @s = ender_hopper marker\n# located at @s\n# run from gm4_ender_hoppers:machine/destroy_cart\n\n# find hopper with the invalid item\nscoreboard players set $found_item gm4_machine_data 0\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\n\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\n\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper\n\n# if no hoppers found, find hopper minecarts with the invalid item\nexecute if score $found_item gm4_machine_data matches 0 as @e[type=hopper_minecart,distance=..3,nbt={Items:[{id:\"minecraft:hopper_minecart\",components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}]}] run function gm4_ender_hoppers:machine/destroy_cart/update_hopper_minecart\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/destroy_cart/update_hopper.mcfunction",
    "content": "# updates hoppers with invalid items\n# @s = ender_hopper marker\n# located at the hopper with an invalid item\n# run from gm4_ender_hoppers:machine/destroy_cart/scan_hoppers\n\n# replace correct slot with proper item\ndata modify storage gm4_machines:temp Items set from block ~ ~ ~ Items\nexecute if data storage gm4_machines:temp Items[{Slot:0b,components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}] run loot replace block ~ ~ ~ container.0 loot gm4_ender_hoppers:entities/ender_hopper_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:1b,components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}] run loot replace block ~ ~ ~ container.1 loot gm4_ender_hoppers:entities/ender_hopper_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:2b,components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}] run loot replace block ~ ~ ~ container.2 loot gm4_ender_hoppers:entities/ender_hopper_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:3b,components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}] run loot replace block ~ ~ ~ container.3 loot gm4_ender_hoppers:entities/ender_hopper_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:4b,components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}] run loot replace block ~ ~ ~ container.4 loot gm4_ender_hoppers:entities/ender_hopper_minecart\n\n# clean up\ndata remove storage gm4_machines:temp Items\nscoreboard players set $found_item gm4_machine_data 1\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/destroy_cart/update_hopper_minecart.mcfunction",
    "content": "# updates hopper minecarts with invalid items\n# @s = hopper minecart with invalid item\n# located at @s\n# run from gm4_ender_hoppers:machine/destroy_cart/scan_hoppers\n\n# replace correct slot with proper item\ndata modify storage gm4_machines:temp Items set from entity @s Items\nexecute if data storage gm4_machines:temp Items[{Slot:0b,components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}] run loot replace entity @s container.0 loot gm4_ender_hoppers:entities/ender_hopper_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:1b,components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}] run loot replace entity @s container.1 loot gm4_ender_hoppers:entities/ender_hopper_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:2b,components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}] run loot replace entity @s container.2 loot gm4_ender_hoppers:entities/ender_hopper_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:3b,components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}] run loot replace entity @s container.3 loot gm4_ender_hoppers:entities/ender_hopper_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:4b,components:{\"minecraft:custom_name\":{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},{\"color\":\"white\",\"font\":\"gm4:container_gui\",\"extra\":[{\"color\":\"#404040\",\"font\":\"gm4:default\",\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"}],\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\"}]}}}] run loot replace entity @s container.4 loot gm4_ender_hoppers:entities/ender_hopper_minecart\n\n# clean up\ndata remove storage gm4_machines:temp Items\nscoreboard players set $found_item gm4_machine_data 1\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/destroy_cart.mcfunction",
    "content": "# destroys the ender_hopper\n# @s = ender_hopper marker\n# located at @s\n# run from gm4_ender_hoppers:machine/verify_destroy\n\n# drop item\nscoreboard players set $dropped_item gm4_machine_data 0\nexecute as @e[type=item,distance=..3,nbt={Age:0s,Item:{id:\"minecraft:hopper_minecart\",count:1,components:{}}},limit=1,sort=nearest] at @s run function gm4_ender_hoppers:machine/destroy_cart/drop_item\n\n# scan hoppers if no item was broken\nexecute if score $dropped_item gm4_machine_data matches 0 run function gm4_ender_hoppers:machine/destroy_cart/scan_hoppers\n\n# kill marker\nkill @s\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/rotate/down.mcfunction",
    "content": "# places the ender_hopper down based on rotation\n# @s = player who placed the ender_hopper\n# located at the center of the placed block\n# run from gm4_ender_hoppers:machine/create\n\n# place hopper\nsetblock ~ ~ ~ hopper[facing=down]{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper\",\"fallback\":\"Ender Hopper\"},[{\"translate\":\"gui.gm4.ender_hopper\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.ender_hopper\",\"fallback\":\"Ender Hopper\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon display armor stand and marker entity\nsummon item_display ~ ~ ~ {item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_ender_hoppers:block/ender_hopper\"]},\"minecraft:profile\":\"$ender_hopper_display\"}},item_display:head,CustomName:\"gm4_ender_hopper_display\",Tags:[\"gm4_ender_hopper_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],transformation:{scale:[0.83,0.83,0.83],left_rotation:[0,0,0,1],right_rotation:[0,0,0,1],translation:[0.0,0.641,0.0]}}\nsummon marker ~ ~ ~ {Tags:[\"gm4_ender_hopper\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_ender_hopper\",Rotation:[0.0f,0.0f]}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/rotate/east.mcfunction",
    "content": "# places the ender_hopper down based on rotation\n# @s = player who placed the ender_hopper\n# located at the center of the placed block\n# run from gm4_ender_hoppers:machine/create\n\n# place hopper\nsetblock ~ ~ ~ hopper[facing=east]{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper\",\"fallback\":\"Ender Hopper\"},[{\"translate\":\"gui.gm4.ender_hopper\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.ender_hopper\",\"fallback\":\"Ender Hopper\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon display armor stand and marker entity\nsummon item_display ~ ~ ~ {item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_ender_hoppers:block/ender_hopper\"]},\"minecraft:profile\":\"$ender_hopper_display\"}},item_display:head,CustomName:\"gm4_ender_hopper_display\",Tags:[\"gm4_ender_hopper_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],transformation:{scale:[0.83,0.83,0.83],left_rotation:[0,0,0,1],right_rotation:[0,0,0,1],translation:[0.0,0.641,0.0]},Rotation:[-90.0f,0.0f]}\nsummon marker ~ ~ ~ {Tags:[\"gm4_ender_hopper\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_ender_hopper\",Rotation:[-90.0f,0.0f]}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/rotate/north.mcfunction",
    "content": "# places the ender_hopper down based on rotation\n# @s = player who placed the ender_hopper\n# located at the center of the placed block\n# run from gm4_ender_hoppers:machine/create\n\n# place hopper\nsetblock ~ ~ ~ hopper[facing=north]{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper\",\"fallback\":\"Ender Hopper\"},[{\"translate\":\"gui.gm4.ender_hopper\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.ender_hopper\",\"fallback\":\"Ender Hopper\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon display armor stand and marker entity\nsummon item_display ~ ~ ~ {item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_ender_hoppers:block/ender_hopper\"]},\"minecraft:profile\":\"$ender_hopper_display\"}},item_display:head,CustomName:\"gm4_ender_hopper_display\",Tags:[\"gm4_ender_hopper_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],transformation:{scale:[0.83,0.83,0.83],left_rotation:[0,0,0,1],right_rotation:[0,0,0,1],translation:[0.0,0.641,0.0]},Rotation:[180.0f,0.0f]}\nsummon marker ~ ~ ~ {Tags:[\"gm4_ender_hopper\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_ender_hopper\",Rotation:[180.0f,0.0f]}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/rotate/south.mcfunction",
    "content": "# places the ender_hopper down based on rotation\n# @s = player who placed the ender_hopper\n# located at the center of the placed block\n# run from gm4_ender_hoppers:machine/create\n\n# place hopper\nsetblock ~ ~ ~ hopper[facing=south]{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper\",\"fallback\":\"Ender Hopper\"},[{\"translate\":\"gui.gm4.ender_hopper\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.ender_hopper\",\"fallback\":\"Ender Hopper\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon display armor stand and marker entity\nsummon item_display ~ ~ ~ {item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_ender_hoppers:block/ender_hopper\"]},\"minecraft:profile\":\"$ender_hopper_display\"}},item_display:head,CustomName:\"gm4_ender_hopper_display\",Tags:[\"gm4_ender_hopper_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],transformation:{scale:[0.83,0.83,0.83],left_rotation:[0,0,0,1],right_rotation:[0,0,0,1],translation:[0.0,0.641,0.0]},Rotation:[0.0f,0.0f]}\nsummon marker ~ ~ ~ {Tags:[\"gm4_ender_hopper\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_ender_hopper\",Rotation:[0.0f,0.0f]}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/rotate/west.mcfunction",
    "content": "# places the ender_hopper down based on rotation\n# @s = player who placed the ender_hopper\n# located at the center of the placed block\n# run from gm4_ender_hoppers:machine/create\n\n# place hopper\nsetblock ~ ~ ~ hopper[facing=west]{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper\",\"fallback\":\"Ender Hopper\"},[{\"translate\":\"gui.gm4.ender_hopper\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.ender_hopper\",\"fallback\":\"Ender Hopper\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon display armor stand and marker entity\nsummon item_display ~ ~ ~ {item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_ender_hoppers:block/ender_hopper\"]},\"minecraft:profile\":\"$ender_hopper_display\"}},item_display:head,CustomName:\"gm4_ender_hopper_display\",Tags:[\"gm4_ender_hopper_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],transformation:{scale:[0.83,0.83,0.83],left_rotation:[0,0,0,1],right_rotation:[0,0,0,1],translation:[0.0,0.641,0.0]},Rotation:[90.0f,0.0f]}\nsummon marker ~ ~ ~ {Tags:[\"gm4_ender_hopper\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_ender_hopper\",Rotation:[90.0f,0.0f]}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/verify_destroy.mcfunction",
    "content": "# verifies that the destroyed machine was from this module\n# @s = machine block marker\n# located at @s\n# run from #gm4_machines:destroy\n\nexecute if entity @s[tag=gm4_ender_hopper] run function gm4_ender_hoppers:machine/destroy\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/verify_destroy_cart.mcfunction",
    "content": "# verifies that the destroyed machine was from this module\n# @s = machine block marker\n# located at @s\n# run from #gm4_machines:destroy\n\nexecute if entity @s[tag=gm4_ender_hopper_display] run function gm4_ender_hoppers:machine/destroy_cart\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/verify_place_cart.mcfunction",
    "content": "# verifies that the placed down machine minecart was from this module\n# @s = machine minecart\n# located at the machine minecart\n# run from #gm4_machines:place_cart\n\nexecute if score $placed_block gm4_machine_data matches 0 if data entity @s {CustomName:{\"translate\":\"item.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\",\"italic\":false}} run function gm4_ender_hoppers:machine/create_cart\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/verify_place_down.mcfunction",
    "content": "# verifies that the placed down machine was from this module\n# @s = player who placed down the machine\n# located at the machine block marker (at the center of the placed down block)\n# run from #gm4_machines:place_down\n\nexecute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:\"ender_hopper\"} run function gm4_ender_hoppers:machine/create\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/main.mcfunction",
    "content": "# process machine\nexecute as @e[type=marker,tag=gm4_ender_hopper] at @s run function gm4_ender_hoppers:process\nexecute as @e[type=hopper_minecart,tag=gm4_ender_hopper_minecart] at @s run function gm4_ender_hoppers:process_cart\n\nschedule function gm4_ender_hoppers:main 16t\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/process.mcfunction",
    "content": "# @s = ender hopper marker\n# run from main\n\nparticle portal ~ ~ ~ 0 0 0 0.5 2\nexecute if block ~ ~ ~ hopper[enabled=true] positioned ~-4.5 ~0.5 ~-4.5 as @e[type=item,dx=8,dy=2,dz=8,tag=!gm4_ender_hoppers_tp] positioned ~4.5 ~ ~4.5 run function gm4_ender_hoppers:teleport\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/process_cart.mcfunction",
    "content": "# @s = ender hopper minecart\n# run from main\n\nparticle portal ~ ~ ~ 0 0 0 0.5 2\nexecute unless block ~ ~ ~ activator_rail[powered=true] positioned ~-4.5 ~ ~-4.5 as @e[type=item,dx=8,dy=3,dz=8,tag=!gm4_ender_hoppers_tp] positioned ~4.5 ~ ~4.5 run function gm4_ender_hoppers:teleport\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/teleport.mcfunction",
    "content": "tp @s ~ ~ ~\nparticle witch ~ ~0.5 ~ 0 0 0 0.6 5\ntag @s add gm4_ender_hoppers_tp\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/upgrade_paths/1.5/block_upgrade.mcfunction",
    "content": "# run from upgrade_paths/1.5\n# @s = ender hopper display armor stand to be replaced\n\nsummon item_display ~ ~0.5 ~ {item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_ender_hoppers:block/ender_hopper\"]},\"minecraft:profile\":\"$ender_hopper_display\"}},item_display:\"head\",CustomName:\"gm4_ender_hopper_display\",Tags:[\"gm4_ender_hopper_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],transformation:{scale:[0.83,0.83,0.83],left_rotation:[0,0,0,1],right_rotation:[0,0,0,1],translation:[0.0,0.641,0.0]},Rotation:[0.0f,0.0f]}\n\n# side-facing hopper, set the right CMD\nexecute if items entity @s weapon.mainhand *[minecraft:custom_model_data={floats:[3420008]}] run data modify entity @e[type=item_display,limit=1,distance=..0.6,tag=gm4_new_machine] item.components.\"minecraft:custom_model_data\" set value {strings:[\"gm4_ender_hoppers:block/ender_hopper_side\"]}\n\ndata modify entity @e[type=item_display,limit=1,distance=..0.6,tag=gm4_new_machine] Rotation set from entity @s Rotation\nscoreboard players set @e[type=item_display,limit=1,distance=..0.6,tag=gm4_new_machine] gm4_entity_version 2\nscoreboard players set @e[type=marker,limit=1,distance=..0.6,tag=gm4_ender_hopper] gm4_entity_version 2\ntag @e[type=item_display,distance=..0.6,tag=gm4_new_machine] remove gm4_new_machine\nkill @s\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/upgrade_paths/1.5/minecart_upgrade.mcfunction",
    "content": "# run from upgrade_paths/1.5\n# @s = existing ender hopper minecart (cart entity)\n\nsummon hopper_minecart ~ ~ ~ {Tags:[\"gm4_ender_hopper_minecart_new\",\"gm4_new_machine\"],Passengers:[{id:\"minecraft:item_display\",CustomName:\"gm4_ender_hopper_display\",Tags:[\"gm4_no_edit\",\"gm4_ender_hopper_display\",\"gm4_machine_cart\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_ender_hoppers:block/ender_hopper_minecart\"]},\"minecraft:profile\":\"$ender_hopper_display\"}},item_display:\"head\",transformation:{scale:[0.83,0.83,0.83],right_rotation:[0,0,0,1],left_rotation:[0,0,0,1],translation:[0.0,0.7275,0.0]}}]}\ndata modify entity @e[type=hopper_minecart,tag=gm4_ender_hopper_minecart_new,distance=..0.1,limit=1] {} merge from entity @s {}\ndata merge entity @e[type=hopper_minecart,tag=gm4_ender_hopper_minecart_new,distance=..0.1,limit=1] {CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\"},[{\"translate\":\"gui.gm4.ender_hopper_minecart\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]},Tags:[\"gm4_ender_hopper_minecart\",\"gm4_machine_cart\"]}\n\ndata merge entity @s {Items:[]}\nexecute on passengers run kill @s\nkill @s\ntag @e[distance=..2] remove gm4_new_machine\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/function/upgrade_paths/1.5.mcfunction",
    "content": "execute as @e[type=armor_stand,tag=gm4_ender_hopper_stand,tag=!gm4_machine_cart,scores={gm4_entity_version=1}] at @s run function gm4_ender_hoppers:upgrade_paths/1.5/block_upgrade\nexecute as @e[type=armor_stand,tag=gm4_ender_hopper_stand,tag=gm4_machine_cart,scores={gm4_entity_version=1}] on vehicle at @s run function gm4_ender_hoppers:upgrade_paths/1.5/minecart_upgrade\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/guidebook/ender_hoppers.json",
    "content": "{\n  \"id\": \"ender_hoppers\",\n  \"name\": \"Ender Hoppers\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:ender_eye\"\n  },\n  \"criteria\": {\n    \"obtain_ender_eye\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:ender_eye\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_hopper\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:hopper\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_ender_hopper\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"ender_hopper\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"open_ender_hopper\": {\n      \"trigger\": \"minecraft:default_block_use\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:hopper\"\n                ],\n                \"nbt\": \"{CustomName:{\\\"translate\\\":\\\"gm4.second\\\",\\\"fallback\\\":\\\"%1$s\\\",\\\"with\\\":[{\\\"translate\\\":\\\"container.gm4.ender_hopper\\\",\\\"fallback\\\":\\\"Ender Hopper\\\"},{\\\"translate\\\":\\\"gui.gm4.ender_hopper\\\",\\\"fallback\\\":\\\"\\\",\\\"extra\\\":[{\\\"translate\\\":\\\"container.gm4.ender_hopper\\\",\\\"fallback\\\":\\\"Ender Hopper\\\",\\\"font\\\":\\\"gm4:default\\\",\\\"color\\\":\\\"#404040\\\"}],\\\"font\\\":\\\"gm4:container_gui\\\",\\\"color\\\":\\\"white\\\"}]}}\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"initial\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.ender_hoppers.description\",\n            \"fallback\": \"Ender Hoppers teleport items to itself, even through walls.\\n\\nThey can also be combined with a minecart to create an Ender Hopper Minecart.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"crafting\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_ender_eye\"\n        ],\n        [\n          \"obtain_hopper\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.ender_hoppers.crafting\",\n            \"fallback\": \"Ender Hoppers can be crafted in a crafting table:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_ender_hoppers:ender_hopper\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"open_ender_hopper\",\n          \"obtain_ender_hopper\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.ender_hoppers.usage\",\n            \"fallback\": \"Ender Hoppers can pick up items in a range of 9x9 blocks, centered at itself and extending 3 blocks above itself.\\n\\nCombining a minecart with an ender hopper yields an ender hopper minecart.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/loot_table/entities/ender_hopper_minecart.json",
    "content": "{\n  \"type\": \"minecraft:entity\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_ender_hoppers:items/ender_hopper_minecart\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/loot_table/items/ender_hopper.json",
    "content": "{\n  \"type\": \"block\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_ender_hoppers:item/ender_hopper\"]},\n                \"minecraft:profile\": \"$ender_hopper\"\n              }\n            },\n            {\n              \"function\": \"set_custom_data\",\n              \"tag\": \"{gm4_machines:{id:'ender_hopper'}}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"translate\": \"block.gm4.ender_hopper\",\n                  \"fallback\": \"Ender Hopper\",\n                  \"color\": \"white\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/loot_table/items/ender_hopper_minecart.json",
    "content": "{\n  \"type\": \"generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:hopper_minecart\",\n          \"functions\": [\n            {\n              \"function\": \"set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_ender_hoppers:item/ender_hopper_minecart\"]}\n              }\n            },\n            {\n              \"function\": \"set_custom_data\",\n              \"tag\": \"{gm4_machines:{id:'ender_hopper_minecart'}}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"translate\": \"item.gm4.ender_hopper_minecart\",\n                  \"fallback\": \"Minecart with Ender Hopper\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/recipe/ender_hopper.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"redstone\",\n  \"pattern\": [\n    \"E\",\n    \"R\",\n    \"H\"\n  ],\n  \"key\": {\n    \"E\": \"minecraft:ender_eye\",\n    \"R\": \"minecraft:respawn_anchor\",\n    \"H\": \"minecraft:hopper\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:player_head\",\n    \"components\": {\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_ender_hoppers:item/ender_hopper\"]},\n      \"minecraft:profile\": \"$ender_hopper\",\n      \"minecraft:custom_data\": \"{gm4_machines:{id:'ender_hopper'}}\",\n      \"minecraft:custom_name\": {\"translate\":\"block.gm4.ender_hopper\",\"fallback\":\"Ender Hopper\",\"color\":\"white\",\"italic\":false}\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/recipe/ender_hopper_minecart.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"redstone\",\n  \"pattern\": [\n    \"E\",\n    \"R\",\n    \"H\"\n  ],\n  \"key\": {\n    \"E\": \"minecraft:ender_eye\",\n    \"R\": \"minecraft:respawn_anchor\",\n    \"H\": \"minecraft:hopper_minecart\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:hopper_minecart\",\n    \"components\": {\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_ender_hoppers:item/ender_hopper_minecart\"]},\n      \"minecraft:custom_data\": \"{gm4_machines:{id:'ender_hopper_minecart'}}\",\n      \"minecraft:custom_name\": {\"translate\":\"item.gm4.ender_hopper_minecart\",\"fallback\":\"Minecart with Ender Hopper\",\"color\":\"white\",\"italic\":false}\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/test/pickup.mcfunction",
    "content": "# @template gm4_ender_hoppers:test_pickup\n\nsummon item ~2.5 ~1.5 ~1.5 {Item:{id:\"minecraft:iron_ingot\"}}\nsummon item ~5.5 ~1.5 ~1.5 {Item:{id:\"minecraft:gold_ingot\"}}\nsummon item ~6.5 ~1.5 ~1.5 {Item:{id:\"minecraft:diamond\"}}\n\nawait items block ~1 ~ ~1 container.* minecraft:iron_ingot\nawait items block ~1 ~ ~1 container.* minecraft:gold_ingot\n\nawait delay 1s\n\nassert not items block ~1 ~ ~1 container.* minecraft:diamond\nexecute positioned ~7 ~ ~ run assert items entity @e[type=item,distance=..2] contents minecraft:diamond\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/test/place.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n\nloot give @s loot gm4_ender_hoppers:items/ender_hopper\nexecute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1\ndummy @s use block ~1 ~ ~1\n\nassert block ~1 ~1 ~1 hopper\nassert entity @e[tag=gm4_ender_hopper,distance=..3]\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_ender_hoppers/test/place_minecart.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n# @optional\n\nsetblock ~1 ~1 ~1 rail\nloot give @s loot gm4_ender_hoppers:items/ender_hopper_minecart\nexecute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1\ndummy @s use block ~1 ~1 ~1\n\nawait entity @e[tag=gm4_ender_hopper_minecart,distance=..3]\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_machines/tags/function/destroy.json",
    "content": "{\n    \"values\": [\n        \"gm4_ender_hoppers:machine/verify_destroy\"\n    ]\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_machines/tags/function/destroy_cart.json",
    "content": "{\n    \"values\": [\n        \"gm4_ender_hoppers:machine/verify_destroy_cart\"\n    ]\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_machines/tags/function/place_cart.json",
    "content": "{\n    \"values\": [\n        \"gm4_ender_hoppers:machine/verify_place_cart\"\n    ]\n}\n"
  },
  {
    "path": "gm4_ender_hoppers/data/gm4_machines/tags/function/place_down.json",
    "content": "{\n    \"values\": [\n        \"gm4_ender_hoppers:machine/verify_place_down\"\n    ]\n}\n"
  },
  {
    "path": "gm4_everstone/README.md",
    "content": "# Everstone<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nThe power of ant-aging, but now for mobs! (And yes, it is stolen from Pokemon)<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Adds mob conversions/aging processes when certain conditions are met, for example:\r\n  - Guardians become Elder Guardians when there are at least 5 others nearby for atleast 20 minutes\r\n  - Piglins become Piglin Brutes when there less than 2 Brutes within 32 blocks for 1 hour\r\n  - Slimes become Magma Cubes when in The Nether for over 30 minutes\r\n- An Everstone can be obtained from mining stone during a full moon\r\n- Throwing the Everstone at a mob, blocks the conversion and prevents babies from growing up\r\n\r\nThe full list of mob conversions can be found on the [Wiki](https://wiki.gm4.co/Everstone).\r\n"
  },
  {
    "path": "gm4_everstone/assets/translations.csv",
    "content": "key,en_us\nitem.gm4.everstone,Everstone\nadvancement.gm4.everstone.title,Evolution Halt\nadvancement.gm4.everstone.description,Use an everstone to prevent a mob from aging\ntext.gm4.guidebook.module_desc.everstone,\"Collect Everstones during full moons and use them on baby mobs to stop them from aging! But watch out, some other mobs might start aging, too!\"\ntext.gm4.guidebook.everstone.description,Everstones can prevent mobs from aging.\\n\\nSome mobs that don't normally age now have the ability to evolve into other mobs.\ntext.gm4.guidebook.everstone.obtaining,Everstones can be obtained by mining stone during a full moon.\\n\\nStone mined with Silk Touch will never drop an everstone.\ntext.gm4.guidebook.everstone.usage,\"Dropping an everstone on a mob will prevent it from aging.\\n\\nZombies, Skeletons, Slimes, Strays, Piglins, Guardians, and Vindicators can evolve under specific conditions.\"\ntext.gm4.guidebook.everstone.zombie_conversion,Zombies will convert to husks after being in direct sunlight in a desert or badlands biome for a long time.\ntext.gm4.guidebook.everstone.skeleton_conversion,\"Skeletons will convert into strays after being in a cold, snowy biome for a long time.\"\ntext.gm4.guidebook.everstone.slime_conversion,Slimes will convert into magma cubes after being in the nether for a long time.\ntext.gm4.guidebook.everstone.stray_conversion,\"Strays will convert into skeletons if taken out of a cold, snowy biome for a long time.\"\ntext.gm4.guidebook.everstone.piglin_conversion,Piglins inside bastion remnants will convert into piglin brutes if there are less than two brutes nearby.\ntext.gm4.guidebook.everstone.guardian_conversion,\"Guardians will convert into elder guardians after being near several other guardians for a long time.\\n\\nSpecifically, guardians with five other friends will start to age.\"\ntext.gm4.guidebook.everstone.vindicator_conversion,\"Vindicators will convert into evokers when near at least seven magical blocks for a long time.\\n\\nThese blocks include enchanting tables, bookshelves, lecterns, brewing stands, and cauldrons.\"\n"
  },
  {
    "path": "gm4_everstone/beet.yaml",
    "content": "id: gm4_everstone\nname: Everstone\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: \n        - main\n        - tick\n        - aging_clock\n    model_data:\n      - item: firework_star\n        reference: item/everstone\n        template: generated\n      - item: firework_star\n        reference: gui/advancement/everstones\n        template:\n          name: advancement\n          foward: item/everstone\n    website:\n      description: Collect Everstones during full moons and use them on baby mobs to stop them from aging! But watch out, some other mobs might start aging, too!\n      recommended:\n        - gm4_resource_pack\n      notes: []\n    modrinth:\n      project_id: 4XVj9LBh\n    wiki: https://wiki.gm4.co/wiki/Everstone\n    credits:\n      Creators:\n        - Denniss\n        - BPR\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_everstone/data/c/tags/worldgen/biome/is_cold/overworld.json",
    "content": "{\n  \"values\": [\n    \"minecraft:taiga\",\n    \"minecraft:old_growth_pine_taiga\",\n    \"minecraft:snowy_plains\",\n    \"minecraft:ice_spikes\",\n    \"minecraft:grove\",\n    \"minecraft:snowy_slopes\",\n    \"minecraft:jagged_peaks\",\n    \"minecraft:frozen_peaks\",\n    \"minecraft:snowy_beach\",\n    \"minecraft:snowy_taiga\",\n    \"minecraft:frozen_river\",\n    \"minecraft:cold_ocean\",\n    \"minecraft:frozen_ocean\",\n    \"minecraft:deep_cold_ocean\",\n    \"minecraft:deep_frozen_ocean\",\n    {\n      \"id\": \"#c:climate_cold\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_everstone/data/c/tags/worldgen/biome/is_dry/overworld.json",
    "content": "{\n  \"values\": [\n    \"minecraft:desert\",\n    \"minecraft:badlands\",\n    \"minecraft:wooded_badlands\",\n    \"minecraft:eroded_badlands\",\n    \"minecraft:savanna\",\n    \"minecraft:savanna_plateau\",\n    \"minecraft:windswept_savanna\",\n    {\n      \"id\": \"#c:climate_dry\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_everstone/data/c/tags/worldgen/biome/is_swamp.json",
    "content": "{\n  \"values\": [\n    \"minecraft:mangrove_swamp\",\n    \"minecraft:swamp\"\n  ]\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4/advancement/everstone.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"firework_star\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_everstone:gui/advancement/everstones\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.everstone.title\",\n      \"fallback\": \"Evolution Halt\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.everstone.description\",\n      \"fallback\": \"Use an everstone to prevent a mob from aging\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"use_everstone\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/advancement/kill_age_locked.json",
    "content": "{\n  \"criteria\": {\n    \"ignore_kill\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": {\n          \"nbt\": \"{Tags:[\\\"gm4_everstone_locked\\\"]}\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_everstone:age_locking/killed_age_locked\"\n  }\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/age_locking/check.mcfunction",
    "content": "# checks for ageable mobs\n# @s = everstone item on ground\n# located at @s\n# run from main\n\ntag @s add gm4_everstone_used\ntag @e[distance=..1,type=#gm4_everstone:affected,limit=1,tag=!gm4_everstone_locked,tag=!smithed.entity,sort=nearest] add gm4_everstone_check\nfunction #gm4_everstone:age_locking_check\n\nexecute as @e[type=#gm4_everstone:affected,distance=..1,tag=gm4_everstone_check,limit=1] store result score @s gm4_es_data run data get entity @s Age\nscoreboard players set @e[type=#gm4_everstone:force_age_lock,distance=..1,tag=gm4_everstone_check,limit=1] gm4_es_data -1\nexecute as @e[type=#gm4_everstone:affected,distance=..1,tag=gm4_everstone_check,limit=1,scores={gm4_es_data=..-1}] at @s run function gm4_everstone:age_locking/lock_age\nscoreboard players reset @e[distance=..1] gm4_es_data\ntag @e[distance=..1] remove gm4_everstone_check\ntag @s remove gm4_everstone_used\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/age_locking/killed_age_locked.mcfunction",
    "content": "#run from advancement kill_age_locked\n#@s = player who killed a mob holding the everstone\n\nloot spawn ~ ~.3 ~ loot gm4_everstone:everstone\ndata merge entity @e[type=item,distance=..1,nbt={Age:0s,Item:{components:{\"minecraft:custom_data\":{gm4_everstone:1b}}}},limit=1] {PickupDelay:0}\n\nadvancement revoke @s only gm4_everstone:kill_age_locked\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/age_locking/lock_age.mcfunction",
    "content": "# run from check\n# @s = mob that will be affected by everstone, at @s\n\ndata merge entity @s[type=!#gm4_everstone:aging_mob] {Age:-2147483647}\ntag @s add gm4_everstone_locked\n\nkill @e[type=item,tag=gm4_everstone_used,distance=..1,limit=1]\nparticle minecraft:flash{color:-1} ~ ~2 ~ 0 0 0 0 20\nparticle minecraft:explosion ~ ~ ~ 0 0 0 0 0\nplaysound minecraft:entity.illusioner.cast_spell master @a[distance=..8] ~ ~ ~ 0.3 0.6\nadvancement grant @a[distance=..4] only gm4:everstone\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/age_mobs.mcfunction",
    "content": "# update age for some mobs\n# @s = none\n# located at world spawn\n# run from aging_clock\n\n# if age_count is less than 100, age one mob with that chance\nexecute if score $age_count gm4_es_data matches 1..99 run function gm4_everstone:aging/single\n\n# if age_count is greater than or equal to 100, age one mob then reiterate\nexecute if score $age_count gm4_es_data matches 100.. run function gm4_everstone:aging/multiple\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/convert/bogged.mcfunction",
    "content": "# converts skeleton into bogged\n# @s = skeleton that reached the max age\n# located at @s\n# run from aging/update_age/skeleton\n\n# summon new mob\nsummon minecraft:bogged ~ ~ ~ {Tags:[gm4_es_new_mob]}\n\n# move mob to exact location of old mob\ntp @e[type=bogged,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s\ntag @s add gm4_es_old_mob\nexecute on vehicle run ride @e[type=bogged,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s\nexecute on vehicle run ride @e[type=skeleton,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount\nexecute on passengers run ride @s dismount\n\n# transfer old nbt to new mob\neffect give @s nausea 1 2\ndata merge entity @s {Tags:[]}\ndata modify entity @e[type=bogged,tag=gm4_es_new_mob,limit=1] {} merge from entity @s\n\n# sound effects\nplaysound minecraft:entity.bogged.ambient hostile @a[distance=..16] ~ ~ ~ 0.5\nplaysound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1\n\n# clean up\ndata merge entity @s {DeathTime:19s,Health:0,DeathLootTable:\"gm4:empty\",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}}\ntp @s ~ ~-5000 ~\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/convert/elder_guardian.mcfunction",
    "content": "# converts guardian into elder guardian\n# @s = guardian that reached the max age\n# located at @s\n# run from aging/update_age/guardian\n\n# summon new mob\nsummon minecraft:elder_guardian ~ ~ ~ {Tags:[gm4_es_new_mob]}\n\n# move mob to exact location of old mob\ntp @e[type=elder_guardian,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s\ntag @s add gm4_es_old_mob\nexecute on vehicle run ride @e[type=elder_guardian,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s\nexecute on vehicle run ride @e[type=guardian,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount\nexecute on passengers run ride @s dismount\n\n# transfer old nbt to new mob\neffect give @s nausea 1 2\ndata merge entity @s {Tags:[]}\ndata modify entity @e[type=elder_guardian,tag=gm4_es_new_mob,limit=1] {} merge from entity @s\n\n# sound effects\nplaysound minecraft:entity.elder_guardian.ambient hostile @a[distance=..16] ~ ~ ~ 0.5\nplaysound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1\n\n# clean up\ndata merge entity @s {DeathTime:19s,Health:0,DeathLootTable:\"gm4:empty\",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}}\ntp @s ~ ~-5000 ~\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/convert/evoker.mcfunction",
    "content": "# converts vindicator into evoker\n# @s = vindicator that reached the max age\n# located at @s\n# run from aging/update_age/vindicator\n\n# summon new mob\nsummon minecraft:evoker ~ ~ ~ {Tags:[gm4_es_new_mob]}\n\n# move mob to exact location of old mob\ntp @e[type=evoker,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s\ntag @s add gm4_es_old_mob\nexecute on vehicle run ride @e[type=evoker,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s\nexecute on vehicle run ride @e[type=vindicator,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount\nexecute on passengers run ride @s dismount\n\n# transfer old nbt to new mob\neffect give @s nausea 1 2\ndata merge entity @s {Tags:[]}\ndata modify entity @e[type=evoker,tag=gm4_es_new_mob,limit=1] {} merge from entity @s\n\n# sound effects\nplaysound minecraft:entity.evoker.ambient hostile @a[distance=..16] ~ ~ ~ 0.5\nplaysound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1\n\n# clean up\ndata merge entity @s {DeathTime:19s,Health:0,DeathLootTable:\"gm4:empty\",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}}\ntp @s ~ ~-5000 ~\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/convert/husk.mcfunction",
    "content": "# converts zombie into husk\n# @s = zombie that reached the max age\n# located at @s\n# run from aging/update_age/zombie\n\n# summon new mob\nsummon minecraft:husk ~ ~ ~ {Tags:[gm4_es_new_mob]}\n\n# move mob to exact location of old mob\ntp @e[type=husk,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s\ntag @s add gm4_es_old_mob\nexecute on vehicle run ride @e[type=husk,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s\nexecute on vehicle run ride @e[type=zombie,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount\nexecute on passengers run ride @s dismount\n\n# transfer old nbt to new mob\neffect give @s nausea 1 2\ndata merge entity @s {Tags:[]}\ndata modify entity @e[type=husk,tag=gm4_es_new_mob,limit=1] {} merge from entity @s\n\n# sound effects\nplaysound minecraft:entity.husk.ambient hostile @a[distance=..16] ~ ~ ~ 0.5\nplaysound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1\n\n# clean up\ndata merge entity @s {DeathTime:19s,Health:0,DeathLootTable:\"gm4:empty\",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}}\ntp @s ~ ~-5000 ~\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/convert/magma_cube.mcfunction",
    "content": "# converts slime into magma cube\n# @s = slime that reached the max age\n# located at @s\n# run from aging/update_age/slime\n\n# summon new mob\nsummon minecraft:magma_cube ~ ~ ~ {Tags:[gm4_es_new_mob]}\n\n# move mob to exact location of old mob\ntp @e[type=magma_cube,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s\ntag @s add gm4_es_old_mob\nexecute on vehicle run ride @e[type=magma_cube,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s\nexecute on vehicle run ride @e[type=slime,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount\nexecute on passengers run ride @s dismount\n\n# transfer old nbt to new mob\neffect give @s nausea 1 2\ndata merge entity @s {Tags:[]}\ndata modify entity @e[type=magma_cube,tag=gm4_es_new_mob,limit=1] {} merge from entity @s\n\n# sound effects\nplaysound minecraft:entity.magma_cube.squish hostile @a[distance=..16] ~ ~ ~ 0.5\nplaysound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1\n\n# clean up\ndata merge entity @s {DeathTime:19s,Health:0,DeathLootTable:\"gm4:empty\",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}}\ntp @s ~ ~-5000 ~\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/convert/piglin_brute.mcfunction",
    "content": "# converts piglin into piglin brute\n# @s = piglin that reached the max age\n# located at @s\n# run from aging/update_age/piglin\n\n# summon new mob\nsummon minecraft:piglin_brute ~ ~ ~ {Tags:[gm4_es_new_mob]}\n\n# move mob to exact location of old mob\ntp @e[type=piglin_brute,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s\ntag @s add gm4_es_old_mob\nexecute on vehicle run ride @e[type=piglin_brute,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s\nexecute on vehicle run ride @e[type=piglin,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount\nexecute on passengers run ride @s dismount\n\n# transfer old nbt to new mob\neffect give @s nausea 1 2\ndata merge entity @s {Tags:[]}\ndata modify entity @e[type=piglin_brute,tag=gm4_es_new_mob,limit=1] {} merge from entity @s\n\n# sound effects\nplaysound minecraft:entity.piglin_brute.ambient hostile @a[distance=..16] ~ ~ ~ 0.5\nplaysound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1\n\n# clean up\ndata merge entity @s {DeathTime:19s,Health:0,DeathLootTable:\"gm4:empty\",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}}\ntp @s ~ ~-5000 ~\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/convert/skeleton.mcfunction",
    "content": "# converts stray or bogged into skeleton\n# @s = stray that reached the max age\n# located at @s\n# run from aging/update_age/stray\n\n# summon new mob\nsummon minecraft:skeleton ~ ~ ~ {Tags:[gm4_es_new_mob]}\n\n# move mob to exact location of old mob\ntp @e[type=skeleton,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s\ntag @s add gm4_es_old_mob\nexecute on vehicle run ride @e[type=skeleton,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s\nexecute on vehicle run ride @e[tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount\nexecute on passengers run ride @s dismount\n\n# transfer old nbt to new mob\neffect give @s nausea 1 2\ndata merge entity @s {Tags:[]}\ndata modify entity @e[type=skeleton,tag=gm4_es_new_mob,limit=1] {} merge from entity @s\n\n# sound effects\nplaysound minecraft:entity.skeleton.ambient hostile @a[distance=..16] ~ ~ ~ 0.5\nplaysound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1\n\n# clean up\ndata merge entity @s {DeathTime:19s,Health:0,DeathLootTable:\"gm4:empty\",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}}\ntp @s ~ ~-5000 ~\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/convert/stray.mcfunction",
    "content": "# converts skeleton into stray\n# @s = skeleton that reached the max age\n# located at @s\n# run from aging/update_age/skeleton\n\n# summon new mob\nsummon minecraft:stray ~ ~ ~ {Tags:[gm4_es_new_mob]}\n\n# move mob to exact location of old mob\ntp @e[type=stray,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s\ntag @s add gm4_es_old_mob\nexecute on vehicle run ride @e[type=stray,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s\nexecute on vehicle run ride @e[type=skeleton,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount\nexecute on passengers run ride @s dismount\n\n# transfer old nbt to new mob\neffect give @s nausea 1 2\ndata merge entity @s {Tags:[]}\ndata modify entity @e[type=stray,tag=gm4_es_new_mob,limit=1] {} merge from entity @s\n\n# sound effects\nplaysound minecraft:entity.stray.ambient hostile @a[distance=..16] ~ ~ ~ 0.5\nplaysound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1\n\n# clean up\ndata merge entity @s {DeathTime:19s,Health:0,DeathLootTable:\"gm4:empty\",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}}\ntp @s ~ ~-5000 ~\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/multiple.mcfunction",
    "content": "# age a single mob, then reiterate\n# @s = none\n# located at world spawn\n# run from aging/age_mobs\n\n# age one mob\nexecute as @e[type=#gm4_everstone:aging_mob,tag=!gm4_everstone_locked,tag=!gm4_everstone_ignore,tag=!smithed.entity,limit=1,sort=random] at @s run function gm4_everstone:aging/update_age/check_mob\n\n# reiterate\nscoreboard players remove $age_count gm4_es_data 100\nschedule function gm4_everstone:aging/age_mobs 5t\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/single.mcfunction",
    "content": "# age a single mob with the calculated chance\n# @s = none\n# located at world spawn\n# run from aging/age_mobs\n\n# get random value\nsummon marker ~ ~ ~ {CustomName:\"gm4_everstone_random\",Tags:[\"gm4_everstone_random\"]}\nexecute store result score $random gm4_es_data run data get entity @e[type=marker,tag=gm4_everstone_random,distance=0,limit=1] UUID[3]\nkill @e[type=marker,tag=gm4_everstone_random]\n\n# age one mob, if random value is within the chance\nexecute if score $random gm4_es_data < $age_count gm4_es_data as @e[type=#gm4_everstone:aging_mob,tag=!gm4_everstone_locked,tag=!gm4_everstone_ignore,tag=!smithed.entity,limit=1,sort=random] at @s run function gm4_everstone:aging/update_age/check_mob\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/update_age/bogged.mcfunction",
    "content": "# checks aging conditions of the mob\n# @s = aging bogged\n# located at @s\n# run from aging/update_age/check_mob\n\n# add age if sheared and not in swamp biome\nscoreboard players add @s[predicate=gm4_everstone:sheared_and_out_of_swamp] gm4_es_age 1\n\n# deplete age if in swamp biome\nscoreboard players remove @s[predicate=gm4_everstone:in_swamp,scores={gm4_es_age=1..}] gm4_es_age 1\n\n# will take on average 1 hour to convert\nexecute if score @s gm4_es_age matches 12.. run function gm4_everstone:aging/convert/skeleton\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/update_age/check_mob.mcfunction",
    "content": "# checks the specific mob type\n# @s = aging mob\n# located at @s\n# run from aging/multiple\n# and from aging/single\n\ntag @e remove gm4_es_new_mob\n\nfunction #gm4_everstone:update_age\n\nexecute if entity @s[type=bogged] run function gm4_everstone:aging/update_age/bogged\nexecute if entity @s[type=guardian] run function gm4_everstone:aging/update_age/guardian\nexecute if entity @s[type=piglin] run function gm4_everstone:aging/update_age/piglin\nexecute if entity @s[type=skeleton] run function gm4_everstone:aging/update_age/skeleton\nexecute if entity @s[type=slime] run function gm4_everstone:aging/update_age/slime\nexecute if entity @s[type=stray] run function gm4_everstone:aging/update_age/stray\nexecute if entity @s[type=vindicator] run function gm4_everstone:aging/update_age/vindicator\nexecute if entity @s[type=zombie] run function gm4_everstone:aging/update_age/zombie\n\ntag @e remove gm4_es_new_mob\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/update_age/guardian.mcfunction",
    "content": "# checks aging conditions of the mob\n# @s = aging guardian\n# located at @s\n# run from aging/update_age/check_mob\n\n# check how many nearby guardians there are\nexecute store result score @s gm4_es_data if entity @e[type=guardian,distance=..8,tag=!gm4_everstone_locked]\n\n# if there are 5 other guardians and no elder guardians in a 32 block radius, increase the age\nexecute unless entity @e[type=elder_guardian,distance=..32,limit=1] run scoreboard players add @s[scores={gm4_es_data=6..}] gm4_es_age 1\n\n# will take on average 2 hours to covert\nexecute if score @s gm4_es_age matches 24.. run function gm4_everstone:aging/convert/elder_guardian\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/update_age/piglin.mcfunction",
    "content": "# checks aging conditions of the mob\n# @s = aging piglin\n# located at @s\n# run from aging/update_age/check_mob\n\n# count nearby piglin brutes\nexecute store result score @s gm4_es_data if entity @e[type=piglin_brute,distance=..32]\n\n# add age if in a bastion remnant unless there are 3 other brutes nearby\nscoreboard players add @s[predicate=gm4_everstone:in_bastion_remnant,scores={gm4_es_data=..2}] gm4_es_age 1\n\n# deplete age if not in bastion remnant\nscoreboard players remove @s[predicate=!gm4_everstone:in_bastion_remnant,scores={gm4_es_age=1..}] gm4_es_age 1\n\n# will take on average 1 hour to convert\nexecute if score @s gm4_es_age matches 12.. run function gm4_everstone:aging/convert/piglin_brute\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/update_age/skeleton.mcfunction",
    "content": "# checks aging conditions of the mob\n# @s = aging skeleton\n# located at @s\n# run from aging/update_age/check_mob\n\n# stray conversion\n## add age if in frozen biome with direct sky access\nscoreboard players add @s[predicate=gm4_everstone:in_frozen_sunlight] gm4_es_age 1\n## deplete age if not in frozen biome with direct sky access\nscoreboard players remove @s[predicate=!gm4_everstone:in_frozen_sunlight,scores={gm4_es_age=1..}] gm4_es_age 1\n## will take on average 30 minutes to convert\nexecute if score @s gm4_es_age matches 6.. run function gm4_everstone:aging/convert/stray\n\n# bogged conversion\n## add age if in a swamp biome in water\nscoreboard players add @s[predicate=gm4_everstone:in_swampy_water] gm4_es_age_alt 1\n## deplete age if not in swamp biome\nscoreboard players remove @s[predicate=!gm4_everstone:in_swamp,scores={gm4_es_age_alt=1..}] gm4_es_age_alt 1\n## will take on average 1 hour to convert\nexecute if score @s gm4_es_age_alt matches 12.. run function gm4_everstone:aging/convert/bogged\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/update_age/slime.mcfunction",
    "content": "# checks aging conditions of the mob\n# @s = aging slime\n# located at @s\n# run from aging/update_age/check_mob\n\n# add age if in the nether\nscoreboard players add @s[predicate=gm4_everstone:in_nether] gm4_es_age 1\n\n# deplete age if not in the nether\nscoreboard players remove @s[predicate=!gm4_everstone:in_nether,scores={gm4_es_age=1..}] gm4_es_age 1\n\n# will take on average 30 minutes to convert\nexecute if score @s gm4_es_age matches 6.. run function gm4_everstone:aging/convert/magma_cube\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/update_age/stray.mcfunction",
    "content": "# checks aging conditions of the mob\n# @s = aging stray\n# located at @s\n# run from aging/update_age/check_mob\n\n# add age if not in frozen biome\nscoreboard players add @s[predicate=!gm4_everstone:in_frozen] gm4_es_age 1\n\n# deplete age if in frozen biome\nscoreboard players remove @s[predicate=gm4_everstone:in_frozen,scores={gm4_es_age=1..}] gm4_es_age 1\n\n# will take on average 1 hour to convert\nexecute if score @s gm4_es_age matches 12.. run function gm4_everstone:aging/convert/skeleton\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/update_age/vindicator.mcfunction",
    "content": "# checks aging conditions of the mob\n# @s = aging vindicator\n# located at @s\n# run from aging/update_age/check_mob\n\n# check how many nearby magical blocks there are\nexecute store result score @s gm4_es_data run clone ~-2 ~-1 ~-2 ~2 ~2 ~2 ~-2 ~-1 ~-2 filtered #gm4_everstone:contains_magic force\n\n# if there are 7 or more magical blocks, increase the age\nscoreboard players add @s[scores={gm4_es_data=7..}] gm4_es_age 1\n\n# if there are no magical blocks, decrease the age\nscoreboard players remove @s[scores={gm4_es_data=0}] gm4_es_age 1\n\n# will take on average 1 hour to covert\nexecute if score @s gm4_es_age matches 12.. run function gm4_everstone:aging/convert/evoker\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging/update_age/zombie.mcfunction",
    "content": "# checks aging conditions of the mob\n# @s = aging zombie\n# located at @s\n# run from aging/update_age/check_mob\n\n# add age if in dry biome with direct sky access\nexecute unless block ~ ~0.5 ~ water run scoreboard players add @s[predicate=gm4_everstone:in_dry_sunlight] gm4_es_age 1\n\n# deplete age if not in dry biome with direct sky access\nscoreboard players remove @s[predicate=!gm4_everstone:in_dry_sunlight,scores={gm4_es_age=1..}] gm4_es_age 1\n\n# will take on average 30 minutes to convert\nexecute if score @s gm4_es_age matches 6.. run function gm4_everstone:aging/convert/husk\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/aging_clock.mcfunction",
    "content": "# slow clock to handle mob aging\n# @s = none\n# located at world spawn\n# run from init\n\nschedule function gm4_everstone:aging_clock 30s\n\n# calculate number of mobs that should get aged; caps at 1000 counted mobs (100 iterations, spread over 25 seconds)\nexecute store result score $age_count gm4_es_data if entity @e[type=#gm4_everstone:aging_mob,tag=!gm4_everstone_locked,tag=!gm4_everstone_ignore,tag=!smithed.entity,limit=1000]\nscoreboard players operation $age_count gm4_es_data *= #chance gm4_es_data\n\n# age mobs\nexecute if score $age_count gm4_es_data matches 1.. run function gm4_everstone:aging/age_mobs\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_es_data dummy\nscoreboard objectives add gm4_es_age dummy\nscoreboard objectives add gm4_es_age_alt dummy\nscoreboard objectives add gm4_es_mine minecraft.mined:minecraft.stone\n# set chance (out of 100) for a single mob to age every 30s\n# 10 = on average, a mob ages every 5 minutes\nscoreboard players set #chance gm4_es_data 10\n\nexecute unless score everstone gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Everstone\"}\nexecute unless score everstone gm4_earliest_version < everstone gm4_modules run scoreboard players operation everstone gm4_earliest_version = everstone gm4_modules\nscoreboard players set everstone gm4_modules 1\n\nschedule function gm4_everstone:main 1t\nschedule function gm4_everstone:tick 1t\nschedule function gm4_everstone:aging_clock 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/main.mcfunction",
    "content": "execute as @e[type=item] if items entity @s contents minecraft:firework_star[count=1,custom_data~{gm4_everstone:1b}] if entity @s[nbt={OnGround:1b}] at @s run function gm4_everstone:age_locking/check\n\nschedule function gm4_everstone:main 16t\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/function/tick.mcfunction",
    "content": "execute if predicate gm4_everstone:is_full_moon as @a[scores={gm4_es_mine=1..}] at @s anchored eyes positioned ^ ^ ^3 at @e[type=item,distance=..3.5,limit=1,nbt={Age:0s,Item:{id:\"minecraft:cobblestone\",count:1}}] run loot spawn ~ ~ ~ fish gm4_everstone:drop_chance ~ ~ ~ mainhand\nscoreboard players reset @a gm4_es_mine\n\nschedule function gm4_everstone:tick 1t\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/guidebook/everstone.json",
    "content": "{\n  \"id\": \"everstone\",\n  \"name\": \"Everstone\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:firework_star\"\n  },\n  \"criteria\": {\n    \"obtain_cobblestone_during_full_moon\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:cobblestone\"\n            ]\n          }\n        ],\n        \"player\": [\n          {\n            \"condition\": \"minecraft:time_check\",\n            \"clock\": \"minecraft:overworld\",\n            \"value\": {\n              \"min\": 13000,\n              \"max\": 24000\n            },\n            \"period\": 192000\n          }\n        ]\n      }\n    },\n    \"obtain_everstone\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:firework_star\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_everstone:1b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"kill_zombie\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": {\n          \"type\": \"minecraft:zombie\"\n        }\n      }\n    },\n    \"kill_skeleton\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": {\n          \"type\": \"minecraft:skeleton\"\n        }\n      }\n    },\n    \"kill_slime\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": {\n          \"type\": \"minecraft:slime\"\n        }\n      }\n    },\n    \"kill_stray\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": {\n          \"type\": \"minecraft:stray\"\n        }\n      }\n    },\n    \"kill_piglin\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": {\n          \"type\": \"minecraft:piglin\"\n        }\n      }\n    },\n    \"kill_guardian\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": {\n          \"type\": \"minecraft:guardian\"\n        }\n      }\n    },\n    \"kill_vindicator\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": {\n          \"type\": \"minecraft:vindicator\"\n        }\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.everstone.description\",\n            \"fallback\": \"Everstones can prevent mobs from aging.\\n\\nSome mobs that don't normally age now have the ability to evolve into other mobs.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"obtaining\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_cobblestone_during_full_moon\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.everstone.obtaining\",\n            \"fallback\": \"Everstones can be obtained by mining stone during a full moon.\\n\\nStone mined with Silk Touch will never drop an everstone.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_everstone\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.everstone.usage\",\n            \"fallback\": \"Dropping an everstone on a mob will prevent it from aging.\\n\\nZombies, Skeletons, Slimes, Strays, Piglins, Guardians, and Vindicators can evolve under specific conditions.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"zombie_conversion\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_zombie\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.everstone.zombie_conversion\",\n            \"fallback\": \"Zombies will convert to husks after being in direct sunlight in a desert or badlands biome for a long time.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"skeleton_conversion\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_skeleton\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.everstone.skeleton_conversion\",\n            \"fallback\": \"Skeletons will convert into strays after being in a cold, snowy biome for a long time.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"slime_conversion\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_slime\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.everstone.slime_conversion\",\n            \"fallback\": \"Slimes will convert into magma cubes after being in the nether for a long time.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"stray_conversion\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_stray\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.everstone.stray_conversion\",\n            \"fallback\": \"Strays will convert into skeletons if taken out of a cold, snowy biome for a long time.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"piglin_conversion\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_piglin\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.everstone.piglin_conversion\",\n            \"fallback\": \"Piglins inside bastion remnants will convert into piglin brutes if there are less than two brutes nearby.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"guardian_conversion\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_guardian\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.everstone.guardian_conversion\",\n            \"fallback\": \"Guardians will convert into elder guardians after being near several other guardians for a long time.\\n\\nSpecifically, guardians with five other friends will start to age.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"vindicator_conversion\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_vindicator\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.everstone.vindicator_conversion\",\n            \"fallback\": \"Vindicators will convert into evokers when near at least seven magical blocks for a long time.\\n\\nThese blocks include enchanting tables, bookshelves, lecterns, brewing stands, and cauldrons.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/loot_table/drop_chance.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_everstone:everstone\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:table_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"chances\": [\n                0.0025,\n                0.005,\n                0.0075,\n                0.01\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/loot_table/everstone.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:firework_star\",\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": 1\n            },\n            {\n              \"function\": \"set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_everstone:item/everstone\"]}\n              }\n            },\n            {\n              \"function\": \"set_custom_data\",\n              \"tag\": \"{gm4_everstone:1b}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.everstone\",\n                \"fallback\": \"Everstone\"\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/predicate/in_bastion_remnant.json",
    "content": "{\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n        \"structures\": \"bastion_remnant\"\n    }\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/predicate/in_dry_sunlight.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n      \"biomes\": \"#gm4_everstone:dries_zombies\"\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n      \"can_see_sky\": true\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/predicate/in_frozen.json",
    "content": "{\n  \"condition\": \"minecraft:location_check\",\n  \"predicate\": {\n    \"biomes\": \"#gm4_everstone:freezes_skeletons\"\n  }\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/predicate/in_frozen_sunlight.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:reference\",\n    \"name\": \"gm4_everstone:in_frozen\"\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n      \"can_see_sky\": true\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/predicate/in_nether.json",
    "content": "{\n  \"condition\": \"minecraft:location_check\",\n  \"predicate\": {\n    \"dimension\": \"minecraft:the_nether\"\n  }\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/predicate/in_swamp.json",
    "content": "{\n  \"condition\": \"minecraft:location_check\",\n  \"predicate\": {\n    \"biomes\": \"#gm4_everstone:bogs_skeletons\"\n  }\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/predicate/in_swampy_water.json",
    "content": "{\n  \"condition\": \"minecraft:location_check\",\n  \"offsetY\": 1,\n  \"predicate\": {\n    \"biomes\": \"#gm4_everstone:bogs_skeletons\",\n    \"fluid\": {\n      \"fluids\": \"#minecraft:water\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/predicate/is_full_moon.json",
    "content": "{\n  \"condition\": \"minecraft:time_check\",\n  \"clock\": \"minecraft:overworld\",\n  \"value\": {\n    \"min\": 13000,\n    \"max\": 24000\n  },\n  \"period\": 192000\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/predicate/sheared_and_out_of_swamp.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n      \"nbt\": \"{sheared:1b}\"\n    }\n  },\n  {\n    \"condition\": \"minecraft:inverted\",\n    \"term\": {\n      \"condition\": \"minecraft:location_check\",\n      \"predicate\": {\n        \"biomes\": \"#gm4_everstone:bogs_skeletons\"\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/tags/block/contains_magic.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:cauldrons\",\n        \"minecraft:bookshelf\",\n        \"minecraft:enchanting_table\",\n        \"minecraft:lectern\",\n        \"minecraft:brewing_stand\"\n    ]\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/tags/entity_type/affected.json",
    "content": "{\n    \"values\": [\n        \"minecraft:armadillo\",\n        \"minecraft:axolotl\",\n        \"minecraft:bee\",\n        \"minecraft:cat\",\n        \"minecraft:chicken\",\n        \"minecraft:cow\",\n        \"minecraft:donkey\",\n        \"minecraft:fox\",\n        \"minecraft:goat\",\n        \"minecraft:happy_ghast\",\n        \"minecraft:hoglin\",\n        \"minecraft:horse\",\n        \"minecraft:llama\",\n        \"minecraft:mooshroom\",\n        \"minecraft:mule\",\n        \"minecraft:nautilus\",\n        \"minecraft:ocelot\",\n        \"minecraft:panda\",\n        \"minecraft:pig\",\n        \"minecraft:polar_bear\",\n        \"minecraft:rabbit\",\n        \"minecraft:sheep\",\n        \"minecraft:skeleton_horse\",\n        \"minecraft:sniffer\",\n        \"minecraft:strider\",\n        \"minecraft:trader_llama\",\n        \"minecraft:turtle\",\n        \"minecraft:villager\",\n        \"minecraft:wolf\",\n        \"minecraft:zombie_horse\",\n        \"#gm4_everstone:force_age_lock\"\n    ]\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/tags/entity_type/aging_mob.json",
    "content": "{\n    \"values\": [\n        \"minecraft:bogged\",\n        \"minecraft:guardian\",\n        \"minecraft:piglin\",\n        \"minecraft:skeleton\",\n        \"minecraft:slime\",\n        \"minecraft:stray\",\n        \"minecraft:vindicator\",\n        \"minecraft:zombie\"\n    ]\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/tags/entity_type/force_age_lock.json",
    "content": "{\n    \"values\": [\n        \"#gm4_everstone:aging_mob\",\n        \"minecraft:tadpole\"\n    ]\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/tags/function/age_locking_check.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/tags/function/update_age.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/tags/worldgen/biome/bogs_skeletons.json",
    "content": "{\n  \"values\": [\n    \"#c:is_swamp\"\n  ]\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/tags/worldgen/biome/dries_zombies.json",
    "content": "{\n  \"values\": [\n    \"#c:is_dry/overworld\"\n  ]\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/tags/worldgen/biome/freezes_skeletons.json",
    "content": "{\n  \"values\": [\n    \"#c:is_cold/overworld\"\n  ]\n}\n"
  },
  {
    "path": "gm4_everstone/data/gm4_everstone/test/age_locking.mcfunction",
    "content": "# @template gm4:test_tube\n\nsummon pig ~1.5 ~1 ~1.5 {Age:-40}\nloot spawn ~1.5 ~2 ~1.5 loot gm4_everstone:everstone\n\nawait not entity @e[type=item,distance=..4]\n\nscoreboard objectives add gm4_test dummy\nexecute store result score $age gm4_test run data get entity @e[type=pig,distance=..3,limit=1] Age\nassert score $age gm4_test matches ..-1\n\nawait delay 3s\n\nexecute store result score $age gm4_test run data get entity @e[type=pig,distance=..3,limit=1] Age\nassert score $age gm4_test matches ..-1\n"
  },
  {
    "path": "gm4_fulcio_shamir/README.md",
    "content": "# Fulcio Shamir<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nPlace blocks whilst floating in mid-air!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Allows players to float whilst sneaking and holding a compass with the Fulcio Shamir on it\r\n- Makes particle box appear where the player can then place blocks\r\n- Builds on Gamemode 4's fun extension of the Enchantment system, [Metallurgy]($dynamicLink:gm4_metallurgy).\r\n"
  },
  {
    "path": "gm4_fulcio_shamir/assets/translations.csv",
    "content": "key,en_us\nitem.gm4.shamir.fulcio,Fulcio Shamir\ntext.gm4.guidebook.module_desc.fulcio_shamir,Adds the shamir 'Fulcio' to Metallurgy. It allows you to place blocks in mid-air! This also enables you to choose the orientation of blocks like logs without needing a supporting block.\ntext.gm4.guidebook.fulcio_shamir.description,\"Fulcio changes block placement. While sneaking, blocks can be placed in mid-air.\"\ntext.gm4.guidebook.fulcio_shamir.usage,The Fulcio Shamir is found on Barimium Bands. It can be placed onto compasses.\\n\\nHolding the tool and sneaking will create a temporary space where blocks can be placed.\n"
  },
  {
    "path": "gm4_fulcio_shamir/beet.yaml",
    "content": "id: gm4_fulcio_shamir\nname: Fulcio Shamir\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: ../gm4_metallurgy\n\npipeline:\n  - gm4_metallurgy.shamir_model_template\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_metallurgy: 1.8.0\n      schedule_loops:\n        - main\n        - 4_tick\n    model_data:\n      - item: compass\n        reference: shamir/fulcio\n        template:\n          name: shamir\n          metal: barimium\n          textures_path: gm4_metallurgy:item/shamir/barimium\n    website:\n      description: Adds the shamir 'Fulcio' to Metallurgy. It allows you to place blocks in mid-air! This also enables you to choose the orientation of blocks like logs without needing a supporting block.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: N09PsTgz\n    wiki: https://wiki.gm4.co/wiki/Metallurgy/Fulcio_Shamir\n    credits:\n      Creators:\n        - BPR\n        - Bloo\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/4_tick.mcfunction",
    "content": "execute at @e[type=marker,tag=gm4_fulcio_block] align xyz run function gm4_fulcio_shamir:particles\n\nschedule function gm4_fulcio_shamir:4_tick 4t\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/active.mcfunction",
    "content": "#run from main\n#@s = sneaking players holding a fulcio compass\n\nsummon marker ~ ~ ~ {Tags:[\"gm4_fulcio_ray\"]}\nexecute anchored eyes positioned ^ ^ ^ anchored feet run tp @e[type=marker,tag=gm4_fulcio_ray] ^ ^ ^ ~ ~\nscoreboard players set gm4_ray_counter gm4_count 0\nexecute as @e[type=marker,tag=gm4_fulcio_ray] at @s run function gm4_fulcio_shamir:ray\nexecute as @e[type=marker,tag=gm4_fulcio_ray] at @s positioned ^ ^ ^-0.1 align xyz if block ~ ~ ~ #minecraft:air run function gm4_fulcio_shamir:create_block\nkill @e[type=marker,tag=gm4_fulcio_ray]\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/check_item_validity.mcfunction",
    "content": "#@s = band is trying to apply to\n#run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'fulcio'}}] if items entity @s contents #gm4_fulcio_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/create_block.mcfunction",
    "content": "#run from active\n#@s = players holding a fulcio compass and looking at air positioned ^ ^ ^3 align xyz\n\nsetblock ~ ~ ~ structure_void keep\nsummon marker ~0.5 ~0.5 ~0.5 {CustomName:\"gm4_fulcio_block\",Tags:[\"gm4_fulcio_block\"]}\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_count dummy\nscoreboard objectives add gm4_fulcio_sneak minecraft.custom:minecraft.sneak_time\n\nexecute unless score fulcio_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Fulcio Shamir\"}\nexecute unless score fulcio_shamir gm4_earliest_version < fulcio_shamir gm4_modules run scoreboard players operation fulcio_shamir gm4_earliest_version = fulcio_shamir gm4_modules\nscoreboard players set fulcio_shamir gm4_modules 1\n\nschedule function gm4_fulcio_shamir:main 1t\nschedule function gm4_fulcio_shamir:4_tick 1t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/main.mcfunction",
    "content": "execute as @e[type=marker,tag=gm4_fulcio_block] at @s run function gm4_fulcio_shamir:process_block\n\nexecute as @a[gamemode=!spectator,scores={gm4_fulcio_sneak=1..},predicate=gm4_fulcio_shamir:holding_fulcio] at @s run function gm4_fulcio_shamir:active\n\nscoreboard players reset @a gm4_fulcio_sneak\n\nschedule function gm4_fulcio_shamir:main 16t\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/particles.mcfunction",
    "content": "#@s = fulcio block AEC\n#run from 10hz\n\nparticle minecraft:mycelium ~.5 ~.33 ~.33 .125 0 0 0 1\nparticle minecraft:mycelium ~.5 ~.33 ~.66 .125 0 0 0 1\nparticle minecraft:mycelium ~.33 ~.33 ~.5 0 0 .125 0 1\nparticle minecraft:mycelium ~.66 ~.33 ~.5 0 0 .125 0 1\nparticle minecraft:mycelium ~.5 ~.66 ~.33 .125 0 0 0 1\nparticle minecraft:mycelium ~.5 ~.66 ~.66 .125 0 0 0 1\nparticle minecraft:mycelium ~.33 ~.66 ~.5 0 0 .125 0 1\nparticle minecraft:mycelium ~.66 ~.66 ~.5 0 0 .125 0 1\nparticle minecraft:mycelium ~.33 ~.5 ~.33 0 .125 0 0 1\nparticle minecraft:mycelium ~.33 ~.5 ~.66 0 .125 0 0 1\nparticle minecraft:mycelium ~.66 ~.5 ~.33 0 .125 0 0 1\nparticle minecraft:mycelium ~.66 ~.5 ~.66 0 .125 0 0 1\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/process_block.mcfunction",
    "content": "#run from main\n#@s = fulcio block marker AEC\n\nexecute if block ~ ~ ~ structure_void run setblock ~ ~ ~ air\nkill @s\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/ray.mcfunction",
    "content": "# @s = area effect cloud ray used to find air\n# run from active\n\nscoreboard players add gm4_ray_counter gm4_count 1\ntp @s ^ ^ ^0.1\nexecute if score gm4_ray_counter gm4_count matches 0..30 at @s positioned ^ ^ ^0.1 if block ~ ~ ~ #minecraft:air positioned as @s run function gm4_fulcio_shamir:ray\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/barimium via #gm4_metallurgy:summon_band/barimium\n\nloot spawn ~ ~ ~ loot gm4_fulcio_shamir:band\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/guidebook/fulcio_shamir.json",
    "content": "{\n  \"id\": \"fulcio_shamir\",\n  \"name\": \"Fulcio Shamir\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"metallurgy\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_fulcio_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'fulcio'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_fulcio_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'fulcio'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.fulcio_shamir.description\",\n            \"fallback\": \"Fulcio changes block placement. While sneaking, blocks can be placed in mid-air.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_fulcio_shamir\",\n          \"obtain_fulcio_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.fulcio_shamir.usage\",\n            \"fallback\": \"The Fulcio Shamir is found on Barimium Bands. It can be placed onto compasses.\\n\\nHolding the tool and sneaking will create a temporary space where blocks can be placed.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:barimium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_fulcio_shamir:shamir/fulcio\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'fulcio'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.fulcio\",\n                                    \"fallback\": \"Fulcio Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/predicate/holding_fulcio.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"weapon.*\": {\n        \"items\": [\n          \"minecraft:compass\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'fulcio'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"minecraft:compass\"\n  ]\n}\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_fulcio_shamir/test/smoosh.mcfunction",
    "content": "# @template gm4_metallurgy:test_smooshing\n\nloot spawn ~1.5 ~2.5 ~1.8 loot gm4_fulcio_shamir:band\nsummon item ~1.5 ~2.5 ~1.8 {Item:{id:\"minecraft:compass\"}}\n\nawait delay 1s\n\nsetblock ~1 ~4 ~1 redstone_block\n\nawait items entity @e[type=item,distance=..4] contents minecraft:compass[count=1,custom_data~{gm4_metallurgy:{active_shamir:\"fulcio\"}}]\nassert items entity @e[type=item,distance=..4] contents minecraft:obsidian[count=1]\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json",
    "content": "{\n    \"values\": [\n      \"gm4_fulcio_shamir:check_item_validity\"\n    ]\n}\n"
  },
  {
    "path": "gm4_fulcio_shamir/data/gm4_metallurgy/tags/function/summon_band/barimium.json",
    "content": "{\n    \"values\":[\n      \"gm4_fulcio_shamir:summon_band\"\n    ]\n}\n"
  },
  {
    "path": "gm4_guidebook/CONTRIBUTING.md",
    "content": "# Contributing to the Guidebook\nGuidebook sections can be easily added with a custom file. These JSON files are read by beet and the specific datapack contents are automatically generated. Guidebook pages can be locked initially, and players can unlock said pages by completing certain advancement criteria. This behavior is also automatically generated from the custom guidebook file.\n\n## Custom Guidebook File\nTo add a guidebook entry, create a file in the `guidebook` folder, similar to how functions are added to the `functions` folder. For example, the Standard Liquids guidebook pages are found under `gm4_liquid_tanks/data/gm4_standard_liquids/guidebook/standard_liquids.json`. These files will be referred to as \"guidebook files\" or \"guidebook JSONs.\"\n\n### Guidebook File Contents\nGuidebook files are JSON files. Below is a description of each field.\n- `id`: The id of the module. Should be in `snake_case` and NOT contain a namespace (`gm4_`). This is used to alphabetically sort the table of contents\n- `name`: The name of the module. Should be in `Title Case`. This is what displays in the table of contents and unlock advancement chat message.\n- `module_type`: The type of module. `module`, `base`, or `expansion`. This is used to display expansions under their base in the table of contents.\n- `load_check`: Optional. The `id` of the module that this expansion is packaged under. This is used for `load.status` checks. For example Standard Liquids is packaged with Liquid Tanks, so the `standard_liquids` guidebook file will have `liquid_tanks` in this field.\n- `base_module`: Optional. The `id` of the base module. This is used to display expansions under their base in the table of contents.\n- `description`: Optional. The description shown in the unlock advancement chat message. Defaults to the website description in `beet.yaml`.\n- `wiki_link`: Optional. The link to the wiki page for this module. Defaults to the wiki link in `beet.yaml`.\n- `icon`: The advancement icon shown in the unlock advancment toast. Follows the same format as the `icon` field in advancement files.\n- `criteria`: The advancement criteria used to unlock pages. Follows the same format as the `criteria` field in advancement files. Each criterion should be named with a short description of what it is detecting. Unlike advancement files, these criteria aren't checked by default; instead each `section` must explicitly specify which criteria applies to each section unlock using `requirements` which is similar to advancement files.\n- `sections`: A list of the page sections that get unlocked. See below for section contents.\n\n### Guidebook Sections\nEach section is a JSON dictionary. Below is a description of each field.\n- `name`: The name of the section. Should give a short description of what the page(s) explain. This is used to name the advancements.\n- `enable`: A **list** of `load.status` scores to check. This is used to display different page contents based on if other module are installed. For example, boots of ostara mentions that they can prevent desire lines only if desire lines is also installed and enabled. This should come in pairs in which the contents of a single page changes based on if another module is or isn't installed. *Adding* extra pages that only exist if a module is installed is not supported.\n  - `id`: The scoreboard holder (fake player) to check the score. This should be the full name of the fake player, including the `gm4_` namespace (if it's a GM4 module check)\n  - `load`: A non-positive number indicates an unset score. Otherwise it only checks if a score is set to 1 or more. Convention is to use `-1` for a module that isn't enabled and `1` for a module that is enable.\n- `requirements`: A list of list of `criteria` (from above). Follows the same format as the `requirements` field in advancment files. This is used to unlock the pages in this section once the advancement criteria are completed. If left as an empty list, the page will be unlocked by default.\n- `prerequisites`: A list of guidebook section `name`s that must be unlocked before this section can be unlocked. Used to gate specific info behind other required info. For example, Zauber Cauldrons potion recipe can only be granted after creating a zauber cauldron. Can be empty.\n- `grants`: A list of guidebook section `name`s that will be unlocked when this section is unlocked. Used to grant specific info if the expected sequence is skipped. For example if a player obtains a zauber crystal before obtaining the criteria to display the recipe, they will unlock the page with the recipe for a zauber crystal. Can be empty.\n- `pages`: A list of text components. Follows the same format as tellraw JSON. Some shortcuts have been added to make writing pages easier.\n  - `{\"insert\": \"title\"}`: This will insert the `name` of the module (from above) into the page. It will be underlined and add a newline.\n  - `{\"insert\": \"recipe\"}`: This will insert a recipe display consisting of a 3x3 input and a single output. The recipe is pulled from a `gm4_recipe` file (see below).\n\n### GM4 Recipes\nRecipes can be defined with a custom JSON file in the `gm4_recipes` folder (similar to the `functions` folder). This custom recipe file is similar to vanilla recipes, but supports nbt inputs and outputs, along with being able to call functions as the result instead of just a loot table. Below is a description of each field in the JSON dictionary.\n- `input`: JSON dictionary of the input\n  - `type`: `shaped` or `shapeless`\n  - `recipe`: Only for `shaped`. List of up to 3 strings consisting of up to 3 keys each, similar to normal recipe files.\n  - `ingredients`: Only for `shapeless`. List of `ingredients`. Similar to normal recipe files, but supports the `guidebook` info as seen in the `values` below. Can also be a list of JSON dictionaries for recipes that support alternative items. (The guidebook will display the first item in the list).\n  - `key`: JSON dictionary mapping keys to items (`\"key\": \"value\"`). key must be a char and value must be either a JSON dictionaries (described below, starting with `item`) or a list of JSON dictionaries.\n    - `CHAR`: the key character matching the `recipe` and JSON value defining the key. Can also be a list of JSON dictionaries for recipes that support alternative items. (The guidebook will display the first item in the list).\n      - `item`: The minecraft item id.\n      - `tag`: The minecraft item tag. `item` and `tag` should be used exclusively.\n      - `nbt`: Optional. Specific NBT to check along with the item id.\n      - `guidebook`: Specific nbt for the guidebook display to show (e.g. player heads with custom names and textures)\n        - `type`: `loot_table`\n        - `name`: The `loot_table` path. Format is the same as if you'd call `loot give @s loot ...`, so `namespace:subfolder/file.json`\n- `output`: JSON dictionary of the output\n  - `type`: Optional. `normal`, `special`, or `replace`. Defaults to `normal`\n  - `result`: Optional. Only applies if `type` is `normal` or `replace`. If `type` is `normal`, a JSON dictionary for the resulting output item. \n    - `type`: `loot_table` or `item`\n    - `name`: The id of the `item` or the `loot_table` path.\n    - `count`: Optional. The number of items resulting from a single craft. Defaults to `1`.\n  - `result`: Optional. Only applies if `type` is `normal` or `replace`. If `type` is `replace`, a list of up to 3 strings consisting of up to 3 keys each, similar to normal recipe files.\n  - `key`: Optional. Only applies if `type` is `replace`. Same format as the `key` in `input`, except `count` can be added to specify the number of the item resulting from a single craft (defaults to 1).\n  - `function`: Optional. Only applies if `type` is `special`. Function to run when input recipe is found.\n  - `guidebook`: Optional. If this field exists, the item shown in the guidebook will be shown based on this field. Otherwise the `result` is used to display the item. The guidebook does not support displaying of `special` or `replace` outputs, so this field should be used to overwrite the display.\n    - `type`: `loot_table` or `item`\n    - `name`: The id of `item` or the `loot_table` path.\n    - `count`: Optional. The number of items resulting from a single craft. Defaults to `1`\n"
  },
  {
    "path": "gm4_guidebook/README.md",
    "content": "# Guidebook<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nAdds a dynamic guidebook to discover the mechanics of Gamemode 4!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Grows with pages as you discover features from Gamemode 4's data packs\r\n- Shows only data packs installed in a world, so you don't think you have features you haven't actually installed\r\n"
  },
  {
    "path": "gm4_guidebook/advances.json",
    "content": "{\n  \"\\u0000\": {\n    \"unicode\": 9\n  },\n  \"\\u0001\": {\n    \"unicode\": 9\n  },\n  \"\\u0002\": {\n    \"unicode\": 9\n  },\n  \"\\u0003\": {\n    \"unicode\": 9\n  },\n  \"\\u0004\": {\n    \"unicode\": 9\n  },\n  \"\\u0005\": {\n    \"unicode\": 9\n  },\n  \"\\u0006\": {\n    \"unicode\": 9\n  },\n  \"\\u0007\": {\n    \"unicode\": 9\n  },\n  \"\\b\": {\n    \"unicode\": 9\n  },\n  \"\\t\": {\n    \"unicode\": 9\n  },\n  \"\\n\": {\n    \"unicode\": 9\n  },\n  \"\\u000b\": {\n    \"unicode\": 9\n  },\n  \"\\f\": {\n    \"unicode\": 9\n  },\n  \"\\r\": {\n    \"unicode\": 9\n  },\n  \"\\u000e\": {\n    \"unicode\": 9\n  },\n  \"\\u000f\": {\n    \"unicode\": 9\n  },\n  \"\\u0010\": {\n    \"unicode\": 9\n  },\n  \"\\u0011\": {\n    \"unicode\": 9\n  },\n  \"\\u0012\": {\n    \"unicode\": 9\n  },\n  \"\\u0013\": {\n    \"unicode\": 9\n  },\n  \"\\u0014\": {\n    \"unicode\": 9\n  },\n  \"\\u0015\": {\n    \"unicode\": 9\n  },\n  \"\\u0016\": {\n    \"unicode\": 9\n  },\n  \"\\u0017\": {\n    \"unicode\": 9\n  },\n  \"\\u0018\": {\n    \"unicode\": 9\n  },\n  \"\\u0019\": {\n    \"unicode\": 9\n  },\n  \"\\u001a\": {\n    \"unicode\": 9\n  },\n  \"\\u001b\": {\n    \"unicode\": 9\n  },\n  \"\\u001c\": {\n    \"unicode\": 9\n  },\n  \"\\u001d\": {\n    \"unicode\": 9\n  },\n  \"\\u001e\": {\n    \"unicode\": 9\n  },\n  \"\\u001f\": {\n    \"unicode\": 9\n  },\n  \" \": {\n    \"unicode\": 4\n  },\n  \"!\": 2,\n  \"\\\"\": 4,\n  \"#\": 6,\n  \"$\": 6,\n  \"%\": 6,\n  \"&\": 6,\n  \"'\": 2,\n  \"(\": 4,\n  \")\": 4,\n  \"*\": 4,\n  \"+\": 6,\n  \",\": 2,\n  \"-\": 6,\n  \".\": 2,\n  \"/\": 6,\n  \"0\": 6,\n  \"1\": 6,\n  \"2\": 6,\n  \"3\": 6,\n  \"4\": 6,\n  \"5\": 6,\n  \"6\": 6,\n  \"7\": 6,\n  \"8\": 6,\n  \"9\": 6,\n  \":\": 2,\n  \";\": 2,\n  \"<\": 5,\n  \"=\": 6,\n  \">\": 5,\n  \"?\": 6,\n  \"@\": 7,\n  \"A\": 6,\n  \"B\": 6,\n  \"C\": 6,\n  \"D\": 6,\n  \"E\": 6,\n  \"F\": 6,\n  \"G\": 6,\n  \"H\": 6,\n  \"I\": 4,\n  \"J\": 6,\n  \"K\": 6,\n  \"L\": 6,\n  \"M\": 6,\n  \"N\": 6,\n  \"O\": 6,\n  \"P\": 6,\n  \"Q\": 6,\n  \"R\": 6,\n  \"S\": 6,\n  \"T\": 6,\n  \"U\": 6,\n  \"V\": 6,\n  \"W\": 6,\n  \"X\": 6,\n  \"Y\": 6,\n  \"Z\": 6,\n  \"[\": 4,\n  \"\\\\\": 6,\n  \"]\": 4,\n  \"^\": 6,\n  \"_\": 6,\n  \"`\": 3,\n  \"a\": 6,\n  \"b\": 6,\n  \"c\": 6,\n  \"d\": 6,\n  \"e\": 6,\n  \"f\": 5,\n  \"g\": 6,\n  \"h\": 6,\n  \"i\": 2,\n  \"j\": 6,\n  \"k\": 5,\n  \"l\": 3,\n  \"m\": 6,\n  \"n\": 6,\n  \"o\": 6,\n  \"p\": 6,\n  \"q\": 6,\n  \"r\": 6,\n  \"s\": 6,\n  \"t\": 4,\n  \"u\": 6,\n  \"v\": 6,\n  \"w\": 6,\n  \"x\": 6,\n  \"y\": 6,\n  \"z\": 6,\n  \"{\": 4,\n  \"|\": 2,\n  \"}\": 4,\n  \"~\": 7,\n  \"\\u007f\": {\n    \"unicode\": 9\n  },\n  \"\\u0080\": {\n    \"unicode\": 9\n  },\n  \"\\u0081\": {\n    \"unicode\": 9\n  },\n  \"\\u0082\": {\n    \"unicode\": 9\n  },\n  \"\\u0083\": {\n    \"unicode\": 9\n  },\n  \"\\u0084\": {\n    \"unicode\": 9\n  },\n  \"\\u0085\": {\n    \"unicode\": 9\n  },\n  \"\\u0086\": {\n    \"unicode\": 9\n  },\n  \"\\u0087\": {\n    \"unicode\": 9\n  },\n  \"\\u0088\": {\n    \"unicode\": 9\n  },\n  \"\\u0089\": {\n    \"unicode\": 9\n  },\n  \"\\u008a\": {\n    \"unicode\": 9\n  },\n  \"\\u008b\": {\n    \"unicode\": 9\n  },\n  \"\\u008c\": {\n    \"unicode\": 9\n  },\n  \"\\u008d\": {\n    \"unicode\": 9\n  },\n  \"\\u008e\": {\n    \"unicode\": 9\n  },\n  \"\\u008f\": {\n    \"unicode\": 9\n  },\n  \"\\u0090\": {\n    \"unicode\": 9\n  },\n  \"\\u0091\": {\n    \"unicode\": 9\n  },\n  \"\\u0092\": {\n    \"unicode\": 9\n  },\n  \"\\u0093\": {\n    \"unicode\": 9\n  },\n  \"\\u0094\": {\n    \"unicode\": 9\n  },\n  \"\\u0095\": {\n    \"unicode\": 9\n  },\n  \"\\u0096\": {\n    \"unicode\": 9\n  },\n  \"\\u0097\": {\n    \"unicode\": 9\n  },\n  \"\\u0098\": {\n    \"unicode\": 9\n  },\n  \"\\u0099\": {\n    \"unicode\": 9\n  },\n  \"\\u009a\": {\n    \"unicode\": 9\n  },\n  \"\\u009b\": {\n    \"unicode\": 9\n  },\n  \"\\u009c\": {\n    \"unicode\": 9\n  },\n  \"\\u009d\": {\n    \"unicode\": 9\n  },\n  \"\\u009e\": {\n    \"unicode\": 9\n  },\n  \"\\u009f\": {\n    \"unicode\": 9\n  },\n  \"\\u00a0\": {\n    \"unicode\": 9\n  },\n  \"\\u00a1\": 2,\n  \"\\u00a2\": 6,\n  \"\\u00a3\": 6,\n  \"\\u00a4\": 8,\n  \"\\u00a5\": 6,\n  \"\\u00a6\": 2,\n  \"\\u00a7\": 6,\n  \"\\u00a8\": 4,\n  \"\\u00a9\": 8,\n  \"\\u00aa\": 5,\n  \"\\u00ab\": 7,\n  \"\\u00ac\": 6,\n  \"\\u00ad\": 4,\n  \"\\u00ae\": 8,\n  \"\\u00af\": 6,\n  \"\\u00b0\": 5,\n  \"\\u00b1\": 6,\n  \"\\u00b2\": 5,\n  \"\\u00b3\": 5,\n  \"\\u00b4\": 3,\n  \"\\u00b5\": 6,\n  \"\\u00b6\": 7,\n  \"\\u00b7\": 2,\n  \"\\u00b8\": {\n    \"unicode\": 2\n  },\n  \"\\u00b9\": 4,\n  \"\\u00ba\": 5,\n  \"\\u00bb\": 7,\n  \"\\u00bc\": 8,\n  \"\\u00bd\": 8,\n  \"\\u00be\": 8,\n  \"\\u00bf\": 6,\n  \"\\u00c0\": 6,\n  \"\\u00c1\": 6,\n  \"\\u00c2\": 6,\n  \"\\u00c3\": 6,\n  \"\\u00c4\": 6,\n  \"\\u00c5\": 6,\n  \"\\u00c6\": 10,\n  \"\\u00c7\": 6,\n  \"\\u00c8\": 6,\n  \"\\u00c9\": 6,\n  \"\\u00ca\": 6,\n  \"\\u00cb\": 6,\n  \"\\u00cc\": 4,\n  \"\\u00cd\": 4,\n  \"\\u00ce\": 4,\n  \"\\u00cf\": 4,\n  \"\\u00d0\": 7,\n  \"\\u00d1\": 6,\n  \"\\u00d2\": 6,\n  \"\\u00d3\": 6,\n  \"\\u00d4\": 6,\n  \"\\u00d5\": 6,\n  \"\\u00d6\": 6,\n  \"\\u00d7\": 6,\n  \"\\u00d8\": 6,\n  \"\\u00d9\": 6,\n  \"\\u00da\": 6,\n  \"\\u00db\": 6,\n  \"\\u00dc\": 6,\n  \"\\u00dd\": 6,\n  \"\\u00de\": 6,\n  \"\\u00df\": 6,\n  \"\\u00e0\": 6,\n  \"\\u00e1\": 6,\n  \"\\u00e2\": 6,\n  \"\\u00e3\": 6,\n  \"\\u00e4\": 6,\n  \"\\u00e5\": 6,\n  \"\\u00e6\": 10,\n  \"\\u00e7\": 6,\n  \"\\u00e8\": 6,\n  \"\\u00e9\": 6,\n  \"\\u00ea\": 6,\n  \"\\u00eb\": 6,\n  \"\\u00ec\": 3,\n  \"\\u00ed\": 3,\n  \"\\u00ee\": 4,\n  \"\\u00ef\": 4,\n  \"\\u00f0\": 6,\n  \"\\u00f1\": 6,\n  \"\\u00f2\": 6,\n  \"\\u00f3\": 6,\n  \"\\u00f4\": 6,\n  \"\\u00f5\": 6,\n  \"\\u00f6\": 6,\n  \"\\u00f7\": 6,\n  \"\\u00f8\": 6,\n  \"\\u00f9\": 6,\n  \"\\u00fa\": 6,\n  \"\\u00fb\": 6,\n  \"\\u00fc\": 6,\n  \"\\u00fd\": 6,\n  \"\\u00fe\": 6,\n  \"\\u00ff\": 6,\n  \"\\u0192\": 6,\n  \"\\u2591\": 8,\n  \"\\u2592\": 9,\n  \"\\u2593\": 9,\n  \"\\u2502\": 6,\n  \"\\u2524\": 6,\n  \"\\u2561\": 6,\n  \"\\u2562\": 8,\n  \"\\u2556\": 8,\n  \"\\u2555\": 6,\n  \"\\u2563\": 8,\n  \"\\u2551\": 8,\n  \"\\u2557\": 8,\n  \"\\u255d\": 8,\n  \"\\u255c\": 8,\n  \"\\u255b\": 6,\n  \"\\u2510\": 6,\n  \"\\u2514\": 9,\n  \"\\u2534\": 9,\n  \"\\u252c\": 9,\n  \"\\u251c\": 9,\n  \"\\u2500\": 9,\n  \"\\u253c\": 9,\n  \"\\u255e\": 9,\n  \"\\u255f\": 9,\n  \"\\u255a\": 9,\n  \"\\u2554\": 9,\n  \"\\u2569\": 9,\n  \"\\u2566\": 9,\n  \"\\u2560\": 9,\n  \"\\u2550\": 9,\n  \"\\u256c\": 9,\n  \"\\u2567\": 9,\n  \"\\u2568\": 9,\n  \"\\u2564\": 9,\n  \"\\u2565\": 9,\n  \"\\u2559\": 9,\n  \"\\u2558\": 9,\n  \"\\u2552\": 9,\n  \"\\u2553\": 9,\n  \"\\u256b\": 9,\n  \"\\u256a\": 9,\n  \"\\u2518\": 6,\n  \"\\u250c\": 9,\n  \"\\u2588\": 9,\n  \"\\u2584\": 9,\n  \"\\u258c\": 5,\n  \"\\u2590\": 9,\n  \"\\u2580\": 9,\n  \"\\u2205\": 8,\n  \"\\u2208\": 6,\n  \"\\u2261\": 7,\n  \"\\u2265\": 6,\n  \"\\u2264\": 6,\n  \"\\u2320\": 8,\n  \"\\u2321\": 5,\n  \"\\u2248\": 7,\n  \"\\u2219\": 6,\n  \"\\u221a\": 7,\n  \"\\u207f\": 5,\n  \"\\u25a0\": 6,\n  \"\\u0100\": 6,\n  \"\\u0101\": 6,\n  \"\\u0102\": 6,\n  \"\\u0103\": 6,\n  \"\\u0104\": 6,\n  \"\\u0105\": 6,\n  \"\\u0106\": 6,\n  \"\\u0107\": 6,\n  \"\\u0108\": 6,\n  \"\\u0109\": 6,\n  \"\\u010a\": 6,\n  \"\\u010b\": 6,\n  \"\\u010c\": 6,\n  \"\\u010d\": 6,\n  \"\\u010e\": 6,\n  \"\\u010f\": 8,\n  \"\\u0110\": 7,\n  \"\\u0111\": 7,\n  \"\\u0112\": 6,\n  \"\\u0113\": 6,\n  \"\\u0114\": 6,\n  \"\\u0115\": 6,\n  \"\\u0116\": 6,\n  \"\\u0117\": 6,\n  \"\\u0118\": 6,\n  \"\\u0119\": 6,\n  \"\\u011a\": 6,\n  \"\\u011b\": 6,\n  \"\\u011c\": 6,\n  \"\\u011d\": 6,\n  \"\\u1e20\": 6,\n  \"\\u1e21\": 6,\n  \"\\u011e\": 6,\n  \"\\u011f\": 6,\n  \"\\u0120\": 6,\n  \"\\u0121\": 6,\n  \"\\u0122\": 6,\n  \"\\u0123\": 6,\n  \"\\u0124\": 6,\n  \"\\u0125\": 6,\n  \"\\u0126\": 8,\n  \"\\u0127\": 7,\n  \"\\u0128\": 5,\n  \"\\u0129\": 5,\n  \"\\u012a\": 4,\n  \"\\u012b\": 4,\n  \"\\u012c\": 5,\n  \"\\u012d\": 5,\n  \"\\u012e\": 4,\n  \"\\u012f\": 3,\n  \"\\u0130\": 4,\n  \"\\u0131\": 2,\n  \"\\u0134\": 6,\n  \"\\u0135\": 6,\n  \"\\u0136\": 6,\n  \"\\u0137\": 5,\n  \"\\u0139\": 6,\n  \"\\u013a\": 3,\n  \"\\u013b\": 6,\n  \"\\u013c\": 3,\n  \"\\u013d\": 6,\n  \"\\u013e\": 4,\n  \"\\u013f\": 6,\n  \"\\u0140\": 4,\n  \"\\u0141\": 7,\n  \"\\u0142\": 5,\n  \"\\u0143\": 6,\n  \"\\u0144\": 6,\n  \"\\u0145\": 6,\n  \"\\u0146\": 6,\n  \"\\u0147\": 6,\n  \"\\u0148\": 6,\n  \"\\u014a\": 6,\n  \"\\u014b\": 6,\n  \"\\u014c\": 6,\n  \"\\u014d\": 6,\n  \"\\u014e\": 6,\n  \"\\u014f\": 6,\n  \"\\u0150\": 6,\n  \"\\u0151\": 6,\n  \"\\u0152\": 10,\n  \"\\u0153\": 10,\n  \"\\u0154\": 6,\n  \"\\u0155\": 6,\n  \"\\u0156\": 6,\n  \"\\u0157\": 6,\n  \"\\u0158\": 6,\n  \"\\u0159\": 6,\n  \"\\u015a\": 6,\n  \"\\u015b\": 6,\n  \"\\u015c\": 6,\n  \"\\u015d\": 6,\n  \"\\u015e\": 6,\n  \"\\u015f\": 6,\n  \"\\u0160\": 6,\n  \"\\u0161\": 6,\n  \"\\u0162\": 6,\n  \"\\u0163\": 4,\n  \"\\u0164\": 6,\n  \"\\u0165\": 5,\n  \"\\u0166\": 6,\n  \"\\u0167\": 4,\n  \"\\u0168\": 6,\n  \"\\u0169\": 6,\n  \"\\u016a\": 6,\n  \"\\u016b\": 6,\n  \"\\u016c\": 6,\n  \"\\u016d\": 6,\n  \"\\u016e\": 6,\n  \"\\u016f\": 6,\n  \"\\u0170\": 6,\n  \"\\u0171\": 6,\n  \"\\u0172\": 6,\n  \"\\u0173\": 6,\n  \"\\u0174\": 6,\n  \"\\u0175\": 6,\n  \"\\u0176\": 6,\n  \"\\u0177\": 6,\n  \"\\u0178\": 6,\n  \"\\u0179\": 6,\n  \"\\u017a\": 6,\n  \"\\u017b\": 6,\n  \"\\u017c\": 6,\n  \"\\u017d\": 6,\n  \"\\u017e\": 6,\n  \"\\u01fc\": 10,\n  \"\\u01fd\": 10,\n  \"\\u01fe\": 6,\n  \"\\u01ff\": 6,\n  \"\\u0218\": 6,\n  \"\\u0219\": 6,\n  \"\\u021a\": 6,\n  \"\\u021b\": 4,\n  \"\\u0386\": 8,\n  \"\\u0388\": 8,\n  \"\\u0389\": 8,\n  \"\\u038a\": 6,\n  \"\\u038c\": 8,\n  \"\\u038e\": 8,\n  \"\\u038f\": 8,\n  \"\\u0390\": 6,\n  \"\\u03aa\": 4,\n  \"\\u03ab\": 6,\n  \"\\u03ac\": 6,\n  \"\\u03ad\": 6,\n  \"\\u03ae\": 6,\n  \"\\u03af\": 3,\n  \"\\u03b0\": 6,\n  \"\\u03ca\": 4,\n  \"\\u03cb\": 6,\n  \"\\u03cc\": 6,\n  \"\\u03cd\": 6,\n  \"\\u03ce\": 8,\n  \"\\u0400\": 6,\n  \"\\u0401\": 6,\n  \"\\u0403\": 6,\n  \"\\u0407\": 4,\n  \"\\u040c\": 6,\n  \"\\u040d\": 6,\n  \"\\u040e\": 6,\n  \"\\u0419\": 6,\n  \"\\u0439\": 6,\n  \"\\u0450\": 6,\n  \"\\u0451\": 6,\n  \"\\u0452\": 7,\n  \"\\u0453\": 5,\n  \"\\u0457\": 4,\n  \"\\u045b\": 7,\n  \"\\u045c\": 5,\n  \"\\u045d\": 6,\n  \"\\u045e\": 6,\n  \"\\u045f\": 6,\n  \"\\u0490\": 6,\n  \"\\u0491\": 6,\n  \"\\u1e02\": 6,\n  \"\\u1e03\": 6,\n  \"\\u1e0a\": 6,\n  \"\\u1e0b\": 6,\n  \"\\u1e1e\": 6,\n  \"\\u1e1f\": 5,\n  \"\\u1e22\": 6,\n  \"\\u1e23\": 6,\n  \"\\u1e30\": 6,\n  \"\\u1e31\": 5,\n  \"\\u1e40\": 6,\n  \"\\u1e41\": 6,\n  \"\\u1e56\": 6,\n  \"\\u1e57\": 6,\n  \"\\u1e60\": 6,\n  \"\\u1e61\": 6,\n  \"\\u1e6a\": 6,\n  \"\\u1e6b\": 4,\n  \"\\u1e80\": 6,\n  \"\\u1e81\": 6,\n  \"\\u1e82\": 6,\n  \"\\u1e83\": 6,\n  \"\\u1e84\": 6,\n  \"\\u1e85\": 6,\n  \"\\u1ef2\": 6,\n  \"\\u1ef3\": 6,\n  \"\\u0149\": 8,\n  \"\\u01e7\": 6,\n  \"\\u01eb\": 6,\n  \"\\u040f\": 6,\n  \"\\u1e0d\": 6,\n  \"\\u1e25\": 6,\n  \"\\u1e5b\": 6,\n  \"\\u1e6d\": 4,\n  \"\\u1e92\": 6,\n  \"\\u1eca\": 4,\n  \"\\u1ecb\": 2,\n  \"\\u1ecc\": 6,\n  \"\\u1ecd\": 6,\n  \"\\u1ee4\": 6,\n  \"\\u1ee5\": 6,\n  \"\\u2116\": 10,\n  \"\\u0207\": 6,\n  \"\\u0194\": 6,\n  \"\\u0263\": 6,\n  \"\\u0283\": 6,\n  \"\\u2047\": 10,\n  \"\\u01f1\": 10,\n  \"\\u01f2\": 10,\n  \"\\u01f3\": 10,\n  \"\\u01c4\": 10,\n  \"\\u01c5\": 10,\n  \"\\u01c6\": 10,\n  \"\\u01c7\": 10,\n  \"\\u01c8\": 10,\n  \"\\u01ca\": 10,\n  \"\\u01cb\": 10,\n  \"\\u01cc\": 10,\n  \"\\u2139\": 10,\n  \"\\u1d6b\": 10,\n  \"\\ua732\": 10,\n  \"\\ua733\": 10,\n  \"\\ua734\": 10,\n  \"\\ua735\": 10,\n  \"\\ua736\": 10,\n  \"\\ua737\": 10,\n  \"\\ua738\": 10,\n  \"\\ua73a\": 10,\n  \"\\ua73c\": 10,\n  \"\\ua73d\": 9,\n  \"\\ua74e\": 10,\n  \"\\ua74f\": 10,\n  \"\\ua760\": 6,\n  \"\\ua761\": 6,\n  \"\\ufb04\": 10,\n  \"\\ufb06\": 10,\n  \"\\u16a1\": 5,\n  \"\\u16b5\": 5,\n  \"\\u01a0\": 8,\n  \"\\u01a1\": 8,\n  \"\\u01af\": 8,\n  \"\\u01b0\": 8,\n  \"\\u1eae\": 6,\n  \"\\u1eaf\": 6,\n  \"\\u1ea4\": 6,\n  \"\\u1ea5\": 6,\n  \"\\u1ebe\": 6,\n  \"\\u1ebf\": 6,\n  \"\\u1ed1\": 6,\n  \"\\u1eda\": 8,\n  \"\\u1edb\": 8,\n  \"\\u1ee8\": 8,\n  \"\\u1ee9\": 8,\n  \"\\u1eb0\": 6,\n  \"\\u1eb1\": 6,\n  \"\\u1ea6\": 6,\n  \"\\u1ea7\": 6,\n  \"\\u1ec0\": 6,\n  \"\\u1ec1\": 6,\n  \"\\u1ed3\": 6,\n  \"\\u1edc\": 8,\n  \"\\u1edd\": 8,\n  \"\\u1eea\": 8,\n  \"\\u1eeb\": 8,\n  \"\\u1ea2\": 6,\n  \"\\u1ea3\": 6,\n  \"\\u1eb2\": 6,\n  \"\\u1eb3\": 6,\n  \"\\u1ea8\": 6,\n  \"\\u1ea9\": 6,\n  \"\\u1eba\": 6,\n  \"\\u1ebb\": 6,\n  \"\\u1ed5\": 6,\n  \"\\u1ede\": 8,\n  \"\\u1ec2\": 6,\n  \"\\u1ec3\": 6,\n  \"\\u1ec8\": 4,\n  \"\\u1ec9\": 4,\n  \"\\u1ece\": 6,\n  \"\\u1ecf\": 6,\n  \"\\u1ed4\": 6,\n  \"\\u1edf\": 8,\n  \"\\u1ee6\": 6,\n  \"\\u1ee7\": 6,\n  \"\\u1eec\": 8,\n  \"\\u1eed\": 8,\n  \"\\u1ef6\": 6,\n  \"\\u1ef7\": 6,\n  \"\\u1ea0\": 6,\n  \"\\u1ea1\": 6,\n  \"\\u1eb6\": 6,\n  \"\\u1eb7\": 6,\n  \"\\u1eac\": 6,\n  \"\\u1ead\": 6,\n  \"\\u1eb8\": 6,\n  \"\\u1eb9\": 6,\n  \"\\u1ec6\": 6,\n  \"\\u1ec7\": 6,\n  \"\\u1ed8\": 6,\n  \"\\u1ed9\": 6,\n  \"\\u1ee2\": 8,\n  \"\\u1ee3\": 8,\n  \"\\u1ef0\": 8,\n  \"\\u1ef1\": 8,\n  \"\\u1ef4\": 6,\n  \"\\u1ef5\": 6,\n  \"\\u1ed0\": 6,\n  \"\\u0195\": 9,\n  \"\\u1eaa\": 6,\n  \"\\u1eab\": 6,\n  \"\\u1ed6\": 6,\n  \"\\u1ed7\": 6,\n  \"\\u1eef\": 8,\n  \"\\u261e\": 10,\n  \"\\u261c\": 10,\n  \"\\u262e\": 10,\n  \"\\u1eb4\": 6,\n  \"\\u1eb5\": 6,\n  \"\\u1ebc\": 6,\n  \"\\u1ebd\": 6,\n  \"\\u1ec4\": 6,\n  \"\\u1ec5\": 6,\n  \"\\u1ed2\": 6,\n  \"\\u1ee0\": 8,\n  \"\\u1ee1\": 8,\n  \"\\u1eee\": 8,\n  \"\\u1ef8\": 6,\n  \"\\u1ef9\": 6,\n  \"\\u0498\": 6,\n  \"\\u0499\": 6,\n  \"\\u04a0\": 7,\n  \"\\u04a1\": 6,\n  \"\\u04aa\": 6,\n  \"\\u04ab\": 6,\n  \"\\u01f6\": 9,\n  \"\\u26a0\": 10,\n  \"\\u24ea\": 10,\n  \"\\u2460\": 10,\n  \"\\u2461\": 10,\n  \"\\u2462\": 10,\n  \"\\u2463\": 10,\n  \"\\u2464\": 10,\n  \"\\u2465\": 10,\n  \"\\u2466\": 10,\n  \"\\u2467\": 10,\n  \"\\u2468\": 10,\n  \"\\u2469\": 10,\n  \"\\u246a\": 10,\n  \"\\u246b\": 10,\n  \"\\u246c\": 10,\n  \"\\u246d\": 10,\n  \"\\u246e\": 10,\n  \"\\u246f\": 10,\n  \"\\u2470\": 10,\n  \"\\u2471\": 10,\n  \"\\u2472\": 10,\n  \"\\u2473\": 10,\n  \"\\u24b6\": 10,\n  \"\\u24b7\": 10,\n  \"\\u24b8\": 10,\n  \"\\u24b9\": 10,\n  \"\\u24ba\": 10,\n  \"\\u24bb\": 10,\n  \"\\u24bc\": 10,\n  \"\\u24bd\": 10,\n  \"\\u24be\": 10,\n  \"\\u24bf\": 10,\n  \"\\u24c0\": 10,\n  \"\\u24c1\": 10,\n  \"\\u24c2\": 10,\n  \"\\u24c3\": 10,\n  \"\\u24c4\": 10,\n  \"\\u24c5\": 10,\n  \"\\u24c6\": 10,\n  \"\\u24c7\": 10,\n  \"\\u24c8\": 10,\n  \"\\u24c9\": 10,\n  \"\\u24ca\": 10,\n  \"\\u24cb\": 10,\n  \"\\u24cc\": 10,\n  \"\\u24cd\": 10,\n  \"\\u24ce\": 10,\n  \"\\u24cf\": 10,\n  \"\\u24d0\": 10,\n  \"\\u24d1\": 10,\n  \"\\u24d2\": 10,\n  \"\\u24d3\": 10,\n  \"\\u24d4\": 10,\n  \"\\u24d5\": 10,\n  \"\\u24d6\": 10,\n  \"\\u24d7\": 10,\n  \"\\u24d8\": 10,\n  \"\\u24d9\": 10,\n  \"\\u24da\": 10,\n  \"\\u24db\": 10,\n  \"\\u24dc\": 10,\n  \"\\u24dd\": 10,\n  \"\\u24de\": 10,\n  \"\\u24df\": 10,\n  \"\\u24e0\": 10,\n  \"\\u24e1\": 10,\n  \"\\u24e2\": 10,\n  \"\\u24e3\": 10,\n  \"\\u24e4\": 10,\n  \"\\u24e5\": 10,\n  \"\\u24e6\": 10,\n  \"\\u24e7\": 10,\n  \"\\u24e8\": 10,\n  \"\\u24e9\": 10,\n  \"\\u0327\": 3,\n  \"\\u0282\": 6,\n  \"\\u0290\": 7,\n  \"\\u0276\": 10,\n  \"\\u01cd\": 6,\n  \"\\u01ce\": 6,\n  \"\\u01de\": 6,\n  \"\\u01df\": 6,\n  \"\\u01fa\": 6,\n  \"\\u01fb\": 6,\n  \"\\u0202\": 6,\n  \"\\u0203\": 6,\n  \"\\u0226\": 6,\n  \"\\u0227\": 6,\n  \"\\u01e0\": 6,\n  \"\\u01e1\": 6,\n  \"\\u1e00\": 6,\n  \"\\u1e01\": 6,\n  \"\\u0200\": 6,\n  \"\\u0201\": 6,\n  \"\\u1e06\": 6,\n  \"\\u1e07\": 6,\n  \"\\u1e04\": 6,\n  \"\\u1e05\": 6,\n  \"\\u1d6c\": 8,\n  \"\\u1e08\": 6,\n  \"\\u1e09\": 6,\n  \"\\u1e10\": 6,\n  \"\\u1e11\": 6,\n  \"\\u1e12\": 6,\n  \"\\u1e13\": 6,\n  \"\\u1e0e\": 6,\n  \"\\u1e0f\": 6,\n  \"\\u1e0c\": 6,\n  \"\\u1d6d\": 8,\n  \"\\u1e14\": 6,\n  \"\\u1e15\": 6,\n  \"\\u1e16\": 6,\n  \"\\u1e17\": 6,\n  \"\\u1e18\": 6,\n  \"\\u1e19\": 6,\n  \"\\u1e1c\": 6,\n  \"\\u1e1d\": 6,\n  \"\\u0228\": 6,\n  \"\\u0229\": 6,\n  \"\\u1e1a\": 6,\n  \"\\u1e1b\": 6,\n  \"\\u0204\": 6,\n  \"\\u0205\": 6,\n  \"\\u0206\": 6,\n  \"\\u1d6e\": 6,\n  \"\\u01f4\": 6,\n  \"\\u01f5\": 6,\n  \"\\u01e6\": 6,\n  \"\\u1e26\": 6,\n  \"\\u1e27\": 6,\n  \"\\u1e28\": 6,\n  \"\\u1e29\": 6,\n  \"\\u1e2a\": 6,\n  \"\\u1e2b\": 6,\n  \"\\u021e\": 6,\n  \"\\u021f\": 6,\n  \"\\u1e24\": 6,\n  \"\\u1e96\": 6,\n  \"\\u1e2e\": 4,\n  \"\\u1e2f\": 4,\n  \"\\u020a\": 5,\n  \"\\u020b\": 5,\n  \"\\u01cf\": 4,\n  \"\\u01d0\": 4,\n  \"\\u0208\": 6,\n  \"\\u0209\": 6,\n  \"\\u1e2c\": 5,\n  \"\\u1e2d\": 5,\n  \"\\u01f0\": 6,\n  \"\\u0237\": 6,\n  \"\\u01e8\": 6,\n  \"\\u01e9\": 5,\n  \"\\u1e32\": 6,\n  \"\\u1e33\": 5,\n  \"\\u1e34\": 6,\n  \"\\u1e35\": 5,\n  \"\\u1e3a\": 6,\n  \"\\u1e3b\": 4,\n  \"\\u1e3c\": 6,\n  \"\\u1e3d\": 4,\n  \"\\u1e36\": 6,\n  \"\\u1e37\": 3,\n  \"\\u1e38\": 6,\n  \"\\u1e39\": 4,\n  \"\\u2c62\": 8,\n  \"\\u1e3e\": 6,\n  \"\\u1e3f\": 6,\n  \"\\u1e42\": 6,\n  \"\\u1e43\": 6,\n  \"\\u1d6f\": 8,\n  \"\\u1e44\": 6,\n  \"\\u1e45\": 6,\n  \"\\u1e46\": 6,\n  \"\\u1e47\": 6,\n  \"\\u1e4a\": 6,\n  \"\\u1e4b\": 6,\n  \"\\u01f8\": 6,\n  \"\\u01f9\": 6,\n  \"\\u1e48\": 6,\n  \"\\u1e49\": 6,\n  \"\\u1d70\": 8,\n  \"\\u01ec\": 6,\n  \"\\u01ed\": 6,\n  \"\\u022c\": 6,\n  \"\\u022d\": 6,\n  \"\\u1e4c\": 6,\n  \"\\u1e4d\": 6,\n  \"\\u1e4e\": 6,\n  \"\\u1e4f\": 6,\n  \"\\u1e50\": 6,\n  \"\\u1e51\": 6,\n  \"\\u1e52\": 6,\n  \"\\u1e53\": 6,\n  \"\\u020e\": 6,\n  \"\\u020f\": 6,\n  \"\\u022a\": 6,\n  \"\\u022b\": 6,\n  \"\\u01d1\": 6,\n  \"\\u01d2\": 6,\n  \"\\u022e\": 6,\n  \"\\u022f\": 6,\n  \"\\u0230\": 6,\n  \"\\u0231\": 6,\n  \"\\u020c\": 6,\n  \"\\u020d\": 6,\n  \"\\u01ea\": 6,\n  \"\\u1e54\": 6,\n  \"\\u1e55\": 6,\n  \"\\u1d71\": 8,\n  \"\\u0212\": 6,\n  \"\\u0213\": 6,\n  \"\\u1e58\": 6,\n  \"\\u1e59\": 6,\n  \"\\u1e5c\": 6,\n  \"\\u1e5d\": 6,\n  \"\\u1e5e\": 6,\n  \"\\u1e5f\": 6,\n  \"\\u0210\": 6,\n  \"\\u0211\": 6,\n  \"\\u1e5a\": 6,\n  \"\\u1d73\": 8,\n  \"\\u1d72\": 8,\n  \"\\u1e64\": 6,\n  \"\\u1e65\": 6,\n  \"\\u1e66\": 6,\n  \"\\u1e67\": 6,\n  \"\\u1e62\": 6,\n  \"\\u1e63\": 6,\n  \"\\u1e68\": 6,\n  \"\\u1e69\": 6,\n  \"\\u1d74\": 8,\n  \"\\u1e70\": 6,\n  \"\\u1e71\": 4,\n  \"\\u1e6e\": 6,\n  \"\\u1e6f\": 4,\n  \"\\u1e6c\": 6,\n  \"\\u1e97\": 4,\n  \"\\u1d75\": 6,\n  \"\\u1e72\": 6,\n  \"\\u1e73\": 6,\n  \"\\u1e76\": 6,\n  \"\\u1e77\": 6,\n  \"\\u1e78\": 6,\n  \"\\u1e79\": 6,\n  \"\\u1e7a\": 6,\n  \"\\u1e7b\": 6,\n  \"\\u01d3\": 6,\n  \"\\u01d4\": 6,\n  \"\\u01d5\": 6,\n  \"\\u01d6\": 6,\n  \"\\u01d7\": 6,\n  \"\\u01d8\": 6,\n  \"\\u01d9\": 6,\n  \"\\u01da\": 6,\n  \"\\u01db\": 6,\n  \"\\u01dc\": 6,\n  \"\\u1e74\": 6,\n  \"\\u1e75\": 6,\n  \"\\u0214\": 6,\n  \"\\u0215\": 6,\n  \"\\u0216\": 6,\n  \"\\u1e7e\": 6,\n  \"\\u1e7f\": 6,\n  \"\\u1e7c\": 6,\n  \"\\u1e7d\": 6,\n  \"\\u1e86\": 6,\n  \"\\u1e87\": 6,\n  \"\\u1e88\": 6,\n  \"\\u1e89\": 6,\n  \"\\u1e98\": 6,\n  \"\\u1e8c\": 6,\n  \"\\u1e8d\": 6,\n  \"\\u1e8a\": 6,\n  \"\\u1e8b\": 6,\n  \"\\u0232\": 6,\n  \"\\u0233\": 6,\n  \"\\u1e8e\": 6,\n  \"\\u1e8f\": 6,\n  \"\\u1e99\": 6,\n  \"\\u1e94\": 6,\n  \"\\u1e95\": 6,\n  \"\\u1e90\": 6,\n  \"\\u1e91\": 6,\n  \"\\u1e93\": 6,\n  \"\\u1d76\": 6,\n  \"\\u01ee\": 6,\n  \"\\u01ef\": 6,\n  \"\\u1e9b\": 4,\n  \"\\ua73e\": 6,\n  \"\\ua73f\": 6,\n  \"\\u01e2\": 10,\n  \"\\u01e3\": 10,\n  \"\\u1d7a\": 9,\n  \"\\u1efb\": 7,\n  \"\\u1d02\": 10,\n  \"\\u1d14\": 10,\n  \"\\uab63\": 10,\n  \"\\u0238\": 10,\n  \"\\u02a3\": 10,\n  \"\\u02a5\": 10,\n  \"\\u02a4\": 10,\n  \"\\u02a9\": 10,\n  \"\\u02aa\": 8,\n  \"\\u02ab\": 8,\n  \"\\u0239\": 10,\n  \"\\u02a8\": 9,\n  \"\\u02a6\": 9,\n  \"\\u02a7\": 8,\n  \"\\uab50\": 6,\n  \"\\uab51\": 6,\n  \"\\u20a7\": 10,\n  \"\\u1efa\": 8,\n  \"\\ufb2e\": 6,\n  \"\\ufb2f\": 6,\n  \"\\u0180\": 7,\n  \"\\u0182\": 6,\n  \"\\u0183\": 6,\n  \"\\u0187\": 7,\n  \"\\u0188\": 7,\n  \"\\u018a\": 8,\n  \"\\u018b\": 6,\n  \"\\u018c\": 6,\n  \"\\u0193\": 7,\n  \"\\u01e4\": 7,\n  \"\\u01e5\": 7,\n  \"\\u0197\": 4,\n  \"\\u0196\": 4,\n  \"\\u0269\": 3,\n  \"\\u0198\": 6,\n  \"\\u0199\": 5,\n  \"\\u019d\": 7,\n  \"\\u01a4\": 8,\n  \"\\u01a5\": 6,\n  \"\\u027d\": 6,\n  \"\\u01a6\": 6,\n  \"\\u01ac\": 7,\n  \"\\u01ad\": 4,\n  \"\\u01ab\": 4,\n  \"\\u01ae\": 6,\n  \"\\u0217\": 6,\n  \"\\u01b1\": 6,\n  \"\\u019c\": 6,\n  \"\\u01b3\": 7,\n  \"\\u01b4\": 8,\n  \"\\u01b5\": 6,\n  \"\\u01b6\": 6,\n  \"\\u01a2\": 8,\n  \"\\u01a3\": 8,\n  \"\\u0222\": 6,\n  \"\\u0223\": 6,\n  \"\\u02ad\": 6,\n  \"\\u02ae\": 7,\n  \"\\u02af\": 8,\n  \"\\ufb14\": 10,\n  \"\\ufb15\": 10,\n  \"\\ufb17\": 10,\n  \"\\ufb16\": 10,\n  \"\\ufb13\": 10,\n  \"\\u04d0\": 6,\n  \"\\u04d1\": 6,\n  \"\\u04d2\": 6,\n  \"\\u04d3\": 6,\n  \"\\u04f6\": 6,\n  \"\\u04f7\": 5,\n  \"\\u0494\": 6,\n  \"\\u0495\": 5,\n  \"\\u04d6\": 6,\n  \"\\u04d7\": 6,\n  \"\\u04bc\": 8,\n  \"\\u04bd\": 8,\n  \"\\u04be\": 8,\n  \"\\u04bf\": 8,\n  \"\\u04da\": 6,\n  \"\\u04db\": 6,\n  \"\\u04dc\": 8,\n  \"\\u04dd\": 6,\n  \"\\u04c1\": 8,\n  \"\\u04c2\": 6,\n  \"\\u04de\": 6,\n  \"\\u04df\": 6,\n  \"\\u04e2\": 6,\n  \"\\u04e3\": 6,\n  \"\\u04e4\": 6,\n  \"\\u04e5\": 6,\n  \"\\u04e6\": 6,\n  \"\\u04e7\": 6,\n  \"\\u04ea\": 6,\n  \"\\u04eb\": 6,\n  \"\\u04f0\": 6,\n  \"\\u04f1\": 6,\n  \"\\u04ee\": 6,\n  \"\\u04ef\": 6,\n  \"\\u04f2\": 6,\n  \"\\u04f3\": 6,\n  \"\\u04f4\": 6,\n  \"\\u04f5\": 6,\n  \"\\u04f8\": 8,\n  \"\\u04f9\": 7,\n  \"\\u04ec\": 6,\n  \"\\u04ed\": 6,\n  \"\\u0476\": 7,\n  \"\\u0477\": 7,\n  \"\\u04d4\": 10,\n  \"\\u04fa\": 7,\n  \"\\u0502\": 9,\n  \"\\ua682\": 6,\n  \"\\ua680\": 7,\n  \"\\ua688\": 7,\n  \"\\u052a\": 10,\n  \"\\u052c\": 7,\n  \"\\ua684\": 10,\n  \"\\u0504\": 8,\n  \"\\u0510\": 6,\n  \"\\u04e0\": 6,\n  \"\\u0506\": 7,\n  \"\\u048a\": 7,\n  \"\\u04c3\": 6,\n  \"\\u049e\": 7,\n  \"\\u049c\": 6,\n  \"\\u051e\": 6,\n  \"\\u051a\": 6,\n  \"\\u04c5\": 7,\n  \"\\u052e\": 7,\n  \"\\u0512\": 6,\n  \"\\u0520\": 9,\n  \"\\u0508\": 9,\n  \"\\u0514\": 9,\n  \"\\u04cd\": 7,\n  \"\\u04c9\": 7,\n  \"\\u0528\": 7,\n  \"\\u04c7\": 6,\n  \"\\u04a4\": 7,\n  \"\\u0522\": 9,\n  \"\\u050a\": 9,\n  \"\\u04a8\": 7,\n  \"\\u0524\": 7,\n  \"\\u04a6\": 9,\n  \"\\u048e\": 6,\n  \"\\u0516\": 9,\n  \"\\u050c\": 6,\n  \"\\ua690\": 6,\n  \"\\u04ac\": 6,\n  \"\\ua68a\": 7,\n  \"\\ua68c\": 6,\n  \"\\u050e\": 7,\n  \"\\u04b2\": 7,\n  \"\\u04fc\": 6,\n  \"\\u04fe\": 6,\n  \"\\u0526\": 7,\n  \"\\ua694\": 6,\n  \"\\u04b4\": 8,\n  \"\\ua68e\": 7,\n  \"\\u04b6\": 7,\n  \"\\u04cb\": 6,\n  \"\\u04b8\": 6,\n  \"\\ua692\": 7,\n  \"\\ua696\": 9,\n  \"\\ua686\": 6,\n  \"\\u048c\": 7,\n  \"\\u0518\": 10,\n  \"\\u051c\": 6,\n  \"\\u04d5\": 10,\n  \"\\u04fb\": 6,\n  \"\\u0503\": 9,\n  \"\\ua683\": 6,\n  \"\\ua681\": 7,\n  \"\\ua689\": 7,\n  \"\\u052b\": 10,\n  \"\\u052d\": 7,\n  \"\\ua685\": 9,\n  \"\\u0505\": 8,\n  \"\\u0511\": 6,\n  \"\\u04e1\": 6,\n  \"\\u0507\": 7,\n  \"\\u048b\": 7,\n  \"\\u04c4\": 5,\n  \"\\u049f\": 6,\n  \"\\u049d\": 6,\n  \"\\u051f\": 6,\n  \"\\u051b\": 6,\n  \"\\u04c6\": 7,\n  \"\\u052f\": 7,\n  \"\\u0513\": 6,\n  \"\\u0521\": 9,\n  \"\\u0509\": 9,\n  \"\\u0515\": 9,\n  \"\\u04ce\": 7,\n  \"\\u04ca\": 7,\n  \"\\u0529\": 7,\n  \"\\u04c8\": 6,\n  \"\\u04a5\": 7,\n  \"\\u0523\": 9,\n  \"\\u050b\": 9,\n  \"\\u04a9\": 7,\n  \"\\u0525\": 7,\n  \"\\u04a7\": 9,\n  \"\\u048f\": 6,\n  \"\\u0517\": 9,\n  \"\\u050d\": 6,\n  \"\\ua691\": 6,\n  \"\\u04ad\": 6,\n  \"\\ua68b\": 7,\n  \"\\ua68d\": 6,\n  \"\\u050f\": 7,\n  \"\\u04b3\": 7,\n  \"\\u04fd\": 6,\n  \"\\u04ff\": 6,\n  \"\\u0527\": 7,\n  \"\\ua695\": 6,\n  \"\\u04b5\": 7,\n  \"\\ua68f\": 6,\n  \"\\u04b7\": 7,\n  \"\\u04cc\": 6,\n  \"\\u04b9\": 6,\n  \"\\ua693\": 7,\n  \"\\ua697\": 7,\n  \"\\ua687\": 6,\n  \"\\u048d\": 7,\n  \"\\u0519\": 10,\n  \"\\u051d\": 6,\n  \"\\u1f08\": 9,\n  \"\\u1f00\": 6,\n  \"\\u1f09\": 9,\n  \"\\u1f01\": 6,\n  \"\\u1f0a\": 10,\n  \"\\u1f02\": 6,\n  \"\\u1f0b\": 10,\n  \"\\u1f03\": 6,\n  \"\\u1f0c\": 10,\n  \"\\u1f04\": 6,\n  \"\\u1f0d\": 10,\n  \"\\u1f05\": 7,\n  \"\\u1f0e\": 9,\n  \"\\u1f06\": 6,\n  \"\\u1f0f\": 9,\n  \"\\u1f07\": 6,\n  \"\\u1fba\": 9,\n  \"\\u1f70\": 6,\n  \"\\u1fb8\": 6,\n  \"\\u1fb0\": 6,\n  \"\\u1fb9\": 6,\n  \"\\u1fb1\": 6,\n  \"\\u1fbb\": 9,\n  \"\\u1f71\": 6,\n  \"\\u1f88\": 9,\n  \"\\u1f80\": 6,\n  \"\\u1f89\": 9,\n  \"\\u1f81\": 6,\n  \"\\u1f8a\": 10,\n  \"\\u1f82\": 6,\n  \"\\u1f8b\": 10,\n  \"\\u1f83\": 6,\n  \"\\u1f8c\": 10,\n  \"\\u1f84\": 6,\n  \"\\u1f8d\": 10,\n  \"\\u1f85\": 6,\n  \"\\u1f8e\": 9,\n  \"\\u1f86\": 6,\n  \"\\u1f8f\": 9,\n  \"\\u1f87\": 6,\n  \"\\u1fbc\": 6,\n  \"\\u1fb4\": 6,\n  \"\\u1fb6\": 6,\n  \"\\u1fb7\": 6,\n  \"\\u1fb2\": 6,\n  \"\\u1fb3\": 6,\n  \"\\u1f18\": 9,\n  \"\\u1f10\": 6,\n  \"\\u1f19\": 9,\n  \"\\u1f11\": 6,\n  \"\\u1f1a\": 10,\n  \"\\u1f12\": 6,\n  \"\\u1f1b\": 10,\n  \"\\u1f13\": 6,\n  \"\\u1f1c\": 10,\n  \"\\u1f14\": 6,\n  \"\\u1f1d\": 10,\n  \"\\u1f15\": 6,\n  \"\\u1fc8\": 9,\n  \"\\u1fc9\": 9,\n  \"\\u1f72\": 6,\n  \"\\u1f73\": 6,\n  \"\\u1f28\": 9,\n  \"\\u1f20\": 6,\n  \"\\u1fca\": 9,\n  \"\\u1f74\": 6,\n  \"\\u1f29\": 9,\n  \"\\u1f21\": 6,\n  \"\\u1f2a\": 10,\n  \"\\u1f22\": 6,\n  \"\\u1f2b\": 10,\n  \"\\u1f23\": 6,\n  \"\\u1f2c\": 10,\n  \"\\u1f24\": 6,\n  \"\\u1f2d\": 10,\n  \"\\u1f25\": 6,\n  \"\\u1f2e\": 9,\n  \"\\u1f26\": 6,\n  \"\\u1f2f\": 9,\n  \"\\u1f27\": 6,\n  \"\\u1f98\": 9,\n  \"\\u1f90\": 6,\n  \"\\u1f99\": 9,\n  \"\\u1f91\": 6,\n  \"\\u1f9a\": 10,\n  \"\\u1f92\": 6,\n  \"\\u1f9b\": 10,\n  \"\\u1f93\": 6,\n  \"\\u1f9c\": 10,\n  \"\\u1f94\": 6,\n  \"\\u1f9d\": 10,\n  \"\\u1f95\": 6,\n  \"\\u1f9e\": 9,\n  \"\\u1f96\": 6,\n  \"\\u1f9f\": 9,\n  \"\\u1f97\": 6,\n  \"\\u1fcb\": 9,\n  \"\\u1f75\": 6,\n  \"\\u1fcc\": 6,\n  \"\\u1fc3\": 6,\n  \"\\u1fc2\": 6,\n  \"\\u1fc4\": 6,\n  \"\\u1fc6\": 6,\n  \"\\u1fc7\": 6,\n  \"\\u1fda\": 7,\n  \"\\u1f76\": 4,\n  \"\\u1fdb\": 7,\n  \"\\u1f77\": 3,\n  \"\\u1f38\": 7,\n  \"\\u1f30\": 4,\n  \"\\u1f39\": 10,\n  \"\\u1f31\": 3,\n  \"\\u1f3a\": 9,\n  \"\\u1f32\": 6,\n  \"\\u1f3b\": 8,\n  \"\\u1f33\": 6,\n  \"\\u1f3c\": 9,\n  \"\\u1f34\": 6,\n  \"\\u1f3d\": 8,\n  \"\\u1f35\": 6,\n  \"\\u1f3e\": 7,\n  \"\\u1f36\": 5,\n  \"\\u1f3f\": 7,\n  \"\\u1f37\": 5,\n  \"\\u1fd8\": 5,\n  \"\\u1fd0\": 5,\n  \"\\u1fd9\": 4,\n  \"\\u1fd1\": 4,\n  \"\\u1fd2\": 4,\n  \"\\u1fd3\": 4,\n  \"\\u1fd6\": 5,\n  \"\\u1fd7\": 5,\n  \"\\u1ff8\": 9,\n  \"\\u1f78\": 6,\n  \"\\u1ff9\": 9,\n  \"\\u1f79\": 6,\n  \"\\u1f48\": 9,\n  \"\\u1f40\": 6,\n  \"\\u1f49\": 9,\n  \"\\u1f41\": 6,\n  \"\\u1f4a\": 10,\n  \"\\u1f42\": 6,\n  \"\\u1f4b\": 10,\n  \"\\u1f43\": 6,\n  \"\\u1f4c\": 10,\n  \"\\u1f44\": 6,\n  \"\\u1f4d\": 10,\n  \"\\u1f45\": 6,\n  \"\\u1fec\": 9,\n  \"\\u1fe4\": 6,\n  \"\\u1fe5\": 6,\n  \"\\u1fea\": 9,\n  \"\\u1f7a\": 6,\n  \"\\u1feb\": 9,\n  \"\\u1f7b\": 6,\n  \"\\u1f59\": 9,\n  \"\\u1f51\": 6,\n  \"\\u1f5b\": 10,\n  \"\\u1f53\": 6,\n  \"\\u1f5d\": 10,\n  \"\\u1f55\": 6,\n  \"\\u1f5f\": 9,\n  \"\\u1f57\": 6,\n  \"\\u1fe8\": 6,\n  \"\\u1fe0\": 6,\n  \"\\u1fe9\": 6,\n  \"\\u1fe1\": 6,\n  \"\\u03d3\": 10,\n  \"\\u03d4\": 7,\n  \"\\u1fe2\": 6,\n  \"\\u1fe3\": 6,\n  \"\\u1fe7\": 6,\n  \"\\u1f50\": 6,\n  \"\\u1f52\": 6,\n  \"\\u1f54\": 6,\n  \"\\u1fe6\": 6,\n  \"\\u1f56\": 6,\n  \"\\u1ffa\": 9,\n  \"\\u1f7c\": 8,\n  \"\\u1ffb\": 9,\n  \"\\u1f7d\": 8,\n  \"\\u1f68\": 9,\n  \"\\u1f60\": 8,\n  \"\\u1f69\": 9,\n  \"\\u1f61\": 8,\n  \"\\u1f6a\": 10,\n  \"\\u1f62\": 8,\n  \"\\u1f6b\": 10,\n  \"\\u1f63\": 8,\n  \"\\u1f6c\": 10,\n  \"\\u1f64\": 8,\n  \"\\u1f6d\": 10,\n  \"\\u1f65\": 8,\n  \"\\u1f6e\": 9,\n  \"\\u1f66\": 8,\n  \"\\u1f6f\": 10,\n  \"\\u1f67\": 8,\n  \"\\u1fa8\": 9,\n  \"\\u1fa0\": 8,\n  \"\\u1fa9\": 9,\n  \"\\u1fa1\": 8,\n  \"\\u1faa\": 10,\n  \"\\u1fa2\": 8,\n  \"\\u1fab\": 10,\n  \"\\u1fa3\": 8,\n  \"\\u1fac\": 10,\n  \"\\u1fa4\": 8,\n  \"\\u1fad\": 10,\n  \"\\u1fa5\": 8,\n  \"\\u1fae\": 9,\n  \"\\u1fa6\": 8,\n  \"\\u1faf\": 10,\n  \"\\u1fa7\": 8,\n  \"\\u1ffc\": 6,\n  \"\\u1ff3\": 8,\n  \"\\u1ff2\": 8,\n  \"\\u1ff4\": 8,\n  \"\\u1ff6\": 8,\n  \"\\u1ff7\": 8,\n  \"\\u262f\": 10,\n  \"\\u2610\": 10,\n  \"\\u2611\": 10,\n  \"\\u2612\": 10,\n  \"\\u018d\": 6,\n  \"\\u01ba\": 6,\n  \"\\u2c7e\": 6,\n  \"\\u023f\": 6,\n  \"\\u2c7f\": 6,\n  \"\\u0240\": 6,\n  \"\\u1d80\": 6,\n  \"\\ua7c4\": 6,\n  \"\\ua794\": 6,\n  \"\\u1d81\": 7,\n  \"\\u1d82\": 5,\n  \"\\u1d83\": 7,\n  \"\\ua795\": 7,\n  \"\\u1d84\": 6,\n  \"\\u1d85\": 3,\n  \"\\u1d86\": 7,\n  \"\\u1d87\": 7,\n  \"\\u1d88\": 6,\n  \"\\u1d89\": 6,\n  \"\\u1d8a\": 6,\n  \"\\u1d8b\": 6,\n  \"\\u1d8c\": 6,\n  \"\\u1d8d\": 7,\n  \"\\ua7c6\": 7,\n  \"\\u1d8e\": 7,\n  \"\\u1d8f\": 7,\n  \"\\u1d90\": 7,\n  \"\\u1d92\": 7,\n  \"\\u1d93\": 7,\n  \"\\u1d94\": 6,\n  \"\\u1d95\": 7,\n  \"\\u1d96\": 3,\n  \"\\u1d97\": 7,\n  \"\\u1d98\": 6,\n  \"\\u1d99\": 7,\n  \"\\u1d9a\": 6,\n  \"\\u1e9a\": 6,\n  \"\\u2152\": 10,\n  \"\\u2158\": 10,\n  \"\\u20a8\": 10,\n  \"\\u20af\": 10,\n  \"\\u2030\": 8,\n  \"\\u20b4\": 8,\n  \"\\u2260\": 6,\n  \"\\u04bb\": 6,\n  \"\\u0391\": 6,\n  \"\\u0392\": 6,\n  \"\\u0393\": 6,\n  \"\\u0394\": 6,\n  \"\\u0395\": 6,\n  \"\\u0396\": 6,\n  \"\\u0397\": 6,\n  \"\\u0398\": 6,\n  \"\\u0399\": 4,\n  \"\\u039a\": 6,\n  \"\\u039b\": 6,\n  \"\\u039c\": 6,\n  \"\\u039d\": 6,\n  \"\\u039e\": 6,\n  \"\\u039f\": 6,\n  \"\\u03a0\": 6,\n  \"\\u03a1\": 6,\n  \"\\u03a3\": 6,\n  \"\\u03a4\": 6,\n  \"\\u03a5\": 6,\n  \"\\u03a6\": 6,\n  \"\\u03a7\": 6,\n  \"\\u03a8\": 6,\n  \"\\u03a9\": 6,\n  \"\\u03b1\": 6,\n  \"\\u03b2\": 6,\n  \"\\u03b3\": 6,\n  \"\\u03b4\": 6,\n  \"\\u03b5\": 6,\n  \"\\u03b6\": 6,\n  \"\\u03b7\": 6,\n  \"\\u03b8\": 6,\n  \"\\u03b9\": 3,\n  \"\\u03ba\": 5,\n  \"\\u03bb\": 6,\n  \"\\u03bc\": 6,\n  \"\\u03bd\": 6,\n  \"\\u03be\": 6,\n  \"\\u03bf\": 6,\n  \"\\u03c0\": 6,\n  \"\\u03c1\": 6,\n  \"\\u03c2\": 6,\n  \"\\u03c3\": 7,\n  \"\\u03c4\": 6,\n  \"\\u03c5\": 6,\n  \"\\u03c6\": 6,\n  \"\\u03c7\": 6,\n  \"\\u03c8\": 6,\n  \"\\u03c9\": 8,\n  \"\\u0402\": 8,\n  \"\\u0405\": 6,\n  \"\\u0406\": 4,\n  \"\\u0408\": 6,\n  \"\\u0409\": 8,\n  \"\\u040a\": 7,\n  \"\\u040b\": 7,\n  \"\\u0410\": 6,\n  \"\\u0411\": 6,\n  \"\\u0412\": 6,\n  \"\\u0413\": 6,\n  \"\\u0414\": 7,\n  \"\\u0415\": 6,\n  \"\\u0416\": 8,\n  \"\\u0417\": 6,\n  \"\\u0418\": 6,\n  \"\\u041a\": 6,\n  \"\\u041b\": 6,\n  \"\\u041c\": 6,\n  \"\\u041d\": 6,\n  \"\\u041e\": 6,\n  \"\\u041f\": 6,\n  \"\\u0420\": 6,\n  \"\\u0421\": 6,\n  \"\\u0422\": 6,\n  \"\\u0423\": 6,\n  \"\\u0424\": 8,\n  \"\\u0425\": 6,\n  \"\\u0426\": 7,\n  \"\\u0427\": 6,\n  \"\\u0428\": 8,\n  \"\\u0429\": 9,\n  \"\\u042a\": 7,\n  \"\\u042b\": 8,\n  \"\\u042c\": 6,\n  \"\\u042d\": 6,\n  \"\\u042e\": 8,\n  \"\\u042f\": 6,\n  \"\\u0430\": 6,\n  \"\\u0431\": 6,\n  \"\\u0432\": 6,\n  \"\\u0433\": 5,\n  \"\\u0434\": 7,\n  \"\\u0435\": 6,\n  \"\\u0436\": 6,\n  \"\\u0437\": 6,\n  \"\\u0438\": 6,\n  \"\\u043a\": 5,\n  \"\\u043b\": 6,\n  \"\\u043c\": 6,\n  \"\\u043d\": 6,\n  \"\\u043e\": 6,\n  \"\\u043f\": 6,\n  \"\\u0440\": 6,\n  \"\\u0441\": 6,\n  \"\\u0442\": 6,\n  \"\\u0443\": 6,\n  \"\\u0444\": 6,\n  \"\\u0445\": 6,\n  \"\\u0446\": 6,\n  \"\\u0447\": 6,\n  \"\\u0448\": 6,\n  \"\\u0449\": 7,\n  \"\\u044a\": 7,\n  \"\\u044b\": 7,\n  \"\\u044c\": 6,\n  \"\\u044d\": 6,\n  \"\\u044e\": 8,\n  \"\\u044f\": 6,\n  \"\\u0454\": 6,\n  \"\\u0455\": 6,\n  \"\\u0456\": 2,\n  \"\\u0458\": 6,\n  \"\\u0459\": 8,\n  \"\\u045a\": 7,\n  \"\\u2013\": 7,\n  \"\\u2014\": 9,\n  \"\\u2018\": 3,\n  \"\\u2019\": 3,\n  \"\\u201c\": 5,\n  \"\\u201d\": 5,\n  \"\\u201e\": 5,\n  \"\\u2026\": 8,\n  \"\\u204a\": 5,\n  \"\\u2190\": 8,\n  \"\\u2191\": 6,\n  \"\\u2192\": 8,\n  \"\\u2193\": 6,\n  \"\\u21c4\": 8,\n  \"\\uff0b\": 6,\n  \"\\u018f\": 6,\n  \"\\u0259\": 6,\n  \"\\u025b\": 6,\n  \"\\u026a\": 4,\n  \"\\u04ae\": 6,\n  \"\\u04af\": 6,\n  \"\\u04e8\": 6,\n  \"\\u04e9\": 6,\n  \"\\u02bb\": 2,\n  \"\\u02cc\": 2,\n  \"\\u037e\": 2,\n  \"\\u0138\": 5,\n  \"\\u1e9e\": 6,\n  \"\\u20bd\": 7,\n  \"\\u20ac\": 7,\n  \"\\u0462\": 7,\n  \"\\u0463\": 7,\n  \"\\u0474\": 7,\n  \"\\u0475\": 7,\n  \"\\u04c0\": 4,\n  \"\\u0472\": 6,\n  \"\\u0473\": 6,\n  \"\\u2070\": 5,\n  \"\\u2074\": 5,\n  \"\\u2075\": 5,\n  \"\\u2076\": 5,\n  \"\\u2077\": 5,\n  \"\\u2078\": 5,\n  \"\\u2079\": 5,\n  \"\\u207a\": 4,\n  \"\\u207b\": 4,\n  \"\\u207c\": 4,\n  \"\\u207d\": 3,\n  \"\\u207e\": 3,\n  \"\\u2071\": 2,\n  \"\\u2122\": 9,\n  \"\\u0294\": 6,\n  \"\\u0295\": 6,\n  \"\\u29c8\": 8,\n  \"\\u2694\": 8,\n  \"\\u2620\": 8,\n  \"\\u049a\": 7,\n  \"\\u049b\": 6,\n  \"\\u0492\": 7,\n  \"\\u0493\": 6,\n  \"\\u04b0\": 6,\n  \"\\u04b1\": 6,\n  \"\\u04d8\": 6,\n  \"\\u04d9\": 6,\n  \"\\u0496\": 9,\n  \"\\u0497\": 7,\n  \"\\u04a2\": 7,\n  \"\\u04a3\": 7,\n  \"\\u04ba\": 6,\n  \"\\u05d0\": 6,\n  \"\\u05d1\": 6,\n  \"\\u05d2\": 5,\n  \"\\u05d3\": 6,\n  \"\\u05d4\": 6,\n  \"\\u05d5\": 2,\n  \"\\u05d6\": 4,\n  \"\\u05d7\": 6,\n  \"\\u05d8\": 6,\n  \"\\u05d9\": 2,\n  \"\\u05db\": 6,\n  \"\\u05dc\": 6,\n  \"\\u05de\": 6,\n  \"\\u05dd\": 6,\n  \"\\u05e0\": 4,\n  \"\\u05df\": 2,\n  \"\\u05e1\": 6,\n  \"\\u05e2\": 6,\n  \"\\u05e4\": 6,\n  \"\\u05e3\": 6,\n  \"\\u05e6\": 6,\n  \"\\u05e5\": 6,\n  \"\\u05e7\": 6,\n  \"\\u05e8\": 6,\n  \"\\u0387\": 2,\n  \"\\u2010\": 4,\n  \"\\u201a\": 3,\n  \"\\u2020\": 6,\n  \"\\u2021\": 6,\n  \"\\u2022\": 3,\n  \"\\u2031\": 9,\n  \"\\u2032\": 3,\n  \"\\u2033\": 5,\n  \"\\u2034\": 7,\n  \"\\u2035\": 3,\n  \"\\u2036\": 5,\n  \"\\u2037\": 7,\n  \"\\u2039\": 4,\n  \"\\u203a\": 4,\n  \"\\u203b\": 8,\n  \"\\u203c\": 4,\n  \"\\u203d\": 6,\n  \"\\u2042\": 8,\n  \"\\u2048\": 8,\n  \"\\u2049\": 8,\n  \"\\u204b\": 7,\n  \"\\u204e\": 4,\n  \"\\u204f\": 2,\n  \"\\u2051\": 4,\n  \"\\u2052\": 4,\n  \"\\u2057\": 9,\n  \"\\u2117\": 8,\n  \"\\u2212\": 6,\n  \"\\u2213\": 6,\n  \"\\u221e\": 8,\n  \"\\u2600\": 9,\n  \"\\u2601\": 9,\n  \"\\u2608\": 8,\n  \"\\u0404\": 6,\n  \"\\u2632\": 6,\n  \"\\u2635\": 6,\n  \"\\u263d\": 9,\n  \"\\u2640\": 4,\n  \"\\u2642\": 6,\n  \"\\u26a5\": 6,\n  \"\\u2660\": 6,\n  \"\\u2663\": 6,\n  \"\\u2665\": 6,\n  \"\\u2666\": 6,\n  \"\\u2669\": 4,\n  \"\\u266a\": 6,\n  \"\\u266b\": 8,\n  \"\\u266c\": 8,\n  \"\\u266d\": 4,\n  \"\\u266e\": 4,\n  \"\\u266f\": 6,\n  \"\\u2680\": 8,\n  \"\\u2681\": 8,\n  \"\\u2682\": 8,\n  \"\\u2683\": 8,\n  \"\\u2684\": 8,\n  \"\\u2685\": 8,\n  \"\\u02ac\": 6,\n  \"\\u26a1\": 6,\n  \"\\u26cf\": 9,\n  \"\\u2714\": 7,\n  \"\\u2744\": 8,\n  \"\\u274c\": 7,\n  \"\\u2764\": 8,\n  \"\\u2b50\": 8,\n  \"\\u2e18\": 6,\n  \"\\u2e2e\": 6,\n  \"\\u2e35\": 2,\n  \"\\u2e38\": 6,\n  \"\\u2e41\": 2,\n  \"\\u2e4b\": 6,\n  \"\\u295d\": 6,\n  \"\\u1614\": 6,\n  \"\\u0190\": 6,\n  \"\\u07c8\": 6,\n  \"\\u03db\": 6,\n  \"\\u3125\": 6,\n  \"\\u2c6f\": 6,\n  \"\\u15fa\": 6,\n  \"\\u0186\": 6,\n  \"\\u15e1\": 6,\n  \"\\u018e\": 6,\n  \"\\u2132\": 6,\n  \"\\u2141\": 6,\n  \"\\ua7b0\": 6,\n  \"\\ua780\": 6,\n  \"\\u0500\": 6,\n  \"\\ua779\": 6,\n  \"\\u1d1a\": 6,\n  \"\\u27d8\": 6,\n  \"\\u2229\": 6,\n  \"\\u0245\": 6,\n  \"\\u2144\": 6,\n  \"\\u0250\": 6,\n  \"\\u0254\": 6,\n  \"\\u01dd\": 6,\n  \"\\u025f\": 5,\n  \"\\u1d77\": 6,\n  \"\\u0265\": 6,\n  \"\\u1d09\": 2,\n  \"\\u027e\": 6,\n  \"\\u029e\": 5,\n  \"\\ua781\": 3,\n  \"\\u026f\": 6,\n  \"\\u0279\": 6,\n  \"\\u0287\": 4,\n  \"\\u028c\": 6,\n  \"\\u028d\": 6,\n  \"\\u028e\": 6,\n  \"\\u0531\": 6,\n  \"\\u0532\": 6,\n  \"\\u0533\": 7,\n  \"\\u0534\": 7,\n  \"\\u0536\": 6,\n  \"\\u0537\": 6,\n  \"\\u0539\": 7,\n  \"\\u053a\": 7,\n  \"\\u053b\": 6,\n  \"\\u053c\": 5,\n  \"\\u053d\": 7,\n  \"\\u053e\": 6,\n  \"\\u053f\": 6,\n  \"\\u0540\": 6,\n  \"\\u0541\": 6,\n  \"\\u0542\": 7,\n  \"\\u0543\": 6,\n  \"\\u0544\": 7,\n  \"\\u0545\": 6,\n  \"\\u0546\": 6,\n  \"\\u0547\": 6,\n  \"\\u0548\": 6,\n  \"\\u0549\": 6,\n  \"\\u054b\": 6,\n  \"\\u054c\": 7,\n  \"\\u054d\": 6,\n  \"\\u054e\": 6,\n  \"\\u054f\": 6,\n  \"\\u0550\": 6,\n  \"\\u0551\": 6,\n  \"\\u0552\": 5,\n  \"\\u0553\": 6,\n  \"\\u0554\": 6,\n  \"\\u0555\": 6,\n  \"\\u0556\": 6,\n  \"\\u0559\": 3,\n  \"\\u0561\": 6,\n  \"\\u0562\": 6,\n  \"\\u0563\": 7,\n  \"\\u0564\": 7,\n  \"\\u0565\": 6,\n  \"\\u0566\": 7,\n  \"\\u0567\": 5,\n  \"\\u0568\": 6,\n  \"\\u0569\": 6,\n  \"\\u056a\": 7,\n  \"\\u056b\": 6,\n  \"\\u056c\": 3,\n  \"\\u056d\": 7,\n  \"\\u056e\": 6,\n  \"\\u056f\": 6,\n  \"\\u0570\": 6,\n  \"\\u0571\": 6,\n  \"\\u0572\": 7,\n  \"\\u0573\": 6,\n  \"\\u0574\": 7,\n  \"\\u0575\": 6,\n  \"\\u0576\": 7,\n  \"\\u0577\": 6,\n  \"\\u0578\": 6,\n  \"\\u0579\": 6,\n  \"\\u057a\": 6,\n  \"\\u057b\": 6,\n  \"\\u057c\": 6,\n  \"\\u057d\": 6,\n  \"\\u057e\": 7,\n  \"\\u057f\": 8,\n  \"\\u0580\": 6,\n  \"\\u0581\": 6,\n  \"\\u0582\": 5,\n  \"\\u0583\": 8,\n  \"\\u0584\": 7,\n  \"\\u0585\": 6,\n  \"\\u0586\": 6,\n  \"\\u0587\": 7,\n  \"\\u05e9\": 6,\n  \"\\u05ea\": 6,\n  \"\\u0538\": 6,\n  \"\\u055a\": 3,\n  \"\\u055b\": 3,\n  \"\\u055c\": 4,\n  \"\\u055d\": 3,\n  \"\\u055e\": 4,\n  \"\\u055f\": 6,\n  \"\\u0560\": 6,\n  \"\\u0588\": 7,\n  \"\\u058f\": 6,\n  \"\\u017f\": 4,\n  \"\\u01b7\": 6,\n  \"\\u0292\": 6,\n  \"\\u01f7\": 6,\n  \"\\u01bf\": 6,\n  \"\\u021c\": 6,\n  \"\\u021d\": 6,\n  \"\\u0224\": 6,\n  \"\\u0225\": 6,\n  \"\\u02d9\": 2,\n  \"\\ua75a\": 6,\n  \"\\ua75b\": 5,\n  \"\\u2011\": 4,\n  \"\\u214b\": 6,\n  \"\\u23cf\": 6,\n  \"\\u23e9\": 7,\n  \"\\u23ea\": 7,\n  \"\\u23ed\": 8,\n  \"\\u23ee\": 8,\n  \"\\u23ef\": 7,\n  \"\\u23f4\": 4,\n  \"\\u23f5\": 4,\n  \"\\u23f6\": 6,\n  \"\\u23f7\": 6,\n  \"\\u23f8\": 4,\n  \"\\u23f9\": 6,\n  \"\\u23fa\": 6,\n  \"\\u23fb\": 8,\n  \"\\u23fc\": 8,\n  \"\\u23fd\": 2,\n  \"\\u2b58\": 8,\n  \"\\u25b2\": 6,\n  \"\\u25b6\": 7,\n  \"\\u25bc\": 6,\n  \"\\u25c0\": 7,\n  \"\\u25cf\": 5,\n  \"\\u25e6\": 4,\n  \"\\u25d8\": 4,\n  \"\\u2693\": 8,\n  \"\\u26e8\": 8,\n  \"\\u0132\": 6,\n  \"\\u0133\": 5,\n  \"\\u01c9\": 8,\n  \"\\ua728\": 8,\n  \"\\ua729\": 7,\n  \"\\ua739\": 9,\n  \"\\ua73b\": 9,\n  \"\\ufb00\": 8,\n  \"\\ufb01\": 6,\n  \"\\ufb02\": 7,\n  \"\\ufb03\": 9,\n  \"\\ufb05\": 6,\n  \"\\ufffd\": 8,\n  \"\\u0535\": 6,\n  \"\\u054a\": 6,\n  \"\\u16a0\": 5,\n  \"\\u16a2\": 6,\n  \"\\u16a3\": 6,\n  \"\\u16a4\": 6,\n  \"\\u16a5\": 6,\n  \"\\u16a6\": 5,\n  \"\\u16a7\": 5,\n  \"\\u16a8\": 4,\n  \"\\u16a9\": 5,\n  \"\\u16aa\": 5,\n  \"\\u16ab\": 5,\n  \"\\u16ac\": 6,\n  \"\\u16ad\": 4,\n  \"\\u16ae\": 4,\n  \"\\u16af\": 6,\n  \"\\u16b0\": 6,\n  \"\\u16b1\": 5,\n  \"\\u16b2\": 4,\n  \"\\u16b3\": 5,\n  \"\\u16b4\": 5,\n  \"\\u16b6\": 6,\n  \"\\u16b7\": 6,\n  \"\\u16b8\": 6,\n  \"\\u16b9\": 5,\n  \"\\u16ba\": 6,\n  \"\\u16bb\": 6,\n  \"\\u16bc\": 6,\n  \"\\u16bd\": 4,\n  \"\\u16be\": 6,\n  \"\\u16bf\": 4,\n  \"\\u16c0\": 6,\n  \"\\u16c1\": 2,\n  \"\\u16c2\": 4,\n  \"\\u16c3\": 7,\n  \"\\u16c4\": 6,\n  \"\\u16c5\": 6,\n  \"\\u16c6\": 4,\n  \"\\u16c7\": 6,\n  \"\\u16c8\": 5,\n  \"\\u16c9\": 6,\n  \"\\u16ca\": 4,\n  \"\\u16cb\": 6,\n  \"\\u16cc\": 2,\n  \"\\u16cd\": 4,\n  \"\\u16ce\": 6,\n  \"\\u16cf\": 6,\n  \"\\u16d0\": 4,\n  \"\\u16d1\": 5,\n  \"\\u16d2\": 5,\n  \"\\u16d3\": 4,\n  \"\\u16d4\": 5,\n  \"\\u16d5\": 5,\n  \"\\u16d6\": 6,\n  \"\\u16d7\": 6,\n  \"\\u16d8\": 6,\n  \"\\u16d9\": 4,\n  \"\\u16da\": 4,\n  \"\\u16db\": 5,\n  \"\\u16dc\": 6,\n  \"\\u16dd\": 6,\n  \"\\u16de\": 6,\n  \"\\u16df\": 7,\n  \"\\u16e0\": 8,\n  \"\\u16e1\": 6,\n  \"\\u16e2\": 8,\n  \"\\u16e3\": 6,\n  \"\\u16e4\": 6,\n  \"\\u16e5\": 6,\n  \"\\u16e6\": 6,\n  \"\\u16e7\": 2,\n  \"\\u16e8\": 6,\n  \"\\u16e9\": 5,\n  \"\\u16ea\": 8,\n  \"\\u16eb\": 3,\n  \"\\u16ec\": 2,\n  \"\\u16ed\": 6,\n  \"\\u16ee\": 6,\n  \"\\u16ef\": 6,\n  \"\\u16f0\": 6,\n  \"\\u16f1\": 6,\n  \"\\u16f2\": 6,\n  \"\\u16f3\": 8,\n  \"\\u16f4\": 5,\n  \"\\u16f5\": 3,\n  \"\\u16f6\": 6,\n  \"\\u16f7\": 6,\n  \"\\u16f8\": 6,\n  \"\\u263a\": 6,\n  \"\\u263b\": 8,\n  \"\\u2639\": 6,\n  \"\\u05da\": 6,\n  \"\\u05f3\": 3,\n  \"\\u05f4\": 5,\n  \"\\u05f0\": 4,\n  \"\\u05f1\": 4,\n  \"\\u05f2\": 4,\n  \"\\u05be\": 6,\n  \"\\u05c3\": 2,\n  \"\\u05c6\": 4,\n  \"\\u1d00\": 6,\n  \"\\u0299\": 6,\n  \"\\u1d04\": 6,\n  \"\\u1d05\": 6,\n  \"\\u1d07\": 6,\n  \"\\ua730\": 6,\n  \"\\u0262\": 6,\n  \"\\u029c\": 6,\n  \"\\u1d0a\": 6,\n  \"\\u1d0b\": 6,\n  \"\\u029f\": 6,\n  \"\\u1d0d\": 6,\n  \"\\u0274\": 6,\n  \"\\u1d0f\": 6,\n  \"\\u1d18\": 6,\n  \"\\ua7af\": 6,\n  \"\\u0280\": 6,\n  \"\\ua731\": 6,\n  \"\\u1d1b\": 6,\n  \"\\u1d1c\": 6,\n  \"\\u1d20\": 6,\n  \"\\u1d21\": 6,\n  \"\\u028f\": 6,\n  \"\\u1d22\": 6,\n  \"\\u0271\": 6,\n  \"\\u0273\": 7,\n  \"\\u0272\": 7,\n  \"\\u0288\": 4,\n  \"\\u0256\": 7,\n  \"\\u0261\": 6,\n  \"\\u02a1\": 6,\n  \"\\u0255\": 6,\n  \"\\u0291\": 6,\n  \"\\u0278\": 6,\n  \"\\u029d\": 6,\n  \"\\u02a2\": 6,\n  \"\\u027b\": 7,\n  \"\\u0281\": 6,\n  \"\\u0266\": 6,\n  \"\\u028b\": 6,\n  \"\\u0270\": 6,\n  \"\\u026c\": 5,\n  \"\\u026e\": 6,\n  \"\\u0298\": 6,\n  \"\\u01c0\": 2,\n  \"\\u01c3\": 2,\n  \"\\u01c2\": 6,\n  \"\\u01c1\": 4,\n  \"\\u0253\": 6,\n  \"\\u0257\": 7,\n  \"\\u1d91\": 7,\n  \"\\u0284\": 7,\n  \"\\u0260\": 7,\n  \"\\u029b\": 7,\n  \"\\u0267\": 6,\n  \"\\u026b\": 6,\n  \"\\u0268\": 4,\n  \"\\u0289\": 8,\n  \"\\u028a\": 6,\n  \"\\u0258\": 6,\n  \"\\u0275\": 6,\n  \"\\u0264\": 6,\n  \"\\u025c\": 6,\n  \"\\u025e\": 6,\n  \"\\u0251\": 6,\n  \"\\u0252\": 6,\n  \"\\u025a\": 8,\n  \"\\u025d\": 8,\n  \"\\u0181\": 8,\n  \"\\u0189\": 7,\n  \"\\u0191\": 7,\n  \"\\u01a9\": 6,\n  \"\\u01b2\": 6,\n  \"\\u10a0\": 6,\n  \"\\u10a1\": 8,\n  \"\\u10a2\": 8,\n  \"\\u10a3\": 6,\n  \"\\u10a4\": 6,\n  \"\\u10a5\": 8,\n  \"\\u10a6\": 8,\n  \"\\u10a7\": 8,\n  \"\\u10a8\": 6,\n  \"\\u10a9\": 6,\n  \"\\u10aa\": 8,\n  \"\\u10ab\": 7,\n  \"\\u10ac\": 6,\n  \"\\u10ad\": 8,\n  \"\\u10ae\": 8,\n  \"\\u10af\": 7,\n  \"\\u10b0\": 8,\n  \"\\u10b1\": 6,\n  \"\\u10b2\": 6,\n  \"\\u10b3\": 8,\n  \"\\u10b4\": 6,\n  \"\\u10b5\": 6,\n  \"\\u10b6\": 6,\n  \"\\u10b7\": 6,\n  \"\\u10b8\": 6,\n  \"\\u10b9\": 6,\n  \"\\u10ba\": 6,\n  \"\\u10bb\": 8,\n  \"\\u10bc\": 6,\n  \"\\u10bd\": 6,\n  \"\\u10be\": 6,\n  \"\\u10bf\": 6,\n  \"\\u10c0\": 8,\n  \"\\u10c1\": 6,\n  \"\\u10c2\": 6,\n  \"\\u10c3\": 6,\n  \"\\u10c4\": 6,\n  \"\\u10c5\": 8,\n  \"\\u10c7\": 6,\n  \"\\u10cd\": 6,\n  \"\\u10d0\": 6,\n  \"\\u10d1\": 6,\n  \"\\u10d2\": 6,\n  \"\\u10d3\": 6,\n  \"\\u10d4\": 6,\n  \"\\u10d5\": 6,\n  \"\\u10d6\": 6,\n  \"\\u10d7\": 6,\n  \"\\u10d8\": 6,\n  \"\\u10d9\": 6,\n  \"\\u10da\": 8,\n  \"\\u10db\": 6,\n  \"\\u10dc\": 6,\n  \"\\u10dd\": 6,\n  \"\\u10de\": 6,\n  \"\\u10df\": 6,\n  \"\\u10e0\": 6,\n  \"\\u10e1\": 6,\n  \"\\u10e2\": 6,\n  \"\\u10e3\": 6,\n  \"\\u10e4\": 6,\n  \"\\u10e5\": 6,\n  \"\\u10e6\": 6,\n  \"\\u10e7\": 6,\n  \"\\u10e8\": 6,\n  \"\\u10e9\": 6,\n  \"\\u10ea\": 6,\n  \"\\u10eb\": 6,\n  \"\\u10ec\": 6,\n  \"\\u10ed\": 6,\n  \"\\u10ee\": 6,\n  \"\\u10ef\": 5,\n  \"\\u10f0\": 6,\n  \"\\u10f1\": 7,\n  \"\\u10f2\": 6,\n  \"\\u10f3\": 6,\n  \"\\u10f4\": 6,\n  \"\\u10f5\": 6,\n  \"\\u10f6\": 6,\n  \"\\u10f7\": 6,\n  \"\\u10f8\": 6,\n  \"\\u10f9\": 6,\n  \"\\u10fa\": 6,\n  \"\\u10fb\": 4,\n  \"\\u10fc\": 4,\n  \"\\u10fd\": 6,\n  \"\\u10fe\": 6,\n  \"\\u10ff\": 6,\n  \"\\ufb4a\": 6,\n  \"\\ufb2b\": 6,\n  \"\\ufb4e\": 6,\n  \"\\ufb44\": 6,\n  \"\\ufb3b\": 5,\n  \"\\ufb1f\": 4,\n  \"\\ufb1d\": 2,\n  \"\\ufb4b\": 3,\n  \"\\ufb35\": 4,\n  \"\\ufb4c\": 6,\n  \"\\ufb31\": 6,\n  \"\\ua727\": 6,\n  \"\\ua726\": 6,\n  \"\\u027a\": 6,\n  \"\\u2c71\": 8,\n  \"\\u02a0\": 7,\n  \"\\u0297\": 6,\n  \"\\u0296\": 6,\n  \"\\u026d\": 3,\n  \"\\u0277\": 8,\n  \"\\u027f\": 6,\n  \"\\u0285\": 6,\n  \"\\u0286\": 7,\n  \"\\u0293\": 6,\n  \"\\u029a\": 6,\n  \"\\u20aa\": 8,\n  \"\\u20be\": 7,\n  \"\\u058a\": 6,\n  \"\\u2d00\": 6,\n  \"\\u2d01\": 7,\n  \"\\u2d02\": 7,\n  \"\\u2d03\": 6,\n  \"\\u2d04\": 6,\n  \"\\u2d05\": 6,\n  \"\\u2d06\": 7,\n  \"\\u2d21\": 6,\n  \"\\u2d07\": 6,\n  \"\\u2d08\": 6,\n  \"\\u2d09\": 6,\n  \"\\u2d0a\": 6,\n  \"\\u2d0b\": 6,\n  \"\\u2d0c\": 6,\n  \"\\u2d22\": 6,\n  \"\\u2d0d\": 6,\n  \"\\u2d0e\": 7,\n  \"\\u2d0f\": 7,\n  \"\\u2d10\": 6,\n  \"\\u2d11\": 6,\n  \"\\u2d12\": 6,\n  \"\\u2d23\": 6,\n  \"\\u2d13\": 6,\n  \"\\u2d14\": 6,\n  \"\\u2d15\": 6,\n  \"\\u2d16\": 6,\n  \"\\u2d17\": 6,\n  \"\\u2d18\": 6,\n  \"\\u2d19\": 6,\n  \"\\u2d1a\": 6,\n  \"\\u2d1b\": 6,\n  \"\\u2d1c\": 6,\n  \"\\u2d1d\": 7,\n  \"\\u2d1e\": 6,\n  \"\\u2d24\": 6,\n  \"\\u2d1f\": 6,\n  \"\\u2d20\": 6,\n  \"\\u2d25\": 6,\n  \"\\u215b\": 9,\n  \"\\u215c\": 9,\n  \"\\u215d\": 9,\n  \"\\u215e\": 9,\n  \"\\u2153\": 9,\n  \"\\u2154\": 9,\n  \"\\u2709\": 8,\n  \"\\u2602\": 8,\n  \"\\u2614\": 8,\n  \"\\u2604\": 8,\n  \"\\u26c4\": 7,\n  \"\\u2603\": 8,\n  \"\\u231b\": 8,\n  \"\\u231a\": 8,\n  \"\\u2690\": 8,\n  \"\\u270e\": 8,\n  \"\\u2763\": 6,\n  \"\\u2664\": 6,\n  \"\\u2667\": 6,\n  \"\\u2661\": 6,\n  \"\\u2662\": 6,\n  \"\\u26c8\": 9,\n  \"\\u2630\": 6,\n  \"\\u2631\": 6,\n  \"\\u2633\": 6,\n  \"\\u2634\": 6,\n  \"\\u2636\": 6,\n  \"\\u2637\": 6,\n  \"\\u2194\": 9,\n  \"\\u21d2\": 9,\n  \"\\u21cf\": 9,\n  \"\\u21d4\": 9,\n  \"\\u21f5\": 7,\n  \"\\u2200\": 8,\n  \"\\u2203\": 6,\n  \"\\u2204\": 6,\n  \"\\u2209\": 6,\n  \"\\u220b\": 6,\n  \"\\u220c\": 6,\n  \"\\u2282\": 6,\n  \"\\u2283\": 6,\n  \"\\u2284\": 6,\n  \"\\u2285\": 6,\n  \"\\u2227\": 6,\n  \"\\u2228\": 6,\n  \"\\u22bb\": 6,\n  \"\\u22bc\": 6,\n  \"\\u22bd\": 6,\n  \"\\u2225\": 4,\n  \"\\u2262\": 7,\n  \"\\u22c6\": 4,\n  \"\\u2211\": 6,\n  \"\\u22a4\": 6,\n  \"\\u22a5\": 6,\n  \"\\u22a2\": 6,\n  \"\\u22a8\": 6,\n  \"\\u2254\": 8,\n  \"\\u2201\": 5,\n  \"\\u2234\": 6,\n  \"\\u2235\": 6,\n  \"\\u221b\": 8,\n  \"\\u221c\": 8,\n  \"\\u2202\": 6,\n  \"\\u22c3\": 6,\n  \"\\u2286\": 6,\n  \"\\u2287\": 6,\n  \"\\u25a1\": 6,\n  \"\\u25b3\": 6,\n  \"\\u25b7\": 7,\n  \"\\u25bd\": 6,\n  \"\\u25c1\": 7,\n  \"\\u25c6\": 6,\n  \"\\u25c7\": 6,\n  \"\\u25cb\": 6,\n  \"\\u25ce\": 8,\n  \"\\u2606\": 8,\n  \"\\u2605\": 8,\n  \"\\u2718\": 7,\n  \"\\u2080\": 5,\n  \"\\u2081\": 4,\n  \"\\u2082\": 5,\n  \"\\u2083\": 5,\n  \"\\u2084\": 5,\n  \"\\u2085\": 5,\n  \"\\u2086\": 5,\n  \"\\u2087\": 5,\n  \"\\u2088\": 5,\n  \"\\u2089\": 5,\n  \"\\u208a\": 4,\n  \"\\u208b\": 4,\n  \"\\u208c\": 4,\n  \"\\u208d\": 3,\n  \"\\u208e\": 3,\n  \"\\u222b\": 6,\n  \"\\u222e\": 6,\n  \"\\u221d\": 7,\n  \"\\u2300\": 8,\n  \"\\u2302\": 8,\n  \"\\u2318\": 8,\n  \"\\u3012\": 6,\n  \"\\u027c\": 6,\n  \"\\u0184\": 7,\n  \"\\u0185\": 7,\n  \"\\u1e9f\": 6,\n  \"\\u023d\": 7,\n  \"\\u019a\": 4,\n  \"\\u019b\": 6,\n  \"\\u0220\": 6,\n  \"\\u019e\": 6,\n  \"\\u019f\": 6,\n  \"\\u01a7\": 6,\n  \"\\u01a8\": 6,\n  \"\\u01aa\": 6,\n  \"\\u01b8\": 6,\n  \"\\u01b9\": 6,\n  \"\\u01bb\": 6,\n  \"\\u01bc\": 6,\n  \"\\u01bd\": 6,\n  \"\\u01be\": 6,\n  \"\\u0221\": 8,\n  \"\\u0234\": 4,\n  \"\\u0235\": 8,\n  \"\\u0236\": 5,\n  \"\\u023a\": 6,\n  \"\\u2c65\": 7,\n  \"\\u023b\": 6,\n  \"\\u023c\": 6,\n  \"\\u0246\": 6,\n  \"\\u0247\": 7,\n  \"\\u023e\": 6,\n  \"\\u2c66\": 6,\n  \"\\u0241\": 6,\n  \"\\u0242\": 6,\n  \"\\u0243\": 7,\n  \"\\u0244\": 8,\n  \"\\u0248\": 7,\n  \"\\u0249\": 7,\n  \"\\u024a\": 7,\n  \"\\u024b\": 7,\n  \"\\u024c\": 7,\n  \"\\u024d\": 7,\n  \"\\u024e\": 8,\n  \"\\u024f\": 8,\n  \"\\u1e9c\": 5,\n  \"\\u1e9d\": 5,\n  \"\\u1efc\": 6,\n  \"\\u1efd\": 5,\n  \"\\u1efe\": 6,\n  \"\\u1eff\": 7,\n  \"\\ua7a8\": 7,\n  \"\\ua7a9\": 6,\n  \"\\ud800\\udf30\": 6,\n  \"\\ud800\\udf31\": 6,\n  \"\\ud800\\udf32\": 6,\n  \"\\ud800\\udf33\": 6,\n  \"\\ud800\\udf34\": 6,\n  \"\\ud800\\udf35\": 6,\n  \"\\ud800\\udf36\": 6,\n  \"\\ud800\\udf37\": 6,\n  \"\\ud800\\udf38\": 6,\n  \"\\ud800\\udf39\": 2,\n  \"\\ud800\\udf3a\": 6,\n  \"\\ud800\\udf3b\": 6,\n  \"\\ud800\\udf3c\": 6,\n  \"\\ud800\\udf3d\": 6,\n  \"\\ud800\\udf3e\": 6,\n  \"\\ud800\\udf3f\": 6,\n  \"\\ud800\\udf40\": 6,\n  \"\\ud800\\udf41\": 6,\n  \"\\ud800\\udf42\": 6,\n  \"\\ud800\\udf43\": 6,\n  \"\\ud800\\udf44\": 6,\n  \"\\ud800\\udf45\": 6,\n  \"\\ud800\\udf46\": 6,\n  \"\\ud800\\udf47\": 6,\n  \"\\ud800\\udf48\": 6,\n  \"\\ud800\\udf49\": 6,\n  \"\\ud800\\udf4a\": 6,\n  \"\\ud83c\\udf27\": 9,\n  \"\\ud83d\\udd25\": 7,\n  \"\\ud83c\\udf0a\": 9,\n  \"\\u2150\": 9,\n  \"\\u2151\": 9,\n  \"\\u2155\": 9,\n  \"\\u2156\": 9,\n  \"\\u2157\": 9,\n  \"\\u2159\": 8,\n  \"\\u215a\": 8,\n  \"\\u215f\": 7,\n  \"\\u2189\": 9,\n  \"\\ud83d\\udde1\": 9,\n  \"\\ud83c\\udff9\": 9,\n  \"\\ud83e\\ude93\": 7,\n  \"\\ud83d\\udd31\": 9,\n  \"\\ud83c\\udfa3\": 9,\n  \"\\ud83e\\uddea\": 8,\n  \"\\u2697\": 8,\n  \"\\u2bea\": 8,\n  \"\\u2beb\": 8,\n  \"\\u2c6d\": 6,\n  \"\\ud83d\\udee1\": 8,\n  \"\\u2702\": 8,\n  \"\\ud83c\\udf56\": 9,\n  \"\\ud83e\\udea3\": 8,\n  \"\\ud83d\\udd14\": 8,\n  \"\\u23f3\": 8,\n  \"\\u2691\": 8,\n  \"\\u20a0\": 6,\n  \"\\u20a1\": 6,\n  \"\\u20a2\": 6,\n  \"\\u20a3\": 7,\n  \"\\u20a4\": 6,\n  \"\\u20a5\": 6,\n  \"\\u20a6\": 8,\n  \"\\u20a9\": 8,\n  \"\\u20ab\": 7,\n  \"\\u20ad\": 7,\n  \"\\u20ae\": 6,\n  \"\\u20b0\": 6,\n  \"\\u20b1\": 8,\n  \"\\u20b2\": 6,\n  \"\\u20b3\": 8,\n  \"\\u20b5\": 6,\n  \"\\u20b6\": 6,\n  \"\\u20b7\": 8,\n  \"\\u20b8\": 6,\n  \"\\u20b9\": 6,\n  \"\\u20ba\": 7,\n  \"\\u20bb\": 8,\n  \"\\u20bc\": 6,\n  \"\\u20bf\": 6\n}\n"
  },
  {
    "path": "gm4_guidebook/assets/gm4/font/gm4_items.json",
    "content": "{\n    \"providers\": [\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/boots_of_ostara/boots_of_ostara_overlay.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u4101\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/boots_of_ostara/boots_of_ostara.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u4102\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/scuba_gear/flippers_overlay.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u4103\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/scuba_gear/flippers.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u4104\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/scuba_gear/scuba_helmet.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u4105\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/scuba_gear/scuba_tank.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u4106\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/heart_canisters/heart_canister_tier_1.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u4109\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/tunnel_bores/piston_minecart.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u4110\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/orb_of_ankou/orb_of_ankou_overlay.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u4111\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/orb_of_ankou/orb_of_ankou.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u4112\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/boots_of_ostara/boots_of_ostara_overlay.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u4201\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/boots_of_ostara/boots_of_ostara.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u4202\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/scuba_gear/flippers_overlay.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u4203\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/scuba_gear/flippers.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u4204\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/scuba_gear/scuba_helmet.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u4205\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/scuba_gear/scuba_tank.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u4206\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/heart_canisters/heart_canister_tier_1.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u4209\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/tunnel_bores/piston_minecart.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u4210\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/orb_of_ankou/orb_of_ankou_overlay.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u4211\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4:item/orb_of_ankou/orb_of_ankou.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u4212\"\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_guidebook/assets/gm4/font/guidebook.json",
    "content": "{\n   \"providers\": [\n      {\n         \"type\": \"space\",\n         \"advances\": {\n            \" \": 4,\n            \"\\u200c\": 0,\n            \"\\ue001\": -1,\n            \"\\ue002\": -2,\n            \"\\ue005\": -5,\n            \"\\ue007\": -7,\n            \"\\ue008\": -8,\n            \"\\ue010\": -10,\n            \"\\ue012\": -12,\n            \"\\ue014\": -14,\n            \"\\ue016\": -16,\n            \"\\ue018\": -18,\n            \"\\ue030\": -30,\n            \"\\ue148\": -161,\n            \"\\uf001\": 1,\n            \"\\uf003\": 3,\n            \"\\uf004\": 4,\n            \"\\uf008\": 8,\n            \"\\uf015\": 15,\n            \"\\uf016\": 16,\n            \"\\uf018\": 18,\n            \"\\uf019\": 19,\n            \"\\uf032\": 32,\n            \"\\uf037\": 37,\n            \"\\uf048\": 48,\n            \"\\uf110\": 110,\n            \"☒\": 10\n         }\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:font_magic/spacing_square.png\",\n         \"ascent\": -32768,\n         \"height\": -2,\n         \"chars\": [\n            \"\\uffff\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/shapeless.png\",\n         \"ascent\": 8,\n         \"height\": 10,\n         \"chars\": [\n            \"🔀\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/locked_page.png\",\n         \"ascent\": 24,\n         \"height\": 40,\n         \"chars\": [\n            \"?\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/toast.png\",\n         \"ascent\": 25,\n         \"height\": 32,\n         \"chars\": [\n            \"\\u9000\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/toast_icon.png\",\n         \"ascent\": 25,\n         \"height\": 32,\n         \"chars\": [\n            \"\\u9001\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/crafting_grid.png\",\n         \"ascent\": 7,\n         \"height\": 68,\n         \"chars\": [\n            \"\\u9002\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/crafting_grid.png\",\n         \"ascent\": -32768,\n         \"height\": -68,\n         \"chars\": [\n            \"\\u9003\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/page.png\",\n         \"ascent\": 55,\n         \"height\": 256,\n         \"chars\": [\n            \"\\u9004\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/page.png\",\n         \"ascent\": -32768,\n         \"height\": -256,\n         \"chars\": [\n            \"\\u9005\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/page_edge.png\",\n         \"ascent\": -32768,\n         \"height\": -256,\n         \"chars\": [\n            \"\\u9006\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/page_edge.png\",\n         \"ascent\": 55,\n         \"height\": 256,\n         \"chars\": [\n            \"\\u9007\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/page_intro.png\",\n         \"ascent\": 37,\n         \"height\": 256,\n         \"chars\": [\n            \"\\u9008\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/page_intro.png\",\n         \"ascent\": -32768,\n         \"height\": -256,\n         \"chars\": [\n            \"\\u9009\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/page_edge_intro.png\",\n         \"ascent\": -32768,\n         \"height\": -256,\n         \"chars\": [\n            \"\\u900a\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:gui/page_edge_intro.png\",\n         \"ascent\": 37,\n         \"height\": 256,\n         \"chars\": [\n            \"\\u900b\"\n         ]\n      },\n      {\n         \"type\": \"bitmap\",\n         \"file\": \"gm4_guidebook:font_magic/numbers.png\",\n         \"ascent\": 0,\n         \"height\": 8,\n         \"chars\": [\n            \"\\u0abf\\u0ac0\\u0ac1\\u0ac2\\u0ac3\\u0ac4\\u0ac5\\u0ac6\\u0ac7\\u0ac8\"\n         ]\n      }\n   ]\n}\n"
  },
  {
    "path": "gm4_guidebook/assets/gm4/font/vanilla_items.json",
    "content": "{\n    \"providers\": [\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/acacia_boat.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0903\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/acacia_door.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0904\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/acacia_sapling.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0905\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/acacia_sign.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0906\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/activator_rail.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0907\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/allium.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0908\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/amethyst_cluster.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0909\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/amethyst_shard.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u090a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/apple.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u090b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/armor_stand.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u090c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/arrow.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u090d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/axolotl_bucket.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u090e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/azure_bluet.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u090f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/baked_potato.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0910\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bamboo.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0911\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/barrier.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0912\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/beef.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0913\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/beetroot.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0914\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/beetroot_seeds.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0915\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/beetroot_soup.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0916\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bell.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0917\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/birch_boat.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0916\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/birch_door.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0919\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/birch_sapling.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u091a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/birch_sign.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u091b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/black_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u091c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/black_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u091d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/black_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u091e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/blaze_powder.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u091f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/blaze_rod.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0920\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/blue_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0921\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/blue_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0922\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/blue_orchid.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0923\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/blue_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0924\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bone.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0925\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bone_meal.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0926\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/book.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0927\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bow.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0928\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bowl.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0929\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/brain_coral.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u092a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/brain_coral_fan.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u092b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bread.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u092c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/brewing_stand.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u092d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/brick.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u092e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/elytra_broken.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u092f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/brown_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0930\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/brown_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0931\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/brown_mushroom.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0932\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/brown_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0933\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/bubble_coral.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0934\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/bubble_coral_fan.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0935\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bucket.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0936\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bundle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0937\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cake.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0939\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/campfire.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u093a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u093b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/carrot.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u093c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/carrot_on_a_stick.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u093d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cauldron.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u093e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_chain.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u093f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chainmail_boots.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0940\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chainmail_chestplate.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0941\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chainmail_helmet.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0942\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chainmail_leggings.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0943\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/charcoal.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0944\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chest_minecart.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0945\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chicken.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0946\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chorus_fruit.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0947\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/clay_ball.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0948\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/clock_00.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0949\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/coal.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u094a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/cobweb.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u094b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cocoa_beans.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u094c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cod.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u094d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cod_bucket.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u094e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/command_block_minecart.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u094f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/comparator.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0950\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/compass_16.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0951\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_beef.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0952\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_chicken.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0953\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_cod.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0954\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_mutton.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0955\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_porkchop.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0956\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_rabbit.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0957\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_salmon.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0958\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cookie.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0959\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/copper_ingot.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u095a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/cornflower.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u095b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/creeper_banner_pattern.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u095c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/crimson_door.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u095d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/crimson_fungus.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u095e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/crimson_roots.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u095f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/crimson_sign.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0960\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/crossbow_standby.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0961\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/crossbow_arrow.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0962\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/crossbow_firework.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0963\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cyan_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0964\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cyan_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0965\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/cyan_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0966\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dandelion.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0967\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/dark_oak_boat.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0968\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/dark_oak_door.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0969\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dark_oak_sapling.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u096a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/dark_oak_sign.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u096b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_brain_coral.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u096c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_brain_coral_fan.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u096d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_bubble_coral.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u096e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_bubble_coral_fan.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u096f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_bush.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0970\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_fire_coral.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0971\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_fire_coral_fan.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0972\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_horn_coral.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0973\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_horn_coral_fan.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0974\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_tube_coral.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0975\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_tube_coral_fan.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0976\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/detector_rail.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0977\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0978\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_axe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0979\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_boots.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u097a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_chestplate.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u097b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_helmet.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u097c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_hoe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u097d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_horse_armor.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u097e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_leggings.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u097f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_pickaxe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0980\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_shovel.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0981\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_sword.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0982\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/dragon_breath.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0983\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/dried_kelp.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0984\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/egg.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0985\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/elytra.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0986\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/emerald.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0987\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/enchanted_book.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0988\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/end_crystal.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0989\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/ender_eye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u098a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/ender_pearl.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u098b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/experience_bottle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u098c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/feather.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u098d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/fermented_spider_eye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u098e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/fern.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u098f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/filled_map.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0990\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/filled_map_markings.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0991\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/fire_charge.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0992\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/fire_coral.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0993\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/fire_coral_fan.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0994\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/firework_rocket.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0995\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/firework_star.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0996\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/firework_star_overlay.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0997\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/fishing_rod.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0998\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/flint.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0999\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/flint_and_steel.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u099a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/flower_banner_pattern.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u099b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/flower_pot.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u099c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/furnace_minecart.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u099d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/ghast_tear.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u099e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/glass_bottle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u099f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09a0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/glistering_melon_slice.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09a1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/globe_banner_pattern.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09a2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/glow_berries.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09a3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/glow_ink_sac.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09a4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/glow_item_frame.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09a5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/glow_lichen.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09a6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/glowstone_dust.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09a7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/gold_ingot.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09a8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/gold_nugget.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09a9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_apple.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09aa\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_axe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09ab\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_boots.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09ac\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_carrot.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09ad\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_chestplate.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09ae\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_helmet.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09af\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_hoe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09b0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_horse_armor.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09b1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_leggings.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09b2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_pickaxe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09b3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_shovel.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09b4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_sword.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09b5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/gray_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09b7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/gray_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09b8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/gray_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09b9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/green_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09ba\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/green_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09bb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/green_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09bc\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/gunpowder.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09bd\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/hanging_roots.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09be\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/heart_of_the_sea.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09bf\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/honey_bottle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09c0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/honeycomb.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09c1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/hopper.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09c2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/hopper_minecart.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09c3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/horn_coral.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09c4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/horn_coral_fan.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09c5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/ink_sac.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09c6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_axe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09c7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/iron_bars.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09c8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_boots.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09c9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_chestplate.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09ca\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_door.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09cb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_helmet.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09cc\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_hoe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09cd\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_horse_armor.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09ce\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_ingot.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09cf\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_leggings.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09d0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_nugget.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09d1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_pickaxe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09d2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_shovel.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09d3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_sword.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09d4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/item_frame.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09d5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/jungle_boat.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09d6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/jungle_door.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09d7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/jungle_sapling.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09d8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/jungle_sign.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09d9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/kelp.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09da\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/knowledge_book.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09db\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/ladder.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09dc\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lantern.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09dd\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lapis_lazuli.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09de\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/large_amethyst_bud.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09df\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/large_fern_top.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09e0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lava_bucket.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09e1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lead.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09e2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09e3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_boots.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09e4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_boots_overlay.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09e5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_chestplate.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09e6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_chestplate_overlay.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09e7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_helmet.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09e8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_helmet_overlay.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09e9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_horse_armor.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09ea\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_leggings.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09eb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_leggings_overlay.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09ec\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/lever.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09ed\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09ee\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_00.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09ef\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_01.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09f0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_02.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09f1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_03.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09f2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_04.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09f3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_05.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09f4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_06.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09f5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_07.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09f6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_08.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09f7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_09.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09f8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_10.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09f9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_11.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09fa\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_12.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09fb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_13.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09fc\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_14.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09fd\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_15.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09fe\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_blue_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u09ff\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_blue_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a00\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/light_blue_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a01\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_gray_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a02\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_gray_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a03\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/light_gray_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a04\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/lilac_top.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a05\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/lily_of_the_valley.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a06\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/lily_pad.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a07\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lime_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a08\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lime_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a09\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/lime_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a0a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lingering_potion.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a0b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/magenta_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a0c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/magenta_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a0d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/magenta_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a0e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/magma_cream.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a0f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/map.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a10\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/medium_amethyst_bud.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a11\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/melon_seeds.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a12\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/melon_slice.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a13\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/milk_bucket.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a14\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/minecart.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a15\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/mojang_banner_pattern.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a16\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/mushroom_stew.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a17\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_11.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a16\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_13.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a19\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_blocks.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a1a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_cat.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a1b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_chirp.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a1c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_far.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a1d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_mall.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a1e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_mellohi.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a1f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_pigstep.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a20\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_stal.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a21\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_strad.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a22\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_wait.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a23\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_ward.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a24\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/mutton.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a25\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/name_tag.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a26\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/nautilus_shell.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a27\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/nether_brick.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a28\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/nether_sprouts.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a29\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/nether_star.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a2a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/nether_wart.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a2b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_axe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a2c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_boots.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a2d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_chestplate.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a2e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_helmet.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a2f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_hoe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a30\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_ingot.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a31\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_leggings.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a32\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_pickaxe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a33\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_scrap.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a34\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_shovel.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a35\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_sword.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a36\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/oak_boat.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a37\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/oak_door.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a38\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/oak_sapling.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a39\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/oak_sign.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a3a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/orange_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a3b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/orange_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a3c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/orange_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a3d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/orange_tulip.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a3e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/oxeye_daisy.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a3f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/painting.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a40\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/paper.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a41\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/peony_top.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a42\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/phantom_membrane.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a43\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/piglin_banner_pattern.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a44\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pink_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a45\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pink_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a46\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/pink_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a47\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/pink_tulip.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a48\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pointed_dripstone.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a49\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/poisonous_potato.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a4a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/popped_chorus_fruit.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a4b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/poppy.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a4c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/porkchop.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a4d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/potato.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a4e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/potion.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a4f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/potion_overlay.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a50\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/powder_snow_bucket.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a51\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/powered_rail.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a52\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/prismarine_crystals.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a53\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/prismarine_shard.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a54\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pufferfish.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a55\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pufferfish_bucket.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a56\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pumpkin_pie.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a57\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pumpkin_seeds.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a58\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/purple_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a59\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/purple_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a5a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/purple_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a5b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/quartz.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a5c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/rabbit.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a5d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/rabbit_foot.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a5e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/rabbit_hide.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a5f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/rabbit_stew.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a60\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/rail.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a61\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/raw_copper.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a62\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/raw_gold.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a63\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/raw_iron.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a64\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/red_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a65\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/red_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a66\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/red_mushroom.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a67\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/red_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a68\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/red_tulip.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a69\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/redstone.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a6a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/redstone_torch.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a6b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/repeater.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a6c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/rose_bush_top.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a6d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/rotten_flesh.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a6e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/saddle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a6f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/salmon.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a70\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/salmon_bucket.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a71\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/turtle_scute.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a72\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/sea_pickle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a73\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/seagrass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a74\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/shears.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a75\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/shulker_shell.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a76\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/skull_banner_pattern.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a77\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/slime_ball.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a78\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/small_amethyst_bud.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a79\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/snowball.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a7a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/soul_campfire.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a7b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/soul_lantern.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a7c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/soul_torch.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a7d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/spectral_arrow.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a80\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/spider_eye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a81\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/splash_potion.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a82\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/spruce_boat.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a83\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/spruce_door.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a84\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/spruce_sapling.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a85\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/spruce_sign.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a86\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/spyglass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a87\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/stick.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a88\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/stone_axe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a89\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/stone_hoe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a8a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/stone_pickaxe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a8b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/stone_shovel.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a8c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/stone_sword.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a8d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/string.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a8e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/structure_void.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a8f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/sugar.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a90\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/sugar_cane.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a91\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/sunflower_front.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a92\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/suspicious_stew.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a93\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/sweet_berries.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a94\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/tall_grass_top.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a95\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/tipped_arrow_base.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a96\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/tipped_arrow_base.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a97\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/tipped_arrow_head.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a98\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/tnt_minecart.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a99\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/torch.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a9a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/totem_of_undying.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a9b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/trident.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a9c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/tripwire_hook.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a9d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/tropical_fish.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a9e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/tropical_fish_bucket.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0a9f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/tube_coral.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aa0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/tube_coral_fan.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aa1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/turtle_egg.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aa2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/turtle_helmet.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aa3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/twisting_vines_plant.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aa4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/vine.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aa5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/warped_door.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aa6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/warped_fungus.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aa7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/warped_fungus_on_a_stick.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aa8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/warped_roots.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aa9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/warped_sign.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aaa\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/water_bucket.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aab\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/weeping_vines_plant.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aac\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wheat.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aad\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wheat_seeds.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aae\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/white_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aaf\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/white_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0ab0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/white_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0ab1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/white_tulip.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0ab2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/wither_rose.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0ab3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wooden_axe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0ab4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wooden_hoe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0ab5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wooden_pickaxe.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0ab6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wooden_shovel.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0ab7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wooden_sword.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0ab8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/writable_book.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0ab9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/written_book.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0aba\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/yellow_candle.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0abb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/yellow_dye.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0abc\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/yellow_stained_glass.png\",\n            \"ascent\": -32768,\n            \"height\": -16,\n            \"chars\": [\n                \"\\u0abd\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"gm4_guidebook:font_magic/block_sheet.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ad7\\u0ad8\\u0ad9\\u0ada\\u0adb\\u0adc\\u0add\\u0ade\\u0adf\\u0ae0\\u0ae1\\u0ae2\\u0ae3\\u0ae4\\u0ae5\\u0ae6\\u0ae7\\u0ae8\\u0ae9\\u0aea\\u0aeb\\u0aec\\u0aed\\u0aee\\u0aef\\u0af0\\u0af1\",\n                \"\\u0af2\\u0af3\\u0af4\\u0af5\\u0af6\\u0af7\\u0af8\\u0af9\\u0afa\\u0afb\\u0afc\\u0afd\\u0afe\\u0aff\\u0b00\\u0b01\\u0b02\\u0b03\\u0b04\\u0b05\\u0b06\\u0b07\\u0b08\\u0b09\\u0b0a\\u0b0b\\u0b0c\",\n                \"\\u0b0d\\u0b0e\\u0b0f\\u0b10\\u0b11\\u0b12\\u0b13\\u0b14\\u0b15\\u0b16\\u0b17\\u0b18\\u0b19\\u0b1a\\u0b1b\\u0b1c\\u0b1d\\u0b1e\\u0b1f\\u0b20\\u0b21\\u0b22\\u0b23\\u0b24\\u0b25\\u0b26\\u0b27\",\n                \"\\u0b28\\u0b29\\u0b2a\\u0b2b\\u0b2c\\u0b2d\\u0b2e\\u0b2f\\u0b30\\u0b31\\u0b32\\u0b33\\u0b34\\u0b35\\u0b36\\u0b37\\u0b38\\u0b39\\u0b3a\\u0b3b\\u0b3c\\u0b3d\\u0b3e\\u0b3f\\u0b40\\u0b41\\u0b42\",\n                \"\\u0b43\\u0b44\\u0b45\\u0b46\\u0b47\\u0b48\\u0b49\\u0b4a\\u0b4b\\u0b4c\\u0b4d\\u0b4e\\u0b4f\\u0b50\\u0b51\\u0b52\\u0b53\\u0b54\\u0b55\\u0b56\\u0b57\\u0b58\\u0b59\\u0b5a\\u0b5b\\u0b5c\\u0b5d\",\n                \"\\u0b5e\\u0b5f\\u0b60\\u0b61\\u0b62\\u0b63\\u0b64\\u0b65\\u0b66\\u0b67\\u0b68\\u0b69\\u0b6a\\u0b6b\\u0b6c\\u0b6d\\u0b6e\\u0b6f\\u0b70\\u0b71\\u0b72\\u0b73\\u0b74\\u0b75\\u0b76\\u0b77\\u0b78\",\n                \"\\u0b79\\u0b7a\\u0b7b\\u0b7c\\u0b7d\\u0b7e\\u0b7f\\u0b80\\u0b81\\u0b82\\u0b83\\u0b84\\u0b85\\u0b86\\u0b87\\u0b88\\u0b89\\u0b8a\\u0b8b\\u0b8c\\u0b8d\\u0b8e\\u0b8f\\u0b90\\u0b91\\u0b92\\u0b93\",\n                \"\\u0b94\\u0b95\\u0b96\\u0b97\\u0b98\\u0b99\\u0b9a\\u0b9b\\u0b9c\\u0b9d\\u0b9e\\u0b9f\\u0ba0\\u0ba1\\u0ba2\\u0ba3\\u0ba4\\u0ba5\\u0ba6\\u0ba7\\u0ba8\\u0ba9\\u0baa\\u0bab\\u0bac\\u0bad\\u0bae\",\n                \"\\u0baf\\u0bb0\\u0bb1\\u0bb2\\u0bb3\\u0bb4\\u0bb5\\u0bb6\\u0bb7\\u0bb8\\u0bb9\\u0bba\\u0bbb\\u0bbc\\u0bbd\\u0bbe\\u0bbf\\u0bc0\\u0bc1\\u0bc2\\u0bc3\\u0bc4\\u0bc5\\u0bc6\\u0bc7\\u0bc8\\u0bc9\",\n                \"\\u0bca\\u0bcb\\u0bcc\\u0bcd\\u0bce\\u0bcf\\u0bd0\\u0bd1\\u0bd2\\u0bd3\\u0bd4\\u0bd5\\u0bd6\\u0bd7\\u0bd8\\u0bd9\\u0bda\\u0bdb\\u0bdc\\u0bdd\\u0bde\\u0bdf\\u0be0\\u0be1\\u0be2\\u0be3\\u0be4\",\n                \"\\u0be5\\u0be6\\u0be7\\u0be8\\u0be9\\u0bea\\u0beb\\u0bec\\u0bed\\u0bee\\u0bef\\u0bf0\\u0bf1\\u0bf2\\u0bf3\\u0bf4\\u0bf5\\u0bf6\\u0bf7\\u0bf8\\u0bf9\\u0bfa\\u0bfb\\u0bfc\\u0bfd\\u0bfe\\u0bff\",\n                \"\\u0c00\\u0c01\\u0c02\\u0c03\\u0c04\\u0c05\\u0c06\\u0c07\\u0c08\\u0c09\\u0c0a\\u0c0b\\u0c0c\\u0c0d\\u0c0e\\u0c0f\\u0c10\\u0c11\\u0c12\\u0c13\\u0c14\\u0c15\\u0c16\\u0c17\\u0c18\\u0c19\\u0c1a\",\n                \"\\u0c1b\\u0c1c\\u0c1d\\u0c1e\\u0c1f\\u0c20\\u0c21\\u0c22\\u0c23\\u0c24\\u0c25\\u0c26\\u0c27\\u0c28\\u0c29\\u0c2a\\u0c2b\\u0c2c\\u0c2d\\u0c2e\\u0c2f\\u0c30\\u0c31\\u0c32\\u0c33\\u0c34\\u0c35\",\n                \"\\u0c36\\u0c37\\u0c38\\u0c39\\u0c3a\\u0c3b\\u0c3c\\u0c3d\\u0c3e\\u0c3f\\u0c40\\u0c41\\u0c42\\u0c43\\u0c44\\u0c45\\u0c46\\u0c47\\u0c48\\u0c49\\u0c4a\\u0c4b\\u0c4c\\u0c4d\\u0c4e\\u0c4f\\u0c50\",\n                \"\\u0c51\\u0c52\\u0c53\\u0c54\\u0c55\\u0c56\\u0c57\\u0c58\\u0c59\\u0c5a\\u0c5b\\u0c5c\\u0c5d\\u0c5e\\u0c5f\\u0c60\\u0c61\\u0c62\\u0c63\\u0c64\\u0c65\\u0c66\\u0c67\\u0c68\\u0c69\\u0c6a\\u0c6b\",\n                \"\\u0c6c\\u0c6d\\u0c6e\\u0c6f\\u0c70\\u0c71\\u0c72\\u0c73\\u0c74\\u0c75\\u0c76\\u0c77\\u0c78\\u0c79\\u0c7a\\u0c7b\\u0c7c\\u0c7d\\u0c7e\\u0c7f\\u0c80\\u0c81\\u0c82\\u0c83\\u0c84\\u0c85\\u0c86\",\n                \"\\u0c87\\u0c88\\u0c89\\u0c8a\\u0c8b\\u0c8c\\u0c8d\\u0c8e\\u0c8f\\u0c90\\u0c91\\u0c92\\u0c93\\u0c94\\u0c95\\u0c96\\u0c97\\u0c98\\u0c99\\u0c9a\\u0c9b\\u0c9c\\u0c9d\\u0c9e\\u0c9f\\u0ca0\\u0ca1\",\n                \"\\u0ca2\\u0ca3\\u0ca4\\u0ca5\\u0ca6\\u0ca7\\u0ca8\\u0ca9\\u0caa\\u0cab\\u0cac\\u0cad\\u0cae\\u0caf\\u0cb0\\u0cb1\\u0cb2\\u0cb3\\u0cb4\\u0cb5\\u0cb6\\u0cb7\\u0cb8\\u0cb9\\u0cba\\u0cbb\\u0cbc\",\n                \"\\u0cbd\\u0cbe\\u0cbf\\u0cc0\\u0cc1\\u0cc2\\u0cc3\\u0cc4\\u0cc5\\u0cc6\\u0cc7\\u0cc8\\u0cc9\\u0cca\\u0ccb\\u0ccc\\u0ccd\\u0cce\\u0ccf\\u0cd0\\u0cd1\\u0cd2\\u0cd3\\u0cd4\\u0cd5\\u0cd6\\u0cd7\",\n                \"\\u0cd8\\u0cd9\\u0cda\\u0cdb\\u0cdc\\u0cdd\\u0cde\\u0cdf\\u0ce0\\u0ce1\\u0ce2\\u0ce3\\u0ce4\\u0ce5\\u0ce6\\u0ce7\\u0ce8\\u0ce9\\u0cea\\u0ceb\\u0cec\\u0ced\\u0cee\\u0cef\\u0cf0\\u0cf1\\u0cf2\",\n                \"\\u0cf3\\u0cf4\\u0cf5\\u0cf6\\u0cf7\\u0cf8\\u0cf9\\u0cfa\\u0cfb\\u0cfc\\u0cfd\\u0cfe\\u0cff\\u0d00\\u0d01\\u0d02\\u0d03\\u0d04\\u0d05\\u0d06\\u0d07\\u0d08\\u0d09\\u0d0a\\u0d0b\\u0d0c\\u0d0d\",\n                \"\\u0d0e\\u0d0f\\u0d10\\u0d11\\u0d12\\u0d13\\u0d14\\u0d15\\u0d16\\u0d17\\u0d18\\u0d19\\u0d1a\\u0d1b\\u0d1c\\u0d1d\\u0d1e\\u0d1f\\u0d20\\u0d21\\u0d22\\u0d23\\u0d24\\u0d25\\u0d26\\u0d27\\u0d28\",\n                \"\\u0d29\\u0d2a\\u0d2b\\u0d2c\\u0d2d\\u0d2e\\u0d2f\\u0d30\\u0d31\\u0d32\\u0d33\\u0d34\\u0d35\\u0d36\\u0d37\\u0d38\\u0d39\\u0d3a\\u0d3b\\u0d3c\\u0d3d\\u0d3e\\u0d3f\\u0d40\\u0d41\\u0d42\\u0d43\",\n                \"\\u0d44\\u0d45\\u0d46\\u0d47\\u0d48\\u0d49\\u0d4a\\u0d4b\\u0d4c\\u0d4d\\u0d4e\\u0d4f\\u0d50\\u0d51\\u0d52\\u0d53\\u0d54\\u0d55\\u0d56\\u0d57\\u0d58\\u0d59\\u0d5a\\u0d5b\\u0d5c\\u0d5d\\u0d5e\",\n                \"\\u0d5f\\u0d60\\u0d61\\u0d62\\u0d63\\u0d64\\u0d65\\u0d66\\u0d67\\u0d68\\u0d69\\u0d6a\\u0d6b\\u0d6c\\u0d6d\\u0d6e\\u0d6f\\u0d70\\u0d71\\u0d72\\u0d73\\u0d74\\u0d75\\u0d76\\u0d77\\u0d78\\u0d79\",\n                \"\\u0d7a\\u0d7b\\u0d7c\\u0d7d\\u0d7e\\u0d7f\\u0d80\\u0d81\\u0d82\\u0d83\\u0d84\\u0d85\\u0d86\\u0d87\\u0d88\\u0d89\\u0d8a\\u0d8b\\u0d8c\\u0d8d\\u0d8e\\u0d8f\\u0d90\\u0d91\\u0000\\u0000\\u0000\",\n                \"\\u4001\\u4002\\u4003\\u4004\\u4005\\u4006\\u4007\\u4008\\u4009\\u4010\\u4011\\u4012\\u4013\\u4014\\u4015\\u4016\\u4017\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/acacia_boat.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d92\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/acacia_door.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d93\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/acacia_sapling.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d94\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/acacia_sign.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d95\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/activator_rail.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d96\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/allium.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d97\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/amethyst_cluster.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d98\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/amethyst_shard.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d99\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/apple.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d9a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/armor_stand.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d9b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/arrow.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d9c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/axolotl_bucket.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d9d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/azure_bluet.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d9e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/baked_potato.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0d9f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bamboo.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0da0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/barrier.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0da1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/beef.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0da2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/beetroot.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0da3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/beetroot_seeds.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0da4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/beetroot_soup.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0da5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bell.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0da6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/birch_boat.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0da7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/birch_door.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0da8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/birch_sapling.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0da9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/birch_sign.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0daa\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/black_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dab\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/black_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dac\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/black_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dad\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/blaze_powder.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dae\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/blaze_rod.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0daf\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/blue_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0db0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/blue_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0db1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/blue_orchid.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0db2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/blue_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0db3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bone.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0db4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bone_meal.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0db5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/book.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0db6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bow.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0db7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bowl.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0db8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/brain_coral.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0db9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/brain_coral_fan.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dba\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bread.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dbb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/brewing_stand.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dbc\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/brick.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dbd\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/elytra_broken.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dbe\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/brown_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dbf\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/brown_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dc0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/brown_mushroom.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dc1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/brown_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dc2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/bubble_coral.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dc3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/bubble_coral_fan.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dc4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bucket.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dc5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/bundle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dc6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cake.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dc8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/campfire.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dc9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dca\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/carrot.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dcb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/carrot_on_a_stick.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dcc\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cauldron.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dcd\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_chain.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dce\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chainmail_boots.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dcf\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chainmail_chestplate.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dd0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chainmail_helmet.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dd1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chainmail_leggings.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dd2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/charcoal.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dd3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chest_minecart.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dd4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chicken.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dd5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/chorus_fruit.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dd6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/clay_ball.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dd7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/clock_00.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dd8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/coal.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dd9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/cobweb.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dda\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cocoa_beans.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ddb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cod.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ddc\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cod_bucket.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ddd\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/command_block_minecart.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dde\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/comparator.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ddf\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/compass_16.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0de0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_beef.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0de1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_chicken.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0de2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_cod.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0de3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_mutton.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0de4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_porkchop.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0de5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_rabbit.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0de6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cooked_salmon.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0de7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cookie.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0de8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/copper_ingot.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0de9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/cornflower.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dea\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/creeper_banner_pattern.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0deb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/crimson_door.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dec\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/crimson_fungus.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ded\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/crimson_roots.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dee\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/crimson_sign.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0def\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/crossbow_standby.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0df0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/crossbow_arrow.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0df1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/crossbow_firework.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0df2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cyan_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0df3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/cyan_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0df4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/cyan_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0df5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dandelion.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0df6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/dark_oak_boat.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0df7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/dark_oak_door.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0df8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dark_oak_sapling.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0df9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/dark_oak_sign.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dfa\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_brain_coral.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dfb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_brain_coral_fan.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dfc\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_bubble_coral.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dfd\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_bubble_coral_fan.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dfe\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_bush.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0dff\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_fire_coral.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e00\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_fire_coral_fan.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e01\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_horn_coral.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e02\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_horn_coral_fan.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e03\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_tube_coral.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e04\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/dead_tube_coral_fan.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e05\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/detector_rail.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e06\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e07\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_axe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e08\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_boots.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e09\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_chestplate.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e0a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_helmet.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e0b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_hoe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e0c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_horse_armor.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e0d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_leggings.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e0e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_pickaxe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e0f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_shovel.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e10\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/diamond_sword.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e11\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/dragon_breath.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e12\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/dried_kelp.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e13\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/egg.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e14\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/elytra.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e15\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/emerald.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e16\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/enchanted_book.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e17\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/end_crystal.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e16\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/ender_eye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e19\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/ender_pearl.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e1a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/experience_bottle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e1b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/feather.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e1c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/fermented_spider_eye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e1d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/fern.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e1e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/filled_map.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e1f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/filled_map_markings.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e20\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/fire_charge.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e21\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/fire_coral.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e22\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/fire_coral_fan.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e23\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/firework_rocket.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e24\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/firework_star.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e25\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/firework_star_overlay.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e26\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/fishing_rod.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e27\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/flint.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e28\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/flint_and_steel.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e29\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/flower_banner_pattern.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e2a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/flower_pot.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e2b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/furnace_minecart.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e2c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/ghast_tear.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e2d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/glass_bottle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e2e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e2f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/glistering_melon_slice.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e30\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/globe_banner_pattern.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e31\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/glow_berries.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e32\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/glow_ink_sac.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e33\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/glow_item_frame.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e34\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/glow_lichen.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e35\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/glowstone_dust.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e36\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/gold_ingot.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e37\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/gold_nugget.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e38\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_apple.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e39\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_axe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e3a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_boots.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e3b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_carrot.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e3c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_chestplate.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e3d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_helmet.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e3e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_hoe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e3f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_horse_armor.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e40\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_leggings.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e41\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_pickaxe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e42\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_shovel.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e43\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/golden_sword.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e44\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/gray_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e46\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/gray_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e47\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/gray_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e48\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/green_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e49\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/green_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e4a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/green_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e4b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/gunpowder.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e4c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/hanging_roots.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e4d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/heart_of_the_sea.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e4e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/honey_bottle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e4f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/honeycomb.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e50\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/hopper.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e51\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/hopper_minecart.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e52\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/horn_coral.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e53\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/horn_coral_fan.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e54\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/ink_sac.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e55\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_axe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e56\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/iron_bars.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e57\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_boots.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e58\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_chestplate.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e59\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_door.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e5a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_helmet.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e5b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_hoe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e5c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_horse_armor.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e5d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_ingot.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e5e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_leggings.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e5f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_nugget.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e60\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_pickaxe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e61\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_shovel.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e62\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/iron_sword.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e63\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/item_frame.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e64\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/jungle_boat.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e65\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/jungle_door.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e66\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/jungle_sapling.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e67\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/jungle_sign.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e68\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/kelp.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e69\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/knowledge_book.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e6a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/ladder.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e6b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lantern.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e6c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lapis_lazuli.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e6d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/large_amethyst_bud.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e6e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/large_fern_top.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e6f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lava_bucket.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e70\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lead.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e71\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e72\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_boots.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e73\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_boots_overlay.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e74\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_chestplate.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e75\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_chestplate_overlay.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e76\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_helmet.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e77\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_helmet_overlay.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e78\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_horse_armor.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e79\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_leggings.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e7a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/leather_leggings_overlay.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e7b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/lever.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e7c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e7d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_00.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e7e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_01.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e7f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_02.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e80\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_03.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e81\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_04.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e82\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_05.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e83\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_06.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e84\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_07.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e85\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_08.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e86\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_09.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e87\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_10.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e88\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_11.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e89\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_12.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e8a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_13.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e8b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_14.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e8c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_15.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e8d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_blue_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e8e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_blue_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e8f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/light_blue_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e90\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_gray_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e91\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/light_gray_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e92\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/light_gray_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e93\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/lilac_top.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e94\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/lily_of_the_valley.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e95\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/lily_pad.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e96\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lime_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e97\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lime_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e98\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/lime_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e99\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/lingering_potion.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e9a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/magenta_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e9b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/magenta_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e9c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/magenta_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e9d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/magma_cream.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e9e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/map.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0e9f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/medium_amethyst_bud.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ea0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/melon_seeds.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ea1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/melon_slice.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ea2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/milk_bucket.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ea3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/minecart.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ea4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/mojang_banner_pattern.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ea5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/mushroom_stew.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ea6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_11.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ea7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_13.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ea8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_blocks.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ea9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_cat.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eaa\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_chirp.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eab\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_far.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eac\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_mall.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ead\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_mellohi.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eae\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_pigstep.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eaf\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_stal.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eb0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_strad.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eb1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_wait.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eb2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/music_disc_ward.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eb3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/mutton.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eb4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/name_tag.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eb5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/nautilus_shell.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eb6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/nether_brick.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eb7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/nether_sprouts.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eb8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/nether_star.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eb9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/nether_wart.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eba\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_axe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ebb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_boots.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ebc\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_chestplate.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ebd\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_helmet.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ebe\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_hoe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ebf\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_ingot.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ec0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_leggings.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ec1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_pickaxe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ec2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_scrap.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ec3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_shovel.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ec4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/netherite_sword.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ec5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/oak_boat.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ec6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/oak_door.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ec7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/oak_sapling.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ec8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/oak_sign.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ec9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/orange_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eca\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/orange_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ecb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/orange_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ecc\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/orange_tulip.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ecd\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/oxeye_daisy.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ece\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/painting.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ecf\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/paper.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ed0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/peony_top.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ed1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/phantom_membrane.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ed2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/piglin_banner_pattern.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ed3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pink_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ed4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pink_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ed5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/pink_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ed6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/pink_tulip.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ed7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pointed_dripstone.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ed8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/poisonous_potato.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ed9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/popped_chorus_fruit.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eda\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/poppy.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0edb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/porkchop.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0edc\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/potato.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0edd\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/potion.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ede\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/potion_overlay.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0edf\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/powder_snow_bucket.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ee0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/powered_rail.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ee1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/prismarine_crystals.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ee2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/prismarine_shard.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ee3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pufferfish.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ee4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pufferfish_bucket.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ee5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pumpkin_pie.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ee6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/pumpkin_seeds.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ee7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/purple_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ee8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/purple_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ee9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/purple_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eea\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/quartz.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eeb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/rabbit.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eec\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/rabbit_foot.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eed\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/rabbit_hide.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eee\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/rabbit_stew.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eef\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/rail.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ef0\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/raw_copper.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ef1\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/raw_gold.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ef2\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/raw_iron.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ef3\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/red_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ef4\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/red_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ef5\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/red_mushroom.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ef6\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/red_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ef7\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/red_tulip.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ef8\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/redstone.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0ef9\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/redstone_torch.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0efa\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/repeater.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0efb\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/rose_bush_top.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0efc\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/rotten_flesh.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0efd\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/saddle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0efe\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/salmon.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0eff\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/salmon_bucket.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f00\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/turtle_scute.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f01\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/sea_pickle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f02\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/seagrass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f03\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/shears.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f04\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/shulker_shell.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f05\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/skull_banner_pattern.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f06\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/slime_ball.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f07\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/small_amethyst_bud.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f08\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/snowball.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f09\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/soul_campfire.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f0a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/soul_lantern.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f0b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/soul_torch.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f0c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/spectral_arrow.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f0f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/spider_eye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f10\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/splash_potion.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f11\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/spruce_boat.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f12\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/spruce_door.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f13\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/spruce_sapling.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f14\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/spruce_sign.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f15\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/spyglass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f16\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/stick.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f17\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/stone_axe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f16\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/stone_hoe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f19\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/stone_pickaxe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f1a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/stone_shovel.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f1b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/stone_sword.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f1c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/string.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f1d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/structure_void.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f1e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/sugar.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f1f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/sugar_cane.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f20\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/sunflower_front.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f21\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/suspicious_stew.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f22\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/sweet_berries.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f23\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/tall_grass_top.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f24\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/tipped_arrow_base.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f25\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/tipped_arrow_base.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f26\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/tipped_arrow_head.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f27\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/tnt_minecart.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f28\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/torch.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f29\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/totem_of_undying.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f2a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/trident.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f2b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/tripwire_hook.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f2c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/tropical_fish.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f2d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/tropical_fish_bucket.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f2e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/tube_coral.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f2f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/tube_coral_fan.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f30\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/turtle_egg.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f31\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/turtle_helmet.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f32\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/twisting_vines_plant.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f33\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/vine.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f34\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/warped_door.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f35\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/warped_fungus.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f36\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/warped_fungus_on_a_stick.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f37\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/warped_roots.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f38\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/warped_sign.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f39\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/water_bucket.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f3a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/weeping_vines_plant.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f3b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wheat.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f3c\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wheat_seeds.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f3d\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/white_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f3e\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/white_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f3f\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/white_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f40\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/white_tulip.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f41\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/wither_rose.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f42\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wooden_axe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f43\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wooden_hoe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f44\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wooden_pickaxe.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f45\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wooden_shovel.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f46\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/wooden_sword.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f47\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/writable_book.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f48\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/written_book.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f49\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/yellow_candle.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f4a\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:item/yellow_dye.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f4b\"\n            ]\n        },\n        {\n            \"type\": \"bitmap\",\n            \"file\": \"minecraft:block/yellow_stained_glass.png\",\n            \"ascent\": 8,\n            \"height\": 16,\n            \"chars\": [\n                \"\\u0f4c\"\n            ]\n        }\n        \n    ]\n}\n"
  },
  {
    "path": "gm4_guidebook/assets/gm4/textures/item/NOTE.md",
    "content": "# NOTE\n\nThese textures will be distributed to their proper datapack folders in the future, but that architechure is considered future work. They are left here as legacy textures and referenced in the gm4_items.json font.\n"
  },
  {
    "path": "gm4_guidebook/assets/gm4_guidebook/lang/en_us.json",
    "content": "{\n    \"gui.gm4.guidebook.page\": \"\\u9004\\u9005\\ue005\\u9006\\u9007\\ue001\",\n    \"gui.gm4.guidebook.page.toc\": \"\\u9008\\u9009\\ue005\\u900a\\u900b\\ue001\",\n    \"gui.gm4.guidebook.page.intro\": \"\\u9008\\u9009\\ue005\\u900a\\u900b\\ue001\",\n    \"gui.gm4.guidebook.header.toc\": \"\\uf016\",\n    \"gui.gm4.guidebook.header.toc.under\": \"\\uf016\",\n    \"gui.gm4.guidebook.header.wiki\": \"\\uf016\",\n    \"gui.gm4.guidebook.header.wiki.under\": \"\\uf016\",\n    \"gui.gm4.guidebook.header.refresh\": \"\\uf016\",\n    \"gui.gm4.guidebook.header.refresh.under\": \"\\uf016\",\n    \"gui.gm4.guidebook.header.prev\": \"\\uf016\",\n    \"gui.gm4.guidebook.header.prev.under\": \"\\uf016\",\n    \"gui.gm4.guidebook.header.next\": \"\\uf016\",\n    \"gui.gm4.guidebook.header.next.under\": \"\\uf016\",\n    \"gui.gm4.guidebook.locked_page\": \"\\n\\n\\n\\n\\uf110\\n\\uf110\\uf037?\\uf048\\n\\uf110\\n\\uf110\",\n    \"gui.gm4.guidebook.toast\": \"\\u9000\\ue148\\u9001\\uf003\",\n    \"gui.gm4.guidebook.crafting.display.grid\": \"\\uf004\\u9002\\u9003\\ue007\",\n    \"gui.gm4.guidebook.crafting.display.empty_slot\": \"\\uf018\",\n    \"gui.gm4.guidebook.crafting.display.filled_slot.under\": \"\\uf018\",\n    \"gui.gm4.guidebook.crafting.display.empty_slot.under\": \"\\uf018\",\n    \"gui.gm4.guidebook.crafting.display.arrow\": \"\\uf019\",\n    \"gui.gm4.guidebook.crafting.display.arrow.under\": \"\\uf019\",\n    \"gui.gm4.guidebook.crafting.display.shapeless\": \"🔀\",\n    \"gui.gm4.guidebook.crafting.display.count.0\": \"\\ue007\\u0abf\",\n    \"gui.gm4.guidebook.crafting.display.count.1\": \"\\ue007\\u0ac0\",\n    \"gui.gm4.guidebook.crafting.display.count.2\": \"\\ue007\\u0ac1\",\n    \"gui.gm4.guidebook.crafting.display.count.3\": \"\\ue007\\u0ac2\",\n    \"gui.gm4.guidebook.crafting.display.count.4\": \"\\ue007\\u0ac3\",\n    \"gui.gm4.guidebook.crafting.display.count.5\": \"\\ue007\\u0ac4\",\n    \"gui.gm4.guidebook.crafting.display.count.6\": \"\\ue007\\u0ac5\",\n    \"gui.gm4.guidebook.crafting.display.count.7\": \"\\ue007\\u0ac6\",\n    \"gui.gm4.guidebook.crafting.display.count.8\": \"\\ue007\\u0ac7\",\n    \"gui.gm4.guidebook.crafting.display.count.9\": \"\\ue007\\u0ac8\",\n    \"gui.gm4.guidebook.crafting.display.count.10\": \"\\ue012\\u0ac0\\ue002\\u0abf\",\n    \"gui.gm4.guidebook.crafting.display.count.11\": \"\\ue012\\u0ac0\\ue002\\u0ac0\",\n    \"gui.gm4.guidebook.crafting.display.count.12\": \"\\ue012\\u0ac0\\ue002\\u0ac1\",\n    \"gui.gm4.guidebook.crafting.display.count.13\": \"\\ue012\\u0ac0\\ue002\\u0ac2\",\n    \"gui.gm4.guidebook.crafting.display.count.14\": \"\\ue012\\u0ac0\\ue002\\u0ac3\",\n    \"gui.gm4.guidebook.crafting.display.count.15\": \"\\ue012\\u0ac0\\ue002\\u0ac4\",\n    \"gui.gm4.guidebook.crafting.display.count.16\": \"\\ue012\\u0ac0\\ue002\\u0ac5\",\n    \"gui.gm4.guidebook.crafting.display.count.17\": \"\\ue012\\u0ac0\\ue002\\u0ac6\",\n    \"gui.gm4.guidebook.crafting.display.count.18\": \"\\ue012\\u0ac0\\ue002\\u0ac7\",\n    \"gui.gm4.guidebook.crafting.display.count.19\": \"\\ue012\\u0ac0\\ue002\\u0ac8\",\n    \"gui.gm4.guidebook.crafting.display.count.20\": \"\\ue012\\u0ac1\\ue002\\u0abf\",\n    \"gui.gm4.guidebook.crafting.display.count.21\": \"\\ue012\\u0ac1\\ue002\\u0ac0\",\n    \"gui.gm4.guidebook.crafting.display.count.22\": \"\\ue012\\u0ac1\\ue002\\u0ac1\",\n    \"gui.gm4.guidebook.crafting.display.count.23\": \"\\ue012\\u0ac1\\ue002\\u0ac2\",\n    \"gui.gm4.guidebook.crafting.display.count.24\": \"\\ue012\\u0ac1\\ue002\\u0ac3\",\n    \"gui.gm4.guidebook.crafting.display.count.25\": \"\\ue012\\u0ac1\\ue002\\u0ac4\",\n    \"gui.gm4.guidebook.crafting.display.count.26\": \"\\ue012\\u0ac1\\ue002\\u0ac5\",\n    \"gui.gm4.guidebook.crafting.display.count.27\": \"\\ue012\\u0ac1\\ue002\\u0ac6\",\n    \"gui.gm4.guidebook.crafting.display.count.28\": \"\\ue012\\u0ac1\\ue002\\u0ac7\",\n    \"gui.gm4.guidebook.crafting.display.count.29\": \"\\ue012\\u0ac1\\ue002\\u0ac8\",\n    \"gui.gm4.guidebook.crafting.display.count.30\": \"\\ue012\\u0ac2\\ue002\\u0abf\",\n    \"gui.gm4.guidebook.crafting.display.count.31\": \"\\ue012\\u0ac2\\ue002\\u0ac0\",\n    \"gui.gm4.guidebook.crafting.display.count.32\": \"\\ue012\\u0ac2\\ue002\\u0ac1\",\n    \"gui.gm4.guidebook.crafting.display.count.33\": \"\\ue012\\u0ac2\\ue002\\u0ac2\",\n    \"gui.gm4.guidebook.crafting.display.count.34\": \"\\ue012\\u0ac2\\ue002\\u0ac3\",\n    \"gui.gm4.guidebook.crafting.display.count.35\": \"\\ue012\\u0ac2\\ue002\\u0ac4\",\n    \"gui.gm4.guidebook.crafting.display.count.36\": \"\\ue012\\u0ac2\\ue002\\u0ac5\",\n    \"gui.gm4.guidebook.crafting.display.count.37\": \"\\ue012\\u0ac2\\ue002\\u0ac6\",\n    \"gui.gm4.guidebook.crafting.display.count.38\": \"\\ue012\\u0ac2\\ue002\\u0ac7\",\n    \"gui.gm4.guidebook.crafting.display.count.39\": \"\\ue012\\u0ac2\\ue002\\u0ac8\",\n    \"gui.gm4.guidebook.crafting.display.count.40\": \"\\ue012\\u0ac3\\ue002\\u0abf\",\n    \"gui.gm4.guidebook.crafting.display.count.41\": \"\\ue012\\u0ac3\\ue002\\u0ac0\",\n    \"gui.gm4.guidebook.crafting.display.count.42\": \"\\ue012\\u0ac3\\ue002\\u0ac1\",\n    \"gui.gm4.guidebook.crafting.display.count.43\": \"\\ue012\\u0ac3\\ue002\\u0ac2\",\n    \"gui.gm4.guidebook.crafting.display.count.44\": \"\\ue012\\u0ac3\\ue002\\u0ac3\",\n    \"gui.gm4.guidebook.crafting.display.count.45\": \"\\ue012\\u0ac3\\ue002\\u0ac4\",\n    \"gui.gm4.guidebook.crafting.display.count.46\": \"\\ue012\\u0ac3\\ue002\\u0ac5\",\n    \"gui.gm4.guidebook.crafting.display.count.47\": \"\\ue012\\u0ac3\\ue002\\u0ac6\",\n    \"gui.gm4.guidebook.crafting.display.count.48\": \"\\ue012\\u0ac3\\ue002\\u0ac7\",\n    \"gui.gm4.guidebook.crafting.display.count.49\": \"\\ue012\\u0ac3\\ue002\\u0ac8\",\n    \"gui.gm4.guidebook.crafting.display.count.50\": \"\\ue012\\u0ac4\\ue002\\u0abf\",\n    \"gui.gm4.guidebook.crafting.display.count.51\": \"\\ue012\\u0ac4\\ue002\\u0ac0\",\n    \"gui.gm4.guidebook.crafting.display.count.52\": \"\\ue012\\u0ac4\\ue002\\u0ac1\",\n    \"gui.gm4.guidebook.crafting.display.count.53\": \"\\ue012\\u0ac4\\ue002\\u0ac2\",\n    \"gui.gm4.guidebook.crafting.display.count.54\": \"\\ue012\\u0ac4\\ue002\\u0ac3\",\n    \"gui.gm4.guidebook.crafting.display.count.55\": \"\\ue012\\u0ac4\\ue002\\u0ac4\",\n    \"gui.gm4.guidebook.crafting.display.count.56\": \"\\ue012\\u0ac4\\ue002\\u0ac5\",\n    \"gui.gm4.guidebook.crafting.display.count.57\": \"\\ue012\\u0ac4\\ue002\\u0ac6\",\n    \"gui.gm4.guidebook.crafting.display.count.58\": \"\\ue012\\u0ac4\\ue002\\u0ac7\",\n    \"gui.gm4.guidebook.crafting.display.count.59\": \"\\ue012\\u0ac4\\ue002\\u0ac8\",\n    \"gui.gm4.guidebook.crafting.display.count.60\": \"\\ue012\\u0ac5\\ue002\\u0abf\",\n    \"gui.gm4.guidebook.crafting.display.count.61\": \"\\ue012\\u0ac5\\ue002\\u0ac0\",\n    \"gui.gm4.guidebook.crafting.display.count.62\": \"\\ue012\\u0ac5\\ue002\\u0ac1\",\n    \"gui.gm4.guidebook.crafting.display.count.63\": \"\\ue012\\u0ac5\\ue002\\u0ac2\",\n    \"gui.gm4.guidebook.crafting.display.count.64\": \"\\ue012\\u0ac5\\ue002\\u0ac3\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_button\": \"\\u0ad7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_fence\": \"\\u0ad8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_fence_gate\": \"\\u0ad9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_leaves\": \"\\u0ada\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_log\": \"\\u0adb\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_planks\": \"\\u0adc\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_pressure_plate\": \"\\u0add\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_slab\": \"\\u0ade\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_stairs\": \"\\u0adf\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_trapdoor\": \"\\u0ae0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_wood\": \"\\u0ae1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.amethyst_block\": \"\\u0ae2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.ancient_debris\": \"\\u0ae3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.andesite\": \"\\u0ae4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.andesite_slab\": \"\\u0ae5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.andesite_stairs\": \"\\u0ae6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.andesite_wall\": \"\\u0ae7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.anvil\": \"\\u0ae8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.azalea\": \"\\u0ae9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.azalea_leaves\": \"\\u0aea\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.barrel\": \"\\u0aeb\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.basalt\": \"\\u0aec\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.beacon\": \"\\u0aed\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bedrock\": \"\\u0aee\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bee_nest\": \"\\u0aef\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.beehive\": \"\\u0af0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.big_dripleaf\": \"\\u0af1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_button\": \"\\u0af2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_fence\": \"\\u0af3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_fence_gate\": \"\\u0af4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_leaves\": \"\\u0af5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_log\": \"\\u0af6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_planks\": \"\\u0af7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_pressure_plate\": \"\\u0af8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_slab\": \"\\u0af9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_stairs\": \"\\u0afa\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_trapdoor\": \"\\u0afb\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_wood\": \"\\u0afc\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.black_banner\": \"\\u0afd\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.black_bed\": \"\\u0afe\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.black_carpet\": \"\\u0aff\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.black_concrete\": \"\\u0b00\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.black_concrete_powder\": \"\\u0b01\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.black_glazed_terracotta\": \"\\u0b02\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.black_shulker_box\": \"\\u0b03\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.black_stained_glass\": \"\\u0b04\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.black_terracotta\": \"\\u0b05\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.black_wool\": \"\\u0b06\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blackstone\": \"\\u0b07\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blackstone_slab\": \"\\u0b08\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blackstone_stairs\": \"\\u0b09\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blackstone_wall\": \"\\u0b0a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blast_furnace\": \"\\u0b0b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_banner\": \"\\u0b0c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_bed\": \"\\u0b0d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_carpet\": \"\\u0b0e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_concrete\": \"\\u0b0f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_concrete_powder\": \"\\u0b10\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_glazed_terracotta\": \"\\u0b11\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_ice\": \"\\u0b12\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_shulker_box\": \"\\u0b13\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_stained_glass\": \"\\u0b14\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_terracotta\": \"\\u0b15\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_wool\": \"\\u0b16\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bone_block\": \"\\u0b17\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bookshelf\": \"\\u0b18\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brain_coral_block\": \"\\u0b19\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brick_slab\": \"\\u0b1a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brick_stairs\": \"\\u0b1b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brick_wall\": \"\\u0b1c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bricks\": \"\\u0b1d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_banner\": \"\\u0b1e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_bed\": \"\\u0b1f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_carpet\": \"\\u0b20\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_concrete\": \"\\u0b21\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_concrete_powder\": \"\\u0b22\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_glazed_terracotta\": \"\\u0b23\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_mushroom_block\": \"\\u0b24\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_shulker_box\": \"\\u0b25\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_stained_glass\": \"\\u0b26\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_terracotta\": \"\\u0b27\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_wool\": \"\\u0b28\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bubble_coral_block\": \"\\u0b29\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.budding_amethyst\": \"\\u0b2a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cactus\": \"\\u0b2b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.calcite\": \"\\u0b2c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cartography_table\": \"\\u0b2d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.carved_pumpkin\": \"\\u0b2e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chain_command_block\": \"\\u0b2f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chest\": \"\\u0b30\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chipped_anvil\": \"\\u0b31\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chiseled_deepslate\": \"\\u0b32\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chiseled_nether_bricks\": \"\\u0b33\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chiseled_polished_blackstone\": \"\\u0b34\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chiseled_quartz_block\": \"\\u0b35\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chiseled_red_sandstone\": \"\\u0b36\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chiseled_sandstone\": \"\\u0b37\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chiseled_stone_bricks\": \"\\u0b38\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chorus_flower\": \"\\u0b39\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chorus_plant\": \"\\u0b3a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.clay\": \"\\u0b3b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.coal_block\": \"\\u0b3c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.coal_ore\": \"\\u0b3d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.coarse_dirt\": \"\\u0b3e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cobbled_deepslate\": \"\\u0b3f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cobbled_deepslate_slab\": \"\\u0b40\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cobbled_deepslate_stairs\": \"\\u0b41\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cobbled_deepslate_wall\": \"\\u0b42\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cobblestone\": \"\\u0b43\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cobblestone_slab\": \"\\u0b44\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cobblestone_stairs\": \"\\u0b45\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cobblestone_wall\": \"\\u0b46\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.command_block\": \"\\u0b47\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.composter\": \"\\u0b48\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.conduit\": \"\\u0b49\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.copper_block\": \"\\u0b4a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.copper_ore\": \"\\u0b4b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cracked_deepslate_bricks\": \"\\u0b4c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cracked_deepslate_tiles\": \"\\u0b4d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cracked_nether_bricks\": \"\\u0b4e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cracked_polished_blackstone_bricks\": \"\\u0b4f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cracked_stone_bricks\": \"\\u0b50\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crafting_table\": \"\\u0b51\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.creeper_head\": \"\\u0b52\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_button\": \"\\u0b53\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_fence\": \"\\u0b54\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_fence_gate\": \"\\u0b55\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_hyphae\": \"\\u0b56\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_nylium\": \"\\u0b57\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_planks\": \"\\u0b58\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_pressure_plate\": \"\\u0b59\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_slab\": \"\\u0b5a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_stairs\": \"\\u0b5b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_stem\": \"\\u0b5c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_trapdoor\": \"\\u0b5d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crying_obsidian\": \"\\u0b5e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cut_copper\": \"\\u0b5f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cut_copper_slab\": \"\\u0b60\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cut_copper_stairs\": \"\\u0b61\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cut_red_sandstone\": \"\\u0b62\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cut_red_sandstone_slab\": \"\\u0b63\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cut_sandstone\": \"\\u0b64\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cut_sandstone_slab\": \"\\u0b65\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cyan_banner\": \"\\u0b66\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cyan_bed\": \"\\u0b67\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cyan_carpet\": \"\\u0b68\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cyan_concrete\": \"\\u0b69\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cyan_concrete_powder\": \"\\u0b6a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cyan_glazed_terracotta\": \"\\u0b6b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cyan_shulker_box\": \"\\u0b6c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cyan_stained_glass\": \"\\u0b6d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cyan_terracotta\": \"\\u0b6e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cyan_wool\": \"\\u0b6f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.damaged_anvil\": \"\\u0b70\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_button\": \"\\u0b71\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_fence\": \"\\u0b72\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_fence_gate\": \"\\u0b73\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_leaves\": \"\\u0b74\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_log\": \"\\u0b75\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_planks\": \"\\u0b76\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_pressure_plate\": \"\\u0b77\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_slab\": \"\\u0b78\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_stairs\": \"\\u0b79\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_trapdoor\": \"\\u0b7a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_wood\": \"\\u0b7b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_prismarine\": \"\\u0b7c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_prismarine_slab\": \"\\u0b7d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_prismarine_stairs\": \"\\u0b7e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.daylight_detector\": \"\\u0b7f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_brain_coral_block\": \"\\u0b80\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_bubble_coral_block\": \"\\u0b81\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_fire_coral_block\": \"\\u0b82\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_horn_coral_block\": \"\\u0b83\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_tube_coral_block\": \"\\u0b84\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate\": \"\\u0b85\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_brick_slab\": \"\\u0b86\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_brick_stairs\": \"\\u0b87\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_brick_wall\": \"\\u0b88\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_bricks\": \"\\u0b89\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_coal_ore\": \"\\u0b8a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_copper_ore\": \"\\u0b8b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_diamond_ore\": \"\\u0b8c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_emerald_ore\": \"\\u0b8d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_gold_ore\": \"\\u0b8e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_iron_ore\": \"\\u0b8f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_lapis_ore\": \"\\u0b90\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_redstone_ore\": \"\\u0b91\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_tile_slab\": \"\\u0b92\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_tile_stairs\": \"\\u0b93\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_tile_wall\": \"\\u0b94\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.deepslate_tiles\": \"\\u0b95\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diamond_block\": \"\\u0b96\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diamond_ore\": \"\\u0b97\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diorite\": \"\\u0b98\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diorite_slab\": \"\\u0b99\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diorite_stairs\": \"\\u0b9a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diorite_wall\": \"\\u0b9b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dirt\": \"\\u0b9c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dirt_path\": \"\\u0b9d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dispenser\": \"\\u0b9e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dragon_egg\": \"\\u0b9f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dragon_head\": \"\\u0ba0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dried_kelp_block\": \"\\u0ba1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dripstone_block\": \"\\u0ba2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dropper\": \"\\u0ba3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.emerald_block\": \"\\u0ba4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.emerald_ore\": \"\\u0ba5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.enchanting_table\": \"\\u0ba6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.end_portal_frame\": \"\\u0ba7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.end_rod\": \"\\u0ba8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.end_stone\": \"\\u0ba9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.end_stone_brick_slab\": \"\\u0baa\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.end_stone_brick_stairs\": \"\\u0bab\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.end_stone_brick_wall\": \"\\u0bac\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.end_stone_bricks\": \"\\u0bad\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.ender_chest\": \"\\u0bae\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.exposed_copper\": \"\\u0baf\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.exposed_cut_copper\": \"\\u0bb0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.exposed_cut_copper_slab\": \"\\u0bb1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.exposed_cut_copper_stairs\": \"\\u0bb2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.farmland\": \"\\u0bb3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.fire_coral_block\": \"\\u0bb4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.fletching_table\": \"\\u0bb5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.flowering_azalea\": \"\\u0bb6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.flowering_azalea_leaves\": \"\\u0bb7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.furnace\": \"\\u0bb8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gilded_blackstone\": \"\\u0bb9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.glass\": \"\\u0bba\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.glowstone\": \"\\u0bbb\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gold_block\": \"\\u0bbc\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gold_ore\": \"\\u0bbd\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.granite\": \"\\u0bbe\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.granite_slab\": \"\\u0bbf\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.granite_stairs\": \"\\u0bc0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.granite_wall\": \"\\u0bc1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.grass_block\": \"\\u0bc2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gravel\": \"\\u0bc3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gray_banner\": \"\\u0bc4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gray_bed\": \"\\u0bc5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gray_carpet\": \"\\u0bc6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gray_concrete\": \"\\u0bc7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gray_concrete_powder\": \"\\u0bc8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gray_glazed_terracotta\": \"\\u0bc9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gray_shulker_box\": \"\\u0bca\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gray_stained_glass\": \"\\u0bcb\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gray_terracotta\": \"\\u0bcc\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gray_wool\": \"\\u0bcd\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.green_banner\": \"\\u0bce\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.green_bed\": \"\\u0bcf\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.green_carpet\": \"\\u0bd0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.green_concrete\": \"\\u0bd1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.green_concrete_powder\": \"\\u0bd2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.green_glazed_terracotta\": \"\\u0bd3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.green_shulker_box\": \"\\u0bd4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.green_stained_glass\": \"\\u0bd5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.green_terracotta\": \"\\u0bd6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.green_wool\": \"\\u0bd7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.grindstone\": \"\\u0bd8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.hay_block\": \"\\u0bd9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.heavy_weighted_pressure_plate\": \"\\u0bda\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.honey_block\": \"\\u0bdb\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.honeycomb_block\": \"\\u0bdc\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.horn_coral_block\": \"\\u0bdd\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.ice\": \"\\u0bde\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.infested_chiseled_stone_bricks\": \"\\u0bdf\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.infested_cobblestone\": \"\\u0be0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.infested_cracked_stone_bricks\": \"\\u0be1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.infested_deepslate\": \"\\u0be2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.infested_mossy_stone_bricks\": \"\\u0be3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.infested_stone\": \"\\u0be4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.infested_stone_bricks\": \"\\u0be5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_block\": \"\\u0be6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_ore\": \"\\u0be7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_trapdoor\": \"\\u0be8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jack_o_lantern\": \"\\u0be9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jigsaw\": \"\\u0bea\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jukebox\": \"\\u0beb\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_button\": \"\\u0bec\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_fence\": \"\\u0bed\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_fence_gate\": \"\\u0bee\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_leaves\": \"\\u0bef\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_log\": \"\\u0bf0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_planks\": \"\\u0bf1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_pressure_plate\": \"\\u0bf2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_slab\": \"\\u0bf3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_stairs\": \"\\u0bf4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_trapdoor\": \"\\u0bf5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_wood\": \"\\u0bf6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lapis_block\": \"\\u0bf7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lapis_ore\": \"\\u0bf8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lectern\": \"\\u0bf9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_blue_banner\": \"\\u0bfa\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_blue_bed\": \"\\u0bfb\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_blue_carpet\": \"\\u0bfc\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_blue_concrete\": \"\\u0bfd\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_blue_concrete_powder\": \"\\u0bfe\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_blue_glazed_terracotta\": \"\\u0bff\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_blue_shulker_box\": \"\\u0c00\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_blue_stained_glass\": \"\\u0c01\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_blue_terracotta\": \"\\u0c02\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_blue_wool\": \"\\u0c03\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_gray_banner\": \"\\u0c04\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_gray_bed\": \"\\u0c05\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_gray_carpet\": \"\\u0c06\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_gray_concrete\": \"\\u0c07\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_gray_concrete_powder\": \"\\u0c08\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_gray_glazed_terracotta\": \"\\u0c09\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_gray_shulker_box\": \"\\u0c0a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_gray_stained_glass\": \"\\u0c0b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_gray_terracotta\": \"\\u0c0c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_gray_wool\": \"\\u0c0d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_weighted_pressure_plate\": \"\\u0c0e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lightning_rod\": \"\\u0c0f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lime_banner\": \"\\u0c10\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lime_bed\": \"\\u0c11\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lime_carpet\": \"\\u0c12\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lime_concrete\": \"\\u0c13\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lime_concrete_powder\": \"\\u0c14\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lime_glazed_terracotta\": \"\\u0c15\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lime_shulker_box\": \"\\u0c16\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lime_stained_glass\": \"\\u0c17\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lime_terracotta\": \"\\u0c18\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lime_wool\": \"\\u0c19\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lodestone\": \"\\u0c1a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.loom\": \"\\u0c1b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magenta_banner\": \"\\u0c1c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magenta_bed\": \"\\u0c1d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magenta_carpet\": \"\\u0c1e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magenta_concrete\": \"\\u0c1f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magenta_concrete_powder\": \"\\u0c20\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magenta_glazed_terracotta\": \"\\u0c21\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magenta_shulker_box\": \"\\u0c22\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magenta_stained_glass\": \"\\u0c23\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magenta_terracotta\": \"\\u0c24\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magenta_wool\": \"\\u0c25\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magma_block\": \"\\u0c26\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.melon\": \"\\u0c27\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.moss_block\": \"\\u0c28\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.moss_carpet\": \"\\u0c29\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.mossy_cobblestone\": \"\\u0c2a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.mossy_cobblestone_slab\": \"\\u0c2b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.mossy_cobblestone_stairs\": \"\\u0c2c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.mossy_cobblestone_wall\": \"\\u0c2d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.mossy_stone_brick_slab\": \"\\u0c2e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.mossy_stone_brick_stairs\": \"\\u0c2f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.mossy_stone_brick_wall\": \"\\u0c30\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.mossy_stone_bricks\": \"\\u0c31\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.mushroom_stem\": \"\\u0c32\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.mycelium\": \"\\u0c33\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.nether_brick_fence\": \"\\u0c34\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.nether_brick_slab\": \"\\u0c35\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.nether_brick_stairs\": \"\\u0c36\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.nether_brick_wall\": \"\\u0c37\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.nether_bricks\": \"\\u0c38\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.nether_gold_ore\": \"\\u0c39\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.nether_quartz_ore\": \"\\u0c3a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.nether_wart_block\": \"\\u0c3b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.netherite_block\": \"\\u0c3c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.netherrack\": \"\\u0c3d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.note_block\": \"\\u0c3e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_button\": \"\\u0c3f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_fence\": \"\\u0c40\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_fence_gate\": \"\\u0c41\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_leaves\": \"\\u0c42\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_log\": \"\\u0c43\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_planks\": \"\\u0c44\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_pressure_plate\": \"\\u0c45\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_slab\": \"\\u0c46\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_stairs\": \"\\u0c47\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_trapdoor\": \"\\u0c48\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_wood\": \"\\u0c49\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.observer\": \"\\u0c4a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.obsidian\": \"\\u0c4b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_banner\": \"\\u0c4c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_bed\": \"\\u0c4d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_carpet\": \"\\u0c4e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_concrete\": \"\\u0c4f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_concrete_powder\": \"\\u0c50\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_glazed_terracotta\": \"\\u0c51\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_shulker_box\": \"\\u0c52\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_stained_glass\": \"\\u0c53\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_terracotta\": \"\\u0c54\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_wool\": \"\\u0c55\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oxidized_copper\": \"\\u0c56\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oxidized_cut_copper\": \"\\u0c57\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oxidized_cut_copper_slab\": \"\\u0c58\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oxidized_cut_copper_stairs\": \"\\u0c59\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.packed_ice\": \"\\u0c5a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.petrified_oak_slab\": \"\\u0c5b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_banner\": \"\\u0c5c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_bed\": \"\\u0c5d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_carpet\": \"\\u0c5e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_concrete\": \"\\u0c5f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_concrete_powder\": \"\\u0c60\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_glazed_terracotta\": \"\\u0c61\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_shulker_box\": \"\\u0c62\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_stained_glass\": \"\\u0c63\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_terracotta\": \"\\u0c64\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_wool\": \"\\u0c65\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.piston\": \"\\u0c66\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.player_head\": \"\\u0c67\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.podzol\": \"\\u0c68\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_andesite\": \"\\u0c69\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_andesite_slab\": \"\\u0c6a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_andesite_stairs\": \"\\u0c6b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_basalt\": \"\\u0c6c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone\": \"\\u0c6d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_brick_slab\": \"\\u0c6e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_brick_stairs\": \"\\u0c6f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_brick_wall\": \"\\u0c70\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_bricks\": \"\\u0c71\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_button\": \"\\u0c72\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_pressure_plate\": \"\\u0c73\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_slab\": \"\\u0c74\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_stairs\": \"\\u0c75\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_wall\": \"\\u0c76\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_deepslate\": \"\\u0c77\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_deepslate_slab\": \"\\u0c78\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_deepslate_stairs\": \"\\u0c79\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_deepslate_wall\": \"\\u0c7a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_diorite\": \"\\u0c7b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_diorite_slab\": \"\\u0c7c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_diorite_stairs\": \"\\u0c7d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_granite\": \"\\u0c7e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_granite_slab\": \"\\u0c7f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.polished_granite_stairs\": \"\\u0c80\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.prismarine\": \"\\u0c81\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.prismarine_brick_slab\": \"\\u0c82\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.prismarine_brick_stairs\": \"\\u0c83\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.prismarine_bricks\": \"\\u0c84\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.prismarine_slab\": \"\\u0c85\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.prismarine_stairs\": \"\\u0c86\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.prismarine_wall\": \"\\u0c87\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pumpkin\": \"\\u0c88\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purple_banner\": \"\\u0c89\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purple_bed\": \"\\u0c8a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purple_carpet\": \"\\u0c8b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purple_concrete\": \"\\u0c8c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purple_concrete_powder\": \"\\u0c8d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purple_glazed_terracotta\": \"\\u0c8e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purple_shulker_box\": \"\\u0c8f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purple_stained_glass\": \"\\u0c90\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purple_terracotta\": \"\\u0c91\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purple_wool\": \"\\u0c92\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purpur_block\": \"\\u0c93\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purpur_pillar\": \"\\u0c94\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purpur_slab\": \"\\u0c95\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purpur_stairs\": \"\\u0c96\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.quartz_block\": \"\\u0c97\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.quartz_bricks\": \"\\u0c98\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.quartz_pillar\": \"\\u0c99\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.quartz_slab\": \"\\u0c9a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.quartz_stairs\": \"\\u0c9b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.raw_copper_block\": \"\\u0c9c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.raw_gold_block\": \"\\u0c9d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.raw_iron_block\": \"\\u0c9e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_banner\": \"\\u0c9f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_bed\": \"\\u0ca0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_carpet\": \"\\u0ca1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_concrete\": \"\\u0ca2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_concrete_powder\": \"\\u0ca3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_glazed_terracotta\": \"\\u0ca4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_mushroom_block\": \"\\u0ca5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_nether_brick_slab\": \"\\u0ca6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_nether_brick_stairs\": \"\\u0ca7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_nether_brick_wall\": \"\\u0ca8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_nether_bricks\": \"\\u0ca9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_sand\": \"\\u0caa\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_sandstone\": \"\\u0cab\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_sandstone_slab\": \"\\u0cac\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_sandstone_stairs\": \"\\u0cad\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_sandstone_wall\": \"\\u0cae\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_shulker_box\": \"\\u0caf\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_stained_glass\": \"\\u0cb0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_terracotta\": \"\\u0cb1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_wool\": \"\\u0cb2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.redstone_block\": \"\\u0cb3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.redstone_lamp\": \"\\u0cb4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.redstone_ore\": \"\\u0cb5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.repeating_command_block\": \"\\u0cb6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.respawn_anchor\": \"\\u0cb7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.rooted_dirt\": \"\\u0cb8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sand\": \"\\u0cb9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sandstone\": \"\\u0cba\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sandstone_slab\": \"\\u0cbb\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sandstone_stairs\": \"\\u0cbc\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sandstone_wall\": \"\\u0cbd\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.scaffolding\": \"\\u0cbe\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sculk_sensor\": \"\\u0cbf\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sea_lantern\": \"\\u0cc0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.shield\": \"\\u0cc1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.shroomlight\": \"\\u0cc2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.shulker_box\": \"\\u0cc3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.skeleton_skull\": \"\\u0cc4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.slime_block\": \"\\u0cc5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.small_dripleaf\": \"\\u0cc6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smithing_table\": \"\\u0cc7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smoker\": \"\\u0cc8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smooth_basalt\": \"\\u0cc9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smooth_quartz\": \"\\u0cca\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smooth_quartz_slab\": \"\\u0ccb\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smooth_quartz_stairs\": \"\\u0ccc\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smooth_red_sandstone\": \"\\u0ccd\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smooth_red_sandstone_slab\": \"\\u0cce\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smooth_red_sandstone_stairs\": \"\\u0ccf\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smooth_sandstone\": \"\\u0cd0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smooth_sandstone_slab\": \"\\u0cd1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smooth_sandstone_stairs\": \"\\u0cd2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smooth_stone\": \"\\u0cd3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.smooth_stone_slab\": \"\\u0cd4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.snow\": \"\\u0cd5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.snow_block\": \"\\u0cd6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.soul_sand\": \"\\u0cd7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.soul_soil\": \"\\u0cd8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spawner\": \"\\u0cd9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sponge\": \"\\u0cda\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spore_blossom\": \"\\u0cdb\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_button\": \"\\u0cdc\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_fence\": \"\\u0cdd\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_fence_gate\": \"\\u0cde\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_leaves\": \"\\u0cdf\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_log\": \"\\u0ce0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_planks\": \"\\u0ce1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_pressure_plate\": \"\\u0ce2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_slab\": \"\\u0ce3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_stairs\": \"\\u0ce4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_trapdoor\": \"\\u0ce5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_wood\": \"\\u0ce6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sticky_piston\": \"\\u0ce7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone\": \"\\u0ce8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone_brick_slab\": \"\\u0ce9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone_brick_stairs\": \"\\u0cea\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone_brick_wall\": \"\\u0ceb\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone_bricks\": \"\\u0cec\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone_button\": \"\\u0ced\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone_pressure_plate\": \"\\u0cee\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone_slab\": \"\\u0cef\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone_stairs\": \"\\u0cf0\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stonecutter\": \"\\u0cf1\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_acacia_log\": \"\\u0cf2\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_acacia_wood\": \"\\u0cf3\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_birch_log\": \"\\u0cf4\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_birch_wood\": \"\\u0cf5\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_crimson_hyphae\": \"\\u0cf6\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_crimson_stem\": \"\\u0cf7\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_dark_oak_log\": \"\\u0cf8\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_dark_oak_wood\": \"\\u0cf9\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_jungle_log\": \"\\u0cfa\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_jungle_wood\": \"\\u0cfb\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_oak_log\": \"\\u0cfc\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_oak_wood\": \"\\u0cfd\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_spruce_log\": \"\\u0cfe\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_spruce_wood\": \"\\u0cff\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_warped_hyphae\": \"\\u0d00\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stripped_warped_stem\": \"\\u0d01\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.structure_block\": \"\\u0d02\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.target\": \"\\u0d03\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.terracotta\": \"\\u0d04\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.tinted_glass\": \"\\u0d05\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.tnt\": \"\\u0d06\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.trapped_chest\": \"\\u0d07\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.tube_coral_block\": \"\\u0d08\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.tuff\": \"\\u0d09\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_button\": \"\\u0d0a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_fence\": \"\\u0d0b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_fence_gate\": \"\\u0d0c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_hyphae\": \"\\u0d0d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_nylium\": \"\\u0d0e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_planks\": \"\\u0d0f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_pressure_plate\": \"\\u0d10\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_slab\": \"\\u0d11\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_stairs\": \"\\u0d12\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_stem\": \"\\u0d13\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_trapdoor\": \"\\u0d14\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_wart_block\": \"\\u0d15\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_copper_block\": \"\\u0d16\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_cut_copper\": \"\\u0d17\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_cut_copper_slab\": \"\\u0d18\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_cut_copper_stairs\": \"\\u0d19\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_exposed_copper\": \"\\u0d1a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_exposed_cut_copper\": \"\\u0d1b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_exposed_cut_copper_slab\": \"\\u0d1c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_exposed_cut_copper_stairs\": \"\\u0d1d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_oxidized_copper\": \"\\u0d1e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_oxidized_cut_copper\": \"\\u0d1f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_oxidized_cut_copper_slab\": \"\\u0d20\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_oxidized_cut_copper_stairs\": \"\\u0d21\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_weathered_copper\": \"\\u0d22\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_weathered_cut_copper\": \"\\u0d23\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_weathered_cut_copper_slab\": \"\\u0d24\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.waxed_weathered_cut_copper_stairs\": \"\\u0d25\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.weathered_copper\": \"\\u0d26\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.weathered_cut_copper\": \"\\u0d27\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.weathered_cut_copper_slab\": \"\\u0d28\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.weathered_cut_copper_stairs\": \"\\u0d29\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.wet_sponge\": \"\\u0d2a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_banner\": \"\\u0d2b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_bed\": \"\\u0d2c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_carpet\": \"\\u0d2d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_concrete\": \"\\u0d2e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_concrete_powder\": \"\\u0d2f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_glazed_terracotta\": \"\\u0d30\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_shulker_box\": \"\\u0d31\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_stained_glass\": \"\\u0d32\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_terracotta\": \"\\u0d33\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_wool\": \"\\u0d34\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.wither_skeleton_skull\": \"\\u0d35\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.yellow_banner\": \"\\u0d36\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.yellow_bed\": \"\\u0d37\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.yellow_carpet\": \"\\u0d38\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.yellow_concrete\": \"\\u0d39\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.yellow_concrete_powder\": \"\\u0d3a\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.yellow_glazed_terracotta\": \"\\u0d3b\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.yellow_shulker_box\": \"\\u0d3c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.yellow_stained_glass\": \"\\u0d3d\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.yellow_terracotta\": \"\\u0d3e\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.yellow_wool\": \"\\u0d3f\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.zombie_head\": \"\\u0d40\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.gm4.block_compressor\": \"\\u4001\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.gm4.charcoal_block\": \"\\u0b3c\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.gm4.custom_crafter\": \"\\u4002\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.gm4.disassembler\": \"\\u4003\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.gm4.enchantment_extractor\": \"\\u4004\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.gm4.ender_hopper\": \"\\u4005\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.gm4.liquid_tank\": \"\\u4006\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.gm4.forming_press\": \"\\u4007\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.gm4.smeltery\": \"\\u4008\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.gm4.tinkering_compressor\": \"\\u4009\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.gm4.teleportation_anchor\": \"\\u4010\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.gm4.teleportation_jammer\": \"\\u4011\\uf001\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.border\": \"\\ue018\\u0d41\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.bricks\": \"\\ue018\\u0d42\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.circle\": \"\\ue018\\u0d43\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.creeper\": \"\\ue018\\u0d44\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.cross\": \"\\ue018\\u0d45\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.curly_border\": \"\\ue018\\u0d46\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.diagonal_left\": \"\\ue018\\u0d47\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.diagonal_right\": \"\\ue018\\u0d48\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.diagonal_up_left\": \"\\ue018\\u0d49\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.diagonal_up_right\": \"\\ue018\\u0d4a\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.flower\": \"\\ue018\\u0d4b\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.globe\": \"\\ue018\\u0d4c\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.gradient\": \"\\ue018\\u0d4d\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.gradient_up\": \"\\ue018\\u0d4e\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.half_horizontal\": \"\\ue018\\u0d4f\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.half_horizontal_bottom\": \"\\ue018\\u0d50\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.half_vertical\": \"\\ue018\\u0d51\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.half_vertical_right\": \"\\ue018\\u0d52\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.mojang\": \"\\ue018\\u0d53\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.piglin\": \"\\ue018\\u0d54\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.rhombus\": \"\\ue018\\u0d55\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.skull\": \"\\ue018\\u0d56\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.small_stripes\": \"\\ue018\\u0d57\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.square_bottom_left\": \"\\ue018\\u0d58\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.square_bottom_right\": \"\\ue018\\u0d59\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.square_top_left\": \"\\ue018\\u0d5a\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.square_top_right\": \"\\ue018\\u0d5b\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.straight_cross\": \"\\ue018\\u0d5c\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.stripe_bottom\": \"\\ue018\\u0d5d\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.stripe_center\": \"\\ue018\\u0d5e\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.stripe_downleft\": \"\\ue018\\u0d5f\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.stripe_downright\": \"\\ue018\\u0d60\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.stripe_left\": \"\\ue018\\u0d61\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.stripe_middle\": \"\\ue018\\u0d62\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.stripe_right\": \"\\ue018\\u0d63\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.stripe_top\": \"\\ue018\\u0d64\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.triangle_bottom\": \"\\ue018\\u0d65\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.triangle_top\": \"\\ue018\\u0d66\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.triangles_bottom\": \"\\ue018\\u0d67\",\n    \"gui.gm4.guidebook.crafting.display.banner_pattern.triangles_top\": \"\\ue018\\u0d68\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.base\": \"\\ue018\\u0d69\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.border\": \"\\ue018\\u0d6a\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.bricks\": \"\\ue018\\u0d6b\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.circle\": \"\\ue018\\u0d6c\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.creeper\": \"\\ue018\\u0d6d\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.cross\": \"\\ue018\\u0d6e\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.curly_border\": \"\\ue018\\u0d6f\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.diagonal_left\": \"\\ue018\\u0d70\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.diagonal_right\": \"\\ue018\\u0d71\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.diagonal_up_left\": \"\\ue018\\u0d72\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.diagonal_up_right\": \"\\ue018\\u0d73\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.flower\": \"\\ue018\\u0d74\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.globe\": \"\\ue018\\u0d75\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.gradient\": \"\\ue018\\u0d76\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.gradient_up\": \"\\ue018\\u0d77\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.half_horizontal\": \"\\ue018\\u0d78\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.half_horizontal_bottom\": \"\\ue018\\u0d79\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.half_vertical\": \"\\ue018\\u0d7a\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.half_vertical_right\": \"\\ue018\\u0d7b\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.mojang\": \"\\ue018\\u0d7c\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.piglin\": \"\\ue018\\u0d7d\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.rhombus\": \"\\ue018\\u0d7e\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.skull\": \"\\ue018\\u0d7f\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.small_stripes\": \"\\ue018\\u0d80\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.square_bottom_left\": \"\\ue018\\u0d81\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.square_bottom_right\": \"\\ue018\\u0d82\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.square_top_left\": \"\\ue018\\u0d83\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.square_top_right\": \"\\ue018\\u0d84\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.straight_cross\": \"\\ue018\\u0d85\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.stripe_bottom\": \"\\ue018\\u0d86\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.stripe_center\": \"\\ue018\\u0d87\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.stripe_downleft\": \"\\ue018\\u0d88\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.stripe_downright\": \"\\ue018\\u0d89\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.stripe_left\": \"\\ue018\\u0d8a\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.stripe_middle\": \"\\ue018\\u0d8b\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.stripe_right\": \"\\ue018\\u0d8c\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.stripe_top\": \"\\ue018\\u0d8d\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.triangle_bottom\": \"\\ue018\\u0d8e\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.triangle_top\": \"\\ue018\\u0d8f\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.triangles_bottom\": \"\\ue018\\u0d90\",\n    \"gui.gm4.guidebook.crafting.display.shield_pattern.triangles_top\": \"\\ue018\\u0d91\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_boat\": \"\\u0d92\\u0903\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_door\": \"\\u0d93\\u0904\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_sapling\": \"\\u0d94\\u0905\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.acacia_sign\": \"\\u0d95\\u0906\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.activator_rail\": \"\\u0d96\\u0907\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.allium\": \"\\u0d97\\u0908\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.amethyst_cluster\": \"\\u0d98\\u0909\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.amethyst_shard\": \"\\u0d99\\u090a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.apple\": \"\\u0d9a\\u090b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.armor_stand\": \"\\u0d9b\\u090c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.arrow\": \"\\u0d9c\\u090d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.axolotl_bucket\": \"\\u0d9d\\u090e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.azure_bluet\": \"\\u0d9e\\u090f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.baked_potato\": \"\\u0d9f\\u0910\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bamboo\": \"\\u0da0\\u0911\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.barrier\": \"\\u0da1\\u0912\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.beef\": \"\\u0da2\\u0913\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.beetroot\": \"\\u0da3\\u0914\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.beetroot_seeds\": \"\\u0da4\\u0915\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.beetroot_soup\": \"\\u0da5\\u0916\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bell\": \"\\u0da6\\u0917\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_boat\": \"\\u0da7\\u0918\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_door\": \"\\u0da8\\u0919\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_sapling\": \"\\u0da9\\u091a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.birch_sign\": \"\\u0daa\\u091b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.black_candle\": \"\\u0dab\\u091c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.black_dye\": \"\\u0dac\\u091d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.black_stained_glass_pane\": \"\\u0dad\\u091e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blaze_powder\": \"\\u0dae\\u091f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blaze_rod\": \"\\u0daf\\u0920\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_candle\": \"\\u0db0\\u0921\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_dye\": \"\\u0db1\\u0922\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_orchid\": \"\\u0db2\\u0923\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.blue_stained_glass_pane\": \"\\u0db3\\u0924\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bone\": \"\\u0db4\\u0925\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bone_meal\": \"\\u0db5\\u0926\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.book\": \"\\u0db6\\u0927\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bow\": \"\\u0db7\\u0928\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bowl\": \"\\u0db8\\u0929\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brain_coral\": \"\\u0db9\\u092a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brain_coral_fan\": \"\\u0dba\\u092b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bread\": \"\\u0dbb\\u092c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brewing_stand\": \"\\u0dbc\\u092d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brick\": \"\\u0dbd\\u092e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.broken_elytra\": \"\\u0dbe\\u092f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_candle\": \"\\u0dbf\\u0930\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_dye\": \"\\u0dc0\\u0931\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_mushroom\": \"\\u0dc1\\u0932\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.brown_stained_glass_pane\": \"\\u0dc2\\u0933\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bubble_coral\": \"\\u0dc3\\u0934\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bubble_coral_fan\": \"\\u0dc4\\u0935\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bucket\": \"\\u0dc5\\u0936\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.bundle\": \"\\u0dc6\\u0937\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cake\": \"\\u0dc8\\u0939\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.campfire\": \"\\u0dc9\\u093a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.candle\": \"\\u0dca\\u093b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.carrot\": \"\\u0dcb\\u093c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.carrot_on_a_stick\": \"\\u0dcc\\u093d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cauldron\": \"\\u0dcd\\u093e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_chain\": \"\\u0dce\\u093f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chainmail_boots\": \"\\u0dcf\\u0940\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chainmail_chestplate\": \"\\u0dd0\\u0941\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chainmail_helmet\": \"\\u0dd1\\u0942\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chainmail_leggings\": \"\\u0dd2\\u0943\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.charcoal\": \"\\u0dd3\\u0944\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chest_minecart\": \"\\u0dd4\\u0945\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chicken\": \"\\u0dd5\\u0946\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.chorus_fruit\": \"\\u0dd6\\u0947\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.clay_ball\": \"\\u0dd7\\u0948\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.clock\": \"\\u0dd8\\u0949\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.coal\": \"\\u0dd9\\u094a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cobweb\": \"\\u0dda\\u094b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cocoa_beans\": \"\\u0ddb\\u094c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cod\": \"\\u0ddc\\u094d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cod_bucket\": \"\\u0ddd\\u094e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.command_block_minecart\": \"\\u0dde\\u094f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.comparator\": \"\\u0ddf\\u0950\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.compass\": \"\\u0de0\\u0951\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cooked_beef\": \"\\u0de1\\u0952\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cooked_chicken\": \"\\u0de2\\u0953\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cooked_cod\": \"\\u0de3\\u0954\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cooked_mutton\": \"\\u0de4\\u0955\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cooked_porkchop\": \"\\u0de5\\u0956\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cooked_rabbit\": \"\\u0de6\\u0957\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cooked_salmon\": \"\\u0de7\\u0958\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cookie\": \"\\u0de8\\u0959\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.copper_ingot\": \"\\u0de9\\u095a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cornflower\": \"\\u0dea\\u095b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.creeper_banner_pattern\": \"\\u0deb\\u095c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_door\": \"\\u0dec\\u095d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_fungus\": \"\\u0ded\\u095e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_roots\": \"\\u0dee\\u095f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crimson_sign\": \"\\u0def\\u0960\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crossbow\": \"\\u0df0\\u0961\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crossbow_arrow\": \"\\u0df1\\u0962\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.crossbow_firework\": \"\\u0df2\\u0963\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cyan_candle\": \"\\u0df3\\u0964\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cyan_dye\": \"\\u0df4\\u0965\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.cyan_stained_glass_pane\": \"\\u0df5\\u0966\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dandelion\": \"\\u0df6\\u0967\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_boat\": \"\\u0df7\\u0968\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_door\": \"\\u0df8\\u0969\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_sapling\": \"\\u0df9\\u096a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dark_oak_sign\": \"\\u0dfa\\u096b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_brain_coral\": \"\\u0dfb\\u096c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_brain_coral_fan\": \"\\u0dfc\\u096d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_bubble_coral\": \"\\u0dfd\\u096e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_bubble_coral_fan\": \"\\u0dfe\\u096f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_bush\": \"\\u0dff\\u0970\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_fire_coral\": \"\\u0e00\\u0971\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_fire_coral_fan\": \"\\u0e01\\u0972\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_horn_coral\": \"\\u0e02\\u0973\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_horn_coral_fan\": \"\\u0e03\\u0974\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_tube_coral\": \"\\u0e04\\u0975\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dead_tube_coral_fan\": \"\\u0e05\\u0976\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.detector_rail\": \"\\u0e06\\u0977\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diamond\": \"\\u0e07\\u0978\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diamond_axe\": \"\\u0e08\\u0979\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diamond_boots\": \"\\u0e09\\u097a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diamond_chestplate\": \"\\u0e0a\\u097b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diamond_helmet\": \"\\u0e0b\\u097c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diamond_hoe\": \"\\u0e0c\\u097d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diamond_horse_armor\": \"\\u0e0d\\u097e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diamond_leggings\": \"\\u0e0e\\u097f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diamond_pickaxe\": \"\\u0e0f\\u0980\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diamond_shovel\": \"\\u0e10\\u0981\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.diamond_sword\": \"\\u0e11\\u0982\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dragon_breath\": \"\\u0e12\\u0983\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.dried_kelp\": \"\\u0e13\\u0984\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.egg\": \"\\u0e14\\u0985\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.elytra\": \"\\u0e15\\u0986\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.emerald\": \"\\u0e16\\u0987\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.enchanted_book\": \"\\u0e17\\u0988\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.end_crystal\": \"\\u0e18\\u0989\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.ender_eye\": \"\\u0e19\\u098a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.ender_pearl\": \"\\u0e1a\\u098b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.experience_bottle\": \"\\u0e1b\\u098c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.feather\": \"\\u0e1c\\u098d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.fermented_spider_eye\": \"\\u0e1d\\u098e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.fern\": \"\\u0e1e\\u098f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.filled_map\": \"\\u0e1f\\u0990\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.overlay.minecraft.filled_map_markings\": \"\\uffff\\ue018\\u0e20\\u0991\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.fire_charge\": \"\\u0e21\\u0992\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.fire_coral\": \"\\u0e22\\u0993\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.fire_coral_fan\": \"\\u0e23\\u0994\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.firework_rocket\": \"\\u0e24\\u0995\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.firework_star\": \"\\u0e25\\u0996\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.overlay.minecraft.firework_star\": \"\\uffff\\ue018\\u0e26\\u0997\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.fishing_rod\": \"\\u0e27\\u0998\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.flint\": \"\\u0e28\\u0999\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.flint_and_steel\": \"\\u0e29\\u099a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.flower_banner_pattern\": \"\\u0e2a\\u099b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.flower_pot\": \"\\u0e2b\\u099c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.furnace_minecart\": \"\\u0e2c\\u099d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.ghast_tear\": \"\\u0e2d\\u099e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.glass_bottle\": \"\\u0e2e\\u099f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.glass_pane\": \"\\u0e2f\\u09a0\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.glistering_melon_slice\": \"\\u0e30\\u09a1\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.globe_banner_pattern\": \"\\u0e31\\u09a2\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.glow_berries\": \"\\u0e32\\u09a3\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.glow_ink_sac\": \"\\u0e33\\u09a4\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.glow_item_frame\": \"\\u0e34\\u09a5\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.glow_lichen\": \"\\u0e35\\u09a6\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.glowstone_dust\": \"\\u0e36\\u09a7\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gold_ingot\": \"\\u0e37\\u09a8\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gold_nugget\": \"\\u0e38\\u09a9\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.golden_apple\": \"\\u0e39\\u09aa\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.enchanted_golden_apple\": \"\\u0e39\\u09aa\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.golden_axe\": \"\\u0e3a\\u09ab\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.golden_boots\": \"\\u0e3b\\u09ac\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.golden_carrot\": \"\\u0e3c\\u09ad\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.golden_chestplate\": \"\\u0e3d\\u09ae\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.golden_helmet\": \"\\u0e3e\\u09af\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.golden_hoe\": \"\\u0e3f\\u09b0\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.golden_horse_armor\": \"\\u0e40\\u09b1\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.golden_leggings\": \"\\u0e41\\u09b2\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.golden_pickaxe\": \"\\u0e42\\u09b3\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.golden_shovel\": \"\\u0e43\\u09b4\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.golden_sword\": \"\\u0e44\\u09b5\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.grass\": \"\\u0e45\\u09b6\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gray_candle\": \"\\u0e46\\u09b7\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gray_dye\": \"\\u0e47\\u09b8\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gray_stained_glass_pane\": \"\\u0e48\\u09b9\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.green_candle\": \"\\u0e49\\u09ba\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.green_dye\": \"\\u0e4a\\u09bb\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.green_stained_glass_pane\": \"\\u0e4b\\u09bc\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.gunpowder\": \"\\u0e4c\\u09bd\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.hanging_roots\": \"\\u0e4d\\u09be\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.heart_of_the_sea\": \"\\u0e4e\\u09bf\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.honey_bottle\": \"\\u0e4f\\u09c0\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.honeycomb\": \"\\u0e50\\u09c1\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.hopper\": \"\\u0e51\\u09c2\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.hopper_minecart\": \"\\u0e52\\u09c3\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.horn_coral\": \"\\u0e53\\u09c4\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.horn_coral_fan\": \"\\u0e54\\u09c5\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.ink_sac\": \"\\u0e55\\u09c6\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_axe\": \"\\u0e56\\u09c7\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_bars\": \"\\u0e57\\u09c8\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_boots\": \"\\u0e58\\u09c9\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_chestplate\": \"\\u0e59\\u09ca\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_door\": \"\\u0e5a\\u09cb\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_helmet\": \"\\u0e5b\\u09cc\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_hoe\": \"\\u0e5c\\u09cd\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_horse_armor\": \"\\u0e5d\\u09ce\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_ingot\": \"\\u0e5e\\u09cf\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_leggings\": \"\\u0e5f\\u09d0\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_nugget\": \"\\u0e60\\u09d1\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_pickaxe\": \"\\u0e61\\u09d2\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_shovel\": \"\\u0e62\\u09d3\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.iron_sword\": \"\\u0e63\\u09d4\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.item_frame\": \"\\u0e64\\u09d5\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_boat\": \"\\u0e65\\u09d6\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_door\": \"\\u0e66\\u09d7\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_sapling\": \"\\u0e67\\u09d8\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.jungle_sign\": \"\\u0e68\\u09d9\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.kelp\": \"\\u0e69\\u09da\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.knowledge_book\": \"\\u0e6a\\u09db\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.ladder\": \"\\u0e6b\\u09dc\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lantern\": \"\\u0e6c\\u09dd\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lapis_lazuli\": \"\\u0e6d\\u09de\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.large_amethyst_bud\": \"\\u0e6e\\u09df\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.large_fern\": \"\\u0e6f\\u09e0\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lava_bucket\": \"\\u0e70\\u09e1\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lead\": \"\\u0e71\\u09e2\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.leather\": \"\\u0e72\\u09e3\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.leather_boots\": \"\\u0e73\\u09e4\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.overlay.minecraft.leather_boots\": \"\\uffff\\ue018\\u0e74\\u09e5\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.leather_chestplate\": \"\\u0e75\\u09e6\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.overlay.minecraft.leather_chestplate\": \"\\uffff\\ue018\\u0e76\\u09e7\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.leather_helmet\": \"\\u0e77\\u09e8\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.overlay.minecraft.leather_helmet\": \"\\uffff\\ue018\\u0e78\\u09e9\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.leather_horse_armor\": \"\\u0e79\\u09ea\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.leather_leggings\": \"\\u0e7a\\u09eb\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.overlay.minecraft.leather_leggings\": \"\\uffff\\ue018\\u0e7b\\u09ec\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lever\": \"\\u0e7c\\u09ed\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light\": \"\\u0e7d\\u09ee\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_00\": \"\\u0e7e\\u09ef\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_01\": \"\\u0e7f\\u09f0\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_02\": \"\\u0e80\\u09f1\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_03\": \"\\u0e81\\u09f2\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_04\": \"\\u0e82\\u09f3\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_05\": \"\\u0e83\\u09f4\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_06\": \"\\u0e84\\u09f5\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_07\": \"\\u0e85\\u09f6\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_08\": \"\\u0e86\\u09f7\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_09\": \"\\u0e87\\u09f8\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_10\": \"\\u0e88\\u09f9\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_11\": \"\\u0e89\\u09fa\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_12\": \"\\u0e8a\\u09fb\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_13\": \"\\u0e8b\\u09fc\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_14\": \"\\u0e8c\\u09fd\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_15\": \"\\u0e8d\\u09fe\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_blue_candle\": \"\\u0e8e\\u09ff\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_blue_dye\": \"\\u0e8f\\u0a00\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_blue_stained_glass_pane\": \"\\u0e90\\u0a01\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_gray_candle\": \"\\u0e91\\u0a02\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_gray_dye\": \"\\u0e92\\u0a03\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.light_gray_stained_glass_pane\": \"\\u0e93\\u0a04\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lilac\": \"\\u0e94\\u0a05\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lily_of_the_valley\": \"\\u0e95\\u0a06\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lily_pad\": \"\\u0e96\\u0a07\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lime_candle\": \"\\u0e97\\u0a08\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lime_dye\": \"\\u0e98\\u0a09\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lime_stained_glass_pane\": \"\\u0e99\\u0a0a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.lingering_potion\": \"\\u0e9a\\u0a0b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magenta_candle\": \"\\u0e9b\\u0a0c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magenta_dye\": \"\\u0e9c\\u0a0d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magenta_stained_glass_pane\": \"\\u0e9d\\u0a0e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.magma_cream\": \"\\u0e9e\\u0a0f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.map\": \"\\u0e9f\\u0a10\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.medium_amethyst_bud\": \"\\u0ea0\\u0a11\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.melon_seeds\": \"\\u0ea1\\u0a12\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.melon_slice\": \"\\u0ea2\\u0a13\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.milk_bucket\": \"\\u0ea3\\u0a14\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.minecart\": \"\\u0ea4\\u0a15\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.mojang_banner_pattern\": \"\\u0ea5\\u0a16\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.mushroom_stew\": \"\\u0ea6\\u0a17\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.music_disc_11\": \"\\u0ea7\\u0a18\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.music_disc_13\": \"\\u0ea8\\u0a19\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.music_disc_blocks\": \"\\u0ea9\\u0a1a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.music_disc_cat\": \"\\u0eaa\\u0a1b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.music_disc_chirp\": \"\\u0eab\\u0a1c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.music_disc_far\": \"\\u0eac\\u0a1d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.music_disc_mall\": \"\\u0ead\\u0a1e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.music_disc_mellohi\": \"\\u0eae\\u0a1f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.music_disc_pigstep\": \"\\u0eaf\\u0a20\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.music_disc_stal\": \"\\u0eb0\\u0a21\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.music_disc_strad\": \"\\u0eb1\\u0a22\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.music_disc_wait\": \"\\u0eb2\\u0a23\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.music_disc_ward\": \"\\u0eb3\\u0a24\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.mutton\": \"\\u0eb4\\u0a25\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.name_tag\": \"\\u0eb5\\u0a26\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.nautilus_shell\": \"\\u0eb6\\u0a27\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.nether_brick\": \"\\u0eb7\\u0a28\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.nether_sprouts\": \"\\u0eb8\\u0a29\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.nether_star\": \"\\u0eb9\\u0a2a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.nether_wart\": \"\\u0eba\\u0a2b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.netherite_axe\": \"\\u0ebb\\u0a2c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.netherite_boots\": \"\\u0ebc\\u0a2d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.netherite_chestplate\": \"\\u0ebd\\u0a2e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.netherite_helmet\": \"\\u0ebe\\u0a2f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.netherite_hoe\": \"\\u0ebf\\u0a30\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.netherite_ingot\": \"\\u0ec0\\u0a31\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.netherite_leggings\": \"\\u0ec1\\u0a32\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.netherite_pickaxe\": \"\\u0ec2\\u0a33\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.netherite_scrap\": \"\\u0ec3\\u0a34\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.netherite_shovel\": \"\\u0ec4\\u0a35\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.netherite_sword\": \"\\u0ec5\\u0a36\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_boat\": \"\\u0ec6\\u0a37\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_door\": \"\\u0ec7\\u0a38\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_sapling\": \"\\u0ec8\\u0a39\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oak_sign\": \"\\u0ec9\\u0a3a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_candle\": \"\\u0eca\\u0a3b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_dye\": \"\\u0ecb\\u0a3c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_stained_glass_pane\": \"\\u0ecc\\u0a3d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.orange_tulip\": \"\\u0ecd\\u0a3e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.oxeye_daisy\": \"\\u0ece\\u0a3f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.painting\": \"\\u0ecf\\u0a40\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.paper\": \"\\u0ed0\\u0a41\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.peony\": \"\\u0ed1\\u0a42\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.phantom_membrane\": \"\\u0ed2\\u0a43\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.piglin_banner_pattern\": \"\\u0ed3\\u0a44\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_candle\": \"\\u0ed4\\u0a45\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_dye\": \"\\u0ed5\\u0a46\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_stained_glass_pane\": \"\\u0ed6\\u0a47\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pink_tulip\": \"\\u0ed7\\u0a48\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pointed_dripstone\": \"\\u0ed8\\u0a49\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.poisonous_potato\": \"\\u0ed9\\u0a4a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.popped_chorus_fruit\": \"\\u0eda\\u0a4b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.poppy\": \"\\u0edb\\u0a4c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.porkchop\": \"\\u0edc\\u0a4d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.potato\": \"\\u0edd\\u0a4e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.potion\": \"\\u0ede\\u0a4f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.overlay.minecraft.potion\": \"\\uffff\\ue018\\u0edf\\u0a50\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.powder_snow_bucket\": \"\\u0ee0\\u0a51\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.powered_rail\": \"\\u0ee1\\u0a52\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.prismarine_crystals\": \"\\u0ee2\\u0a53\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.prismarine_shard\": \"\\u0ee3\\u0a54\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pufferfish\": \"\\u0ee4\\u0a55\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pufferfish_bucket\": \"\\u0ee5\\u0a56\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pumpkin_pie\": \"\\u0ee6\\u0a57\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.pumpkin_seeds\": \"\\u0ee7\\u0a58\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purple_candle\": \"\\u0ee8\\u0a59\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purple_dye\": \"\\u0ee9\\u0a5a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.purple_stained_glass_pane\": \"\\u0eea\\u0a5b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.quartz\": \"\\u0eeb\\u0a5c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.rabbit\": \"\\u0eec\\u0a5d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.rabbit_foot\": \"\\u0eed\\u0a5e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.rabbit_hide\": \"\\u0eee\\u0a5f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.rabbit_stew\": \"\\u0eef\\u0a60\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.rail\": \"\\u0ef0\\u0a61\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.raw_copper\": \"\\u0ef1\\u0a62\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.raw_gold\": \"\\u0ef2\\u0a63\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.raw_iron\": \"\\u0ef3\\u0a64\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_candle\": \"\\u0ef4\\u0a65\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_dye\": \"\\u0ef5\\u0a66\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_mushroom\": \"\\u0ef6\\u0a67\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_stained_glass_pane\": \"\\u0ef7\\u0a68\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.red_tulip\": \"\\u0ef8\\u0a69\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.redstone\": \"\\u0ef9\\u0a6a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.redstone_torch\": \"\\u0efa\\u0a6b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.repeater\": \"\\u0efb\\u0a6c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.rose_bush\": \"\\u0efc\\u0a6d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.rotten_flesh\": \"\\u0efd\\u0a6e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.saddle\": \"\\u0efe\\u0a6f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.salmon\": \"\\u0eff\\u0a70\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.salmon_bucket\": \"\\u0f00\\u0a71\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.turtle_scute\": \"\\u0f01\\u0a72\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sea_pickle\": \"\\u0f02\\u0a73\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.seagrass\": \"\\u0f03\\u0a74\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.shears\": \"\\u0f04\\u0a75\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.shulker_shell\": \"\\u0f05\\u0a76\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.skull_banner_pattern\": \"\\u0f06\\u0a77\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.slime_ball\": \"\\u0f07\\u0a78\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.small_amethyst_bud\": \"\\u0f08\\u0a79\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.snowball\": \"\\u0f09\\u0a7a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.soul_campfire\": \"\\u0f0a\\u0a7b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.soul_lantern\": \"\\u0f0b\\u0a7c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.soul_torch\": \"\\u0f0c\\u0a7d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spectral_arrow\": \"\\u0f0f\\u0a80\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spider_eye\": \"\\u0f10\\u0a81\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.splash_potion\": \"\\u0f11\\u0a82\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_boat\": \"\\u0f12\\u0a83\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_door\": \"\\u0f13\\u0a84\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_sapling\": \"\\u0f14\\u0a85\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spruce_sign\": \"\\u0f15\\u0a86\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.spyglass\": \"\\u0f16\\u0a87\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stick\": \"\\u0f17\\u0a88\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone_axe\": \"\\u0f18\\u0a89\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone_hoe\": \"\\u0f19\\u0a8a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone_pickaxe\": \"\\u0f1a\\u0a8b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone_shovel\": \"\\u0f1b\\u0a8c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.stone_sword\": \"\\u0f1c\\u0a8d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.string\": \"\\u0f1d\\u0a8e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.structure_void\": \"\\u0f1e\\u0a8f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sugar\": \"\\u0f1f\\u0a90\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sugar_cane\": \"\\u0f20\\u0a91\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sunflower\": \"\\u0f21\\u0a92\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.suspicious_stew\": \"\\u0f22\\u0a93\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.sweet_berries\": \"\\u0f23\\u0a94\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.tall_grass\": \"\\u0f24\\u0a95\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.tipped_arrow\": \"\\u0f25\\u0a96\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.tipped_arrow_base\": \"\\u0f26\\u0a97\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.overlay.minecraft.tipped_arrow_head\": \"\\uffff\\ue018\\u0f27\\u0a98\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.tnt_minecart\": \"\\u0f28\\u0a99\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.torch\": \"\\u0f29\\u0a9a\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.totem_of_undying\": \"\\u0f2a\\u0a9b\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.trident\": \"\\u0f2b\\u0a9c\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.tripwire_hook\": \"\\u0f2c\\u0a9d\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.tropical_fish\": \"\\u0f2d\\u0a9e\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.tropical_fish_bucket\": \"\\u0f2e\\u0a9f\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.tube_coral\": \"\\u0f2f\\u0aa0\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.tube_coral_fan\": \"\\u0f30\\u0aa1\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.turtle_egg\": \"\\u0f31\\u0aa2\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.turtle_helmet\": \"\\u0f32\\u0aa3\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.twisting_vines\": \"\\u0f33\\u0aa4\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.vine\": \"\\u0f34\\u0aa5\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_door\": \"\\u0f35\\u0aa6\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_fungus\": \"\\u0f36\\u0aa7\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_fungus_on_a_stick\": \"\\u0f37\\u0aa8\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_roots\": \"\\u0f38\\u0aa9\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.warped_sign\": \"\\u0f39\\u0aaa\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.water_bucket\": \"\\u0f3a\\u0aab\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.weeping_vines\": \"\\u0f3b\\u0aac\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.wheat\": \"\\u0f3c\\u0aad\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.wheat_seeds\": \"\\u0f3d\\u0aae\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_candle\": \"\\u0f3e\\u0aaf\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_dye\": \"\\u0f3f\\u0ab0\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_stained_glass_pane\": \"\\u0f40\\u0ab1\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.white_tulip\": \"\\u0f41\\u0ab2\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.wither_rose\": \"\\u0f42\\u0ab3\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.wooden_axe\": \"\\u0f43\\u0ab4\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.wooden_hoe\": \"\\u0f44\\u0ab5\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.wooden_pickaxe\": \"\\u0f45\\u0ab6\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.wooden_shovel\": \"\\u0f46\\u0ab7\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.wooden_sword\": \"\\u0f47\\u0ab8\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.writable_book\": \"\\u0f48\\u0ab9\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.written_book\": \"\\u0f49\\u0aba\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.yellow_candle\": \"\\u0f4a\\u0abb\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.yellow_dye\": \"\\u0f4b\\u0abc\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.minecraft.yellow_stained_glass_pane\": \"\\u0f4c\\u0abd\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.overlay.gm4.boots_of_ostara\": \"\\uffff\\ue018\\u4101\\u4201\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.gm4.boots_of_ostara\": \"\\u4102\\u4202\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.overlay.gm4.flippers\": \"\\uffff\\ue018\\u4103\\u4203\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.gm4.flippers\": \"\\u4104\\u4204\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.gm4.scuba_helmet\": \"\\u4105\\u4205\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.gm4.scuba_tank\": \"\\u4106\\u4206\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.gm4.secret_trapped_oak_sign\": \"\\u4107\\u4207\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.gm4.trapped_oak_sign\": \"\\u4108\\u4208\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.gm4.relocator\": \"\\u4012\",\n    \"gui.gm4.guidebook.crafting.display.gm4.tier_1_heart_canister\": \"\\u4109\\u4209\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.gm4.tier_2_heart_canister\": \"\\u4013\",\n    \"gui.gm4.guidebook.crafting.display.gm4.piston_minecart\": \"\\u4110\\u4210\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.gm4.landmine\": \"\\u4014\",\n    \"gui.gm4.guidebook.crafting.display.gm4.landmine.crafting_table\": \"\\u4015\",\n    \"gui.gm4.guidebook.crafting.display.gm4.landmine.invisible\": \"\\u4016\",\n    \"gui.gm4.guidebook.crafting.display.gm4.soft_defuser\": \"\\u4017\",\n    \"gui.gm4.guidebook.crafting.display.overlay.gm4.orb_of_ankou\": \"\\uffff\\ue018\\u4111\\u4211\\uf015\",\n    \"gui.gm4.guidebook.crafting.display.gm4.orb_of_ankou\": \"\\u4112\\u4212\\uf015\"\n}\n"
  },
  {
    "path": "gm4_guidebook/assets/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.discovered_page,Check your guidebook!\ntext.gm4.guidebook.discovered,%1$s has discovered a guidebook page from %2$s\ntext.gm4.guidebook.jump_to_section,Jump to Section\ntext.gm4.guidebook.next,Go to the next module\ntext.gm4.guidebook.open_wiki,Open the wiki page for this module\ntext.gm4.guidebook.prev,Go to the previous module\ntext.gm4.guidebook.refresh,Refresh section\ntext.gm4.guidebook.return_to_toc,Return to the table of contents\ntext.gm4.guidebook.title,Gamemode 4 Guidebook\ntext.gm4.guidebook.undiscovered,Undiscovered\ntext.gm4.guidebook.introduction,Introduction\ntext.gm4.guidebook.letter,This is a world unlike others. It appears that certain things work...differently to say the least.\\n\\nThis book will document discoveries regarding these new mechanics.\ntext.gm4.guidebook.refresh_toc,Refresh Table of Contents\ntext.gm4.guidebook.refresh_findings,Refresh Findings\n"
  },
  {
    "path": "gm4_guidebook/beet.yaml",
    "content": "id: gm4_guidebook\nname: Guidebook\nversion: 3.3.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n  \nrequire:\n  - bolt\n\npipeline:\n  - legacy_item_sheet\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_forceload\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_forceload: 1.6.0\n      schedule_loops: \n        - main\n        - tick\n        - lecterns/section/tracking\n    model_data:\n      - item: written_book\n        reference: item/guidebook\n        template: generated\n    translation_linter_ignores:\n      - text.gm4.guidebook.discovered_page\n      - text.gm4.guidebook.discovered\n      - text.gm4.guidebook.next\n      - text.gm4.guidebook.open_wiki\n      - text.gm4.guidebook.prev\n      - text.gm4.guidebook.refresh\n      - text.gm4.guidebook.return_to_toc\n      - text.gm4.guidebook.undiscovered\n      - text.gm4.guidebook.jump_to_section\n    website:\n      description: Adds a dynamic guidebook to discover the mechanics of Gamemode 4! This provides a wiki-like experience in-game!\n      recommended:\n        - gm4_resource_pack\n      notes:\n        - Experimental Module! Features may be added or removed without an easy upgrade path. You may encounter unintentional behaviour.\n    wiki: https://wiki.gm4.co/wiki/Guidebook\n    credits:\n      Creators:\n        - BPR\n        - JP12\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/advancement/first_join.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"$giveNewPlayers\"\n              },\n              \"score\": \"gm4_guide_config\"\n            },\n            \"range\": 1\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_guidebook:get_book/first_join\"\n  }\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/advancement/lectern_id.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:tick\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_guidebook:lecterns/get_id\"\n  }\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/advancement/loot_village_chest.json",
    "content": "{\n  \"criteria\": {\n    \"armorer\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_armorer\"\n      }\n    },\n    \"butcher\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_butcher\"\n      }\n    },\n    \"cartographer\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_cartographer\"\n      }\n    },\n    \"desert_house\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_desert_house\"\n      }\n    },\n    \"fisher\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_fisher\"\n      }\n    },\n    \"fletcher\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_fletcher\"\n      }\n    },\n    \"mason\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_mason\"\n      }\n    },\n    \"plains_house\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_plains_house\"\n      }\n    },\n    \"savanna_house\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_savanna_house\"\n      }\n    },\n    \"shepherd\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_shepherd\"\n      }\n    },\n    \"snowy_house\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_snowy_house\"\n      }\n    },\n    \"taiga_house\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_taiga_house\"\n      }\n    },\n    \"tannery\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_tannery\"\n      }\n    },\n    \"temple\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_temple\"\n      }\n    },\n    \"toolsmith\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_toolsmith\"\n      }\n    },\n    \"weaponsmith\": {\n      \"trigger\": \"minecraft:player_generates_container_loot\",\n      \"conditions\": {\n        \"loot_table\": \"minecraft:chests/village/village_weaponsmith\"\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"armorer\",\n      \"butcher\",\n      \"cartographer\",\n      \"desert_house\",\n      \"fisher\",\n      \"fletcher\",\n      \"mason\",\n      \"plains_house\",\n      \"savanna_house\",\n      \"shepherd\",\n      \"snowy_house\",\n      \"taiga_house\",\n      \"tannery\",\n      \"temple\",\n      \"toolsmith\",\n      \"weaponsmith\"\n    ]\n  ],\n  \"rewards\": {\n    \"function\": \"gm4_guidebook:get_book/chest/looted\"\n  }\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/advancement/open_guide_lectern.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:default_block_use\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:lectern\"\n                ],\n                \"nbt\": \"{Book:{components:{'minecraft:custom_data':{gm4_guidebook:{lectern:1b}}}}}\",\n                \"state\": {\n                  \"has_book\": \"true\"\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_guidebook:lecterns/section/find_lectern\"\n  }\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/advancement/open_updating_lectern.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:default_block_use\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:lectern\"\n                ],\n                \"nbt\": \"{Book:{components:{'minecraft:custom_data':{gm4_guidebook:{lectern:0b}}}}}\",\n                \"state\": {\n                  \"has_book\": \"true\"\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_guidebook:lecterns/replace/find_lectern\"\n  }\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/advancement/root.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/advancement/take_lectern_book.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:written_book\"\n            ],\n            \"count\": 1,\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_guidebook:{lectern:1b}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_guidebook:lecterns/restore/search\"\n  }\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/get_book/chest/insert_seed_random.mcfunction",
    "content": "# checks the LootTableSeed of the chest, and inserts for 45% of them\n# @s = player that just looted the chest\n# located at the chest\n# run from gm4_guidebook:get_book/chest/ray\n\n# modulo the loot table seed to 0-99\nexecute store result score $loot_table_seed gm4_guide run data get block ~ ~ ~ LootTableSeed 0.0000000001\nscoreboard players operation $loot_table_seed gm4_guide %= #100 gm4_guide\n\n# for 0-44, insert the guidebook\n$execute if score $loot_table_seed gm4_guide matches ..44 run loot insert ~ ~ ~ loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:items/guidebook\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/get_book/chest/looted.mcfunction",
    "content": "# inserts the guidebook into 45% of village chests\n# @s = player that just looted a village chest\n# located at @s\n# run from advancement gm4_guidebook:loot_village_chest\n\n# revoke advancement\nadvancement revoke @s only gm4_guidebook:loot_village_chest\n\n# raycast to chest block\nscoreboard players set $ray gm4_guide 50\nscoreboard players set $found gm4_guide 0\nexecute anchored eyes positioned ^ ^ ^ run function gm4_guidebook:get_book/chest/ray with storage gm4_guidebook:register\n\n# clean up\nscoreboard players reset $ray gm4_guide\nscoreboard players reset $found gm4_guide\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/get_book/chest/ray.mcfunction",
    "content": "# raycasts to the chest\n# @s = marker ray used to detect the chest\n# located at @s\n# run from gm4_guidebook:get_book/looted\n# run from self\n\nexecute if data block ~ ~ ~ LootTable run scoreboard players set $found gm4_guide 1\n$execute if score $found gm4_guide matches 1 unless data block ~ ~ ~ LootTableSeed if predicate gm4_guidebook:chance_chest run loot insert ~ ~ ~ loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:items/guidebook\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\nexecute if score $found gm4_guide matches 1 if data block ~ ~ ~ LootTableSeed run function gm4_guidebook:get_book/chest/insert_seed_random with storage gm4_guidebook:register\nscoreboard players remove $ray gm4_guide 1\nexecute if score $found gm4_guide matches 0 if score $ray gm4_guide matches 1.. positioned ^ ^ ^0.1 run function gm4_guidebook:get_book/chest/ray with storage gm4_guidebook:register\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/get_book/first_join.mcfunction",
    "content": "# gives all players the guidebook upon joining for the first time\n# @s = new player\n# located at @s\n# run from advancement gm4_guidebook:first_join\n\nfunction gm4_guidebook:get_book/player with storage gm4_guidebook:register\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/get_book/player.mcfunction",
    "content": "# gives all players the guidebook upon joining for the first time\n# @s = new player\n# located at @s\n# run from advancement gm4_guidebook:first_join\n\n$loot give @s loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:items/guidebook\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/get_book/zombie_villager.mcfunction",
    "content": "# places the book in the zombie villager's hand\n# @s = random zombie villager that spawned naturally (not converted)\n# located at world spawn\n# run from gm4_guidebook:main\n\n# put book in mainhand\n$loot replace entity @s weapon.mainhand loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:items/guidebook\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n\n# make zombie drop the book upon player kill\ndata modify entity @s drop_chances.mainhand set value 1.0f\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/hand/get_pages.mcfunction",
    "content": "# gets the module pages\n# @s = player that triggers gm4_guide\n# at @s\n# run from gm4_guidebook:hand/update\n\n# short circuit if the module isn't loaded\n$execute unless score $(load) load.status matches 1.. run return 0\n# create player db if it doesn't exist\n$execute unless data storage gm4_guidebook:register player_pages.\"$(uuid)\".$(name) run function gm4_guidebook:player_db/setup with storage gm4_guidebook:temp book\n# get pages for specific book\n$data modify storage gm4_guidebook:temp book.pages set from storage gm4_guidebook:register player_pages.\"$(uuid)\".$(name).hand\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/hand/next_section/loop.mcfunction",
    "content": "# clears all sections before the current section (inclusive)\n# @s = player who clicked in the guidebook\n# located at world spawn\n# run from gm4_guidebook:hand/next_section/search\n# run from self\n\nexecute store result score $check gm4_guide_next run data get storage gm4_guidebook:temp triggers[0]\ndata remove storage gm4_guidebook:temp triggers[0]\nexecute unless score $check gm4_guide_next = @s gm4_guide_next if data storage gm4_guidebook:temp triggers[-1] run function gm4_guidebook:hand/next_section/loop\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/hand/next_section/search.mcfunction",
    "content": "# finds next section to jump to \n# @s = player who clicked in the guidebook\n# located at world spawn\n# run from gm4_guidebook:tick\n\n# find section\ndata modify storage gm4_guidebook:temp triggers set from storage gm4_guidebook:register trigger_order\nfunction gm4_guidebook:hand/next_section/loop\n\n# set guide score\nexecute store result score @s gm4_guide run data get storage gm4_guidebook:temp triggers[0]\nexecute unless data storage gm4_guidebook:temp triggers[-1] run scoreboard players operation @s gm4_guide = @s gm4_guide_next\ndata remove storage gm4_guidebook:temp triggers\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/hand/populate.mcfunction",
    "content": "# updates the player's book\n# @s = player that triggers gm4_guide\n# at @s\n# run from gm4_guidebook:hand/update\n\n$loot replace entity @s[predicate=gm4_guidebook:book_in_mainhand] weapon.mainhand loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:items/guidebook\",\"functions\":[{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3,\"pages\":$(pages)}}},{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:$(trigger)}}\"},{\"function\":\"minecraft:set_count\",\"count\":$(count)}]}]}]}\n$loot replace entity @s[predicate=gm4_guidebook:book_in_offhand] weapon.offhand loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:items/guidebook\",\"functions\":[{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3,\"pages\":$(pages)}}},{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:$(trigger)}}\"},{\"function\":\"minecraft:set_count\",\"count\":$(count)}]}]}]}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/hand/prev_section/loop.mcfunction",
    "content": "# clears all sections after the current section (inclusive)\n# @s = player who clicked in the guidebook\n# located at world spawn\n# run from gm4_guidebook:hand/prev_section/search\n# run from self\n\nexecute store result score $check gm4_guide_prev run data get storage gm4_guidebook:temp triggers[-1]\ndata remove storage gm4_guidebook:temp triggers[-1]\nexecute unless score $check gm4_guide_prev = @s gm4_guide_prev if data storage gm4_guidebook:temp triggers[-1] run function gm4_guidebook:hand/prev_section/loop\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/hand/prev_section/search.mcfunction",
    "content": "# finds prev section to jump to \n# @s = player who clicked in the guidebook\n# located at world spawn\n# run from gm4_guidebook:tick\n\n# find section\ndata modify storage gm4_guidebook:temp triggers set from storage gm4_guidebook:register trigger_order\nfunction gm4_guidebook:hand/prev_section/loop\n\n# set guide score\nexecute store result score @s gm4_guide run data get storage gm4_guidebook:temp triggers[-1]\nexecute unless data storage gm4_guidebook:temp triggers[-1] run scoreboard players set @s gm4_guide 1\ndata remove storage gm4_guidebook:temp triggers\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/hand/update.mcfunction",
    "content": "# replaces the player's hand with a new book\n# @s = player that triggers gm4_guide\n# at @s\n# run from gm4_guidebook:tick\n\n# save item count\nscoreboard players set $count gm4_guide 0\nexecute store result score $count gm4_guide run data get entity @s[predicate=gm4_guidebook:book_in_mainhand] SelectedItem.count\nexecute if score $count gm4_guide matches 0 store result score $count gm4_guide run data get entity @s[predicate=gm4_guidebook:book_in_offhand] equipment.offhand.count\n\n# replace book\n## short-circuit if it's the table of contents\n$execute if score @s gm4_guide matches 1 run loot replace entity @s[predicate=gm4_guidebook:book_in_mainhand] weapon.mainhand loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score @s gm4_guide matches 1 run loot replace entity @s[predicate=gm4_guidebook:book_in_offhand] weapon.offhand loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\nexecute if score @s gm4_guide matches 1 run return 1\n\n## get unlocked pages\nexecute store result storage gm4_guidebook:temp book.trigger int 1 run scoreboard players get @s gm4_guide\nfunction gm4_guidebook:player_db/get_trigger_name with storage gm4_guidebook:temp book\ndata modify storage gm4_guidebook:temp book.uuid set from entity @s UUID\nfunction gm4_guidebook:hand/get_pages with storage gm4_guidebook:temp book\n\n## update item\nexecute store result storage gm4_guidebook:temp book.count int 1 run scoreboard players get $count gm4_guide\nfunction gm4_guidebook:hand/populate with storage gm4_guidebook:temp book\ndata remove storage gm4_guidebook:temp book\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/init.mcfunction",
    "content": "# set up scoreboards\nscoreboard objectives add gm4_guide trigger\nscoreboard objectives add gm4_guide_next trigger\nscoreboard objectives add gm4_guide_prev trigger\nscoreboard objectives add gm4_guide_id dummy\nscoreboard objectives add gm4_guide_pages dummy\nscoreboard objectives add gm4_guide_section dummy\nscoreboard objectives add gm4_guide_config dummy\n\nexecute unless score $sendCommandFeedback gm4_guide_config = $sendCommandFeedback gm4_guide_config store result score $sendCommandFeedback gm4_guide_config run gamerule send_command_feedback\nexecute unless score $forceCommandFeedback gm4_guide_config = $forceCommandFeedback gm4_guide_config run scoreboard players set $forceCommandFeedback gm4_guide_config 0\nexecute unless score $giveNewPlayers gm4_guide_config = $giveNewPlayers gm4_guide_config run scoreboard players set $giveNewPlayers gm4_guide_config 1\nscoreboard players set #100 gm4_guide 100\nscoreboard players set #intro gm4_guide_pages 1\nscoreboard players reset $module_count gm4_guide\n\nschedule function gm4_guidebook:update_storage/setup_markers 1t\n\nscoreboard players set $ready gm4_guide 0\nschedule function #gm4_guidebook:setup_storage 5t\nschedule function gm4_guidebook:update_storage/mark_ready 6t\n\ndata modify storage gm4_guidebook:register front_matter set value [{raw:[\"\",{\"translate\":\"gui.gm4.guidebook.page.intro\",\"fallback\": \"\",\"color\": \"white\",\"font\": \"gm4:guidebook\"},{\"translate\":\"text.gm4.guidebook.introduction\",\"fallback\":\"Introduction\",\"underlined\":true},{\"text\":\"\\n\\n\"},{\"translate\":\"text.gm4.guidebook.letter\",\"fallback\":\"This is a world unlike others. It appears that certain things work...differently to say the least.\\n\\nThis book will document discoveries regarding these new mechanics.\"},{\"text\":\"\\n\\n> \",\"color\":\"#4AA0C7\"},{\"translate\":\"text.gm4.guidebook.refresh_findings\",\"fallback\":\"Refresh Findings\",\"color\":\"#4AA0C7\",\"hover_event\":{\"action\":\"show_text\",\"value\":[{\"translate\":\"text.gm4.guidebook.refresh_toc\",\"fallback\":\"Refresh Table of Contents\",\"color\":\"gold\"}]},\"click_event\":{\"action\":\"run_command\",\"command\":\"/trigger gm4_guide set 1\"}}]}]\n\n# start up module\nexecute unless score guidebook gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Guidebook\"}\nexecute unless score guidebook gm4_earliest_version < guidebook gm4_modules run scoreboard players operation guidebook gm4_earliest_version = guidebook gm4_modules\nscoreboard players set guidebook gm4_modules 1\n\nschedule function gm4_guidebook:main 2t\nschedule function gm4_guidebook:tick 1t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/get_id.mcfunction",
    "content": "# gives all players an id for lectern matching\n# @s = new player\n# located at @s\n# run from advancement gm4_guidebook:lectern_id\n\nexecute store result score @s gm4_guide_id run scoreboard players add #max gm4_guide_id 1\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/get_pages.mcfunction",
    "content": "# gets the module pages\n# @s = player that last opened the lectern\n# at the lectern\n# run from gm4_guidebook:lecterns/update\n\n# short circuit if the module isn't loaded\n$execute unless score $(load) load.status matches 1.. run return 0\n# create player db if it doesn't exist\n$execute unless data storage gm4_guidebook:register player_pages.\"$(uuid)\".$(name) run function gm4_guidebook:player_db/setup with storage gm4_guidebook:temp book\n# get pages for specific book\n$data modify storage gm4_guidebook:temp book.pages set from storage gm4_guidebook:register player_pages.\"$(uuid)\".$(name).lectern\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/populate.mcfunction",
    "content": "# sets the module pages\n# @s = player that last opened the lectern\n# at the lectern\n# run from gm4_guidebook:lecterns/update\n\n$data modify block ~ ~ ~ Book.components merge value {\"minecraft:written_book_content\":{\"pages\":$(pages),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3},\"minecraft:custom_data\":{gm4_guidebook:{lectern:1b,trigger:$(trigger)}}}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/process.mcfunction",
    "content": "# process lecterns\n# @s = guidebook lectern marker\n# located at @s\n# run from gm4_guidebook:main\n\nexecute unless block ~ ~ ~ lectern run kill @s\nexecute unless entity @a[gamemode=!spectator,distance=..6,limit=1] run tag @s[tag=gm4_guide_tracking] remove gm4_guide_tracking\nexecute if block ~ ~ ~ lectern[has_book=false] run tag @s[tag=gm4_guide_tracking] remove gm4_guide_tracking\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/replace/find_lectern.mcfunction",
    "content": "# finds the lectern\n# @s = player that opened a lectern without a book\n# located at @s\n# run from advancement gm4_guidebook:open_updating_lectern\n\nadvancement revoke @s only gm4_guidebook:open_updating_lectern\n\n# raycast to lectern\nscoreboard players set $ray gm4_guide 50\nscoreboard players set $found gm4_guide 0\nexecute anchored eyes positioned ^ ^ ^ run function gm4_guidebook:lecterns/replace/ray\n\n# clean up\nscoreboard players reset $ray gm4_guide\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/replace/ray.mcfunction",
    "content": "# raycasts to the lectern\n# @s = player who opened the lectern\n# located anchored eyes ^ ^ ^0.X\n# run from gm4_guidebook:lecterns/replace/find_lectern\n# run from self\n\nexecute if block ~ ~ ~ lectern[has_book=true]{Book:{components:{\"minecraft:custom_data\":{gm4_guidebook:{lectern:0b}}}}} align xyz positioned ~0.5 ~0.5 ~0.5 run function gm4_guidebook:lecterns/replace/update\nscoreboard players remove $ray gm4_guide 1\nexecute if score $found gm4_guide matches 0 if score $ray gm4_guide matches 1.. positioned ^ ^ ^0.1 run function gm4_guidebook:lecterns/replace/ray\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/replace/update.mcfunction",
    "content": "# marks and updates the lectern\n# @s = player who opened the lectern\n# located at center of the lectern\n# run from gm4_guidebook:lecterns/replace/ray\n\nscoreboard players set $found gm4_guide 1\n\n# summon marker\nexecute unless entity @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] run summon marker ~ ~ ~ {CustomName:\"gm4_guide_lectern\",Tags:[\"gm4_guide_lectern\"]}\n\n# replace book with lectern book\nexecute store result score $trigger gm4_guide run data get block ~ ~ ~ Book.components.\"minecraft:custom_data\".gm4_guidebook.trigger\nfunction gm4_guidebook:lecterns/update with storage gm4_guidebook:register\n\n# store page count (minus 1)\nexecute store result score @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] gm4_guide_pages run data get block ~ ~ ~ Book.components.\"minecraft:written_book_content\".pages\nscoreboard players remove @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] gm4_guide_pages 1\n\n# mark toc\ntag @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] remove gm4_guide_toc\nexecute if score $trigger gm4_guide matches 1 run tag @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] add gm4_guide_toc\n\n# start tracking\nfunction gm4_guidebook:lecterns/section/track\n\n# update page number\nexecute if score $trigger gm4_guide matches 1 run data modify block ~ ~ ~ Page set value 1\nexecute unless score $trigger gm4_guide matches 1 run data modify block ~ ~ ~ Page set value 5\n\n# clean up\nscoreboard players reset $trigger gm4_guide\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/restore/hotbar.mcfunction",
    "content": "# restores the guidebook to normal form\n# @s = player who has moved a lectern book into their inventory\n# located at @s\n# run from gm4_guidebook:lecterns/restore/search\n\n$execute if score $slot gm4_guide matches 0 run loot replace entity @s hotbar.0 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 1 run loot replace entity @s hotbar.1 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 2 run loot replace entity @s hotbar.2 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 3 run loot replace entity @s hotbar.3 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 4 run loot replace entity @s hotbar.4 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 5 run loot replace entity @s hotbar.5 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 6 run loot replace entity @s hotbar.6 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 7 run loot replace entity @s hotbar.7 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 8 run loot replace entity @s hotbar.8 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/restore/inv_1.mcfunction",
    "content": "# restores the guidebook to normal form\n# @s = player who has moved a lectern book into their inventory\n# located at @s\n# run from gm4_guidebook:lecterns/restore/search\n\n$execute if score $slot gm4_guide matches 9 run loot replace entity @s inventory.0 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 10 run loot replace entity @s inventory.1 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 11 run loot replace entity @s inventory.2 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 12 run loot replace entity @s inventory.3 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 13 run loot replace entity @s inventory.4 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 14 run loot replace entity @s inventory.5 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 15 run loot replace entity @s inventory.6 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 16 run loot replace entity @s inventory.7 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 17 run loot replace entity @s inventory.8 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/restore/inv_2.mcfunction",
    "content": "# restores the guidebook to normal form\n# @s = player who has moved a lectern book into their inventory\n# located at @s\n# run from gm4_guidebook:lecterns/restore/search\n\n$execute if score $slot gm4_guide matches 18 run loot replace entity @s inventory.9 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 19 run loot replace entity @s inventory.10 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 20 run loot replace entity @s inventory.11 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 21 run loot replace entity @s inventory.12 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 22 run loot replace entity @s inventory.13 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 23 run loot replace entity @s inventory.14 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 24 run loot replace entity @s inventory.15 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 25 run loot replace entity @s inventory.16 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 26 run loot replace entity @s inventory.17 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/restore/inv_3.mcfunction",
    "content": "# restores the guidebook to normal form\n# @s = player who has moved a lectern book into their inventory\n# located at @s\n# run from gm4_guidebook:lecterns/restore/search\n\n$execute if score $slot gm4_guide matches 27 run loot replace entity @s inventory.18 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 28 run loot replace entity @s inventory.19 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 29 run loot replace entity @s inventory.20 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 30 run loot replace entity @s inventory.21 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 31 run loot replace entity @s inventory.22 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 32 run loot replace entity @s inventory.23 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 33 run loot replace entity @s inventory.24 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 34 run loot replace entity @s inventory.25 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n$execute if score $slot gm4_guide matches 35 run loot replace entity @s inventory.26 1 loot {\"pools\":[{\"rolls\":1,\"entries\":[{\"type\":\"minecraft:loot_table\",\"value\":\"gm4_guidebook:technical/guidebook_with_count\",\"functions\":[{\"function\":\"minecraft:set_custom_data\",\"tag\":\"{gm4_guidebook:{lectern:0b,trigger:1}}\"},{\"function\":\"minecraft:set_components\",\"components\":{\"minecraft:written_book_content\":{\"pages\":$(front_matter),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3}}}]}]}]}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/restore/search.mcfunction",
    "content": "# restores the guidebook to normal form\n# @s = player who has moved a lectern book into their inventory\n# located at @s\n# run from advancement \"gm4_guidebook:take_lectern_book\"\n# run from self\n\nadvancement revoke @s only gm4_guidebook:take_lectern_book\n\n# TODO 1.21.5: this might not work for the offhand\n# get item data\nscoreboard players set $slot gm4_guide -1\ndata modify storage gm4_guidebook:temp Inventory set from entity @s Inventory\nexecute store success score $item gm4_guide run data modify storage gm4_guidebook:temp Item set from storage gm4_guidebook:temp Inventory[{components:{\"minecraft:custom_data\":{gm4_guidebook:{lectern:1b}}}}]\nexecute if score $item gm4_guide matches 1.. store result score $slot gm4_guide run data get storage gm4_guidebook:temp Item.Slot\nexecute unless score $slot gm4_guide matches -1 store result score $count gm4_guide run data get storage gm4_guidebook:temp Item.count\n\n# replace item\nexecute if score $slot gm4_guide matches 0..8 run function gm4_guidebook:lecterns/restore/hotbar with storage gm4_guidebook:register\nexecute if score $slot gm4_guide matches 9..17 run function gm4_guidebook:lecterns/restore/inv_1 with storage gm4_guidebook:register\nexecute if score $slot gm4_guide matches 18..26 run function gm4_guidebook:lecterns/restore/inv_2 with storage gm4_guidebook:register\nexecute if score $slot gm4_guide matches 27..35 run function gm4_guidebook:lecterns/restore/inv_3 with storage gm4_guidebook:register\n\n# clean up\ndata remove storage gm4_guidebook:temp Item\ndata remove storage gm4_guidebook:temp Inventory\n\n# loop for all lectern guidebooks\nexecute unless score $slot gm4_guide matches ..-1 run function gm4_guidebook:lecterns/restore/search\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/check_page/normal.mcfunction",
    "content": "# check if page is one of the section changes\n# @s = guide lectern marker\n# located at @s (center of the lectern)\n# run from gm4_guidebook:lecterns/section/check_page\n\n# if 0 or last page, jump to next section\nexecute if score $page gm4_guide_pages matches 0 run function gm4_guidebook:lecterns/section/update/next_section/find_player\nexecute if score $page gm4_guide_pages = @s gm4_guide_pages run function gm4_guidebook:lecterns/section/update/next_section/find_player\n# if 3 or 4, jump to prev section\nexecute if score $page gm4_guide_pages matches 3..4 run function gm4_guidebook:lecterns/section/update/prev_section/find_player\n# if 2, refresh\nexecute if score $page gm4_guide_pages matches 2 run function gm4_guidebook:lecterns/section/update/refresh/find_player\n# if 1, jump to TOC\nexecute if score $page gm4_guide_pages matches 1 run function gm4_guidebook:lecterns/section/update/toc/jump with storage gm4_guidebook:register\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/check_page/toc.mcfunction",
    "content": "# check if page is one of the section changes\n# @s = guide lectern marker\n# located at @s (center of the lectern)\n# run from gm4_guidebook:lecterns/section/check_page\n\nscoreboard players set $toc gm4_guide_pages 1\n\n# if 0, jump to TOC (refresh)\nexecute if score $page gm4_guide_pages matches 0 run function gm4_guidebook:lecterns/section/update/toc/jump\n\n# else, figure out what section to jump to\n# execute if score $page gm4_guide_pages matches 0..1 run return\nexecute if score $page gm4_guide_pages > $front_matter gm4_guide_pages run function gm4_guidebook:lecterns/section/toc/find_player\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/check_page.mcfunction",
    "content": "# check if page is one of the section changes\n# @s = guide lectern marker\n# located at @s (center of the lectern)\n# run from gm4_guidebook:lecterns/section/tracking\n\nscoreboard players operation $original_page gm4_guide_pages = $page gm4_guide_pages\nexecute store result score $page gm4_guide_pages run data get block ~ ~ ~ Page\n\n# different behavior based on TOC or normal\nscoreboard players set $toc gm4_guide_pages 0\nexecute if entity @s[tag=gm4_guide_toc] run function gm4_guidebook:lecterns/section/check_page/toc\nexecute if score $toc gm4_guide_pages matches 0 run function gm4_guidebook:lecterns/section/check_page/normal\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/find_lectern.mcfunction",
    "content": "# finds the lectern\n# @s = player that opened a lectern with a lectern guidebook\n# located at @s\n# run from advancement gm4_guidebook:open_guide_lectern\n\nadvancement revoke @s only gm4_guidebook:open_guide_lectern\n\n# raycast to lectern\nscoreboard players set $ray gm4_guide 50\nscoreboard players set $found gm4_guide 0\nexecute anchored eyes positioned ^ ^ ^ run function gm4_guidebook:lecterns/section/ray\n\n# clean up\nscoreboard players reset $ray gm4_guide\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/ray.mcfunction",
    "content": "# raycasts to the lectern\n# @s = player who opened the lectern\n# located anchored eyes ^ ^ ^0.X\n# run from gm4_guidebook:lecterns/section/find_lectern\n\nexecute if block ~ ~ ~ lectern[has_book=true]{Book:{components:{\"minecraft:custom_data\":{gm4_guidebook:{lectern:1b}}}}} align xyz positioned ~0.5 ~0.5 ~0.5 run function gm4_guidebook:lecterns/section/track\nscoreboard players remove $ray gm4_guide 1\nexecute if score $found gm4_guide matches 0 if score $ray gm4_guide matches 1.. positioned ^ ^ ^0.1 run function gm4_guidebook:lecterns/section/ray\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/toc/find_player.mcfunction",
    "content": "# finds last player to open the lectern\n# @s = guide lectern marker\n# located at the center of the lectern\n# run from gm4_guidebook:lecterns/section/check_page/toc\n\n# execute as player, at block\nscoreboard players operation $current gm4_guide_id = @s gm4_guide_id\nexecute as @a[distance=..6] if score @s gm4_guide_id = $current gm4_guide_id run function gm4_guidebook:lecterns/section/toc/jump\n\n# mark toc\ntag @s remove gm4_guide_toc\nexecute if score $trigger gm4_guide matches 1 run tag @s add gm4_guide_toc\n\n# clean up\nscoreboard players reset $index gm4_guide\nscoreboard players reset $check gm4_guide\nscoreboard players reset $trigger gm4_guide\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/toc/find_section.mcfunction",
    "content": "# clears all sections before the desired section (exclusive)\n# @s = player who last opened the lectern\n# located at the center of the lectern\n# run from gm4_guidebook:lecterns/section/update/next_section/jump\n# run from self\n\ndata remove storage gm4_guidebook:temp triggers[0]\nscoreboard players add $check gm4_guide 1\nexecute unless score $check gm4_guide >= $index gm4_guide if data storage gm4_guidebook:temp triggers[-1] run function gm4_guidebook:lecterns/section/toc/find_section\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/toc/jump.mcfunction",
    "content": "# finds section to jump to \n# @s = player who last opened the lectern\n# located at the center of the lectern\n# run from gm4_guidebook:lecterns/section/update/next_section/find_player\n# and from gm4_guidebook:lecterns/section/check_page/normal\n\n# get the index\nexecute store result score $index gm4_guide run data get block ~ ~ ~ Page\nscoreboard players operation $index gm4_guide -= $front_matter gm4_guide_pages\nscoreboard players remove $index gm4_guide 1\n\n# find section\nscoreboard players set $check gm4_guide 0\ndata modify storage gm4_guidebook:temp triggers set from storage gm4_guidebook:register trigger_order\nexecute if score $index gm4_guide matches 1.. run function gm4_guidebook:lecterns/section/toc/find_section\n\n# set guide score\nexecute store result score $trigger gm4_guide run data get storage gm4_guidebook:temp triggers[0]\n## special case: if the storage is somehow empty (shouldn't happen) jump to TOC\nexecute unless data storage gm4_guidebook:temp triggers[0] run scoreboard players set $trigger gm4_guide 1\ndata remove storage gm4_guidebook:temp triggers\n\n# jump to section\nfunction gm4_guidebook:lecterns/update with storage gm4_guidebook:register\n\n# store page count (minus 1)\nexecute store result score @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] gm4_guide_pages run data get block ~ ~ ~ Book.components.\"minecraft:written_book_content\".pages\nscoreboard players remove @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] gm4_guide_pages 1\n\n# update page number\nexecute if score $trigger gm4_guide matches 1 run data modify block ~ ~ ~ Page set value 1\nexecute unless score $trigger gm4_guide matches 1 run data modify block ~ ~ ~ Page set value 5\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/track.mcfunction",
    "content": "# starts tracking changes\n# @s = player who opened the lectern\n# located at center of lectern\n# run from gm4_guidebook:lecterns/section/ray\n# run from gm4_guidebook:lecterns/replace/update\n\n# update id score\nscoreboard players operation @e[type=marker,tag=gm4_guide_tracking,limit=1,distance=..0.5] gm4_guide_id = @s gm4_guide_id\n\n# start tracking page changes\ntag @e[type=marker,tag=gm4_guide_lectern,limit=1,distance=..0.5] add gm4_guide_tracking\nschedule function gm4_guidebook:lecterns/section/tracking 1t\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/tracking.mcfunction",
    "content": "# check for section changes\n# @s = none\n# located at world spawn\n# run from gm4_guidebook:lecterns/section/track\n\nexecute as @e[type=marker,tag=gm4_guide_tracking] at @s if block ~ ~ ~ lectern[has_book=true] run function gm4_guidebook:lecterns/section/check_page\n\nexecute if entity @e[type=marker,tag=gm4_guide_tracking,limit=1] run schedule function gm4_guidebook:lecterns/section/tracking 1t\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/next_section/find_player.mcfunction",
    "content": "# finds last player to open the lectern\n# @s = guide lectern marker\n# located at the center of the lectern\n# run from gm4_guidebook:lecterns/section/check_page/normal\n\n# execute as player, at block\nscoreboard players operation $current gm4_guide_id = @s gm4_guide_id\nexecute as @a[distance=..6] if score @s gm4_guide_id = $current gm4_guide_id run function gm4_guidebook:lecterns/section/update/next_section/jump\n\n# mark toc\ntag @s remove gm4_guide_toc\nexecute if score $trigger gm4_guide matches 1 run tag @s add gm4_guide_toc\n\n# store page count (minus 1)\nexecute store result score @s gm4_guide_pages run data get block ~ ~ ~ Book.components.\"minecraft:written_book_content\".pages\nscoreboard players remove @s gm4_guide_pages 1\n\n# clean up\nscoreboard players reset $trigger gm4_guide\nscoreboard players reset $trigger gm4_guide_next\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/next_section/find_section.mcfunction",
    "content": "# clears all sections before the current section (inclusive)\n# @s = player who last opened the lectern\n# located at the center of the lectern\n# run from gm4_guidebook:lecterns/section/update/next_section/jump\n# run from self\n\nexecute store result score $check gm4_guide_next run data get storage gm4_guidebook:temp triggers[0]\ndata remove storage gm4_guidebook:temp triggers[0]\nexecute unless score $check gm4_guide_next = $trigger gm4_guide_next if data storage gm4_guidebook:temp triggers[-1] run function gm4_guidebook:lecterns/section/update/next_section/find_section\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/next_section/jump.mcfunction",
    "content": "# finds next section to jump to \n# @s = player who last opened the lectern\n# located at the center of the lectern\n# run from gm4_guidebook:lecterns/section/update/next_section/find_player\n\n# get this trigger\nexecute store result score $trigger gm4_guide_next run data get block ~ ~ ~ Book.components.\"minecraft:custom_data\".gm4_guidebook.trigger\n\n# find section\ndata modify storage gm4_guidebook:temp triggers set from storage gm4_guidebook:register trigger_order\nexecute unless score $trigger gm4_guide_next matches 1 run function gm4_guidebook:lecterns/section/update/next_section/find_section\n## ^ special case: if it's TOC, get the first trigger\n\n# set guide score\nexecute store result score $trigger gm4_guide run data get storage gm4_guidebook:temp triggers[0]\n## special case: if this is the last section, just refresh the section\nexecute unless data storage gm4_guidebook:temp triggers[-1] run scoreboard players operation $trigger gm4_guide = $trigger gm4_guide_next\ndata remove storage gm4_guidebook:temp triggers\n\n# jump to section\nfunction gm4_guidebook:lecterns/update with storage gm4_guidebook:register\n\n# update page number\nexecute if score $trigger gm4_guide matches 1 run data modify block ~ ~ ~ Page set value 1\nexecute unless score $trigger gm4_guide matches 1 unless score $trigger gm4_guide = $trigger gm4_guide_next run data modify block ~ ~ ~ Page set value 5\nexecute unless score $trigger gm4_guide matches 1 if score $trigger gm4_guide = $trigger gm4_guide_next store result score $pages gm4_guide run data get block ~ ~ ~ Book.components.\"minecraft:written_book_content\".pages\nexecute unless score $trigger gm4_guide matches 1 if score $trigger gm4_guide = $trigger gm4_guide_next store result block ~ ~ ~ Page int 1 run scoreboard players remove $pages gm4_guide 2\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/prev_section/find_player.mcfunction",
    "content": "# finds last player to open the lectern\n# @s = guide lectern marker\n# located at the center of the lectern\n# run from gm4_guidebook:lecterns/section/check_page/normal\n\n# execute as player, at block\nscoreboard players operation $current gm4_guide_id = @s gm4_guide_id\nexecute as @a[distance=..6] if score @s gm4_guide_id = $current gm4_guide_id run function gm4_guidebook:lecterns/section/update/prev_section/jump\n\n# mark toc\ntag @s remove gm4_guide_toc\nexecute if score $trigger gm4_guide matches 1 run tag @s add gm4_guide_toc\n\n# store page count (minus 1) and update page number\nexecute store result score @s gm4_guide_pages run data get block ~ ~ ~ Book.components.\"minecraft:written_book_content\".pages\nscoreboard players remove @s gm4_guide_pages 1\n\n# clean up\nscoreboard players reset $trigger gm4_guide\nscoreboard players reset $trigger gm4_guide_prev\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/prev_section/find_section.mcfunction",
    "content": "# clears all sections before the current section (inclusive)\n# @s = player who last opened the lectern\n# located at the center of the lectern\n# run from gm4_guidebook:lecterns/section/update/prev_section/jump\n# run from self\n\nexecute store result score $check gm4_guide_prev run data get storage gm4_guidebook:temp triggers[-1]\ndata remove storage gm4_guidebook:temp triggers[-1]\nexecute unless score $check gm4_guide_prev = $trigger gm4_guide_prev if data storage gm4_guidebook:temp triggers[-1] run function gm4_guidebook:lecterns/section/update/prev_section/find_section\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/prev_section/jump.mcfunction",
    "content": "# finds previous section to jump to \n# @s = player who last opened the lectern\n# located at the center of the lectern\n# run from gm4_guidebook:lecterns/section/update/prev_section/find_player\n\n# get this trigger\nexecute store result score $trigger gm4_guide_prev run data get block ~ ~ ~ Book.components.\"minecraft:custom_data\".gm4_guidebook.trigger\n\n# find section\ndata modify storage gm4_guidebook:temp triggers set from storage gm4_guidebook:register trigger_order\nfunction gm4_guidebook:lecterns/section/update/prev_section/find_section\n\n# set guide score\nexecute store result score $trigger gm4_guide run data get storage gm4_guidebook:temp triggers[-1]\n## special case: if there's nothing before this, jump to TOC\nexecute unless data storage gm4_guidebook:temp triggers[-1] run scoreboard players set $trigger gm4_guide 1\ndata remove storage gm4_guidebook:temp triggers\n\n# jump to section\nfunction gm4_guidebook:lecterns/update with storage gm4_guidebook:register\n\n# update page number\nexecute if score $trigger gm4_guide matches 1 run data modify block ~ ~ ~ Page set value 1\nexecute unless score $trigger gm4_guide matches 1 unless score $page gm4_guide_pages matches 4 run data modify block ~ ~ ~ Page set value 5\nexecute unless score $trigger gm4_guide matches 1 if score $page gm4_guide_pages matches 4 store result score $pages gm4_guide run data get block ~ ~ ~ Book.components.\"minecraft:written_book_content\".pages\nexecute unless score $trigger gm4_guide matches 1 if score $page gm4_guide_pages matches 4 store result block ~ ~ ~ Page int 1 run scoreboard players remove $pages gm4_guide 2\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/refresh/find_player.mcfunction",
    "content": "# finds last player to open the lectern\n# @s = guide lectern marker\n# located at the center of the lectern\n# run from gm4_guidebook:lecterns/section/check_page/normal\n\n# execute as player, at block\nscoreboard players operation $current gm4_guide_id = @s gm4_guide_id\nexecute as @a[distance=..6] if score @s gm4_guide_id = $current gm4_guide_id run function gm4_guidebook:lecterns/section/update/refresh/jump\n\n# store page count (minus 1)\nexecute store result score @s gm4_guide_pages run data get block ~ ~ ~ Book.components.\"minecraft:written_book_content\".pages\nscoreboard players remove @s gm4_guide_pages 1\n\n# clean up\nscoreboard players reset $trigger gm4_guide\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/refresh/jump.mcfunction",
    "content": "# updates the book\n# @s = player who last opened the lectern\n# located at the center of the lectern\n# run from gm4_guidebook:lecterns/section/update/refresh/find_player\n\n# get guide score\nexecute store result score $trigger gm4_guide run data get block ~ ~ ~ Book.components.\"minecraft:custom_data\".gm4_guidebook.trigger\n\n# jump to section\nfunction gm4_guidebook:lecterns/update with storage gm4_guidebook:register\n\n# update page number\nexecute store result block ~ ~ ~ Page int 1 run scoreboard players get $original_page gm4_guide_pages\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/toc/jump.mcfunction",
    "content": "# jumps to toc\n# @s = guide lectern marker\n# located at the center of the lectern\n# run from gm4_guidebook:lecterns/section/check_page/normal\n\n# jump to section\nscoreboard players set $trigger gm4_guide 1\nfunction gm4_guidebook:lecterns/update with storage gm4_guidebook:register\n\n# store page count (minus 1)\nexecute store result score @s gm4_guide_pages run data get block ~ ~ ~ Book.components.\"minecraft:written_book_content\".pages\nscoreboard players remove @s gm4_guide_pages 1\n\n# update page number\ndata modify block ~ ~ ~ Page set value 1\n\n# mark toc\ntag @s add gm4_guide_toc\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/lecterns/update.mcfunction",
    "content": "# replaces the lectern with a new book\n# @s = player that last opened the lectern\n# at the lectern\n# run from gm4_guidebook:lecterns/replace/update\n# run from gm4_guidebook:lecterns/section/update/*/jump\n# run from gm4_guidebook:lecterns/section/toc/jump\n\n# replace book\n## short-circuit if it's the table of contents\n$execute if score $trigger gm4_guide matches 1 run return run data modify block ~ ~ ~ Book.components merge value {\"minecraft:written_book_content\":{\"pages\":$(lectern_toc),\"title\":\"Gamemode 4 Guidebook\",\"author\":\"Unknown\",\"generation\":3},\"minecraft:custom_data\":{gm4_guidebook:{lectern:1b,trigger:1}}}\n\n## get unlocked pages\nexecute store result storage gm4_guidebook:temp book.trigger int 1 run scoreboard players get $trigger gm4_guide\nfunction gm4_guidebook:player_db/get_trigger_name with storage gm4_guidebook:temp book\ndata modify storage gm4_guidebook:temp book.uuid set from entity @s UUID\nfunction gm4_guidebook:lecterns/get_pages with storage gm4_guidebook:temp book\n\n# update book\nfunction gm4_guidebook:lecterns/populate with storage gm4_guidebook:temp book\ndata remove storage gm4_guidebook:temp book\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/main.mcfunction",
    "content": "schedule function gm4_guidebook:main 16t\n\n# give random zombie villagers the guidebook\nexecute as @e[type=zombie_villager,tag=!gm4_guidebook_checked,predicate=gm4_guidebook:chance_zombie_villager,nbt={PersistenceRequired:0b}] unless items entity @s weapon.* * unless data entity @s Gossips run function gm4_guidebook:get_book/zombie_villager with storage gm4_guidebook:register\ntag @e[type=zombie_villager,tag=!gm4_guidebook_checked] add gm4_guidebook_checked\n\n# process lectern markers\nexecute as @e[type=marker,tag=gm4_guide_lectern] at @s run function gm4_guidebook:lecterns/process\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/player_db/get_trigger_name.mcfunction",
    "content": "# gets the module name based on the trigger number\n# @s = player that triggers gm4_guide\n# at @s\n# run from gm4_guidebook:hand/update\n# and from gm4_guidebook:lectern/update\n\n$data modify storage gm4_guidebook:temp book.name set from storage gm4_guidebook:register trigger_map.$(trigger).name\n$data modify storage gm4_guidebook:temp book.load set from storage gm4_guidebook:register trigger_map.$(trigger).load\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/player_db/setup.mcfunction",
    "content": "# create a player db entry for this player and module\n# @s = player that is being initialized\n# at @s\n# run from gm4_guidebook:hand/get_pages\n# and from gm4_guidebook:player_db/update\n\n# create an entry for this player and module\n$data modify storage gm4_guidebook:register player_pages.\"$(uuid)\".$(name).hand set from storage gm4_guidebook:register pages.$(name).hand.initial\n$data modify storage gm4_guidebook:register player_pages.\"$(uuid)\".$(name).lectern set from storage gm4_guidebook:register pages.$(name).lectern.initial\n\n# find any previously unlocked pages\n$function gm4_guidebook:$(name)/init_player_db\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/player_db/update.mcfunction",
    "content": "# create a player db entry for this player and module\n# @s = player that is being updated\n# at @s\n# and from gm4_guidebook:<MODULE_NAME>/rewards/unlock/*\n\n# create if necessary (also populates unlocked pages)\n$execute unless data storage gm4_guidebook:register player_pages.\"$(uuid)\".$(name) run return run function gm4_guidebook:player_db/setup with storage gm4_guidebook:temp unlocking\n\n# populate unlocked page\n$data modify storage gm4_guidebook:register player_pages.\"$(uuid)\".$(name).hand[$(target_page)] set from storage gm4_guidebook:register pages.$(name).hand.unlockable.$(source_page)\n$data modify storage gm4_guidebook:register player_pages.\"$(uuid)\".$(name).lectern[$(lectern_target_page)] set from storage gm4_guidebook:register pages.$(name).lectern.unlockable.$(source_page)\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/tick.mcfunction",
    "content": "schedule function gm4_guidebook:tick 1t\n\n# if a player is holding the guidebook, turn off minecraft:send_command_feedback\nexecute if score $sendCommandFeedback gm4_guide_config matches 1 run gamerule send_command_feedback true\nexecute if score $forceCommandFeedback gm4_guide_config matches 0 if entity @a[predicate=gm4_guidebook:holding_book,limit=1] run gamerule send_command_feedback false\n\n# jump to prev section\nexecute as @a[scores={gm4_guide_prev=1..}] run function gm4_guidebook:hand/prev_section/search\n\n# jump to next section\nexecute as @a[scores={gm4_guide_next=1..}] run function gm4_guidebook:hand/next_section/search\n\n# jump to section\nexecute as @a[scores={gm4_guide=1..},predicate=gm4_guidebook:holding_book] run function gm4_guidebook:hand/update with storage gm4_guidebook:register\n\n# reset triggers\nscoreboard players reset @a gm4_guide_prev\nscoreboard players reset @a gm4_guide_next\nscoreboard players reset @a gm4_guide\nscoreboard players enable @a gm4_guide_prev\nscoreboard players enable @a gm4_guide_next\nscoreboard players enable @a gm4_guide\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/update_storage/add_base.mcfunction",
    "content": "# adds the base module to the table of contents array, with its expansion packs following\n# @s = none\n# located at world spawn\n# run from gm4_guidebook:update_storage/build_line\n\n# add expansions to go directly under this\ndata modify storage gm4_guidebook:temp check_expansions set from storage gm4_guidebook:temp expansions\nscoreboard players operation $expansions gm4_guide = $expansion_count gm4_guide\nfunction gm4_guidebook:update_storage/find_expansions\n\n# clean up\ndata remove storage gm4_guidebook:temp check_expansions\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/update_storage/add_to_toc.mcfunction",
    "content": "$data modify storage gm4_guidebook:register front_matter append value {raw:$(page_content)}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/update_storage/build_line.mcfunction",
    "content": "# builds each line of each page of the table of contents\n# @s = none\n# located at world spawn\n# run from gm4_guidebook:update_storage/build_page\n# run from self\n\n# add expansions to module list\ndata modify storage gm4_guidebook:temp module set from storage gm4_guidebook:temp modules[-1]\nexecute if data storage gm4_guidebook:temp module{type:\"base\"} run function gm4_guidebook:update_storage/add_base\n\n# add line\nexecute store result score $trigger gm4_guide run data get storage gm4_guidebook:temp module.trigger\nexecute store result score $lines gm4_guide run data get storage gm4_guidebook:temp module.line_count\nfunction #gm4_guidebook:add_toc_line\nscoreboard players operation $line_count gm4_guide += $lines gm4_guide\n\n# store module in permanent storage\ndata modify storage gm4_guidebook:register trigger_order append from storage gm4_guidebook:temp module.trigger\n\n# store for lectern toc\ndata modify storage gm4_guidebook:temp lectern_page append from storage gm4_guidebook:temp module.toc_line\n\n# loop until this page is full or there's no more modules\ndata remove storage gm4_guidebook:temp modules[-1]\ndata remove storage gm4_guidebook:temp module\nscoreboard players remove $module_count gm4_guide 1\nexecute unless score $line_count gm4_guide matches 13.. if score $module_count gm4_guide matches 1.. run function gm4_guidebook:update_storage/build_line\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/update_storage/build_page.mcfunction",
    "content": "# builds each page of the table of contents\n# @s = none\n# located at world spawn\n# run from gm4_guidebook:update_storage/build_toc\n# run from self\n\n# build lines\nscoreboard players set $line_count gm4_guide 2\ndata merge storage gm4_guidebook:temp {page:[[\"\",{\"translate\":\"gui.gm4.guidebook.page.toc\",\"fallback\":\"\",\"color\":\"white\",\"font\":\"gm4:guidebook\"}]],lectern_page:[]}\nfunction gm4_guidebook:update_storage/build_line\nexecute if score $line_count gm4_guide matches 2 run return 1\n\n# add table of contents page\ndata modify block 29999998 1 7133 front_text.messages[0] set value {\"nbt\":\"page[]\",\"storage\":\"gm4_guidebook:temp\",\"interpret\":true,\"separator\":{\"text\":\"\\n\",\"color\":\"white\"}}\ndata modify storage gm4_guidebook:temp page_content set from block 29999998 1 7133 front_text.messages[0]\nfunction gm4_guidebook:update_storage/add_to_toc with storage gm4_guidebook:temp\n\n# store (unfinished) lectern toc page\ndata modify storage gm4_guidebook:temp lectern_pages append from storage gm4_guidebook:temp lectern_page\nscoreboard players add $front_matter gm4_guide_pages 1\n\n# loop for all modules\nexecute if score $module_count gm4_guide matches 1.. run function gm4_guidebook:update_storage/build_page\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/update_storage/build_toc.mcfunction",
    "content": "# builds the stored table of contents\n# @s = none\n# located at world spawn\n# run from gm4_guidebook:update_storage/setup_markers\n\n# get all module data\ndata merge storage gm4_guidebook:temp {modules:[],expansions:[]}\nexecute positioned ~ 0 ~ as @e[type=marker,tag=gm4_guide,sort=furthest] run data modify storage gm4_guidebook:temp modules append from entity @s data\nexecute store result score $module_count gm4_guide run data get storage gm4_guidebook:temp modules\n# separate expansions into their own list\ndata modify storage gm4_guidebook:temp expansions append from storage gm4_guidebook:temp modules[{type:\"expansion\"}]\ndata remove storage gm4_guidebook:temp modules[{type:\"expansion\"}]\nexecute store result score $expansion_count gm4_guide run data get storage gm4_guidebook:temp expansions\n\n# build pages\nscoreboard players operation $front_matter gm4_guide_pages = #intro gm4_guide_pages\ndata modify storage gm4_guidebook:temp prev_trigger_order set from storage gm4_guidebook:register trigger_order\ndata merge storage gm4_guidebook:register {trigger_order:[],lectern_toc:[[\"\",{\"translate\":\"gui.gm4.guidebook.page.toc\",\"fallback\":\"\",\"color\":\"white\",\"font\":\"gm4:guidebook\"}],[\"\",{\"translate\":\"gui.gm4.guidebook.page.intro\",\"fallback\": \"\",\"color\": \"white\",\"font\": \"gm4:guidebook\"},{\"translate\":\"text.gm4.guidebook.introduction\",\"fallback\":\"Introduction\",\"underlined\":true},{\"text\":\"\\n\\n\"},{\"translate\":\"text.gm4.guidebook.letter\",\"fallback\":\"This is a world unlike others. It appears that certain things work...differently to say the least.\\n\\nThis book will document discoveries regarding these new mechanics.\"},{\"text\":\"\\n\\n> \",\"color\":\"#4AA0C7\"},{\"translate\":\"text.gm4.guidebook.refresh_findings\",\"fallback\":\"Refresh Findings\",\"color\":\"#4AA0C7\",\"hover_event\":{\"action\":\"show_text\",\"value\":[{\"translate\":\"text.gm4.guidebook.refresh_toc\",\"fallback\":\"Refresh Table of Contents\",\"color\":\"gold\"}]},\"click_event\":{\"action\":\"change_page\",\"page\":1}}]]}\ndata merge storage gm4_guidebook:temp {lectern_pages:[],toc_back:[]}\nfunction gm4_guidebook:update_storage/build_page\n\n# build lectern toc pages\nscoreboard players operation $click gm4_guide_pages = $front_matter gm4_guide_pages\nexecute store result storage gm4_guidebook:temp click int 1 run scoreboard players add $click gm4_guide_pages 2\nfunction gm4_guidebook:update_storage/lectern/build_page\ndata modify storage gm4_guidebook:register lectern_toc append from storage gm4_guidebook:temp toc_back[]\n\n# check if modules changed\nscoreboard players set $updated gm4_guide 0\nexecute store success score $updated gm4_guide run data modify storage gm4_guidebook:temp prev_trigger_order set from storage gm4_guidebook:register trigger_order\nexecute if score $updated gm4_guide matches 1 run data remove storage gm4_guidebook:register player_pages\n\n# clean up\ndata remove storage gm4_guidebook:temp modules\ndata remove storage gm4_guidebook:temp expansions\ndata remove storage gm4_guidebook:temp toc_back\ndata remove storage gm4_guidebook:temp lectern_pages\ndata remove storage gm4_guidebook:temp prev_trigger_order\ndata remove storage gm4_guidebook:temp click\nscoreboard players reset $trigger gm4_guide\nkill @e[type=marker,tag=gm4_guide]\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/update_storage/find_expansions.mcfunction",
    "content": "# finds expansions matching the base module\n# @s = none\n# located at world spawn\n# run from gm4_guidebook:update_storage/add_base\n# run from self\n\n# check if the expansion matches the base\ndata modify storage gm4_guidebook:temp expansion set from storage gm4_guidebook:temp check_expansions[0]\nscoreboard players set $unmatching gm4_guide 1\nexecute store success score $unmatching gm4_guide run data modify storage gm4_guidebook:temp expansion.base set from storage gm4_guidebook:temp module.id\n\n# insert expansion into the modules list\nexecute unless score $unmatching gm4_guide matches 1 run data modify storage gm4_guidebook:temp modules insert -2 from storage gm4_guidebook:temp expansion\n\n# loop for all expansions\ndata remove storage gm4_guidebook:temp check_expansions[0]\ndata remove storage gm4_guidebook:temp expansion\nscoreboard players remove $expansions gm4_guide 1\nexecute if score $expansions gm4_guide matches 1.. run function gm4_guidebook:update_storage/find_expansions\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/update_storage/lectern/build_line.mcfunction",
    "content": "# builds each line of each page of the lectern table of contents\n# @s = none\n# located at world spawn\n# run from gm4_guidebook:update_storage/lectern/build_page\n# run from self\n\n# find proper click event\nfunction gm4_guidebook:update_storage/lectern/click_event with storage gm4_guidebook:temp\ndata modify storage gm4_guidebook:temp page append from block 29999998 1 7133 front_text.messages[0]\n\n# add blank page for each module\ndata modify storage gm4_guidebook:temp toc_back append value [\"\\n\\n\",{\"translate\":\"gui.gm4.guidebook.page\",\"fallback\":\"\",\"color\":\"white\",\"font\":\"gm4:guidebook\"}]\n\n# check the next module\nexecute store result storage gm4_guidebook:temp click int 1 run scoreboard players add $click gm4_guide_pages 1\ndata remove storage gm4_guidebook:temp lectern_pages[0][0]\nexecute if data storage gm4_guidebook:temp lectern_pages[0][-1] run function gm4_guidebook:update_storage/lectern/build_line\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/update_storage/lectern/build_page.mcfunction",
    "content": "# builds each page of the lectern table of contents\n# @s = none\n# located at world spawn\n# run from gm4_guidebook:update_storage/build_toc\n# run from self\n\n# build module lines\ndata merge storage gm4_guidebook:temp {page:[[\"\",{\"translate\":\"gui.gm4.guidebook.page.toc\",\"fallback\":\"\",\"color\":\"white\",\"font\":\"gm4:guidebook\"}]]}\nfunction gm4_guidebook:update_storage/lectern/build_line\n\n# add table of contents page\ndata modify block 29999998 1 7133 front_text.messages[0] set value {\"nbt\": \"page[]\",\"storage\": \"gm4_guidebook:temp\",\"interpret\": True,\"separator\":\"\\n\"}\ndata modify storage gm4_guidebook:register lectern_toc append from block 29999998 1 7133 front_text.messages[0]\n\n# loop for all modules\ndata remove storage gm4_guidebook:temp lectern_pages[0]\nexecute if data storage gm4_guidebook:temp lectern_pages[-1] run function gm4_guidebook:update_storage/lectern/build_page\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/update_storage/lectern/click_event.mcfunction",
    "content": "# build the line with the proper click event\n# @s = none\n# located at world spawn\n# run from gm4_guidebook:update_storage/lectern/build_line\n\n$data modify block 29999998 1 7133 front_text.messages[0] set value {\"nbt\":\"lectern_pages[0][0]\",\"storage\":\"gm4_guidebook:temp\",\"color\":\"#4AA0C7\",\"click_event\":{\"action\":\"change_page\",\"page\":$(click)},\"hover_event\":{\"action\":\"show_text\",\"value\":[{\"translate\":\"text.gm4.guidebook.jump_to_section\",\"fallback\":\"Jump to Section\",\"color\":\"gold\"}]}}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/update_storage/mark_ready.mcfunction",
    "content": "# marks the module ready for advancements to be granted\n# @s = none\n# located at world spawn\n# run from gm4_guidebook:init\n\nscoreboard players set $ready gm4_guide 1\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/function/update_storage/setup_markers.mcfunction",
    "content": "# prepares the guide markers\n# @s = none\n# located at world spawn\n# run from gm4_guidebook:init\n\n# summon markers\nkill @e[type=marker,tag=gm4_guide]\nfunction #gm4_guidebook:summon_marker\n\n# sort all tags\nschedule function gm4_guidebook:update_storage/build_toc 1t\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/loot_table/items/guidebook.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:written_book\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_guidebook:item/guidebook\"]},\n                \"minecraft:written_book_content\": {\n                  \"pages\": [\n                    [\"\",{\"translate\":\"gui.gm4.guidebook.page.intro\",\"fallback\": \"\",\"color\": \"white\",\"font\": \"gm4:guidebook\"},{\"translate\":\"text.gm4.guidebook.introduction\",\"fallback\":\"Introduction\",\"underlined\":true},{\"text\":\"\\n\\n\"},{\"translate\":\"text.gm4.guidebook.letter\",\"fallback\":\"This is a world unlike others. It appears that certain things work...differently to say the least.\\n\\nThis book will document discoveries regarding these new mechanics.\"},{\"text\":\"\\n\\n> \",\"color\":\"#4AA0C7\"},{\"translate\":\"text.gm4.guidebook.refresh_findings\",\"fallback\":\"Refresh Findings\",\"color\":\"#4AA0C7\",\"hover_event\":{\"action\":\"show_text\",\"value\":[{\"translate\":\"text.gm4.guidebook.refresh_toc\",\"fallback\":\"Refresh Table of Contents\",\"color\":\"gold\"}]},\"click_event\":{\"action\":\"run_command\",\"command\":\"/trigger gm4_guide set 1\"}}]\n                  ],\n                  \"title\": \"Gamemode 4 Guidebook\",\n                  \"author\": \"Unknown\",\n                  \"generation\": 3\n                }\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_guidebook:{lectern:0b,trigger:1}}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"text.gm4.guidebook.title\",\n                \"fallback\": \"Gamemode 4 Guidebook\"\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/loot_table/technical/guidebook_with_count.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_guidebook:items/guidebook\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"type\": \"minecraft:score\",\n                \"target\": {\n                  \"type\": \"minecraft:fixed\",\n                  \"name\": \"$count\"\n                },\n                \"score\": \"gm4_guide\"\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/predicate/book_in_mainhand.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:written_book\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_guidebook:{}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/predicate/book_in_offhand.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:inverted\",\n    \"term\": {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"items\": [\n              \"minecraft:written_book\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_guidebook:{}}\"\n            }\n          }\n        }\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n      \"equipment\": {\n        \"offhand\": {\n          \"items\": [\n            \"minecraft:written_book\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_guidebook:{}}\"\n          }\n        }\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/predicate/chance_chest.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.45\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/predicate/chance_zombie_villager.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.2\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/predicate/holding_book.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"weapon.*\": {\n        \"items\": [\n          \"minecraft:written_book\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_guidebook:{}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/predicate/lectern_contents.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_guidebook:{lectern:1b}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/tags/function/add_toc_line.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/tags/function/setup_storage.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/tags/function/summon_marker.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/tags/function/update_hand.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "gm4_guidebook/data/gm4_guidebook/tags/function/update_lectern.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "gm4_guidebook/generate_guidebooks.py",
    "content": "import colorsys\nimport json\nimport logging\nimport os\nimport sys\nfrom typing import Any, ClassVar, Literal, Optional, cast\nfrom pathlib import Path\n\nimport nbtlib  # type: ignore ; missing stub file\nfrom beet import (\n    Advancement,\n    Context,\n    DataPack,\n    FileDeserialize,\n    Function,\n    JsonFile,\n    JsonFileBase,\n    Model,\n    NamespaceContainer,\n    NamespaceFileScope,\n    PngFile,\n    Texture,\n)\nfrom beet.contrib.vanilla import Vanilla\nfrom beet.core.utils import TextComponent\nfrom PIL import Image, ImageDraw\nfrom pydantic import BaseModel\n\nlogger = logging.getLogger(__name__)\n\n# TODO:\n# merge some functions to reduce fuction call overhead\n\nDEFAULT_COLORS = {\n  \"minecraft:leather_boots\": 10511680,\n  \"minecraft:leather_chestplate\": 10511680,\n  \"minecraft:leather_helmet\": 10511680,\n  \"minecraft:leather_leggings\": 10511680\n}\n\nDEFAULT_OVERLAY_COLORS = {\n  \"empty\": 0\n}\n\nIS_DYED = [\n  \"minecraft:leather_boots\",\n  \"minecraft:leather_chestplate\",\n  \"minecraft:leather_helmet\",\n  \"minecraft:leather_leggings\",\n  \"minecraft:leather_horse_armor\",\n  \"minecraft:wolf_armor\"\n]\n\nOVERLAY_DYED = [\n  \"minecraft:firework_star\",\n  \"minecraft:filled_map_markings\",\n  \"minecraft:potion\",\n  \"minecraft:spawn_egg\",\n  \"minecraft:tipped_arrow\" # note: the texture file is tipped_arrow_head\n]\n\nclass Section(BaseModel):\n  name: str\n  pages: list[TextComponent]\n  enable: list[dict[str, int|str]]\n  requirements: list[list[str]]\n  prerequisites: list[str] = []\n  grants: list[str] = []\n\n\nclass Icon(BaseModel):\n  id: str\n  components: Optional[dict[str, Any]] = None\n\n\nclass Book(BaseModel):\n  id: str\n  name: str\n  module_type: Literal[\"expansion\", \"base\", \"module\"]\n  load_check: Optional[str] = None\n  base_module: Optional[str] = None\n  icon: Icon\n  criteria: dict[str, dict[Any, Any]]\n  sections: list[Section]\n  trigger_id: int = -1 # value set by triggers.json\n  description: Optional[str] = None\n  wiki_link: Optional[str] = None\n\nclass GuidebookPages(JsonFileBase[Book]):\n  \"\"\"defines a custom beet filetype for guidebook pages\"\"\"\n  scope: ClassVar[NamespaceFileScope] = (\"guidebook\",)\n  extension: ClassVar[str] = \".json\"\n  data: ClassVar[FileDeserialize[Book]] = FileDeserialize()\n  model = Book # tell beet to parse this file using the Book data model\n\n\ndef load_page_data(ctx: Context):\n  \"\"\"registers guidebook files with the beet file loader\"\"\"\n  ctx.data.extend_namespace.append(GuidebookPages)\n  yield\n  ctx.data[GuidebookPages].clear()\n\n\ndef beet_default(ctx: Context):\n  if not ctx.data[GuidebookPages]:\n    return # there are no pages configured\n\n  generate_files(ctx, ctx.data)\n\n  if ctx.data.overlays:\n    for d in ctx.data.overlays.values():\n      if not d[GuidebookPages]:\n        continue\n      generate_files(ctx, d, True)\n\n\n\"\"\"\nparse guidebook file and generate all files\n\"\"\"\ndef generate_files(ctx:Context, d: DataPack, overlay: bool = False):\n  for book in [b.data for b in d[GuidebookPages].values()]:\n\n    # get trigger id, generate one if not already existing\n    triggers_file = JsonFile(source_path=\"gm4_guidebook/triggers.json\")\n    triggers = triggers_file.data\n\n    if book.id not in triggers:\n        if os.getenv(\"GITHUB_ACTIONS\"):\n          logger.error(\"Github Actions cannot add guidebook triggers. Run the build locally and commit changes to gm4_guidebook/triggers.json\")\n          sys.exit(1) # quit the build and mark the github action as failed\n\n        triggers[book.id] = triggers['__next__']\n        triggers['__next__'] += 1\n        triggers_file.data = dict(sorted(triggers.items()))\n        triggers_file.dump(origin=\"\", path=\"gm4_guidebook/triggers.json\")\n    book.trigger_id = triggers[book.id]\n\n    # get description\n    if not book.description:\n      book.description = ctx.meta[\"gm4\"][\"website\"][\"description\"] if \"website\" in ctx.meta[\"gm4\"] else \"\"\n\n    # get load check\n    if not book.load_check:\n      book.load_check = book.id\n    if \"gm4_\" not in book.load_check:\n      book.load_check = f\"gm4_{book.load_check}\"\n\n    # get wiki link\n    if not book.wiki_link:\n      book.wiki_link = ctx.meta['gm4']['wiki'] if \"wiki\" in ctx.meta[\"gm4\"] else \"https://wiki.gm4.co\"\n\n    # add functions to datapack\n    d[f\"gm4_guidebook:{book.id}/add_toc_line\"] = generate_add_toc_line_function(book, overlay)\n    d[f\"gm4_guidebook:{book.id}/setup_storage\"] = generate_setup_storage_function(book, ctx, overlay)\n    d[f\"gm4_guidebook:{book.id}/summon_marker\"] = generate_summon_marker_function(book, overlay)\n    d[f\"gm4_guidebook:{book.id}/init_player_db\"] = generate_init_player_db_function(book, overlay)\n\n    # add advancements (and corresponding unlock functions) to datapack\n    d[\"gm4_guidebook:root\"] = root_advancement()\n    page_index: int = 0\n    load_map: dict[str,int] = {}\n    for index, section in enumerate(book.sections):\n      if (advancement := generate_advancement(book, index)) is not None:\n        d[f\"gm4_guidebook:{book.id}/unlock/{section.name}\"] = advancement\n        d[f\"gm4_guidebook:{book.id}/display/{section.name}\"] = generate_display_advancement(book, ctx.project_id)\n        d[f\"gm4_guidebook:{book.id}/rewards/{section.name}\"] = generate_reward_function(\n          section, book.id, book.name, book.description)\n        d[f\"gm4_guidebook:{book.id}/rewards/unlock/{section.name}\"], page_index, load_map = generate_unlock_function(\n          section, book.id, page_index, load_map)\n      else:\n        page_index += 1\n\n    # register and create advancement icons to resource pack\n    if d is ctx.data: # don't run for overlays - its not needed\n      ctx.meta['gm4'].setdefault('model_data',[]).append({\n        \"template\": \"custom\",\n        \"reference\": f\"{ctx.project_id}:guidebook_icon/{book.id}\",\n        \"item\": book.icon.id.removeprefix(\"minecraft:\"),\n      })\n      ctx.assets[f\"{ctx.project_id}:guidebook_icon/{book.id}\"] = generate_toast_model(book, ctx)\n\n  d[GuidebookPages].clear()\n\n\n\"\"\"\nAlphabetical hash to convert the name of the module into a float\n\"\"\"\ndef get_pos_hash(module_id: str):\n  # ignore the underscores\n  id = module_id.replace(\"_\", \"\")\n  n:list[int] = []\n  # get number for each character (ascii -> int)\n  for l in id:\n    n.append(ord(l) - 96) # ascii A = 96, int A = 0\n  while len(n) < 11:\n    n.append(0)\n  # alphabetical hash\n  id = sum(n[i] * (27 ** (10 - i)) for i in range(11)) / 1000000000000\n  return id\n\n\n\n\"\"\"\nGenerates the book's header for the player's hand\n\"\"\"\ndef generate_book_header(book: Book) -> list[dict[Any, Any]|str]:\n  # header JSON\n  header: list[dict[Any, Any]|str] = [\n    \"\",\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \"↖⌂ \",\n          \"color\": \"#3D83A3\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.toc\",\n          \"fallback\": \"↖⌂ \",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"run_command\",\n        \"command\": \"/trigger gm4_guide set 1\"\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.return_to_toc\",\n          \"fallback\": \"Return to the table of contents\"\n        }\n      }\n    },\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \" Ⓦ \",\n          \"color\": \"#864bc7\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.wiki\",\n          \"fallback\": \" Ⓦ \",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"open_url\",\n        \"url\": book.wiki_link\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.open_wiki\",\n          \"fallback\": \"Open the wiki page for this module\"\n        }\n      }\n    },\n    \" \" * 8,\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \" ⟳ \",\n          \"bold\": True,\n          \"color\": \"dark_green\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.refresh\",\n          \"fallback\": \" Ⓦ \",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"run_command\",\n        \"command\": f\"/trigger gm4_guide set {book.trigger_id}\"\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.refresh\",\n          \"fallback\": \"Refresh section\"\n        }\n      }\n    },\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\":  \" ◀ \"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.prev\",\n          \"fallback\": \" ◀ \",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"run_command\",\n        \"command\": f\"/trigger gm4_guide_prev set {book.trigger_id}\"\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.prev\",\n          \"fallback\": \"Go to the previous module\"\n        }\n      }\n    },\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \" ▶ \"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.next\",\n          \"fallback\": \" ▶ \",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"run_command\",\n        \"command\": f\"/trigger gm4_guide_next set {book.trigger_id}\"\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.next\",\n          \"fallback\": \"Go to the next module\"\n        }\n      }\n    },\n    \"\\n\",\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \" ↖⌂\",\n          \"color\": \"#fcfcf0\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.toc.under\",\n          \"fallback\": \" ↖⌂\",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"run_command\",\n        \"command\": \"/trigger gm4_guide set 1\"\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.return_to_toc\",\n          \"fallback\": \"Return to the table of contents\"\n        }\n      }\n    },\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \"  Ⓦ\",\n          \"color\": \"#fcfcf0\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.wiki.under\",\n          \"fallback\": \"  Ⓦ\",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"open_url\",\n        \"url\": book.wiki_link\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.open_wiki\",\n          \"fallback\": \"Open the wiki page for this module\"\n        }\n      }\n    },\n    \" \" * 8,\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \"  ⟳\",\n          \"bold\": True,\n          \"color\": \"#fcfcf0\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.refresh.under\",\n          \"fallback\": \"  ⟳\",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"run_command\",\n        \"command\": f\"/trigger gm4_guide set {book.trigger_id}\"\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.refresh\",\n          \"fallback\": \"Refresh section\"\n        }\n      }\n    },\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \"  ◀\",\n          \"color\": \"#fcfcf0\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.prev.under\",\n          \"fallback\": \"  ◀\",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"run_command\",\n        \"command\": f\"/trigger gm4_guide_prev set {book.trigger_id}\"\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.prev\",\n          \"fallback\": \"Go to the previous module\"\n        }\n      }\n    },\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \"  ▶\",\n          \"color\": \"#fcfcf0\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.next.under\",\n          \"fallback\": \"  ▶\",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"run_command\",\n        \"command\": f\"/trigger gm4_guide_next set {book.trigger_id}\"\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.next\",\n          \"fallback\": \"Go to the next module\"\n        }\n      }\n    },\n    \"\\n\",\n    {\n      \"translate\": \"gui.gm4.guidebook.page\",\n      \"fallback\": \"\",\n      \"color\": \"white\",\n      \"font\": \"gm4:guidebook\"\n    }\n  ]\n  return header\n\n\n\n\"\"\"\nGenerates the book's header for the lectern\ndifference is change_page vs run_command click events\n\"\"\"\ndef generate_lectern_header(book: Book) -> list[dict[Any, Any]|str]:\n  # header JSON\n  header: list[dict[Any, Any]|str] = [\n    \"\",\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \"↖⌂ \",\n          \"color\": \"#3D83A3\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.toc\",\n          \"fallback\": \"↖⌂ \",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"change_page\",\n        \"page\": 2\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.return_to_toc\",\n          \"fallback\": \"Return to the table of contents\"\n        }\n      }\n    },\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \" Ⓦ \",\n          \"color\": \"#864bc7\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.wiki\",\n          \"fallback\": \" Ⓦ \",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"open_url\",\n        \"url\": book.wiki_link\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.open_wiki\",\n          \"fallback\": \"Open the wiki page for this module\"\n        }\n      }\n    },\n    \" \" * 8,\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \" ⟳ \",\n          \"bold\": True,\n          \"color\": \"dark_green\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.refresh\",\n          \"fallback\": \" ⟳ \",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"change_page\",\n        \"page\": 3\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.refresh\",\n          \"fallback\": \"Refresh section\"\n        }\n      }\n    },\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \" ◀ \"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.prev\",\n          \"fallback\": \" ◀ \",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"change_page\",\n        \"page\": 4\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.prev\",\n          \"fallback\": \"Go to the previous module\"\n        }\n      }\n    },\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \" ▶ \"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.next\",\n          \"fallback\": \" ▶ \",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"change_page\",\n        \"page\": 1\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.next\",\n          \"fallback\": \"Go to the next module\"\n        }\n      }\n    },\n    \"\\n\",\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \" ↖⌂\",\n          \"color\": \"#fcfcf0\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.toc.under\",\n          \"fallback\": \" ↖⌂\",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"change_page\",\n        \"page\": 2\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.return_to_toc\",\n          \"fallback\": \"Return to the table of contents\"\n        }\n      }\n    },\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \"  Ⓦ\",\n          \"color\": \"#fcfcf0\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.wiki.under\",\n          \"fallback\": \"  Ⓦ\",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"open_url\",\n        \"url\": book.wiki_link\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.open_wiki\",\n          \"fallback\": \"Open the wiki page for this module\"\n        }\n      }\n    },\n    \" \" * 8,\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \"  ⟳\",\n          \"bold\": True,\n          \"color\": \"#fcfcf0\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.refresh.under\",\n          \"fallback\": \"  ⟳\",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"change_page\",\n        \"page\": 3\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.refresh\",\n          \"fallback\": \"Refresh section\"\n        }\n      }\n    },\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \"  ◀\",\n          \"color\": \"#fcfcf0\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.prev.under\",\n          \"fallback\": \"  ◀\",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"change_page\",\n        \"page\": 4\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.prev\",\n          \"fallback\": \"Go to the previous module\"\n        }\n      }\n    },\n    {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \"  ▶\",\n          \"color\": \"#fcfcf0\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.header.next.under\",\n          \"fallback\": \"  ▶\",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"click_event\": {\n        \"action\": \"change_page\",\n        \"page\": 1\n      },\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.next\",\n          \"fallback\": \"Go to the next module\"\n        }\n      }\n    },\n    \"\\n\",\n    {\n      \"translate\": \"gui.gm4.guidebook.page\",\n      \"fallback\": \"\",\n      \"color\": \"white\",\n      \"font\": \"gm4:guidebook\"\n    }\n  ]\n  return header\n\n\n\"\"\"\nReads a vanilla item and creates a JSON text component to display the item in the guidebook\n\"\"\"\ndef item_to_display(item: str, components: dict[str, Any] | None, ctx: Context) -> tuple[TextComponent, TextComponent]:\n  vanilla = ctx.inject(Vanilla)\n  vanilla.minecraft_version = '26.1'\n  if item == \"air\":\n    # show empty slot\n    slot = {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \" ☐ \"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.crafting.display.empty_slot\",\n          \"fallback\": \" ☐ \",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ]\n    }\n    slot_under = {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \"  ☐\",\n          \"color\": \"#fcfcf0\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.crafting.display.empty_slot.under\",\n          \"fallback\": \"  ☐\",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ]\n    }\n    return slot, slot_under\n\n  color = get_texture_color(intuit_item_texture(item, vanilla))\n  # TODO 26.1\n  slot: dict[Any, Any] = {\n    \"translate\": \"gm4.second\",\n    \"fallback\": \"%1$s\",\n    \"with\": [\n      {\n        \"text\": \" ☒ \",\n        \"color\": color\n      },\n      [\n        {\n          \"translate\": f\"gui.gm4.guidebook.crafting.display.{item.replace(':','.')}\",\n          \"fallback\": \" ☒ \",\n          \"color\": f\"#{format(16777215, 'x')}\",\n          \"font\": \"gm4:guidebook\"\n        },\n        {\n          \"translate\": f\"gui.gm4.guidebook.crafting.display.overlay.{item.replace(':','.')}\",\n          \"fallback\": \"\",\n          \"color\": f\"#{format(16777215, 'x')}\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ]\n    ],\n    \"hover_event\": {\n      \"action\": \"show_item\",\n      \"id\": item,\n      **({\"components\": components} if components else {}),\n    }\n  }\n  slot_under: dict[Any, Any] = {\n    \"translate\": \"gm4.second\",\n    \"fallback\": \"%1$s\",\n    \"with\": [\n      {\n        \"text\": \"  ☒\",\n        \"color\": \"#fcfcf0\"\n      },\n      {\n        \"translate\": \"gui.gm4.guidebook.crafting.display.filled_slot.under\",\n        \"fallback\": \"  ☒\",\n        \"color\": \"white\",\n        \"font\": \"gm4:guidebook\"\n      }\n    ],\n    \"hover_event\": {\n      \"action\": \"show_item\",\n      \"id\": item,\n      **({\"components\": components} if components else {}),\n    }\n  }\n  return slot, slot_under\n\n\n\n\"\"\"\nRecursively reads item tags to find a single item to use\n\"\"\"\ndef get_item_from_tag(ctx: Context, item_tag: str, vanilla: Vanilla, searched: Optional[list[str]] = None) -> str:\n  # prepare item tag for searching\n  if \":\" in item_tag:\n    prefix, tag_target = item_tag.split(\":\", maxsplit=1)\n    prefix = prefix.removeprefix(\"#\")\n  else:\n    prefix = \"\"\n    tag_target = item_tag.removeprefix(\"#\")\n\n  # open item tag\n  if prefix == \"minecraft\" or prefix == \"\":\n    item_tags = vanilla.mount(\"data/minecraft/tags\").data[\"minecraft\"].item_tags\n  else:\n    item_tags = ctx.data[prefix].item_tags\n  items: list[str|dict[str, Any]] = item_tags[tag_target].data[\"values\"]\n\n  # get first item\n  if isinstance(items[0], str):\n    res: str = items[0]\n  else:\n    res: str = items[0][\"id\"]\n\n  # if first value is another tag, recursively search until an item is found\n  if \"#\" not in res:\n    return res\n  if not searched:\n    searched = []\n  if res in searched:\n    raise ValueError(f\"Cycle found in item tag '{item_tag}' (searched: {', '.join(searched)})\")\n  return get_item_from_tag(ctx, res, vanilla, [*searched, res])\n\n\n\n\"\"\"\nGenerates a crafting grid to be displayed in the guidebook\n\"\"\"\ndef generate_recipe_display(recipe: str, ctx: Context) -> list[TextComponent]:\n  r = ctx.data.recipes[recipe].data\n  ingredients: list[str] = []\n  shapeless = \"  \"\n\n  if r[\"type\"].removeprefix(\"minecraft:\") == \"crafting_shaped\":\n    pattern: list[str] = r[\"pattern\"]\n\n    # fix configured shape to be a full 3x3 grid\n    while len(pattern) < 3:\n      pattern.append(\"   \")\n    for i in range(3):\n      while len(pattern[i]) < 3:\n        pattern[i] += \" \"\n\n    # convert pattern into list of ingredients\n    for i in range(3):\n      for j in range(3):\n        key = pattern[i][j]\n        if key == \" \":\n          ingredients.append(\"air\")\n        else:\n          ingr: str | list[str] = r[\"key\"][key]\n          if isinstance(ingr, list):\n            ingr = ingr[0]\n          elif ingr.startswith(\"#\"):\n            vanilla = ctx.inject(Vanilla)\n            vanilla.minecraft_version = '26.1'\n            ingr = get_item_from_tag(ctx, ingr, vanilla)\n          ingredients.append(ingr)\n\n  elif r[\"type\"].removeprefix(\"minecraft:\") == \"crafting_shapeless\":\n    shapeless = {\n      \"translate\": \"gm4.second\",\n      \"fallback\": \"%1$s\",\n      \"with\": [\n        {\n          \"text\": \" 🔀 \",\n          \"color\": \"dark_gray\"\n        },\n        {\n          \"translate\": \"gui.gm4.guidebook.crafting.display.shapeless\",\n          \"fallback\": \" 🔀 \",\n          \"color\": \"white\",\n          \"font\": \"gm4:guidebook\"\n        }\n      ],\n      \"hover_event\": {\n        \"action\": \"show_text\",\n        \"value\": {\n          \"translate\": \"text.gm4.guidebook.shapeless\",\n          \"fallback\": \"Recipe is shapeless\"\n        }\n      }\n    }\n    for ingr in r[\"ingredients\"]:\n      if isinstance(ingr, list):\n        ingr = ingr[0]\n      elif ingr.startswith(\"#\"):\n        vanilla = ctx.inject(Vanilla)\n        vanilla.minecraft_version = '26.1'\n        ingr = get_item_from_tag(ctx, ingr, vanilla)\n      ingredients.append(ingr)\n    while len(ingredients) < 9:\n      ingredients.append(\"air\")\n\n  # unknown\n  else:\n    raise ValueError(f'Unsupported recipe type: {r[\"type\"]}')\n\n  # get JSON for each ingredient\n  d_ingredients: list[TextComponent] = []\n  d_under: list[TextComponent] = []\n  for item in ingredients:\n    slot, slot_under = item_to_display(item, None, ctx)\n    d_ingredients.append(slot)\n    d_under.append(slot_under)\n\n  # get recipe results\n  result, result_under = item_to_display(r[\"result\"][\"id\"], r[\"result\"].get(\"components\"), ctx)\n\n  # show count\n  result_count = r[\"result\"].get(\"count\", 1)\n  res_count = \"\"\n  if result_count > 1:\n    res_count = {\n      \"translate\": f\"gui.gm4.guidebook.crafting.display.count.{result_count}\",\n      \"fallback\": \"\",\n      \"color\": \"white\",\n      \"font\": \"gm4:guidebook\"\n    }\n    NUMBERS = [\"☐\",\"☒\",\"②\",\"③\",\"④\",\"⑤\",\"⑥\",\"⑦\",\"⑧\",\"⑨\",\"⑩\",\"⑪\",\"⑫\",\"⑬\",\"⑭\",\"⑮\",\"⑯\",\"⑰\",\"⑱\",\"⑲\",\"⑳\"]\n    result[\"with\"][0][\"text\"] = NUMBERS[result_count] # type: ignore\n\n  ARROW = {\n    \"translate\": \"gm4.second\",\n    \"fallback\": \"%1$s\",\n    \"with\": [\n      {\n        \"text\": \" → \"\n      },\n      {\n        \"translate\": \"gui.gm4.guidebook.crafting.display.arrow\",\n        \"fallback\": \" → \",\n        \"color\": \"white\",\n        \"font\": \"gm4:guidebook\"\n      }\n    ]\n  }\n  ARROW_UNDER = {\n    \"translate\": \"gm4.second\",\n    \"fallback\": \"%1$s\",\n    \"with\": [\n      {\n        \"text\": \"  →\",\n        \"color\": \"#fcfcf0\"\n      },\n      {\n        \"translate\": \"gui.gm4.guidebook.crafting.display.arrow.under\",\n        \"fallback\": \"  →\",\n        \"color\": \"white\",\n        \"font\": \"gm4:guidebook\"\n      }\n    ]\n  }\n\n  CRAFTING = {\n    \"translate\": \"gui.gm4.guidebook.crafting.display.grid\",\n    \"fallback\": \"\",\n    \"color\": \"white\",\n    \"font\": \"gm4:guidebook\"\n  }\n\n  margin = \" \" * 3\n  display: list[TextComponent] = [\n    \"\",\n    CRAFTING,\n    \"\\n\",\n    margin,\n    d_ingredients[0],\n    d_ingredients[1],\n    d_ingredients[2],\n    shapeless,\n    \"\\n\",\n    margin,\n    d_under[0],\n    d_under[1],\n    d_under[2],\n    \"\\n\",\n    margin,\n    d_ingredients[3],\n    d_ingredients[4],\n    d_ingredients[5],\n    ARROW,\n    result,\n    res_count,\n    \"\\n\",\n    margin,\n    d_under[3],\n    d_under[4],\n    d_under[5],\n    ARROW_UNDER,\n    result_under,\n    \"\\n\",\n    margin,\n    d_ingredients[6],\n    d_ingredients[7],\n    d_ingredients[8],\n    \"\\n\",\n    margin,\n    d_under[6],\n    d_under[7],\n    d_under[8]\n  ]\n  return display\n\n\n\n\n\"\"\"\nCalculate how many advances each character takes up when written in the default minecraft font\n\"\"\"\ndef char_advance(char: str) -> int:\n  advances = JsonFile(source_path=\"gm4_guidebook/advances.json\").data\n  # find char in database\n  if char in advances:\n    if type(advances[char]) == dict:\n      return advances[char][\"unicode\"]\n    return advances[char]\n  return 6\n\n\n\n\"\"\"\nSplits a string into how a minecraft book would display it in multiple lines\n\"\"\"\ndef split_into_lines(str: str) -> list[int]:\n  lines:list[Any] = []\n  words:list[Any] = []\n  # split string into words\n  for word in str.split(\" \"):\n    # count how many advances are in each word\n    wlen = 0\n    for char in word:\n      wlen += char_advance(char)\n    words.append((word, wlen))\n\n  current_line = \"\"\n  current_len = 0\n  # generate each line based on advances of each word\n  for word, wlen in words:\n    if current_len + wlen > 114: # 114 is max number of advances in each line\n      if not current_line == \"\":\n        lines.append(current_line)\n      current_line = \"\"\n      current_len = 0\n      # if a single word is greater than the max, it gets split every 114 advances\n      if wlen > 114:\n        for char in word:\n          if current_len + char_advance(char) > 114:\n            lines.append(current_line)\n            current_line = \"\"\n            current_len = 0\n          current_line += char\n          current_len += char_advance(char)\n        continue\n    current_line += word + \" \"\n    current_len += wlen + 4\n\n  # add each line to a list, without trailing spaces\n  lines.append(current_line)\n  for i in range(len(lines)):\n    lines[i] = lines[i].removesuffix(\" \")\n\n  return lines\n\n\n\n\"\"\"\nReturn a bulletted string of the module name, indented if it's an expansion\n\"\"\"\ndef get_toc_line(book_dict: Book) -> str:\n  indent = \"  ● \" if book_dict.module_type == \"expansion\" else \"● \"\n  return f\"{indent}{book_dict.name}\"\n\n\n\n\"\"\"\nReplaces {\"insert\": \"X\"} with custom data (header, locked text, or recipe)\n\"\"\"\ndef populate_insert(element: dict[Any, Any], book: Book, ctx: Context, lectern: bool = False) -> TextComponent:\n  if \"insert\" in element.keys():\n    # header\n    if element[\"insert\"] == \"title\":\n      return {\n          \"text\": f\"{book.name}\\n\",\n          \"underlined\": True,\n          \"color\": \"#4AA0C7\"\n        }\n    # (default) locked text\n    elif element[\"insert\"] == \"locked_text\":\n      locked_text = [\"\\n\",{'translate':'gm4.second','fallback':'%1$s',\"with\":[{'text':'\\n\\n\\n\\n           ???           '},{'translate': 'gui.gm4.guidebook.locked_page', 'fallback': '\\n\\n\\n\\n           ???           ','color': 'white','font':'gm4:guidebook'}],'hover_event':{'action':'show_text','value':[{'translate':'text.gm4.guidebook.undiscovered','fallback':'Undiscovered','italic':True,'color':'red'}]}}]\n      return locked_text\n    # title page locked text\n    elif element[\"insert\"] == \"locked_text_title\":\n      locked_text = [\"\",{'translate':'gm4.second','fallback':'%1$s',\"with\":[{'text':'\\n\\n\\n\\n           ???           '},{'translate': 'gui.gm4.guidebook.locked_page', 'fallback': '\\n\\n\\n\\n           ???           ','color': 'white','font':'gm4:guidebook'}],'hover_event':{'action':'show_text','value':[{'translate':'text.gm4.guidebook.undiscovered','fallback':'Undiscovered','italic':True,'color':'red'}]}}]\n      return locked_text\n    # recipes\n    elif element[\"insert\"] == \"recipe\":\n      return generate_recipe_display(element[\"recipe\"], ctx)\n    else:\n      raise ValueError(f'Unknown insert type: {element[\"insert\"]}')\n  return element\n\n\n\n\"\"\"\nConverts the JSON text component into a string to be placed inside the page NBT\n\"\"\"\ndef stringify_page(page: TextComponent, book: Book, ctx: Context, lectern: bool = False) -> list[dict[Any,Any]|str]:\n  page_with_header: list[dict[Any,Any]|str] = generate_lectern_header(book) if lectern else generate_book_header(book)\n  # populate insertions for a single value\n  if isinstance(page, dict):\n    if \"insert\" in page.keys():\n      page = populate_insert(page, book, ctx, lectern)\n  # populate insertions for a list\n  elif isinstance(page, list):\n    for i, element in enumerate(page):\n      if isinstance(element, dict) and \"insert\" in element.keys():\n        page[i] = populate_insert(element, book, ctx, lectern) #type: ignore\n  # stringify the page\n  if isinstance(page, list):\n    page_with_header.extend(page)\n  else:\n    page_with_header.append(page)\n  return page_with_header\n\n\n\n\"\"\"\nCreates a criterion for a prerequisite\n\"\"\"\ndef generate_prereq(prereq: str, module: str):\n  if \":\" in prereq:\n    module = prereq.split(\":\")[0]\n    prereq = prereq.split(\":\")[1]\n  criterion = {\n    \"trigger\": \"minecraft:tick\",\n    \"conditions\": {\n      \"player\": [\n        {\n          \"condition\": \"minecraft:entity_properties\",\n          \"entity\": \"this\",\n          \"predicate\": {\n            \"type_specific\": {\n              \"type\": \"player\",\n              \"advancements\": {\n                f\"gm4_guidebook:{module}/unlock/{prereq}\": True\n              }\n            }\n          }\n        }\n      ]\n    }\n  }\n  return criterion\n\n\n\n\"\"\"\nCreate the advancement to unlock a section\n\"\"\"\ndef generate_advancement(book: Book, section_index: int) -> Advancement | None:\n  # get the target section (based on index)\n  section: Section = book.sections[section_index]\n  module_id = book.id\n  all_criteria = book.criteria\n  criteria_keys: set[str] = set()\n  reqs = section.requirements\n\n  # add requirements to advancement\n  for requirement in section.requirements:\n    for criterion in requirement:\n      criteria_keys.add(criterion)\n  if section.prerequisites:\n    for prereq in section.prerequisites:\n      all_criteria[f\"prereq/{prereq}\"] = generate_prereq(prereq, module_id)\n      criteria_keys.add(f\"prereq/{prereq}\")\n      reqs.append([f\"prereq/{prereq}\"])\n  if len(criteria_keys) == 0:\n    return None\n\n  # standard checks for load checking and spectator prevention\n  extra_player_checks = [\n    {\n      \"condition\": \"minecraft:inverted\",\n      \"term\": {\n        \"condition\": \"minecraft:entity_properties\",\n        \"entity\": \"this\",\n        \"predicate\": {\n          \"type_specific\": {\n            \"type\": \"player\",\n            \"gamemode\": [\n              \"spectator\"\n            ]\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:value_check\",\n      \"value\": {\n        \"type\": \"minecraft:score\",\n        \"target\": {\n          \"type\": \"minecraft:fixed\",\n          \"name\": \"gm4_guidebook\"\n        },\n        \"score\": \"load.status\"\n      },\n      \"range\": {\"min\": 1}\n    },\n    {\n      \"condition\": \"minecraft:value_check\",\n      \"value\": {\n        \"type\": \"minecraft:score\",\n        \"target\": {\n            \"type\": \"minecraft:fixed\",\n            \"name\": book.load_check\n        },\n        \"score\": \"load.status\"\n      },\n      \"range\": {\"min\": 1}\n    },\n    {\n      \"condition\": \"minecraft:value_check\",\n      \"value\": {\n        \"type\": \"minecraft:score\",\n        \"target\": {\n          \"type\": \"minecraft:fixed\",\n          \"name\": \"$ready\"\n        },\n        \"score\": \"gm4_guide\"\n      },\n      \"range\": {\"min\": 1}\n    }\n  ]\n\n  # add requirements to criteria\n  criteria = {k: v for k, v in all_criteria.items() if k in criteria_keys}\n  for criterion in criteria.values():\n    if \"player\" not in criterion[\"conditions\"]:\n      criterion[\"conditions\"][\"player\"] = extra_player_checks\n    else:\n      criterion[\"conditions\"][\"player\"] = [*criterion[\"conditions\"][\"player\"], *extra_player_checks]\n\n  # create advancement that rewards the function\n  return Advancement({\n    \"parent\": \"gm4_guidebook:root\",\n    \"criteria\": criteria,\n    \"requirements\": reqs,\n    \"rewards\": {\n      \"function\": f\"gm4_guidebook:{module_id}/rewards/{section.name}\",\n    }\n  })\n\n\n\n\"\"\"\nCreates the advancement to hide the display advancements\n\"\"\"\ndef root_advancement() -> Advancement:\n  return Advancement({\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:impossible\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"gm4_guidebook\"\n              },\n              \"score\": \"load.status\"\n            },\n            \"range\": {\n              \"min\": 1\n            }\n          }\n        ]\n      }\n    }\n  }\n})\n\n\n\n\"\"\"\nCreates the advancement to show the toast\n\"\"\"\ndef generate_display_advancement(book: Book, project_id: str) -> Advancement:\n  module_name = book.name\n  icon = book.icon\n  if icon.components is None:\n    icon.components = dict()\n  icon.components[\"minecraft:custom_model_data\"] = {\n    \"strings\": [f\"{project_id}:guidebook_icon/{book.id}\"]\n  }\n  display = {\n    \"icon\": {\n      \"id\": icon.id,\n      \"components\": icon.components\n    },\n    \"title\": [\n      \"\",\n      {\n        \"translate\": \"gui.gm4.guidebook.toast\",\n        \"fallback\": \"\",\n        \"color\": \"white\",\n        \"font\": \"gm4:guidebook\"\n      },\n      {\n        \"translate\": \"text.gm4.guidebook.discovered_page\",\n        \"fallback\": \"Check your guidebook!\",\n        \"color\": \"#4AA0C7\",\n        \"italic\": True\n      }\n    ],\n    \"description\": module_name, # this isn't actually ever visible\n    \"frame\": \"goal\",\n    \"show_toast\": True,\n    \"announce_to_chat\": False,\n    \"hidden\": True\n  }\n  return Advancement({\n    \"display\": display,\n    \"parent\": \"gm4_guidebook:root\",\n    \"criteria\": {\n      \"impossible\": {\n        \"trigger\": \"minecraft:impossible\"\n      }\n    }\n  })\n\n\n\n\"\"\"\nCreates the function that is granted when a section is unlocked\n\"\"\"\ndef generate_reward_function(section: Section, book_id: str, book_name: str, desc: Optional[str]) -> Function:\n  # check if any module needs to be loaded\n  if section.enable and len(section.enable) > 0:\n    start = \"execute\"\n    for module_check in section.enable:\n      if module_check[\"load\"] == -1:\n        start += \" unless \"\n      else:\n        start += \" if \"\n      start += f\"score {module_check['id']} load.status matches 1..\"\n    start += \" run \"\n  else:\n    start = \"\"\n  # standard tellraw message\n  tellraw: list[TextComponent] = [\n    \"\",\n    {\n      \"translate\": \"text.gm4.guidebook.discovered\",\n      \"fallback\":\"%1$s has discovered a guidebook page from %2$s\",\n      \"with\": [\n        {\n          \"selector\":\"@s\" # player\n        },\n        {\n          \"text\": f\"[{book_name}]\", # module name (never translated)\n          \"color\": \"#4AA0C7\",\n          \"hover_event\":\n          {\n            \"action\": \"show_text\",\n            \"value\": [\n              {\n                \"text\": book_name, # module name\n                \"color\": \"#4AA0C7\"\n              },\n              {\n                \"text\": \"\\n\"\n              },\n              {\n                \"translate\": f\"text.gm4.guidebook.module_desc.{book_id}\", # module description\n                \"fallback\": desc,\n                \"italic\": True,\n                \"color\": \"gray\"\n              }\n            ]\n          }\n        }\n      ]\n    }\n  ]\n\n  # show tellraw and toast\n  reward = Function([\n    f'{start}tellraw @s {json.dumps(tellraw)}',\n    f\"{start}advancement grant @s only gm4_guidebook:{book_id}/display/{section.name}\"\n  ])\n  # grants other sections when this section is obtained\n  if section.grants:\n    reward.append([f\"{start}advancement grant @s only gm4_guidebook:{book_id}/unlock/{grant}\" for grant in section.grants])\n\n  # update the player's unlocked pages\n  reward.append([f\"{start}function gm4_guidebook:{book_id}/rewards/unlock/{section.name}\"])\n\n  return reward\n\n\n\n\"\"\"\nCreates the function that updates the player's db entry\n\"\"\"\ndef generate_unlock_function(section: Section, book_id: str, page_index: int, load_map: dict[str,int]) -> tuple[Function, int, dict[str,int]]:\n  # initial setup\n  func = Function([\n    f\"data modify storage gm4_guidebook:temp unlocking.uuid set from entity @s UUID\",\n    f'data modify storage gm4_guidebook:temp unlocking.name set value \"{book_id}\"'\n  ])\n\n  # get first page of this section\n  if len(section.enable) > 0:\n    key = \"\"\n    for module_check in section.enable:\n      key += module_check[\"id\"] # type: ignore\n      if key in load_map:\n        page_index = load_map[key]\n      else:\n        load_map[key] = page_index\n\n  # unlock each page\n  for i, _ in enumerate(section.pages):\n    page_name = f\"{section.name}_{i}\" if (len(section.pages) > 1) else section.name\n\n    # add commands\n    func.append([\n      f\"data modify storage gm4_guidebook:temp unlocking.target_page set value {page_index}\",\n      f\"data modify storage gm4_guidebook:temp unlocking.lectern_target_page set value {page_index+5}\",\n      f'data modify storage gm4_guidebook:temp unlocking.source_page set value \"{page_name}\"',\n      \"function gm4_guidebook:player_db/update with storage gm4_guidebook:temp unlocking\"\n    ])\n\n    page_index += 1\n\n\n  # clean up\n  func.append([\"data remove storage gm4_guidebook:temp unlocking\"])\n  return func, page_index, load_map\n\n\n\n\"\"\"\nCreates the page storage to store book info for a given module\n\"\"\"\ndef generate_page_storage(book: Book, ctx: Context) -> dict[str, Any]:\n  hand_initial:list[Any] = []\n  hand_unlockable:dict[str,Any] = {}\n  lectern_initial:list[Any] = [[\"\\n\\n\",{\"translate\":\"gui.gm4.guidebook.page\",\"fallback\":\"\",\"color\":\"white\",\"font\":\"gm4:guidebook\"}],[\"\",{\"translate\":\"gui.gm4.guidebook.page.toc\",\"fallback\":\"\",\"color\":\"white\",\"font\":\"gm4:guidebook\"}],[\"\\n\\n\",{\"translate\":\"gui.gm4.guidebook.page\",\"fallback\":\"\",\"color\":\"white\",\"font\":\"gm4:guidebook\"}],[\"\\n\\n\",{\"translate\":\"gui.gm4.guidebook.page\",\"fallback\":\"\",\"color\":\"white\",\"font\":\"gm4:guidebook\"}],[\"\\n\\n\",{\"translate\":\"gui.gm4.guidebook.page\",\"fallback\":\"\",\"color\":\"white\",\"font\":\"gm4:guidebook\"}]]\n  lectern_unlockable:dict[str,Any] = {}\n\n  for section_index, section in enumerate(book.sections):\n    # check if the page is unlockable or initial\n    if len(section.enable) == 0 and len(section.requirements) == 0 and len(section.prerequisites) == 0:\n      # add page to initial book\n      for page in section.pages:\n        hand_initial.append(stringify_page(page, book, ctx, False))\n        lectern_initial.append(stringify_page(page, book, ctx, True))\n    elif len(section.enable) != 0 and len(section.requirements) == 0 and len(section.prerequisites) == 0:\n      raise ValueError(f'Section \"{section.name}\" in \"{book.id}\" has both module dependencies and requirements')\n    else:\n      for page_index, page in enumerate(section.pages):\n        # add locked page to initial book\n        add_locked_page = True\n        ## only add a locked page for one iteration of a complementary page\n        for module_check in section.enable:\n          if module_check[\"load\"] != -1:\n            add_locked_page = False\n\n        if add_locked_page:\n          if (section_index == 0):\n            locked_text: list[dict[Any, Any]|str] = [{'insert':'title'},{'insert':'locked_text_title'}]\n          else:\n            locked_text: list[dict[Any, Any]|str] = [{'insert':'locked_text'}]\n          hand_initial.append(stringify_page(locked_text, book, ctx, False))\n          lectern_initial.append(stringify_page(locked_text, book, ctx, True))\n\n        # add page to unlockable map\n        page_name = f\"{section.name}_{page_index}\" if (len(section.pages) > 1) else section.name\n        hand_unlockable[page_name] = stringify_page(page, book, ctx, False)\n        lectern_unlockable[page_name] = stringify_page(page, book, ctx, True)\n\n  lectern_initial.append([\"\\n\\n\",{\"translate\":\"gui.gm4.guidebook.page\",\"fallback\":\"\",\"color\":\"white\",\"font\":\"gm4:guidebook\"}])\n\n  return {\n    \"hand\": {\n      \"initial\": hand_initial,\n      \"unlockable\": hand_unlockable\n    },\n    \"lectern\": {\n      \"initial\": lectern_initial,\n      \"unlockable\": lectern_unlockable\n    }\n  }\n\n\n\n\"\"\"\nCreates the function that populates the page storage\n\"\"\"\ndef generate_setup_storage_function(book: Book, ctx: Context, overlay: bool = False) -> Function:\n  # create page storage\n  storage = generate_page_storage(book, ctx)\n\n  # write each command to be placed in the function\n  short_circuit = f\"execute unless score {book.load_check} load.status matches 1.. run return 0\"\n  trigger_map = f\"data modify storage gm4_guidebook:register trigger_map.{book.trigger_id} set value {'{'}name:\\\"{book.id}\\\",load:\\\"{book.load_check}\\\"{'}'}\"\n  page_storage = f\"data modify storage gm4_guidebook:register pages.{book.id} set value {json.dumps(storage, ensure_ascii=False)}\"\n\n  return Function([\n    short_circuit,\n    trigger_map,\n    page_storage\n  ], tags=[] if overlay else [\"gm4_guidebook:setup_storage\"])\n\n\n\"\"\"\nCreates the function that adds a line to the table of contents\n\"\"\"\ndef generate_add_toc_line_function(book: Book, overlay: bool = False) -> Function:\n  text_component = {\n    \"text\": get_toc_line(book),\n    \"color\": \"#4AA0C7\",\n    \"click_event\": {\n      \"action\": \"run_command\",\n      \"command\": f\"/trigger gm4_guide set {book.trigger_id}\"\n    },\n    \"hover_event\": {\n      \"action\": \"show_text\",\n      \"value\": [{\n        \"translate\": \"text.gm4.guidebook.jump_to_section\",\n        \"fallback\": \"Jump to Section\",\n        \"color\": \"gold\"\n      }]\n    }\n  }\n  return Function([\n    f\"execute if score $trigger gm4_guide matches {book.trigger_id} if score {book.load_check} load.status matches 1.. run data modify storage gm4_guidebook:temp page append value {json.dumps(text_component, ensure_ascii=False)}\"\n  ], tags=[] if overlay else [\"gm4_guidebook:add_toc_line\"])\n\n\n\"\"\"\nCreates the function to summon a guidebook marker with proper NBT\n\"\"\"\ndef generate_summon_marker_function(book: Book, overlay: bool = False) -> Function:\n  marker_nbt = nbtlib.Compound()\n  marker_nbt[\"CustomName\"] = nbtlib.String(f'gm4_{book.id}')\n  marker_nbt[\"Tags\"] = nbtlib.List([nbtlib.String(\"gm4_guide\"),nbtlib.String(f\"gm4_guide_{book.id}\")])\n  marker_nbt[\"data\"] = nbtlib.Compound()\n  marker_nbt[\"data\"][\"type\"] = nbtlib.String(book.module_type)\n  if book.module_type == \"expansion\":\n    marker_nbt[\"data\"][\"base\"] = nbtlib.String(book.base_module)\n  marker_nbt[\"data\"][\"id\"] = nbtlib.String(book.id)\n  marker_nbt[\"data\"][\"trigger\"] = nbtlib.Int(book.trigger_id)\n  marker_nbt[\"data\"][\"module_name\"] = nbtlib.String(book.name)\n  marker_nbt[\"data\"][\"toc_line\"] = nbtlib.String(get_toc_line(book))\n  marker_nbt[\"data\"][\"line_count\"] = nbtlib.Int(len(split_into_lines(get_toc_line(book))))\n  return Function([\n    f\"execute if score {book.load_check} load.status matches 1.. run summon marker ~ {get_pos_hash(book.id)} ~ {nbtlib.serialize_tag(marker_nbt)}\"# type: ignore\n  ], tags=[] if overlay else [\"gm4_guidebook:summon_marker\"])\n\n\n\"\"\"\nCreates the function to initialize a player's book entry\n\"\"\"\ndef generate_init_player_db_function(book: Book, overlay: bool = False) -> Function:\n  func: Function = Function([], tags=[] if overlay else [\"gm4_guidebook:init_player_db\"])\n\n  # check guidebook unlock advancements\n  for section in book.sections:\n    # skip any pages that are unlocked by default\n    if len(section.enable) == 0 and len(section.requirements) == 0 and len(section.prerequisites) == 0:\n      continue\n    # check for complementary pages\n    if section.enable and len(section.enable) > 0:\n      score_check = \" \"\n      for module_check in section.enable:\n        if module_check[\"load\"] == -1:\n          score_check += \" unless \"\n        else:\n          score_check += \" if \"\n        score_check += f\"score {module_check['id']} load.status matches 1..\"\n    else:\n      score_check = \"\"\n\n    # update player db\n    func.append(f\"execute{score_check} if entity @s[advancements={'{'}gm4_guidebook:{book.id}/unlock/{section.name}=true{'}'}] run function gm4_guidebook:{book.id}/rewards/unlock/{section.name}\")\n\n  # early return\n  func.append([\"return 1\"])\n\n  return func\n\n\n\"\"\"\nCreates page unlock toast texture from module icons\n\"\"\"\ndef generate_toast_model(book: Book, ctx: Context) -> Model:\n  # look for module icon\n    # first looks for gm4_apple_trees:gui/guidebook/apple_trees\n    # then for the pack.png\n  icon = ctx.assets.textures.get(f\"{ctx.project_id}:gui/guidebook/{book.id}\", None)\n  if not icon and ctx.data.icon and ctx.data.icon != PngFile(source_path=Path(\"base/pack.png\")): # use pack.png of root pack if no guidebook texture given\n    icon = ctx.data.icon.copy() # copy image to new file\n\n  if not icon: # still no icon, use the guidebook book texture\n    return Model({\n      \"parent\":\"gm4_guidebook:item/guidebook\"\n    })\n\n  # round corners\n  img = cast(Image.Image, icon.image) # FIXME why needs cast? # type: ignore\n  mask = Image.new(mode='L', size=img.size)\n  mask_draw = ImageDraw.Draw(mask)\n  mask_draw.rounded_rectangle(((0,0),img.size), radius=img.size[0]//6, fill=255)\n  img.putalpha(mask)\n  ctx.assets[f\"{ctx.project_id}:gui/guidebook/{book.id}\"] = Texture(img)\n\n  # create model for new texture\n  textures = {\n    \"layer0\": f\"{ctx.project_id}:gui/guidebook/{book.id}\"\n  }\n   # some items will tint layer0, so we special case those here.\n  if book.icon.id in IS_DYED:\n    textures = {\n      \"layer0\": \"gm4:item/empty\",\n      \"layer1\": f\"{ctx.project_id}:gui/guidebook/{book.id}\"\n    }\n   # some items will tint layer1, so we special case those here.\n  if book.icon.id in OVERLAY_DYED:\n    textures = {\n      \"layer0\": \"gm4:item/empty\",\n      \"layer1\": \"gm4:item/empty\",\n      \"layer2\": f\"{ctx.project_id}:gui/guidebook/{book.id}\"\n    }\n\n  return Model({\n    \"parent\": \"builtin/generated\",\n    \"textures\": textures,\n    \"display\":{\n      \"gui\":{\n        \"scale\": [1.4, 1.4, 1]\n      }\n    }\n  })\n\n\n\n\"\"\"\nClamps a value between to valid RGB decimal numbers\n\"\"\"\ndef clamp(x: int|float):\n  return int(max(0, min(x, 255)))\n\n\n\n\"\"\"\nReads an texture and finds the average dominant color\n\"\"\"\ndef get_texture_color(texture: PngFile|None) -> str:\n  if texture is None:\n    return \"#000000\"\n\n  # Find the colors that occur most often\n  try:\n    palette: list[int] = texture.image.convert('P', palette=Image.ADAPTIVE, colors=4).getpalette() # type: ignore ; PIL typing is weird\n  except ValueError:\n    return \"#000000\"\n  if not palette:\n    return \"#000000\"\n\n  # get average RGB values\n  r, g, b = 0, 0, 0\n  n = 0\n  for i in range(0, min(12, len(palette)), 3): # type: ignore\n    r += palette[i] # type: ignore ; PIL has 'Unknown' type on palette return\n    g += palette[i+1] # type: ignore\n    b += palette[i+2] # type: ignore\n    n += 1\n  if n > 0:\n    r /= 4 # type: ignore\n    g /= 4 # type: ignore\n    b /= 4 # type: ignore\n\n  # bump saturation and value to taste\n  h, s, v = colorsys.rgb_to_hsv(r, g, b)# type: ignore\n  s *= 1.5\n  v *= 0.85\n  r, g, b = colorsys.hsv_to_rgb(h, s, v)\n\n  # return hex value\n  return \"#{0:02x}{1:02x}{2:02x}\".format(clamp(r), clamp(g), clamp(b))\n\n\n\n\"\"\"\nLooks for a single texture to represent a vanilla item, even in cases where the item has a model with multiple textures\n\"\"\"\ndef intuit_item_texture(item_id: str, vanilla: Vanilla) -> PngFile|None:\n    item_textures = vanilla.mount(\"assets/minecraft/textures/item\").assets[\"minecraft\"].textures\n    block_textures = vanilla.mount(\"assets/minecraft/textures/block\").assets[\"minecraft\"].textures\n    item_id = item_id.removeprefix(\"minecraft:\")\n\n    # try invective mapping\n    if (r:=item_textures.get(f\"item/{item_id}\")):\n      return r\n    elif (r:=block_textures.get(f\"block/{item_id}\")):\n      return r\n    else: # exhaustively look for a fuzzy-esque name match\n      combined_textures = NamespaceContainer[Texture]()\n      combined_textures.merge(item_textures)\n      combined_textures.merge(block_textures)\n      for id, texture in combined_textures.items():\n        if f\"block/{item_id}\" not in id and f\"item/{item_id}\" not in id:\n          continue\n        return texture\n"
  },
  {
    "path": "gm4_guidebook/legacy_item_sheet.py",
    "content": "from beet import Context\n\ndef beet_default(ctx: Context):\n    \"\"\"Merges the `guidebook_items.json Font with the master `guidebook.json`.\n    This is the temporary-ish organization technique until our custom models/items can be rendered on demand and formed into a spritesheet\"\"\"\n\n    # NOTE these font files will be auto-generated in the future\n    ctx.assets.fonts[\"gm4:guidebook\"].merge( ctx.assets.fonts[\"gm4:gm4_items\"] )\n    ctx.assets.fonts[\"gm4:guidebook\"].merge( ctx.assets.fonts[\"gm4:vanilla_items\"] )\n"
  },
  {
    "path": "gm4_guidebook/mod.mcdoc",
    "content": "use ::java::world::item::SingleItem\nuse ::java::data::advancement::AdvancementCriterion\nuse ::java::util::text::Text\nuse ::java::util::Filterable\nuse ::java::util::slot::SlottedItem\nuse ::java::world::item::ItemStack\n\ndispatch minecraft:storage[gm4_guidebook:temp] to struct {\n  modules?: [GuidebookModule],\n  expansions?: [GuidebookModule],\n  check_expansions?: [GuidebookModule],\n  module?: GuidebookModule,\n  expansion?: GuidebookModule,\n  prev_trigger_order?: [int],\n  lectern_pages?: [[Text]],\n  toc_back?: Text,\n  click?: int,\n  book?: struct {\n    trigger: int,\n    uuid: #[uuid] int[] @ 4,\n    count: int,\n    name: string,\n    load: string,\n  },\n  triggers?: [int],\n  Inventory?: [SlottedItem<byte @ 0..35>] @ 0..41,\n  Item?: SlottedItem<byte>,\n  unlocking?: struct {\n    uuid?: #[uuid] int[] @ 4,\n    name?: string,\n    target_page?: int,\n    lectern_target_page?: int,\n    source_page?: string,\n  },\n  lectern_page?: [Text],\n  page?: [Text],\n  page_content?: Text,\n}\n\nstruct GuidebookModule {\n  type: string,\n  id: string,\n  base?: string,\n  trigger: int,\n  line_count: int,\n  toc_line: Text,\n}\n\ndispatch minecraft:storage[gm4_guidebook:register] to struct {\n  front_matter?: [Filterable<Text>],\n  trigger_order?: [int],\n  lectern_toc?: [Text],\n  trigger_map?: struct {\n    [int]: struct {\n      name: string,\n      load: string,\n    },\n  },\n  pages?: struct {\n    [string]: struct {\n      hand: PageState,\n      lectern: PageState,\n    },\n  },\n  player_pages?: struct {\n    [#[uuid] string]: struct {\n      [string]: struct {\n        hand: PageState,\n        lectern: PageState,\n      },\n    },\n  },\n}\n\nstruct PageState {\n  initial: [Text],\n  unlockable: struct {\n    [string]: [Text],\n  },\n}\n\ndispatch minecraft:resource[gm4_guidebook] to struct Book {\n  id: string,\n  name: string,\n  module_type: (\"expansion\" | \"base\" | \"module\"),\n  load_check?: string,\n  base_module?: string,\n  icon: SingleItem,\n  criteria: struct AdvancementCriteriaMap {\n\t\t[string]: AdvancementCriterion,\n\t},\n  sections: [Section],\n  description?: string,\n  wiki_link?: string,\n}\n\nstruct Section {\n  name: string,\n  pages: [GuidebookText],\n  enable: [struct {[string]: (int | string)}],\n  requirements: [[string]],\n  prerequisites?: [string],\n  grants?: [string],\n}\n\ntype GuidebookText = (\n  string |\n  [GuidebookTextObject] |\n  GuidebookTextObject |\n)\n\ntype GuidebookTextObject = (\n  GuidebookInsert |\n  Text |\n)\n\nstruct GuidebookInsert {\n  insert: (\"title\" | \"locked_text\" | \"locked_text_title\" | \"recipe\"),\n  ...gm4_guidebook:insert[[insert]],\n}\n\ndispatch gm4_guidebook:insert[recipe] to struct RecipeInsert {\n  recipe: string,\n}\n"
  },
  {
    "path": "gm4_guidebook/triggers.json",
    "content": "{\n  \"__important__\": \"Generated by generate_guidebooks.py. Don't manually update this\",\n  \"__next__\": 125,\n  \"animi_shamir\": 91,\n  \"apple_trees\": 83,\n  \"arborenda_shamir\": 20,\n  \"audere_shamir\": 8,\n  \"auto_crafting\": 104,\n  \"balloon_animals\": 117,\n  \"bat_grenades\": 90,\n  \"beehive_inspector\": 51,\n  \"better_armour_stands\": 74,\n  \"better_fire\": 57,\n  \"block_compressors\": 54,\n  \"blossoming_pots\": 118,\n  \"book_binders\": 72,\n  \"bookshelf_inspector\": 116,\n  \"boots_of_ostara\": 87,\n  \"calling_bell\": 105,\n  \"celaro_shamir\": 76,\n  \"cement_mixers\": 66,\n  \"chairs\": 73,\n  \"combat_expanded\": 115,\n  \"cooler_caves\": 82,\n  \"corripio_shamir\": 86,\n  \"cozy_campfires\": 61,\n  \"crossbow_cartridges\": 65,\n  \"custom_crafters\": 111,\n  \"dangerous_dungeons\": 60,\n  \"defuse_shamir\": 25,\n  \"desire_lines\": 77,\n  \"disassemblers\": 81,\n  \"display_frames\": 5,\n  \"double_doors\": 106,\n  \"dripleaf_filters\": 107,\n  \"dripleaf_launchers\": 108,\n  \"enchantment_extractors\": 49,\n  \"end_fishing\": 7,\n  \"ender_bolt_shamir\": 27,\n  \"ender_hoppers\": 35,\n  \"enderman_support_class\": 80,\n  \"enlarging_phantoms\": 101,\n  \"everstone\": 75,\n  \"falling_stars\": 43,\n  \"forming_press\": 16,\n  \"forterra_shamir\": 19,\n  \"fulcio_shamir\": 79,\n  \"gemini_shamir\": 22,\n  \"harvest_moons\": 45,\n  \"heart_canisters\": 15,\n  \"helious_shamir\": 69,\n  \"holographic_tags\": 94,\n  \"hypexperia_shamir\": 17,\n  \"iacio_shamir\": 88,\n  \"icy_strays\": 102,\n  \"illusioner_nights\": 103,\n  \"infinitas_shamir\": 23,\n  \"ink_spitting_squid\": 78,\n  \"lavish_livestock\": 122,\n  \"lightning_in_a_bottle\": 109,\n  \"liquid_minecarts\": 47,\n  \"liquid_tanks\": 63,\n  \"live_catch\": 11,\n  \"lively_lily_pads\": 123,\n  \"lumos_shamir\": 71,\n  \"menacing_goblins\": 99,\n  \"mending_tanks\": 13,\n  \"metallurgy\": 28,\n  \"mob_curing\": 38,\n  \"moneo_shamir\": 18,\n  \"monsters_unbound\": 120,\n  \"mountaineering\": 110,\n  \"musical_shamir\": 29,\n  \"mysterious_midnights\": 42,\n  \"nightmare_nights\": 40,\n  \"note_block_interface\": 10,\n  \"orb_of_ankou\": 85,\n  \"particles_pack\": 6,\n  \"percurro_shamir\": 37,\n  \"phantom_scarecrows\": 55,\n  \"pig_tractors\": 56,\n  \"podzol_rooting_soil\": 36,\n  \"poses_pack\": 92,\n  \"potion_liquids\": 32,\n  \"potion_swords\": 62,\n  \"record_crafting\": 97,\n  \"reeling_rods\": 121,\n  \"relocators\": 70,\n  \"resurrecting_skeletons\": 41,\n  \"resurrecting_zombies\": 46,\n  \"rope_ladders\": 112,\n  \"sandy_husks\": 98,\n  \"scuba_gear\": 96,\n  \"sensus_shamir\": 21,\n  \"shapeless_portals\": 113,\n  \"shroomites\": 2,\n  \"slime_fests\": 100,\n  \"smelteries\": 9,\n  \"soul_glass\": 58,\n  \"spawner_minecarts\": 12,\n  \"speed_paths\": 30,\n  \"standard_crafting\": 93,\n  \"standard_liquids\": 64,\n  \"sunken_treasure\": 4,\n  \"survival_refightalized\": 119,\n  \"sweethearts\": 33,\n  \"teleportation_anchors\": 114,\n  \"tinker_shamir\": 26,\n  \"tinkering_compressors\": 52,\n  \"tipped_skeletons\": 44,\n  \"tower_structures\": 89,\n  \"towering_trees\": 124,\n  \"tunnel_bores\": 59,\n  \"undead_players\": 67,\n  \"vecto_shamir\": 95,\n  \"vertical_rails\": 84,\n  \"vibro_shamir\": 24,\n  \"vigere_shamir\": 14,\n  \"washing_tanks\": 3,\n  \"weighted_armour\": 68,\n  \"xp_storage\": 48,\n  \"zauber_cauldrons\": 53,\n  \"zauber_liquids\": 31,\n  \"ziprails\": 50\n}\n"
  },
  {
    "path": "gm4_holographic_tags/README.md",
    "content": "# Holographic Tags<!--$headerTitle--><!--$pmc:delete-->\n\nDecorate your builds with floating text boxes, anywhere you want! This data pack is based on a concept by [SethBling](https://twitter.com/SethBling/status/1140675391012528128).<!--$pmc:headerSize-->\n\n<img src=\"images/holographic_tags.webp\" alt=\"Holographic Tags Demo\" width=\"350\"/> <!--$localAssetToURL--> <!--$pmc:delete-->\n\n### Features\n- Place a named Name Tag in an Item Frame to create a floating text box\n- Place an Item Frame in the same spot to remove it again\n- Use a dyed Wool block to customize the colour of the floating text\n\n<img src=\"images/all_colors.png\" alt=\"Colors of the floating text based on wool type\" width=\"350\"/> <!--$localAssetToURL--> <!--$pmc:delete-->\n"
  },
  {
    "path": "gm4_holographic_tags/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.holographic_tags.title,Holo-riffic!\nadvancement.gm4.holographic_tags.description,Create a Hologram\ntext.gm4.guidebook.module_desc.holographic_tags,Set up floating messages with a simple name tag!\ntext.gm4.guidebook.holographic_tags.description,\"Putting a renamed name tag in an item frame will create floating textbox.\\n\\nTo remove the hologram, place an item frame in the original position.\"\ntext.gm4.guidebook.holographic_tags.colors,Placing the item frame on a wool block will color the hologram.\n"
  },
  {
    "path": "gm4_holographic_tags/beet.yaml",
    "content": "id: gm4_holographic_tags\nname: Holographic Tags\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    model_data:\n      - item: name_tag\n        reference: gui/advancement/holographic_tags\n        template: advancement\n    website:\n      description: Set up floating messages with a simple name tag!\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: AzpWemXn\n    smithed:\n      pack_id: gm4_holographic_tags\n    wiki: https://wiki.gm4.co/wiki/Holographic_Tags\n    credits:\n      Creator:\n        - BPR\n      Updated by:\n        - Bloo\n      Inspired by:\n        - SethBling\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4/advancement/holographic_tags.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"name_tag\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_holographic_tags:gui/advancement/holographic_tags\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.holographic_tags.title\",\n      \"fallback\": \"Holo-riffic!\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.holographic_tags.description\",\n      \"fallback\": \"Create a Hologram\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"create_hologram\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/function/create_hologram.mcfunction",
    "content": "# @s = item frame with renamed name tag\n# run from main\n\n# init text display\ndata modify storage gm4_holographic_tags:temp properties.raw_text set from entity @s Item.components.\"minecraft:custom_name\"\nexecute if entity @s[type=glow_item_frame] run data modify storage gm4_holographic_tags:temp properties.glowing set value 1b\ndata modify storage gm4_holographic_tags:temp properties.rotation set from entity @s Rotation\nexecute summon text_display run function gm4_holographic_tags:initialize_hologram\ndata remove storage gm4_holographic_tags:temp properties\n\n# sights and sounds\nadvancement grant @a[distance=..4,gamemode=!spectator] only gm4:holographic_tags\nplaysound minecraft:entity.item_frame.remove_item block @a\nparticle minecraft:block{block_state:\"minecraft:stripped_acacia_log\"} ~ ~ ~ .2 .2 .2 .1 10\n\n# return item frame item\nexecute unless data storage gm4_holographic_tags:temp properties.glowing run summon item ~ ~ ~ {Item:{id:\"minecraft:item_frame\",count:1},PickupDelay:10s,Motion:[0.0,0.25,0.0]}\nexecute if data storage gm4_holographic_tags:temp properties.glowing run summon item ~ ~ ~ {Item:{id:\"minecraft:glow_item_frame\",count:1},PickupDelay:10s,Motion:[0.0,0.25,0.0]}\n\nkill @s\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/function/destroy_hologram.mcfunction",
    "content": "# @s = hologram text display if empty item frame is nearby\n# at @s positioned ^ ^ ^-0.3 (block face the hologram was placed from)\n# run from main\n\n# prepare data to reduce selector count\ndata modify storage gm4_holographic_tags:temp properties.rotation_hologram set from entity @s Rotation\nexecute store result storage gm4_holographic_tags:temp properties.rotation_x_hologram int 1 run data get storage gm4_holographic_tags:temp properties.rotation_hologram[0]\nexecute store result storage gm4_holographic_tags:temp properties.rotation_y_hologram int 1 run data get storage gm4_holographic_tags:temp properties.rotation_hologram[1]\ndata modify storage gm4_holographic_tags:temp properties.text set from entity @s text.text\n\n# attempt move data from hologram to item frame, if destroy failed, also fail this function\nexecute as @e[type=#gm4_holographic_tags:item_frames,limit=1,sort=nearest,distance=..0.1] unless function gm4_holographic_tags:read_hologram_data run return fail\ndata remove storage gm4_holographic_tags:temp properties\n\n# particles & hologram removal\nparticle minecraft:block{block_state:\"minecraft:stripped_birch_log\"} ~ ~ ~ .2 .2 .2 .1 10\nkill @s\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/function/init.mcfunction",
    "content": "team add gm4_white\nteam add gm4_orange\nteam add gm4_magenta\nteam add gm4_lightblue\nteam add gm4_yellow\nteam add gm4_lime\nteam add gm4_pink\nteam add gm4_gray\nteam add gm4_lightgray\nteam add gm4_cyan\nteam add gm4_purple\nteam add gm4_blue\nteam add gm4_brown\nteam add gm4_green\nteam add gm4_red\nteam add gm4_black\n\nteam modify gm4_white color white\nteam modify gm4_orange color gold\nteam modify gm4_magenta color light_purple\nteam modify gm4_lightblue color aqua\nteam modify gm4_yellow color yellow\nteam modify gm4_lime color green\nteam modify gm4_pink color red\nteam modify gm4_gray color dark_gray\nteam modify gm4_lightgray color gray\nteam modify gm4_cyan color dark_aqua\nteam modify gm4_purple color dark_purple\nteam modify gm4_blue color blue\nteam modify gm4_brown color dark_blue\nteam modify gm4_green color dark_green\nteam modify gm4_red color dark_red\nteam modify gm4_black color black\n\nscoreboard objectives add gm4_entity_version dummy\n\nexecute unless score holographic_tags gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Holographic Tags\"}\nexecute unless score holographic_tags gm4_earliest_version < holographic_tags gm4_modules run scoreboard players operation holographic_tags gm4_earliest_version = holographic_tags gm4_modules\nscoreboard players set holographic_tags gm4_modules 1\n\nschedule function gm4_holographic_tags:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/function/initialize_hologram.mcfunction",
    "content": "# initializes data on the text display\n# @s = newly spawned text display\n# run from main\n\ndata merge entity @s {text:{color:\"#FFFFFF\",text:\"test\"},line_width:2147483647 ,billboard:\"center\",Tags:[\"gm4_hologram\",\"smithed.entity\",\"smithed.strict\"],background:0}\ndata modify entity @s text.text set from storage gm4_holographic_tags:temp properties.raw_text\ndata modify entity @s Rotation set from storage gm4_holographic_tags:temp properties.rotation\nexecute if data storage gm4_holographic_tags:temp properties.glowing run data modify entity @s brightness set value {block:15,sky:15}\n\nexecute positioned as @s if block ^ ^ ^-0.75 #minecraft:wool run function gm4_holographic_tags:set_color\n\nscoreboard players set @s gm4_entity_version 2\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/function/main.mcfunction",
    "content": "execute as @e[type=text_display,tag=gm4_hologram] at @s positioned ^ ^ ^-0.3 if entity @e[type=#gm4_holographic_tags:item_frames,predicate=!gm4_holographic_tags:has_item,distance=..0.1,limit=1] run function gm4_holographic_tags:destroy_hologram\nexecute as @e[type=#gm4_holographic_tags:item_frames,tag=!smithed.entity,tag=!gm4_hologram,predicate=gm4_holographic_tags:has_name_tag] if items entity @s contents *[custom_name] at @s positioned ^ ^ ^0.3 unless entity @e[type=text_display,tag=gm4_hologram,distance=..0.1] run function gm4_holographic_tags:create_hologram\ntag @e[type=#gm4_holographic_tags:item_frames,tag=gm4_hologram,predicate=!gm4_holographic_tags:has_name_tag] remove gm4_hologram\n\nschedule function gm4_holographic_tags:main 16t\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/function/read_hologram_data.mcfunction",
    "content": "# Moves data from the hologram to the item frame, unless their rotations are different\n# @s = item frame ready to receive a nametag\n# at block face hologram was placed from\n# run from return_name_tag\n\n# check if the rotation matches\ndata modify storage gm4_holographic_tags:temp properties.rotation_item_frame set from entity @s Rotation\nexecute store result storage gm4_holographic_tags:temp properties.rotation_x_item_frame int 1 run data get storage gm4_holographic_tags:temp properties.rotation_item_frame[0]\nexecute store result storage gm4_holographic_tags:temp properties.rotation_y_item_frame int 1 run data get storage gm4_holographic_tags:temp properties.rotation_item_frame[1]\n\nexecute store success storage gm4_holographic_tags:temp properties.rotation_x_differs int 1 run data modify storage gm4_holographic_tags:temp properties.rotation_x_hologram set from storage gm4_holographic_tags:temp properties.rotation_x_item_frame\nexecute if data storage gm4_holographic_tags:temp properties{rotation_x_differs:1} run return fail\nexecute store success storage gm4_holographic_tags:temp properties.rotation_y_differs int 1 run data modify storage gm4_holographic_tags:temp properties.rotation_y_hologram set from storage gm4_holographic_tags:temp properties.rotation_y_item_frame\nexecute if data storage gm4_holographic_tags:temp properties{rotation_y_differs:1} run return fail\n\n\n# rotation matched, move data\ndata merge entity @s {Tags:[\"gm4_hologram\"],Item:{id:\"minecraft:name_tag\",count:1,components:{\"minecraft:repair_cost\":0}}}\ndata modify entity @s Item.components.\"minecraft:custom_name\" set from storage gm4_holographic_tags:temp properties.text\n\n# signal that data transfer was successful\nreturn 1\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/function/set_color.mcfunction",
    "content": "# @s = item frame with renamed name tag if on a wool block\n# run from initialize_hologram\n\nexecute if block ^ ^ ^-.75 white_wool run data modify entity @s text.color set value \"#e8ebeb\"\nexecute if block ^ ^ ^-.75 orange_wool run data modify entity @s text.color set value \"#ee7311\"\nexecute if block ^ ^ ^-.75 magenta_wool run data modify entity @s text.color set value \"#be45b5\"\nexecute if block ^ ^ ^-.75 light_blue_wool run data modify entity @s text.color set value \"#37abd6\"\nexecute if block ^ ^ ^-.75 yellow_wool run data modify entity @s text.color set value \"#f7c527\"\nexecute if block ^ ^ ^-.75 lime_wool run data modify entity @s text.color set value \"#6fb718\"\nexecute if block ^ ^ ^-.75 pink_wool run data modify entity @s text.color set value \"#eb88a8\"\nexecute if block ^ ^ ^-.75 gray_wool run data modify entity @s text.color set value \"#3c4245\"\nexecute if block ^ ^ ^-.75 light_gray_wool run data modify entity @s text.color set value \"#8b8b84\"\nexecute if block ^ ^ ^-.75 cyan_wool run data modify entity @s text.color set value \"#15878f\"\nexecute if block ^ ^ ^-.75 purple_wool run data modify entity @s text.color set value \"#7426a7\"\nexecute if block ^ ^ ^-.75 blue_wool run data modify entity @s text.color set value \"#323599\"\nexecute if block ^ ^ ^-.75 brown_wool run data modify entity @s text.color set value \"#6f4425\"\nexecute if block ^ ^ ^-.75 green_wool run data modify entity @s text.color set value \"#51691a\"\nexecute if block ^ ^ ^-.75 red_wool run data modify entity @s text.color set value \"#9f2521\"\nexecute if block ^ ^ ^-.75 black_wool run data modify entity @s text.color set value \"#101115\"\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/function/upgrade_paths/1.5/convert_to_text_display.mcfunction",
    "content": "# collects data from the existing aec and initiates summoning of a replacement text display\n# @s = outdated aec-based holographic tag\n# at @s\n# run from upgrade_paths/1.5\n\n# summon text display based on aec\ntp ^ ^ ^.3\ndata modify storage gm4_holographic_tags:temp properties.raw_text set from entity @s CustomName\ndata modify storage gm4_holographic_tags:temp properties.rotation set from entity @s Rotation\nexecute at @s summon text_display run function gm4_holographic_tags:initialize_hologram\ndata remove storage gm4_holographic_tags:temp properties\nkill @s\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/function/upgrade_paths/1.5.mcfunction",
    "content": "# updates old area effect cloud based holographic tags into new text display based ones\n# @s = player\n# as @s\n# run via upgrade paths util\n\nexecute as @e[type=area_effect_cloud,tag=gm4_hologram,scores={gm4_entity_version=1}] at @s run function gm4_holographic_tags:upgrade_paths/1.5/convert_to_text_display\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/guidebook/holographic_tags.json",
    "content": "{\n  \"id\": \"holographic_tags\",\n  \"name\": \"Holographic Tags\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:name_tag\"\n  },\n  \"criteria\": {\n    \"obtain_name_tag\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:name_tag\"\n            ]\n          }\n        ]\n      }\n    },\n    \"create_holographic_tag\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"player\",\n                \"advancements\": {\n                  \"gm4:holographic_tags\": true\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"creation\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_name_tag\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.holographic_tags.description\",\n            \"fallback\": \"Putting a renamed name tag in an item frame will create floating textbox.\\n\\nTo remove the hologram, place an item frame in the original position.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"colors\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"create_holographic_tag\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.holographic_tags.colors\",\n            \"fallback\": \"Placing the item frame on a wool block will color the hologram.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"creation\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/predicate/has_item.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"count\": {\n          \"min\": 1\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/predicate/has_name_tag.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"items\": \"minecraft:name_tag\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/tags/entity_type/item_frames.json",
    "content": "{\n    \"values\":\n    [\n        \"minecraft:item_frame\",\n        \"minecraft:glow_item_frame\"\n    ]\n}\n"
  },
  {
    "path": "gm4_holographic_tags/data/gm4_holographic_tags/test/create_and_remove.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~\n\nsetblock ~1 ~1 ~2 gray_concrete\n\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~2\nitem replace entity @s weapon.mainhand with item_frame\ndummy @s use block ~1 ~1 ~2 north\n\nitem replace entity @s weapon.mainhand with minecraft:name_tag[custom_name=\"HelloGamemode4\"]\ndummy @s use entity @e[type=item_frame,distance=..4,limit=1]\n\nawait not entity @e[type=item_frame,distance=..4]\nclear @s written_book\nassert entity @e[type=text_display,distance=..4,nbt={text:{text:\"HelloGamemode4\"}}]\n\nexecute at @s run tp @e[type=item,distance=..4] ~ ~ ~\nawait items entity @s weapon.mainhand minecraft:item_frame\n\ndummy @s use block ~1 ~1 ~2 north\n\nawait not entity @e[type=text_display,distance=..4]\nassert items entity @e[type=item_frame,distance=..4] contents minecraft:name_tag[count=1,custom_name=\"HelloGamemode4\"]\n"
  },
  {
    "path": "gm4_holographic_tags/mod.mcdoc",
    "content": "use ::java::util::text::Text\n\ndispatch minecraft:storage[gm4_holographic_tags:temp] to struct {\n  properties?: struct {\n    raw_text?: Text,\n    glowing?: boolean,\n    rotation?: [float] @ 2,\n    rotation_hologram?: [float] @ 2,\n    rotation_x_hologram?: int,\n    rotation_y_hologram?: int,\n    text?: string,\n    rotation_item_frame?: [float] @ 2,\n    rotation_x_item_frame?: int,\n    rotation_y_item_frame?: int,\n    rotation_x_differs?: int,\n    rotation_y_differs?: int,\n  },\n}\n"
  },
  {
    "path": "gm4_iacio_shamir/README.md",
    "content": "# Iacio Shamir<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nThrow items further!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Whilst wearing a chestplate with Iacio on it, tridents, enderpearls, throwable potions, snowballs and eggs go further\r\n- Builds on Gamemode 4's fun extension of the Enchantment system, [Metallurgy]($dynamicLink:gm4_metallurgy)\r\n"
  },
  {
    "path": "gm4_iacio_shamir/beet.yaml",
    "content": "id: gm4_iacio_shamir\nname: Iacio Shamir\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: ../gm4_metallurgy\n\npipeline:\n  - gm4_metallurgy.shamir_model_template\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_metallurgy: 1.8.0\n    model_data:\n      - item: chestplates\n        reference: shamir/iacio\n        template:\n          name: shamir\n          metal: barium\n          textures_path: gm4_metallurgy:item/shamir/barium\n    website:\n      description: Adds the 'Iacio' shamir to Metallurgy. It lets you throw things further! Launch an Ender Pearl into orbit or simply throw your Trident exceptionally far.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: DTk79ZcR\n    wiki: https://wiki.gm4.co/wiki/Metallurgy/Iacio_Shamir\n    credits:\n      Creator:\n        - Denniss\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_iacio_shamir/data/gm4_iacio_shamir/advancement/inventory_changed.json",
    "content": "{\n  \"criteria\": {\n    \"iacio_inv_change\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"flags\": {\n                \"is_sneaking\": false,\n                \"is_sprinting\": false\n              },\n              \"equipment\": {\n                \"chest\": {\n                  \"predicates\": {\n                    \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'iacio'}}\"\n                  }\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_iacio_shamir:check_throw\"\n  }\n}\n"
  },
  {
    "path": "gm4_iacio_shamir/data/gm4_iacio_shamir/function/add_motion.mcfunction",
    "content": "#run from check_throw\n#@s = thrown entity\n\nexecute store result entity @s Motion[0] double 0.001 run data get entity @s Motion[0] 2000\nexecute store result entity @s Motion[1] double 0.001 run data get entity @s Motion[1] 2000\nexecute store result entity @s Motion[2] double 0.001 run data get entity @s Motion[2] 2000\n\nplaysound minecraft:entity.witch.throw player @a[distance=..15] ~ ~ ~ .4 1\n"
  },
  {
    "path": "gm4_iacio_shamir/data/gm4_iacio_shamir/function/check_item_validity.mcfunction",
    "content": "#@s = band is trying to apply to\n#run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'iacio'}}] if items entity @s contents #gm4_iacio_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_iacio_shamir/data/gm4_iacio_shamir/function/check_throw.mcfunction",
    "content": "#run from advancement inventory_changed\n#@s = player with iacio shamir equipped\n\nadvancement revoke @s only gm4_iacio_shamir:inventory_changed\n\nexecute if score @s gm4_iacio_tridnt matches 1.. as @e[type=minecraft:trident,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion\nexecute if score @s gm4_iacio_item matches 1.. as @e[type=item,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion\nexecute if score @s gm4_iacio_pearl matches 1.. as @e[type=minecraft:ender_pearl,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion\nexecute if score @s gm4_iacio_snowbl matches 1.. as @e[type=minecraft:snowball,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion\nexecute if score @s gm4_iacio_egg matches 1.. as @e[type=minecraft:egg,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion\nexecute if score @s gm4_iacio_splash matches 1.. as @e[type=minecraft:splash_potion,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion\nexecute if score @s gm4_iacio_linger matches 1.. as @e[type=minecraft:lingering_potion,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion\n\nscoreboard players reset @s gm4_iacio_tridnt\nscoreboard players reset @s gm4_iacio_item\nscoreboard players reset @s gm4_iacio_pearl\nscoreboard players reset @s gm4_iacio_snowbl\nscoreboard players reset @s gm4_iacio_egg\nscoreboard players reset @s gm4_iacio_splash\nscoreboard players reset @s gm4_iacio_linger\n"
  },
  {
    "path": "gm4_iacio_shamir/data/gm4_iacio_shamir/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_iacio_tridnt minecraft.used:minecraft.trident\nscoreboard objectives add gm4_iacio_item minecraft.custom:minecraft.drop\nscoreboard objectives add gm4_iacio_pearl minecraft.used:minecraft.ender_pearl\nscoreboard objectives add gm4_iacio_snowbl minecraft.used:minecraft.snowball\nscoreboard objectives add gm4_iacio_egg minecraft.used:minecraft.egg\nscoreboard objectives add gm4_iacio_splash minecraft.used:minecraft.splash_potion\nscoreboard objectives add gm4_iacio_linger minecraft.used:minecraft.lingering_potion\n\nexecute unless score iacio_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Iacio shamir\"}\nexecute unless score iacio_shamir gm4_earliest_version < iacio_shamir gm4_modules run scoreboard players operation iacio_shamir gm4_earliest_version = iacio_shamir gm4_modules\nscoreboard players set iacio_shamir gm4_modules 1\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_iacio_shamir/data/gm4_iacio_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/iacio via #gm4_metallurgy:summon_band/iacio\n\nloot spawn ~ ~ ~ loot gm4_iacio_shamir:band\n"
  },
  {
    "path": "gm4_iacio_shamir/data/gm4_iacio_shamir/guidebook/iacio_shamir.json",
    "content": "{\n  \"id\": \"iacio_shamir\",\n  \"name\": \"Iacio Shamir\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"metallurgy\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_iacio_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'iacio'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_iacio_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'iacio'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.iacio_shamir.description\",\n            \"fallback\": \"Iacio strengthens the throw of projectiles and items.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_iacio_shamir\",\n          \"obtain_iacio_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.iacio_shamir.usage\",\n            \"fallback\": \"The Iacio Shamir is found on Barium Bands. It can be placed onto chestplates.\\n\\nItems, Tridents, Ender Pearls, Splash and Lingering Potions, Snowballs, and Eggs will fly farther when thrown.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_iacio_shamir/data/gm4_iacio_shamir/loot_table/band.json",
    "content": "{\n\t\"pools\": [\n\t\t{\n\t\t\t\"rolls\": 1,\n\t\t\t\"entries\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"minecraft:loot_table\",\n\t\t\t\t\t\"value\": \"gm4_metallurgy:barium_band\",\n\t\t\t\t\t\"functions\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_components\",\n\t\t\t\t\t\t\t\"components\": {\n\t\t\t\t\t\t\t\t\"minecraft:custom_model_data\": {\"strings\":[\"gm4_iacio_shamir:shamir/iacio\"]}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_custom_data\",\n\t\t\t\t\t\t\t\"tag\": \"{gm4_metallurgy:{stored_shamir:'iacio'}}\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_lore\",\n\t\t\t\t\t\t\t\"mode\": \"append\",\n\t\t\t\t\t\t\t\"lore\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"translate\": \"item.gm4.shamir.iacio\",\n\t\t\t\t\t\t\t\t\t\"fallback\": \"Iacio Shamir\",\n\t\t\t\t\t\t\t\t\t\"italic\": false,\n\t\t\t\t\t\t\t\t\t\"color\": \"gray\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_iacio_shamir/data/gm4_iacio_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:chest_armor\"\n  ]\n}\n"
  },
  {
    "path": "gm4_iacio_shamir/data/gm4_iacio_shamir/test/throw_item.mcfunction",
    "content": "# @template gm4_iacio_shamir:test_long_platform\n# @dummy ~ ~1 ~1\n\nexecute at @s run tp @s ~ ~ ~ 270 0\n\nitem replace entity @s weapon.mainhand with minecraft:iron_ingot\nawait delay 1t\ndummy @s drop\n\nawait items entity @e[type=item,dx=12,dy=2,dz=2,distance=3..5,nbt={OnGround:1b}] contents minecraft:iron_ingot\n\nitem replace entity @s armor.chest with minecraft:iron_chestplate[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:\"iacio\"}}]\n\nawait delay 1t\n\nitem replace entity @s weapon.mainhand with minecraft:gold_ingot\nawait delay 1t\ndummy @s drop\n\nawait items entity @e[type=item,dx=12,dy=2,dz=2,distance=6..,nbt={OnGround:1b}] contents minecraft:gold_ingot\n"
  },
  {
    "path": "gm4_iacio_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json",
    "content": "{\n\t\"values\": [\n\t\t\"gm4_iacio_shamir:check_item_validity\"\n\t]\n}\n"
  },
  {
    "path": "gm4_iacio_shamir/data/gm4_metallurgy/tags/function/summon_band/barium.json",
    "content": "{\n\t\"values\": [\n\t\t\"gm4_iacio_shamir:summon_band\"\n\t]\n}\n"
  },
  {
    "path": "gm4_iacio_shamir/translations.csv",
    "content": "key,en_us\nitem.gm4.shamir.iacio,Iacio Shamir\ntext.gm4.guidebook.module_desc.iacio_shamir,Adds the 'Iacio' shamir to Metallurgy. It lets you throw things further! Launch an Ender Pearl into orbit or simply throw your Trident exceptionally far.\ntext.gm4.guidebook.iacio_shamir.description,Iacio strengthens the throw of projectiles and items.\ntext.gm4.guidebook.iacio_shamir.usage,\"The Iacio Shamir is found on Barium Bands. It can be placed onto chestplates.\\n\\nItems, Tridents, Ender Pearls, Splash and Lingering Potions, Snowballs, and Eggs will fly farther when thrown.\"\n"
  },
  {
    "path": "gm4_ink_spitting_squid/README.md",
    "content": "# Ink Spitting Squid<!--$headerTitle--><!--$pmc:delete-->\n\nFor too long have Squid been defenceless, now it's time for them to fight back! Or at least annoy you with some ink while you continue killing them.<!--$pmc:headerSize-->\n\n### Features\n- Squid will spit blinding ink on nearby players for 5 seconds.\n- Glow Squid will instead inflict glowing and night vision.\n- Only affects players that have their head submerged in water.\n"
  },
  {
    "path": "gm4_ink_spitting_squid/beet.yaml",
    "content": "id: gm4_ink_spitting_squid\nname: Ink Spitting Squid\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    model_data:\n      - item: ink_sac\n        reference: gui/advancement/ink_spitting_squid\n        template: advancement\n      - item: glow_ink_sac\n        reference: gui/advancement/glow_ink_spitting_squid\n        template: advancement\n    website:\n      description: Improves the vanilla ink effect by adding Blindness. Glow Squid will give Night Vision when disturbed, which might come in handy if you're out of torches!\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: ljOfYHJv\n    planetminecraft:\n      uid: 4581763\n    video: https://www.youtube.com/watch?v=68LMYEhueZ0\n    wiki: https://wiki.gm4.co/wiki/Ink_Spitting_Squid\n    credits:\n      Creator:\n        - Energyxxer\n      Updated by:\n        - BPR\n      Icon Design:\n        - Sparks\n"
  },
  {
    "path": "gm4_ink_spitting_squid/data/gm4/advancement/glow_ink_spitting_squid.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:glow_ink_sac\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_ink_spitting_squid:gui/advancement/glow_ink_spitting_squid\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.glow_ink_spitting_squid.title\",\n      \"fallback\": \"The Light, It Burns!\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.glow_ink_spitting_squid.description\",\n      \"fallback\": \"Glow due to an underwater glow squid\",\n      \"color\": \"gray\"\n    },\n    \"frame\": \"goal\"\n  },\n  \"parent\": \"gm4:ink_spitting_squid\",\n  \"criteria\": {\n    \"glow_ink_squirt_hit\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_ink_spitting_squid/data/gm4/advancement/ink_spitting_squid.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:ink_sac\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_ink_spitting_squid:gui/advancement/ink_spitting_squid\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.ink_spitting_squid.title\",\n      \"fallback\": \"Natural Defenses\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.ink_spitting_squid.description\",\n      \"fallback\": \"Get blinded by an underwater squid\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"ink_squirt_hit\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/function/glow_squid_squirt.mcfunction",
    "content": "#@s = a player near a glow squid in water\n#run from main\n\neffect give @s glowing 5\neffect give @s night_vision 5\nplaysound minecraft:entity.glow_squid.hurt hostile @a[distance=..5] ~ ~ ~ 1 2\nparticle minecraft:glow_squid_ink ^ ^ ^.5 .1 0 .1 0.05 10 normal @s\nadvancement grant @s only gm4:glow_ink_spitting_squid\n"
  },
  {
    "path": "gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/function/init.mcfunction",
    "content": "execute unless score ink_spitting_squid gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Ink Spitting Squid\"}\nexecute unless score ink_spitting_squid gm4_earliest_version < ink_spitting_squid gm4_modules run scoreboard players operation ink_spitting_squid gm4_earliest_version = ink_spitting_squid gm4_modules\nscoreboard players set ink_spitting_squid gm4_modules 1\n\nschedule function gm4_ink_spitting_squid:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/function/main.mcfunction",
    "content": "execute at @e[type=squid,tag=!smithed.entity] as @a[gamemode=!spectator,distance=..3] at @s anchored eyes positioned ^ ^ ^ if predicate gm4_ink_spitting_squid:inkable run function gm4_ink_spitting_squid:squid_squirt\nexecute at @e[type=glow_squid,tag=!smithed.entity] as @a[gamemode=!spectator,distance=..3] at @s anchored eyes positioned ^ ^ ^ if predicate gm4_ink_spitting_squid:inkable run function gm4_ink_spitting_squid:glow_squid_squirt\n\nschedule function gm4_ink_spitting_squid:main 16t\n"
  },
  {
    "path": "gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/function/squid_squirt.mcfunction",
    "content": "#@s = a player near a squid in water\n#run from main\n\neffect give @s nausea 5\neffect give @s blindness 5\nplaysound minecraft:entity.squid.hurt hostile @a[distance=..5] ~ ~ ~ 1 2\nparticle minecraft:squid_ink ^ ^ ^.5 .1 0 .1 0.05 10 normal @s\nadvancement grant @s only gm4:ink_spitting_squid\n"
  },
  {
    "path": "gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/guidebook/ink_spitting_squid.json",
    "content": "{\n  \"id\": \"ink_spitting_squid\",\n  \"name\": \"Ink Spitting Squid\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:ink_sac\"\n  },\n  \"criteria\": {\n    \"inked\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"player\",\n                \"advancements\": {\n                  \"gm4:ink_spitting_squid\": true\n                }\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"glow_inked\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"player\",\n                \"advancements\": {\n                  \"gm4:glow_ink_spitting_squid\": true\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"normal_squid\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"inked\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.ink_spitting_squid.normal_squid\",\n            \"fallback\": \"Swimming underwater near a squid will cause it to ink the diver.\\n\\nWhen affected by squid ink, blindness and nausea effects occur.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"glow_squid\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"glow_inked\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.ink_spitting_squid.glow_squid\",\n            \"fallback\": \"When glow squids ink, they have the opposite effect from squids.\\n\\nThose inked with glow ink are affected by night vision and glowing.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"normal_squid\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/predicate/inkable.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:inverted\",\n    \"term\": {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"effects\": {\n          \"minecraft:conduit_power\": {\n            \"duration\": {\n              \"min\": 1\n            }\n          }\n        }\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n      \"fluid\": {\n        \"fluids\": \"#minecraft:water\"\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/test/squirt.mcfunction",
    "content": "# @template gm4_ink_spitting_squid:test_tank\n# @dummy ~1 ~1 ~1\n\nsummon squid ~2 ~1 ~2\n\nawait entity @s[nbt={active_effects:[{id:\"minecraft:blindness\"},{id:\"minecraft:nausea\"}]}]\n"
  },
  {
    "path": "gm4_ink_spitting_squid/translations.csv",
    "content": "key,en_us\nadvancement.gm4.ink_spitting_squid.title,Natural Defenses\nadvancement.gm4.ink_spitting_squid.description,Get blinded by an underwater squid\nadvancement.gm4.glow_ink_spitting_squid.title,\"The Light, It Burns!\"\nadvancement.gm4.glow_ink_spitting_squid.description,Glow due to an underwater glow squid\ntext.gm4.guidebook.module_desc.ink_spitting_squid,\"Improves the vanilla ink effect by adding Blindness. Glow Squid will give Night Vision when disturbed, which might come in handy if you're out of torches!\"\ntext.gm4.guidebook.ink_spitting_squid.normal_squid,\"Swimming underwater near a squid will cause it to ink the diver.\\n\\nWhen affected by squid ink, blindness and nausea effects occur.\"\ntext.gm4.guidebook.ink_spitting_squid.glow_squid,\"When glow squids ink, they have the opposite effect from squids.\\n\\nThose inked with glow ink are affected by night vision and glowing.\"\n"
  },
  {
    "path": "gm4_lavish_livestock/README.md",
    "content": "# Lavish Livestock<!--$headerTitle--><!--$pmc:delete-->\n\nSelectively breed your livestock for increased yields! Commercialize your farming!<!--$pmc:headerSize-->\n\n### Features\n- Breeding livestock may result in offspring that is abnormally large\n- Larger livestock drops more loot\n"
  },
  {
    "path": "gm4_lavish_livestock/beet.yaml",
    "content": "id: gm4_lavish_livestock\nname: Lavish Livestock\nversion: 1.1.0\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\nrequire:\n  - bolt\n\npipeline:\n  - gm4_lavish_livestock.generate\n  - gm4.plugins.extend.module\n\nmeta:\n  livestock:\n    - chicken\n    - cow\n    - hoglin\n    - mooshroom\n    - pig\n    - rabbit\n    - sheep\n  gm4:\n    versioning:\n      schedule_loops: []\n    website:\n      description: Selectively breed your livestock for increased yields! Commercialize your farming!\n      recommended:\n        - gm4_pig_tractors\n        - metallurgy\n    video: null\n    #modrinth: \n    #  project_id: \n    #smithed:\n    #  pack_id: \n    #planetminecraft: \n    #  uid: \n    wiki: https://wiki.gm4.co/wiki/Lavish_Livestock\n    credits:\n      Creator:\n        - Bloo\n"
  },
  {
    "path": "gm4_lavish_livestock/data/gm4_lavish_livestock/function/init.mcfunction",
    "content": "execute unless score lavish_livestock gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Lavish Livestock\"}\nexecute unless score lavish_livestock gm4_earliest_version < lavish_livestock gm4_modules run scoreboard players operation lavish_livestock gm4_earliest_version = lavish_livestock gm4_modules\nscoreboard players set lavish_livestock gm4_modules 1\n\nscoreboard objectives add gm4_lavish_livestock_size dummy\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_lavish_livestock/data/gm4_lavish_livestock/guidebook/lavish_livestock.json",
    "content": "{\n  \"id\": \"lavish_livestock\",\n  \"name\": \"Lavish Livestock\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:wheat\"\n  },\n  \"criteria\": {\n    \"breed\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"#gm4_lavish_livestock:livestock\"\n        }\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"display\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"breed\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"text\":\"\\n\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.lavish_livestock.description\",\n            \"fallback\": \"Breeding livestock may result in offspring that is abnormally large.\\n\\nLarger livestock drops more loot.\"\n          }\n        ],\n        [\n          {\n            \"translate\":\"text.gm4.guidebook.lavish_livestock.list_header\",\n            \"fallback\":\"Livestock\",\n            \"underlined\":true\n          },\n          {\"text\":\"\\n\\n\"},\n          {\"translate\":\"entity.minecraft.chicken\", \"underlined\":false},\n          {\"text\":\"\\n\"},\n          {\"translate\":\"entity.minecraft.cow\", \"underlined\":false},\n          {\"text\":\"\\n\"},\n          {\"translate\":\"entity.minecraft.hoglin\", \"underlined\":false},\n          {\"text\":\"\\n\"},\n          {\"translate\":\"entity.minecraft.mooshroom\", \"underlined\":false},\n          {\"text\":\"\\n\"},\n          {\"translate\":\"entity.minecraft.pig\", \"underlined\":false},\n          {\"text\":\"\\n\"},\n          {\"translate\":\"entity.minecraft.rabbit\", \"underlined\":false},\n          {\"text\":\"\\n\"},\n          {\"translate\":\"entity.minecraft.sheep\", \"underlined\":false}\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_lavish_livestock/data/gm4_lavish_livestock/tags/entity_type/livestock.json",
    "content": "{\n  \"values\": ctx.meta['livestock']\n}\n"
  },
  {
    "path": "gm4_lavish_livestock/data/gm4_lavish_livestock/templates/advancement/breed.json",
    "content": "{\n    \"criteria\": {\n        \"breed_{{ entity_id }}\": {\n            \"trigger\": \"minecraft:bred_animals\",\n            \"conditions\": {\n                \"child\": {\n                    \"type\": \"{{ entity_id }}\"\n                }\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_lavish_livestock:{{ entity_id }}/revoke_advancement\"\n    }\n}\n"
  },
  {
    "path": "gm4_lavish_livestock/data/gm4_lavish_livestock/templates/function/determine_parent.mcfunction",
    "content": "# Stores the size of each parent into a score\n# @s = parent of the baby\n# at location of player who has fed the parent\n# run from gm4_lavish_livestock:{{ entity_id }}/revoke_advancement\n\n# init score if parent does not have a score\nscoreboard players add @s gm4_lavish_livestock_size 0\n\n# store size of parent into fixed fake player (only one of these triggers, the other one triggers for the other parent)\nexecute if score $parent_a gm4_lavish_livestock_size matches -1 run return run scoreboard players operation $parent_a gm4_lavish_livestock_size = @s gm4_lavish_livestock_size\nexecute if score $parent_b gm4_lavish_livestock_size matches -1 run return run scoreboard players operation $parent_b gm4_lavish_livestock_size = @s gm4_lavish_livestock_size\n"
  },
  {
    "path": "gm4_lavish_livestock/data/gm4_lavish_livestock/templates/function/find_baby.mcfunction",
    "content": "# Selects babies near the breeding site\n# @s = breeding site\n# at @s\n# run from gm4_lavish_livestock:{{ entity_id }}/find_marker\n\n# cache parent size\nscoreboard players operation $size gm4_lavish_livestock_size = @s gm4_lavish_livestock_size\nexecute as @e[type={{ entity_id }},distance=..10,nbt={Age:-24000},limit=1,sort=nearest] run function gm4_lavish_livestock:{{ entity_id }}/modify_baby\n\n# remove breeding site marker\nkill @s\n"
  },
  {
    "path": "gm4_lavish_livestock/data/gm4_lavish_livestock/templates/function/find_marker.mcfunction",
    "content": "# Called once the parent has given birth and initiates breeding sites to look for babies.\n# @s = undefined\n# at undefined\n# scheduled from gm4_lavish_livestock:{{ entity_id }}/revoke_advancement\n\nexecute as @e[type=marker,tag=gm4_lavish_livestock_breeding_site,tag=gm4_lavish_livestock_{{ entity_id }}] at @s run function gm4_lavish_livestock:{{ entity_id }}/find_baby\n"
  },
  {
    "path": "gm4_lavish_livestock/data/gm4_lavish_livestock/templates/function/initialize_marker.mcfunction",
    "content": "# Initializes the breeding site marker which sticks around awaiting birth\n# @s = new breeding site marker\n# at location of player who has fed the parent\n# run from gm4_lavish_livestock:{{ entity_id }}/determine_parent\n\nscoreboard players operation @s gm4_lavish_livestock_size = $parent_a gm4_lavish_livestock_size\ntag @s add gm4_lavish_livestock_breeding_site\ntag @s add gm4_lavish_livestock_{{ entity_id }}\n"
  },
  {
    "path": "gm4_lavish_livestock/data/gm4_lavish_livestock/templates/function/modify_baby.mcfunction",
    "content": "# Sets the size of the newborn baby\n# @s = the newborn baby\n# at location of breeding site marker\n# run from gm4_lavish_livestock:{{ entity_id }}/find_baby\n\n# get baby size from marker value\nscoreboard players operation @s gm4_lavish_livestock_size = $size gm4_lavish_livestock_size\n\n# if non-vanilla size: add loot table and tag entity (tag is for future-proofing only, it is not currently read)\nexecute if score @s gm4_lavish_livestock_size matches 1.. run tag @s add gm4_lavish_livestock_{{ entity_id }}\nexecute if score @s gm4_lavish_livestock_size matches 1.. run data modify entity @s DeathLootTable set value \"gm4_lavish_livestock:{{ entity_id }}/lavish_death\"\n\n# set scale attribute\nexecute if score @s gm4_lavish_livestock_size matches 1 run attribute @s minecraft:scale modifier add gm4_lavish_livestock:size 0.125 add_multiplied_base\nexecute if score @s gm4_lavish_livestock_size matches 2 run attribute @s minecraft:scale modifier add gm4_lavish_livestock:size 0.25 add_multiplied_base\n"
  },
  {
    "path": "gm4_lavish_livestock/data/gm4_lavish_livestock/templates/function/revoke_advancement.mcfunction",
    "content": "# Revokes the breeding advancement and initiates baby tracking\n# @s = player who bred livestock\n# at @s\n# run from advancement gm4_lavish_livestock:{{ entity_id }}/breed\n\nadvancement revoke @s only gm4_lavish_livestock:{{ entity_id }}/breed\n\n# get parent sizes\nscoreboard players set $parent_a gm4_lavish_livestock_size -1\nscoreboard players set $parent_b gm4_lavish_livestock_size -1\nexecute as @e[type={{ entity_id }},distance=..10,limit=2,sort=nearest,nbt=!{InLove:0}] run function gm4_lavish_livestock:{{ entity_id }}/determine_parent\n\n# if the parents differ in size, chose the smaller one\nexecute if score $parent_a gm4_lavish_livestock_size > $parent_b gm4_lavish_livestock_size run scoreboard players operation $parent_a gm4_lavish_livestock_size >< $parent_b gm4_lavish_livestock_size\n\n# if both parents are the same size, roll dice for size increase\nexecute if score $parent_a gm4_lavish_livestock_size = $parent_b gm4_lavish_livestock_size if predicate {condition:\"minecraft:random_chance\",chance:0.025} run scoreboard players add $parent_a gm4_lavish_livestock_size 1\n\n# store size onto marker and wait for baby to be born\nexecute summon marker run function gm4_lavish_livestock:{{ entity_id }}/initialize_marker\nschedule function gm4_lavish_livestock:{{ entity_id }}/find_marker 1t\n"
  },
  {
    "path": "gm4_lavish_livestock/data/gm4_lavish_livestock/templates/loot_table/lavish_death.json",
    "content": "{\n    \"type\": \"minecraft:entity\",\n    \"pools\": [\n        {\n            \"rolls\": {\n                \"type\": \"minecraft:score\",\n                \"target\": {\n                    \"type\": \"minecraft:context\",\n                    \"target\": \"this\"\n                },\n                \"score\": \"gm4_lavish_livestock_size\",\n                \"scale\": 2.5\n            },\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"minecraft:entities/{{ entity_id }}\"\n                }\n            ]\n        }\n    ],\n    \"random_sequence\": \"minecraft:entities/{{ entity_id }}\"\n}\n"
  },
  {
    "path": "gm4_lavish_livestock/generate.py",
    "content": "import logging\n\nfrom beet import Context, subproject\n\nlogger = logging.getLogger(__name__)\n\ndef beet_default(ctx: Context):\n    # List of supported animals defined in beet.yaml as well as the guidebook page\n    # for each supported entity, render a copy of the \"templates\" directory with the appropriate entity-id\n    for entity in ctx.meta['livestock']:\n        subproject_config = {\n            \"data_pack\": {\n                \"load\": [\n                    {\n                        f\"data/gm4_lavish_livestock/advancement/{entity}\": \"data/gm4_lavish_livestock/templates/advancement\",\n                        f\"data/gm4_lavish_livestock/function/{entity}\": \"data/gm4_lavish_livestock/templates/function\",\n                        f\"data/gm4_lavish_livestock/loot_table/{entity}\": \"data/gm4_lavish_livestock/templates/loot_table\",\n                    }\n                ],\n                \"render\": {\n                    \"advancement\": \"*\",\n                    \"function\": \"*\",\n                    \"loot_table\": \"*\"\n                }\n            },\n            \"meta\": {\n                \"entity_id\": entity\n            }\n        }\n\n        ctx.require(subproject(subproject_config))\n"
  },
  {
    "path": "gm4_lavish_livestock/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.lavish_livestock,\"Selectively breed your livestock for increased yields! Commercialize your farming!\"\ntext.gm4.guidebook.lavish_livestock.description,\"Breeding livestock may result in offspring that is abnormally large.\\n\\nLarger livestock drops more loot.\"\ntext.gm4.guidebook.lavish_livestock.list_header,\"Livestock\"\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/README.md",
    "content": "# Lightning in a Bottle<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nHarness the power of lighting, whenever you feel like it!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Allows the capturing of lightning during a storm by getting a lighting strike to hit a brewing stand\r\n- Throwing the bottle spawns lightning upon making contact with a block\r\n- Certain blocks can now become animated, for example Purpur Blocks turn into Shulkers.\r\n\r\nRead more about specific block conversions on the [Wiki](https://wiki.gm4.co/Lightning_in_a_Bottle).\r\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/assets/gm4_lightning_in_a_bottle/textures/item/lightning_in_a_bottle_overlay.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": false\n\t}\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/assets/gm4_lightning_in_a_bottle/textures/item/lingering_lightning_in_a_bottle_overlay.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": false\n\t}\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/assets/gm4_lightning_in_a_bottle/textures/item/splash_lightning_in_a_bottle_overlay.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": false\n\t}\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.lightning_in_a_bottle.lightning_drink.description,Drink a Bottle of Lightning\nadvancement.gm4.lightning_in_a_bottle.lightning_drink.title,Shocking!\nadvancement.gm4.lightning_in_a_bottle.lightning_shulker.description,Strike a Purpur Block with lightning to create a Shulker\nadvancement.gm4.lightning_in_a_bottle.lightning_shulker.title,It's Alive!\ncontainer.gm4.liquid_tank.liab_lightning,Lightning Tank\neffect.gm4.lightning_in_a_bottle.lightning,Lightning\nitem.gm4.bottle.effect.lightning,Bottle of Lightning\nitem.gm4.lingering_bottle.effect.lightning,Lingering Bottle of Lightning\nitem.gm4.splash_bottle.effect.lightning,Splash Bottle of Lightning\ntext.gm4.guidebook.module_desc.lightning_in_a_bottle,\"Bottle and harness the power of lightning using Brewing Stands! Lightning in a Bottle comes in splash and lingering variants, too.\"\ntext.gm4.guidebook.lightning_in_a_bottle.description,\"Lightning can be absorbed into a thick potion when struck by lightning.\\n\\nPillagers, evokers, purpur, and prismarine can amplify or animate into new mobs when struck by lightning.\"\ntext.gm4.guidebook.lightning_in_a_bottle.conversions,Pillagers can be amplified into Evokers.\\nEvokers can be amplified into Illusioners.\\n\\nPurpur Blocks can be animated into Shulkers.\\nPrismarine Bricks can be animated into Guardians.\ntext.gm4.guidebook.lightning_in_a_bottle.obtaining,\"To harness lightning, place a lightning rod attached to the top or bottom of a brewing stand.\\n\\nWhen the rod is struck, any thick potions inside the brewing stand will be converted into bottles of lightning.\"\ntext.gm4.guidebook.lightning_in_a_bottle.usage,\"Splash and Lingering variants can be brewed as normal.\\n\\nWhen a bottle of lightning is drank or thrown, it will release a bolt of lightning!\"\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/beet.yaml",
    "content": "id: gm4_lightning_in_a_bottle\nname: Lightning in a Bottle\nversion: 1.9.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\nrequire:\n  - bolt\n\npipeline:\n  - gm4_liquid_tanks.bolt_liquid_wrappers\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_brewing\n  - gm4.plugins.include.lib_potion_tracking\n\nmeta:\n  bolt:\n    entrypoint:\n      gm4_lightning_in_a_bottle:liquid_tanks/liquid_features\n  gm4:\n    versioning:\n      required:\n        lib_potion_tracking: 1.4.0\n        lib_brewing: 1.5.0\n      schedule_loops:\n        - main\n        - brewing_stand/texture_connector/process\n    model_data:\n      - template: generated_overlay\n        broadcast:\n          - item: potion\n            reference: item/lightning_in_a_bottle\n          - item: lingering_potion\n            reference: item/lingering_lightning_in_a_bottle\n          - item: splash_potion\n            reference: item/splash_lightning_in_a_bottle\n      - item: potion\n        reference: gui/advancement/lightning_in_a_bottle_drink\n        template:\n          name: advancement\n          forward: item/lightning_in_a_bottle\n      - item: purpur_block\n        reference: gui/advancement/lightning_in_a_bottle_shulker\n        template: advancement\n    website:\n      description: Bottle and harness the power of lightning using Brewing Stands! Lightning in a Bottle comes in splash and lingering variants, too.\n      recommended:\n        - gm4_resource_pack\n        - gm4_liquid_tanks\n        - gm4_potion_liquids\n        - gm4_spawner_minecarts\n      notes:\n        - Brewing Stands may need to be broken and replaced to be able to craft Lightning in a Bottle when the module is first installed.\n    modrinth:\n      project_id: GVqJxowR\n    wiki: https://wiki.gm4.co/wiki/Lightning_in_a_Bottle\n    credits:\n      Creator:\n        - Bloo\n        - BPR\n        - TheEpyonProject\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4/advancement/lightning_in_a_bottle_drink.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:potion\",\n      \"components\": {\n        \"minecraft:enchantment_glint_override\": true,\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_lightning_in_a_bottle:gui/advancement/lightning_in_a_bottle_drink\"]},\n        \"minecraft:potion_contents\": {\n          \"custom_color\": 11985402\n        }\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.lightning_in_a_bottle.lightning_drink.title\",\n      \"fallback\": \"Shocking!\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.lightning_in_a_bottle.lightning_drink.description\",\n      \"fallback\": \"Drink a Bottle of Lightning\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4/advancement/lightning_in_a_bottle_shulker.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:purpur_block\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_lightning_in_a_bottle:gui/advancement/lightning_in_a_bottle_shulker\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.lightning_in_a_bottle.lightning_shulker.title\",\n      \"fallback\": \"It's Alive!\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.lightning_in_a_bottle.lightning_shulker.description\",\n      \"fallback\": \"Strike a Purpur Block with lightning to create a Shulker\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:lightning_in_a_bottle_drink\",\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_brewing/tags/function/insert/lingering.json",
    "content": "{\n  \"values\": [\n    \"gm4_lightning_in_a_bottle:brewing_stand/brew/lingering\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_brewing/tags/function/insert/splash.json",
    "content": "{\n  \"values\": [\n    \"gm4_lightning_in_a_bottle:brewing_stand/brew/splash\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/advancement/drink_lightning.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:potion\"\n          ],\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_lightning_in_a_bottle:1b}\"\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_lightning_in_a_bottle:lightning/strike_self\"\n  }\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/advancement/lightning_strike.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:lightning_strike\",\n      \"conditions\": {\n        \"lightning\": {\n          \"distance\": {\n            \"absolute\": {\n              \"min\": 0,\n              \"max\": 64\n            }\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_lightning_in_a_bottle:lightning/locate\"\n  }\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/advancement/place_lightning_rod.json",
    "content": "{\n    \"criteria\": {\n        \"place_lightning_rod\": {\n            \"trigger\": \"minecraft:item_used_on_block\",\n            \"conditions\": {\n                \"location\": [\n                    {\n                        \"condition\": \"minecraft:match_tool\",\n                        \"predicate\": {\n                            \"items\": \"#gm4_lightning_in_a_bottle:lightning_rod\"\n                        }\n                    },\n                    {\n                        \"condition\": \"minecraft:location_check\",\n                        \"predicate\": {\n                            \"block\": {\n                                \"blocks\": [\n                                    \"minecraft:brewing_stand\"\n                                ]\n                            }\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_lightning_in_a_bottle:brewing_stand/texture_connector/force_update\"\n    }\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/brew/lingering.mcfunction",
    "content": "# @s = brewing stand marker with a custom potion to be converted to a lingering potion\n# run from #gm4_brewing:insert/lingering\n\nloot spawn ~ ~ ~ loot gm4_lightning_in_a_bottle:technical/brewing_stand/lingering\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/brew/splash.mcfunction",
    "content": "# @s = brewing stand marker with a custom potion to be converted to a splash potion\n# run from #gm4_brewing:insert/splash\n\nloot spawn ~ ~ ~ loot gm4_lightning_in_a_bottle:technical/brewing_stand/splash\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/check_fuel.mcfunction",
    "content": "# Checks if there is fuel in the Brewing Stand\n# positioned at brewing stand\n# runs from lightning/check\n\nexecute store result score $fuel gm4_liab_data run data get block ~ ~ ~ Fuel\nexecute if score $fuel gm4_liab_data matches 1.. run function gm4_lightning_in_a_bottle:brewing_stand/check_potions\nscoreboard players reset $fuel gm4_liab_data\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/check_potions.mcfunction",
    "content": "# Checks if there are regular Thick Potions in the Brewing Stand\n# positioned at brewing stand\n# runs from brewing_stand/check_fuel\n\n# attempt to \"brew\" Bottles of Lightning\nscoreboard players set $potion_success gm4_liab_data 0\n\nexecute store success score $potion_success gm4_liab_data run item modify block ~ ~ ~ container.0 gm4_lightning_in_a_bottle:brew_lightning\nexecute store success score $potion_success gm4_liab_data run item modify block ~ ~ ~ container.1 gm4_lightning_in_a_bottle:brew_lightning\nexecute store success score $potion_success gm4_liab_data run item modify block ~ ~ ~ container.2 gm4_lightning_in_a_bottle:brew_lightning\n\n# consume fuel, if succcess\nexecute if score $potion_success gm4_liab_data matches 1 run function gm4_lightning_in_a_bottle:brewing_stand/consume_fuel\nscoreboard players reset $potion_success gm4_liab_data\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/consume_fuel.mcfunction",
    "content": "# Consume fuel if Bottle of Lightning successfully brewed\n# @s = lightning bolt\n# positioned at brewing stand\n# runs from brewing_stand/check_potions\n\n# get random fuel cost\nexecute store result score $fuel_cost gm4_liab_data run random value 1..3\n\n# subtract fuel cost from Fuel and set to block's Fuel\nscoreboard players operation $fuel gm4_liab_data -= $fuel_cost gm4_liab_data\nexecute store result block ~ ~ ~ Fuel int 1 run scoreboard players get $fuel gm4_liab_data\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/texture_connector/force_update.mcfunction",
    "content": "# forces nearby texture_connectors to update\n# @s = player who has placed a lightning rod on a brewing stand\n# at @s\n# run from advancement place_lightning_rod\n\n# revoke advancement\nadvancement revoke @s only gm4_lightning_in_a_bottle:place_lightning_rod\n\n# add texture connectors to nearby brewing stands\nexecute as @e[type=marker,tag=gm4_brewing_stand,distance=..8] at @s if block ~ ~1 ~ #gm4_lightning_in_a_bottle:lightning_rod[facing=up] \\\n  align xyz unless entity @e[tag=gm4_lightning_rod_texture_connector,dy=0.01,limit=1] run function gm4_lightning_in_a_bottle:brewing_stand/texture_connector/summon\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/texture_connector/process.mcfunction",
    "content": "# scheduled from main and self\nschedule function gm4_lightning_in_a_bottle:brewing_stand/texture_connector/process 16t\n\n# process texture connectors for removal or texture change\nexecute as @e[type=item_display,tag=gm4_lightning_rod_texture_connector] at @s run function gm4_lightning_in_a_bottle:brewing_stand/texture_connector/update\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/texture_connector/summon.mcfunction",
    "content": "# summons correct texture connector\n# @s = @e[type=marker,tag=gm4_brewing_stand] or @e[type=armor_stand,tag=gm4_lightning_rod_texture_connector]\n# at @s align xyz\n# run from brewing_stand/texture_connector/force_update and main and upgrade_paths/1.4\n\n# normal\nexecute if block ~ ~1 ~ #gm4_lightning_in_a_bottle:normal_lightning_rod run summon item_display ~0.5 ~1 ~0.5 {Tags:[\"gm4_lightning_rod_texture_connector\"],item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:profile\":\"$texture_connector\"}},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0.25,0.25,0.25]}}\n\n# exposed\nexecute if block ~ ~1 ~ #gm4_lightning_in_a_bottle:exposed_lightning_rod run summon item_display ~0.5 ~1 ~0.5 {Tags:[\"gm4_lightning_rod_texture_connector\"],item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:profile\":\"$texture_connector_exposed\"}},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0.25,0.25,0.25]}}\n\n# weathered\nexecute if block ~ ~1 ~ #gm4_lightning_in_a_bottle:weathered_lightning_rod run summon item_display ~0.5 ~1 ~0.5 {Tags:[\"gm4_lightning_rod_texture_connector\"],item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:profile\":\"$texture_connector_weathered\"}},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0.25,0.25,0.25]}}\n\n# oxidized\nexecute if block ~ ~1 ~ #gm4_lightning_in_a_bottle:oxidized_lightning_rod run summon item_display ~0.5 ~1 ~0.5 {Tags:[\"gm4_lightning_rod_texture_connector\"],item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:profile\":\"$texture_connector_oxidized\"}},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0.25,0.25,0.25]}}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/texture_connector/update.mcfunction",
    "content": "# @s = @e[type=item_display,tag=gm4_lightning_rod_texture_connector]\n# at @s\n# run from brewing_stand/texture_connector/process\n\n# kill if unneeded\nexecute unless block ~ ~-0.1 ~ minecraft:brewing_stand run return run kill @s\nexecute unless block ~ ~ ~ #gm4_lightning_in_a_bottle:lightning_rod run return run kill @s\n\n# update texture\nscoreboard players set $texture_changed gm4_liab_data 0\n# normal\nexecute unless score @s gm4_liab.oxidization matches 1 if block ~ ~ ~ #gm4_lightning_in_a_bottle:normal_lightning_rod store success score $texture_changed gm4_liab_data run data modify entity @s item.components merge value {\"minecraft:profile\":\"$texture_connector\"}\nexecute if score $texture_changed gm4_liab_data matches 1 run return run scoreboard players set @s gm4_liab.oxidization 1\n# exposed\nexecute unless score @s gm4_liab.oxidization matches 2 if block ~ ~ ~ #gm4_lightning_in_a_bottle:exposed_lightning_rod store success score $texture_changed gm4_liab_data run data modify entity @s item.components merge value {\"minecraft:profile\":\"$texture_connector_exposed\"}\nexecute if score $texture_changed gm4_liab_data matches 1 run return run scoreboard players set @s gm4_liab.oxidization 2\n# weathered\nexecute unless score @s gm4_liab.oxidization matches 3 if block ~ ~ ~ #gm4_lightning_in_a_bottle:weathered_lightning_rod store success score $texture_changed gm4_liab_data run data modify entity @s item.components merge value {\"minecraft:profile\":\"$texture_connector_weathered\"}\nexecute if score $texture_changed gm4_liab_data matches 1 run return run scoreboard players set @s gm4_liab.oxidization 3\n# oxidized\nexecute unless score @s gm4_liab.oxidization matches 4 if block ~ ~ ~ #gm4_lightning_in_a_bottle:oxidized_lightning_rod store success score $texture_changed gm4_liab_data run data modify entity @s item.components merge value {\"minecraft:profile\":\"$texture_connector_oxidized\"}\nexecute if score $texture_changed gm4_liab_data matches 1 run return run scoreboard players set @s gm4_liab.oxidization 4\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/entity/evoker.mcfunction",
    "content": "# Creates an Evoker from a Pillager\n# @s = pillager\n# at @s\n# run from lightning/check\n\ntag @s add gm4_liab_new_evoker\n\n# Spawn new mob\nsummon evoker ~ ~ ~ {Tags:[\"gm4_liab_new_evoker\"]}\n\n# Copies old mob data\ndata modify entity @e[type=evoker,tag=gm4_liab_new_evoker,limit=1,distance=0] {} merge from entity @s {}\n# But modifies the loot table, if it does not already exist, and fully heals the new mob\nexecute as @e[type=evoker,tag=gm4_liab_new_evoker] run execute unless data entity @s DeathLootTable run data merge entity @s {Health:24f}\ntag @e[type=evoker] remove gm4_liab_new_evoker\n\n# kill old mob\ntp @s ~ -10000 ~\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/entity/guardian.mcfunction",
    "content": "# Creates a Guardian from Prismarine Bricks\n# @s = lightning bolt\n# positioned 1 block above Prismarine Bricks\n# run from lightning/check\n\nsetblock ~ ~ ~ air\nsummon guardian ~ ~ ~ {active_effects:[{id:'minecraft:regeneration',duration:20,amplifier:10b,show_particles:0b}]}\n\n# set fake player flag\nscoreboard players set $found_block gm4_liab_data 1\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/entity/illusioner.mcfunction",
    "content": "# Creates an Illusioner from a Evoker\n# @s = evoker\n# at @s\n# run from lightning/check\n\ntag @s add gm4_liab_new_illusioner\n\n# Spawn new mob\nsummon illusioner ~ ~ ~ {Tags:[\"gm4_liab_new_illusioner\"]}\n\n# Copies old mob data\ndata modify entity @e[type=illusioner,tag=gm4_liab_new_illusioner,limit=1,distance=0] {} merge from entity @s {}\n# But modifies the loot table, if it does not already exist, and fully heals the new mob\nexecute as @e[type=illusioner,tag=gm4_liab_new_illusioner] run execute unless data entity @s DeathLootTable run data merge entity @s {DeathLootTable:\"gm4_lightning_in_a_bottle:entities/illusioner\",Health:32f}\ntag @e[type=illusioner] remove gm4_liab_new_illusioner\n\n# Kill old mob\ntp @s ~ -10000 ~\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/entity/shulker.mcfunction",
    "content": "# Creates a Shulker from a Purpur Block\n# @s = lightning bolt\n# positioned 1 block above a Purpur Block\n# run from lightning/check\n\nsetblock ~ ~ ~ air\nsummon shulker ~ ~-.49 ~ {active_effects:[{id:'minecraft:regeneration',duration:20,amplifier:10b,show_particles:0b}],Color:16,DeathLootTable:\"gm4_lightning_in_a_bottle:entities/shulker\"}\n\nadvancement grant @a[distance=..5,gamemode=!spectator] only gm4:lightning_in_a_bottle_shulker\n\n# set fake player flag\nscoreboard players set $found_block gm4_liab_data 1\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_liab_data dummy\nscoreboard objectives add gm4_liab.oxidization dummy\n\nexecute unless score lightning_in_a_bottle gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Lightning in a Bottle\"}\nexecute unless score lightning_in_a_bottle gm4_earliest_version < lightning_in_a_bottle gm4_modules run scoreboard players operation lightning_in_a_bottle gm4_earliest_version = lightning_in_a_bottle gm4_modules\nscoreboard players set lightning_in_a_bottle gm4_modules 1\n\n\nschedule function gm4_lightning_in_a_bottle:main 2t\nschedule function gm4_lightning_in_a_bottle:brewing_stand/texture_connector/process 8t\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/lightning/check.mcfunction",
    "content": "# Creates and empowers certain mobs and creates Bottles of Lightning\n# @s = lightning bolt\n# at @s\n# run from lightning/locate\n\n# tag processed lightning\ntag @s add gm4_liab_processed\n\n# create Bottles of Lightning from Thick Potions in Brewing Stands under (or above) Lightning Rods\nexecute if block ~ ~-.01 ~ #gm4_lightning_in_a_bottle:lightning_rod[facing=up] if block ~ ~-1.01 ~ brewing_stand positioned ~ ~-1.01 ~ run function gm4_lightning_in_a_bottle:brewing_stand/check_fuel\nexecute if block ~ ~-.01 ~ #gm4_lightning_in_a_bottle:lightning_rod[facing=down] if block ~ ~.99 ~ brewing_stand positioned ~ ~.99 ~ run function gm4_lightning_in_a_bottle:brewing_stand/check_fuel\n\n# Lightning-based mob transformation\n# Evokers -> Illusioners\nexecute align xyz positioned ~-3 ~-2 ~-3 as @e[type=evoker,tag=!smithed.entity,dx=6,dy=11,dz=6] at @s run function gm4_lightning_in_a_bottle:entity/illusioner\n# Pillagers -> Evokers\nexecute align xyz positioned ~-3 ~-2 ~-3 as @e[type=pillager,tag=!smithed.entity,dx=6,dy=11,dz=6] at @s run function gm4_lightning_in_a_bottle:entity/evoker\n\n# Creeper Spawners struck by the lightning will become Charged Creepers Spawners\nexecute align xyz positioned ~0.5 ~-0.5 ~0.5 if block ~ ~ ~ spawner{SpawnData:{entity:{id:\"minecraft:creeper\"}}} unless entity @e[tag=!smithed.block,distance=..0.5] run data merge block ~ ~ ~ {MaxSpawnDelay:801s,SpawnData:{entity:{id:\"minecraft:creeper\",powered:1b}},SpawnPotentials:[{data:{entity:{id:\"minecraft:creeper\",powered:1b,DeathLootTable:\"gm4_lightning_in_a_bottle:entities/charged_creeper\"}},weight:1}]}\n\n# Lightning-based block -> entity transformation\n# inside strike location\nexecute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ purpur_block unless entity @e[tag=smithed.block,distance=..0.5] run function gm4_lightning_in_a_bottle:entity/shulker\nexecute unless score $found_block gm4_liab_data matches 1.. align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ prismarine_bricks unless entity @e[tag=smithed.block,distance=..0.5] run function gm4_lightning_in_a_bottle:entity/guardian\n# below strike location\nexecute unless score $found_block gm4_liab_data matches 1.. align xyz positioned ~0.5 ~-0.5 ~0.5 if block ~ ~ ~ purpur_block unless entity @e[tag=smithed.block,distance=..0.5] run function gm4_lightning_in_a_bottle:entity/shulker\nexecute unless score $found_block gm4_liab_data matches 1.. align xyz positioned ~0.5 ~-0.5 ~0.5 if block ~ ~ ~ prismarine_bricks unless entity @e[tag=smithed.block,distance=..0.5] run function gm4_lightning_in_a_bottle:entity/guardian\n\n# other lightning-based expansions can happen after\nfunction #gm4_lightning_in_a_bottle:lightning_strike\n\n# reset fake players\nscoreboard players reset $found_block gm4_liab_data\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/lightning/locate.mcfunction",
    "content": "# A player near a lightning strike\n# @s = player, near lightning strike\n# at @s\n# run from advancement, gm4_lightning_in_a_bottle:lightning_strike\n\nadvancement revoke @s only gm4_lightning_in_a_bottle:lightning_strike\n\n# Check every lightning bolt\nexecute as @e[type=lightning_bolt,tag=!gm4_liab_processed] at @s run function gm4_lightning_in_a_bottle:lightning/check\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/lightning/strike_self.mcfunction",
    "content": "# player drinking Bottle of Lightning\n# @s = player that drank Bottle of Lightning\n# at @s\n# from advancement, gm4:lightning_drink\n\nadvancement revoke @s only gm4_lightning_in_a_bottle:drink_lightning\n\nsummon lightning_bolt ~ ~ ~\n\neffect give @s speed 2 3\n\nadvancement grant @s only gm4:lightning_in_a_bottle_drink\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/main.mcfunction",
    "content": "\n# find lightning aecs\nexecute as @e[type=area_effect_cloud,tag=gm4_liab_lingering,predicate=gm4_lightning_in_a_bottle:random_strike] at @s run function gm4_lightning_in_a_bottle:sustain_lingering_lightning\n\n# summon lightning rod - brewing stand connectors if needed\nexecute as @e[type=marker,tag=gm4_brewing_stand] at @s if block ~ ~1 ~ #gm4_lightning_in_a_bottle:lightning_rod[facing=up] \\\n  align xyz unless entity @e[tag=gm4_lightning_rod_texture_connector,dy=0.01,limit=1] run function gm4_lightning_in_a_bottle:brewing_stand/texture_connector/summon\n\nschedule function gm4_lightning_in_a_bottle:main 4s\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/potion_tracking/modify_cloud.mcfunction",
    "content": "# change the lingering bottle's cloud particle effects\n# @s = aec with LiaB thrown lingering bottle effects\n# at a nearby gm4_liab_potion_tracker marker\n# run from potion_tracking/potion_landed\n\ntag @s add gm4_liab_lingering\ndata merge entity @s {custom_particle:{type:\"minecraft:electric_spark\"},RadiusOnUse:0f,RadiusPerTick:0f}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/potion_tracking/potion_landed.mcfunction",
    "content": "# force-kills tracker markers in case they are in lazy loaded chunks\n# @s = gm4_liab_potion_tracker markers\n# at @s\n# run from potion_tracking/verify_landed_potion\n\nexecute if block ~ ~-1 ~ #gm4_lightning_in_a_bottle:lightning_rod align y run summon lightning_bolt ~ ~ ~\nexecute unless block ~ ~-1 ~ #gm4_lightning_in_a_bottle:lightning_rod run summon lightning_bolt ~ ~ ~\nexecute as @e[type=area_effect_cloud,distance=..8,limit=1,sort=nearest,nbt={potion_contents:{custom_effects:[{id:'minecraft:night_vision',amplifier:12b,duration:1}]}}] run function gm4_lightning_in_a_bottle:potion_tracking/modify_cloud\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/potion_tracking/tag_potion.mcfunction",
    "content": "# run from #gm4_potion_tracking/tag_potion\n\ntag @s[tag=!gm4_potion,nbt={Item:{components:{\"minecraft:custom_data\":{gm4_lightning_in_a_bottle:1b}}}}] add gm4_potion\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/potion_tracking/verify_landed_potion.mcfunction",
    "content": "# @s = gm4_liab_potion_tracker markers\n# at @s\n# run from #gm4_potion_tracking/potion_landed\n\nexecute if data storage gm4_potion_tracking:temp entity_data.Item.components.\"minecraft:custom_data\"{gm4_lightning_in_a_bottle:1b} run function gm4_lightning_in_a_bottle:potion_tracking/potion_landed\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/sustain_lingering_lightning.mcfunction",
    "content": "# strikes lightning on lingering lightning in a bottle AECs\n# @s = @e[type=area_effect_cloud,tag=gm4_liab_lingering,predicate=gm4_lightning_in_a_bottle:random_strike]\n# at @s\n# run from main\n\n# summon lightning; snap to lightning rod if there is one below\nexecute if block ~ ~-1 ~ #gm4_lightning_in_a_bottle:lightning_rod align y run summon lightning_bolt ~ ~ ~\nexecute unless block ~ ~-1 ~ #gm4_lightning_in_a_bottle:lightning_rod run summon lightning_bolt ~ ~ ~\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/upgrade_paths/1.4.mcfunction",
    "content": "# upgrades armor-stand gm4_lightning_rod_texture_connector's to item_displays\n# @s = player\n# at @s\n# run via upgrade paths util\n\nexecute as @e[type=armor_stand,tag=gm4_lightning_rod_texture_connector] at @s align xyz run function gm4_lightning_in_a_bottle:brewing_stand/texture_connector/summon\nkill @e[type=armor_stand,tag=gm4_lightning_rod_texture_connector]\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/guidebook/lightning_in_a_bottle.json",
    "content": "{\n  \"id\": \"lightning_in_a_bottle\",\n  \"name\": \"Lightning in a Bottle\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:lightning_rod\"\n  },\n  \"criteria\": {\n    \"lightning_strike\": {\n      \"trigger\": \"minecraft:lightning_strike\",\n      \"conditions\": {\n        \"lightning\": {\n          \"distance\": {\n            \"absolute\": {\n              \"min\": 0,\n              \"max\": 64\n            }\n          }\n        }\n      }\n    },\n    \"obtain_lightning_rod\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#gm4_lightning_in_a_bottle:lightning_rod\"\n          }\n        ]\n      }\n    },\n    \"obtain_thick_potion\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:potion\",\n            \"predicates\": {\n              \"minecraft:potion_contents\": \"minecraft:thick\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_lightning_bottle\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:potion\",\n              \"minecraft:splash_potion\",\n              \"minecraft:lingering_potion\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_lightning_in_a_bottle:1b}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"lightning_strike\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.lightning_in_a_bottle.description\",\n            \"fallback\": \"Lightning can be absorbed into a thick potion when struck by lightning.\\n\\nPillagers, evokers, purpur, and prismarine can amplify or animate into new mobs when struck by lightning.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.lightning_in_a_bottle.conversions\",\n            \"fallback\": \"Pillagers can be amplified into Evokers.\\nEvokers can be amplified into Illusioners.\\n\\nPurpur Blocks can be animated into Shulkers.\\nPrismarine Bricks can be animated into Guardians.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"obtaining\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_lightning_rod\"\n        ],\n        [\n          \"obtain_thick_potion\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.lightning_in_a_bottle.obtaining\",\n            \"fallback\": \"To harness lightning, place a lightning rod attached to the top or bottom of a brewing stand.\\n\\nWhen the rod is struck, any thick potions inside the brewing stand will be converted into bottles of lightning.\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"description\"\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_lightning_bottle\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.lightning_in_a_bottle.usage\",\n            \"fallback\": \"Splash and Lingering variants can be brewed as normal.\\n\\nWhen a bottle of lightning is drank or thrown, it will release a bolt of lightning!\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"description\",\n        \"obtaining\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/item_modifier/bottle_of_lightning.json",
    "content": "[\n  {\n    \"function\": \"minecraft:set_name\",\n    \"name\": {\n      \"translate\": \"item.gm4.bottle.effect.lightning\",\n      \"fallback\": \"Bottle of Lightning\",\n      \"color\": \"white\",\n      \"italic\": false\n    }\n  },\n  {\n    \"function\": \"minecraft:set_lore\",\n    \"mode\": \"append\",\n    \"lore\": [\n      {\n        \"translate\": \"potion.withAmplifier\",\n        \"with\": [\n          {\n            \"translate\": \"effect.gm4.lightning_in_a_bottle.lightning\",\n            \"fallback\": \"Lightning\",\n            \"color\": \"red\",\n            \"italic\": false\n          },\n          {\n            \"translate\": \"potion.potency.0\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"function\": \"minecraft:set_components\",\n    \"components\": {\n      \"minecraft:enchantment_glint_override\": true,\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_lightning_in_a_bottle:item/lightning_in_a_bottle\"]},\n      \"minecraft:potion_contents\": {\n        \"custom_color\": 11985402\n      },\n      \"minecraft:tooltip_display\": {\n        \"hidden_components\": [\n          \"minecraft:potion_contents\"\n        ]\n      }\n    }\n  },\n  {\n    \"function\": \"minecraft:set_custom_data\",\n    \"tag\": \"{gm4_lightning_in_a_bottle:1b}\"\n  }\n]\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/item_modifier/brew_lightning.json",
    "content": "[\n    {\n      \"function\": \"minecraft:filtered\",\n      \"item_filter\": {\n        \"items\": \"minecraft:lingering_potion\",\n        \"components\": {\n          \"minecraft:potion_contents\": {\n            \"potion\": \"minecraft:thick\"\n          }\n        }\n      },\n      \"modifier\": {\n        \"function\": \"minecraft:reference\",\n        \"name\": \"gm4_lightning_in_a_bottle:lingering_bottle_of_lightning\"\n      },\n      \"on_pass\": {\n        \"function\": \"minecraft:reference\",\n        \"name\": \"gm4_lightning_in_a_bottle:lingering_bottle_of_lightning\"\n      }\n    },\n    {\n      \"function\": \"minecraft:filtered\",\n      \"item_filter\": {\n        \"items\": \"minecraft:splash_potion\",\n        \"components\": {\n          \"minecraft:potion_contents\": {\n            \"potion\": \"minecraft:thick\"\n          }\n        }\n      },\n      \"modifier\": {\n        \"function\": \"minecraft:reference\",\n        \"name\": \"gm4_lightning_in_a_bottle:splash_bottle_of_lightning\"\n      },\n      \"on_pass\": {\n        \"function\": \"minecraft:reference\",\n        \"name\": \"gm4_lightning_in_a_bottle:splash_bottle_of_lightning\"\n      }\n    },\n    {\n      \"function\": \"minecraft:filtered\",\n      \"item_filter\": {\n        \"items\": \"minecraft:potion\",\n        \"components\": {\n          \"minecraft:potion_contents\": {\n            \"potion\": \"minecraft:thick\"\n          }\n        }\n      },\n      \"modifier\": {\n        \"function\": \"minecraft:reference\",\n        \"name\": \"gm4_lightning_in_a_bottle:bottle_of_lightning\"\n      },\n      \"on_pass\": {\n        \"function\": \"minecraft:reference\",\n        \"name\": \"gm4_lightning_in_a_bottle:bottle_of_lightning\"\n      }\n    }\n  ]\n  "
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/item_modifier/lingering_bottle_of_lightning.json",
    "content": "[\n  {\n    \"function\": \"minecraft:set_name\",\n    \"name\": {\n      \"translate\": \"item.gm4.lingering_bottle.effect.lightning\",\n      \"fallback\": \"Lingering Bottle of Lightning\",\n      \"color\": \"white\",\n      \"italic\": false\n    }\n  },\n  {\n    \"function\": \"minecraft:set_lore\",\n    \"mode\": \"append\",\n    \"lore\": [\n      {\n        \"translate\": \"potion.withAmplifier\",\n        \"with\": [\n          {\n            \"translate\": \"effect.gm4.lightning_in_a_bottle.lightning\",\n            \"fallback\": \"Lightning\",\n            \"color\": \"red\",\n            \"italic\": false\n          },\n          {\n            \"translate\": \"potion.potency.0\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"function\": \"minecraft:set_components\",\n    \"components\": {\n      \"minecraft:enchantment_glint_override\": true,\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_lightning_in_a_bottle:item/lingering_lightning_in_a_bottle\"]},\n      \"minecraft:potion_contents\": {\n        \"custom_color\": 11985402,\n        \"custom_effects\": [\n          {\n            \"id\": \"minecraft:night_vision\",\n            \"amplifier\": 12,\n            \"duration\": 1\n          }\n        ]\n      },\n      \"minecraft:tooltip_display\": {\n        \"hidden_components\": [\n          \"minecraft:potion_contents\"\n        ]\n      }\n    }\n  },\n  {\n    \"function\": \"minecraft:set_custom_data\",\n    \"tag\": \"{gm4_lightning_in_a_bottle:1b}\"\n  }\n]\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/item_modifier/set_zero.json",
    "content": "{\n  \"function\": \"minecraft:set_count\",\n  \"count\": 0\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/item_modifier/splash_bottle_of_lightning.json",
    "content": "[\n  {\n    \"function\": \"minecraft:set_name\",\n    \"name\": {\n      \"translate\": \"item.gm4.splash_bottle.effect.lightning\",\n      \"fallback\": \"Splash Bottle of Lightning\",\n      \"color\": \"white\",\n      \"italic\": false\n    }\n  },\n  {\n    \"function\": \"minecraft:set_lore\",\n    \"mode\": \"append\",\n    \"lore\": [\n      {\n        \"translate\": \"potion.withAmplifier\",\n        \"with\": [\n          {\n            \"translate\": \"effect.gm4.lightning_in_a_bottle.lightning\",\n            \"fallback\": \"Lightning\",\n            \"color\": \"red\",\n            \"italic\": false\n          },\n          {\n            \"translate\": \"potion.potency.0\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"function\": \"minecraft:set_components\",\n    \"components\": {\n      \"minecraft:enchantment_glint_override\": true,\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_lightning_in_a_bottle:item/splash_lightning_in_a_bottle\"]},\n      \"minecraft:potion_contents\": {\n        \"custom_color\": 11985402\n      },\n      \"minecraft:tooltip_display\": {\n        \"hidden_components\": [\n          \"minecraft:potion_contents\"\n        ]\n      }\n    }\n  },\n  {\n    \"function\": \"minecraft:set_custom_data\",\n    \"tag\": \"{gm4_lightning_in_a_bottle:1b}\"\n  }\n]\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/entities/charged_creeper.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"minecraft:entities/creeper\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/entities/illusioner.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:golden_carrot\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 0,\n                \"max\": 3\n              }\n            },\n            {\n              \"function\": \"minecraft:enchanted_count_increase\",\n              \"enchantment\": \"minecraft:looting\",\n              \"count\": {\n                \"min\": 0,\n                \"max\": 1\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/entities/shulker.json",
    "content": "{\n  \"type\": \"minecraft:entity\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"bonus_rolls\": 0,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:shulker_shell\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": 1,\n              \"add\": false,\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance_with_enchanted_bonus\",\n                  \"enchantment\": \"minecraft:looting\",\n                  \"unenchanted_chance\": 0.1,\n                  \"enchanted_chance\": {\n                    \"type\": \"minecraft:linear\",\n                    \"base\": 0.125,\n                    \"per_level_above_first\": 0.025\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:killed_by_player\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/items/bottle_of_lightning.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:potion\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:reference\",\n              \"name\": \"gm4_lightning_in_a_bottle:bottle_of_lightning\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/items/lingering_bottle_of_lightning.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:lingering_potion\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:reference\",\n              \"name\": \"gm4_lightning_in_a_bottle:lingering_bottle_of_lightning\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/items/splash_bottle_of_lightning.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:splash_potion\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:reference\",\n              \"name\": \"gm4_lightning_in_a_bottle:splash_bottle_of_lightning\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/technical/brewing_stand/lingering.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"value\": \"gm4_lightning_in_a_bottle:items/lingering_bottle_of_lightning\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:entity_properties\",\n                  \"entity\": \"this\",\n                  \"predicate\": {\n                    \"nbt\": \"{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{gm4_lightning_in_a_bottle:1b}}}}}}\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      ],\n      \"functions\": [\n        {\n          \"function\": \"minecraft:set_custom_data\",\n          \"tag\": \"{gm4_custom_potion:1b}\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/technical/brewing_stand/splash.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"value\": \"gm4_lightning_in_a_bottle:items/splash_bottle_of_lightning\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:entity_properties\",\n                  \"entity\": \"this\",\n                  \"predicate\": {\n                    \"nbt\": \"{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{gm4_lightning_in_a_bottle:1b}}}}}}\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      ],\n      \"functions\": [\n        {\n          \"function\": \"minecraft:set_custom_data\",\n          \"tag\": \"{gm4_custom_potion:1b}\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/modules/liquid_tanks/liquid_features.bolt",
    "content": "from gm4_liquid_tanks:liquid_wrappers import liquid\n\n@liquid\nclass BottledLightning:\n    id = 'liab_lightning'\n    name = \"Lightning\"\n    capacity = 300\n    skin = 'lightning_liquid'\n\n    liquid.init()\n    \n    @liquid.item_fill(\"glass_bottle\", \"potion[custom_data~{gm4_lightning_in_a_bottle:1b}]\", 1)\n    def fill_bottle():\n        loot replace entity 344d47-4-4-4-f04ce104d weapon.mainhand loot gm4_lightning_in_a_bottle:items/bottle_of_lightning\n\n    @liquid.util_below\n    def lightning_strike():\n        execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0]\n            unless entity @s[gamemode=spectator]\n            unless entity @s[predicate=gm4_lightning_in_a_bottle:on_fire]\n            run function gm4_lightning_in_a_bottle:liquid_tanks/util/lightning:\n                execute at @s run summon lightning_bolt ~ ~ ~\n                scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1\n                playsound entity.firework_rocket.twinkle block @a[distance=..8] ~ ~ ~ 2 1.5\n                advancement grant @s only gm4:lightning_in_a_bottle_drink\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/predicate/on_fire.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"flags\": {\n      \"is_on_fire\": true\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/predicate/random_strike.json",
    "content": "{\n  \"condition\": \"minecraft:random_chance\",\n  \"chance\": 0.5\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/block/exposed_lightning_rod.json",
    "content": "{\n  \"values\": [\n    \"minecraft:exposed_lightning_rod\",\n    \"minecraft:waxed_exposed_lightning_rod\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/block/lightning_rod.json",
    "content": "{\n  \"values\": [\n    \"minecraft:lightning_rod\",\n    \"minecraft:exposed_lightning_rod\",\n    \"minecraft:weathered_lightning_rod\",\n    \"minecraft:oxidized_lightning_rod\",\n    \"minecraft:waxed_lightning_rod\",\n    \"minecraft:waxed_exposed_lightning_rod\",\n    \"minecraft:waxed_weathered_lightning_rod\",\n    \"minecraft:waxed_oxidized_lightning_rod\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/block/normal_lightning_rod.json",
    "content": "{\n  \"values\": [\n    \"minecraft:lightning_rod\",\n    \"minecraft:waxed_lightning_rod\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/block/oxidized_lightning_rod.json",
    "content": "{\n  \"values\": [\n    \"minecraft:oxidized_lightning_rod\",\n    \"minecraft:waxed_oxidized_lightning_rod\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/block/weathered_lightning_rod.json",
    "content": "{\n  \"values\": [\n    \"minecraft:weathered_lightning_rod\",\n    \"minecraft:waxed_weathered_lightning_rod\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/entity_type/potion_tracker.json",
    "content": "{\n  \"values\": [\n    \"minecraft:marker\",\n    \"minecraft:lingering_potion\",\n    \"minecraft:splash_potion\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/function/lightning_strike.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/item/lightning_rod.json",
    "content": "{\n  \"values\": [\n    \"minecraft:lightning_rod\",\n    \"minecraft:exposed_lightning_rod\",\n    \"minecraft:weathered_lightning_rod\",\n    \"minecraft:oxidized_lightning_rod\",\n    \"minecraft:waxed_lightning_rod\",\n    \"minecraft:waxed_exposed_lightning_rod\",\n    \"minecraft:waxed_weathered_lightning_rod\",\n    \"minecraft:waxed_oxidized_lightning_rod\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/brew_splash.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~\n\nitem replace entity @s weapon.mainhand with minecraft:brewing_stand\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1\ndummy @s use block ~1 ~1 ~1\n\nawait entity @e[type=marker,tag=gm4_brewing_stand,distance=..4]\n\nloot replace block ~1 ~1 ~1 container.0 loot gm4_lightning_in_a_bottle:items/bottle_of_lightning\nitem replace block ~1 ~1 ~1 container.3 with minecraft:gunpowder\nitem replace block ~1 ~1 ~1 container.4 with minecraft:blaze_powder\n\nawait delay 1t\n\ndata merge block ~1 ~1 ~1 {BrewTime:40s}\n\nawait items block ~1 ~1 ~1 container.0 minecraft:splash_potion[custom_data~{gm4_lightning_in_a_bottle:1b}]\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/lightning_strike.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~\n\ngive @s brewing_stand\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1\ndummy @s use block ~1 ~1 ~1\n\nawait entity @e[type=marker,tag=gm4_brewing_stand,distance=..4]\n\ngive @s lightning_rod\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-0.5 ~1\ndummy @s use block ~1 ~2 ~1\n\nitem replace block ~1 ~1 ~1 container.0 with minecraft:potion[potion_contents=\"minecraft:thick\"]\nitem replace block ~1 ~1 ~1 container.4 with minecraft:blaze_powder\n\nawait delay 1s\n\nsummon lightning_bolt ~1.5 ~3 ~1.5\n\nawait items block ~1 ~1 ~1 container.0 minecraft:potion[count=1,custom_data~{gm4_lightning_in_a_bottle:1b}]\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/throw.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~\n\nloot give @s loot gm4_lightning_in_a_bottle:items/splash_bottle_of_lightning\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1\ndummy @s use item\n\nawait entity @e[type=lightning_bolt,distance=..4]\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/throw_evoker.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~\n\nsummon pillager ~1.5 ~1 ~1.5\nloot give @s loot gm4_lightning_in_a_bottle:items/splash_bottle_of_lightning\nexecute at @s run tp @s ~ ~ ~ facing ~ ~ ~1\ndummy @s use item\n\nawait entity @e[type=evoker,distance=..4]\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/throw_guardian.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~\n\nsetblock ~1 ~ ~1 prismarine_bricks\nloot give @s loot gm4_lightning_in_a_bottle:items/splash_bottle_of_lightning\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1\ndummy @s use item\n\nawait entity @e[type=guardian,distance=..4]\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/throw_illusioner.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~\n\nsummon pillager ~1.5 ~1 ~1.5\nloot give @s loot gm4_lightning_in_a_bottle:items/splash_bottle_of_lightning\nexecute at @s run tp @s ~ ~ ~ facing ~ ~ ~1\ndummy @s use item\n\nawait entity @e[type=evoker,distance=..4]\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/throw_shulker.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~\n\nsetblock ~1 ~ ~1 purpur_block\nloot give @s loot gm4_lightning_in_a_bottle:items/splash_bottle_of_lightning\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1\ndummy @s use item\n\nawait entity @e[type=shulker,distance=..4]\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_potion_tracking/tags/function/potion_landed.json",
    "content": "{\n    \"values\": [\n        \"gm4_lightning_in_a_bottle:potion_tracking/verify_landed_potion\"\n    ]\n}\n"
  },
  {
    "path": "gm4_lightning_in_a_bottle/data/gm4_potion_tracking/tags/function/tag_potion.json",
    "content": "{\n    \"values\": [\n        \"gm4_lightning_in_a_bottle:potion_tracking/tag_potion\"\n    ]\n}\n"
  },
  {
    "path": "gm4_liquid_minecarts/README.md",
    "content": "# Liquid Minecarts<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nNormal Liquid Tanks can't move, but with this data pack they can ride on rails!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Expands the Gamemode 4 data pack [Liquid Tanks]($dynamicLink:gm4_liquid_tanks) by allowing them to be mobile and work on rails\r\n- Allows a liquid tank to load/unload fluid like a hopper does to a chest\r\n- An activator rail forces the tank cart to fully empty itself\r\n"
  },
  {
    "path": "gm4_liquid_minecarts/assets/translations.csv",
    "content": "key,en_us\nitem.gm4.liquid_minecart,Minecart with Liquid Tank\ntext.gm4.liquid_minecarts.level_report,% Full\nadvancement.gm4.liquid_minecarts.title,Liquid Locomotive\nadvancement.gm4.liquid_minecarts.description,Put a liquid tank on wheels\ntext.gm4.guidebook.module_desc.liquid_minecarts,Adds Liquid Tank Minecarts that allow you to move your liquids from one Liquid Tank to another.\ntext.gm4.guidebook.liquid_minecarts.crafting,Combining a liquid tank and a minecart in a crafting table will craft a liquid minecart.\\n\\nLiquid minecarts can be used to move liquids from one tank to another.\ntext.gm4.guidebook.liquid_minecarts.usage,\"Unlike liquid tanks, liquid minecarts cannot interact with any entities or blocks in the world.\\n\\nLiquid minecarts can be filled by a tank pointing into the minecart and can be drained by driving one over a tank.\"\ntext.gm4.guidebook.liquid_minecarts.usage_1,\"Similar to a tank, if a liquid minecart already has liquid in it, it will only accept the contents of tanks with the same liquid.\\n\\nDriving a liquid minecart over an activator rail will discard any liquid inside.\"\n"
  },
  {
    "path": "gm4_liquid_minecarts/beet.yaml",
    "content": "id: gm4_liquid_minecarts\nname: Liquid Minecarts\nversion: 1.9.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_machines\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_liquid_tanks: 3.1.0\n        lib_machines: 1.5.0\n      schedule_loops: [main]\n    model_data:\n      - item: hopper_minecart\n        reference: item/liquid_minecart\n        template: generated\n      - item: hopper_minecart\n        reference: gui/advancement/liquid_minecarts_create\n        template:\n          name: advancement\n          forward: item/liquid_minecart\n    website:\n      description: Adds Liquid Tank Minecarts that allow you to move your liquids from one Liquid Tank to another.\n      recommended:\n        - gm4_potion_liquids\n      notes: []\n    modrinth:\n      project_id: Ymtg3OOc\n    wiki: https://wiki.gm4.co/wiki/Liquid_Tanks/Liquid_Minecarts\n    credits:\n      Creator:\n        - Sparks\n      Updated by:\n        - SpecialBuilder32\n        - BPR\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4/advancement/liquid_minecarts_create.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"hopper_minecart\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_liquid_minecarts:gui/advancement/liquid_minecarts_create\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.liquid_minecarts.title\",\n      \"fallback\": \"Liquid Locomotive\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.liquid_minecarts.description\",\n      \"fallback\": \"Put a liquid tank on wheels\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:liquid_tanks_create\",\n  \"criteria\": {\n    \"obtain_tunnel_bore\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:hopper_minecart\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"liquid_minecart\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/advancement/recipes/liquid_minecart.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_liquid_minecarts:liquid_minecart\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:hopper_minecart\",\n              \"minecraft:comparator\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_liquid_minecarts:liquid_minecart\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/compare_load_liquid.mcfunction",
    "content": "#@s = liquid minecart containing a liquid with a liquid tank containing liquid pointed at it\n#run from try_to_load\n\ndata modify storage gm4_liquid_minecarts:compare liquid set from entity @e[type=marker,limit=1,sort=nearest,distance=..1,tag=gm4_liquid_tank] data.gm4_liquid_tanks.liquid_tag\nexecute store success score @s gm4_lm_data run data modify storage gm4_liquid_minecarts:compare liquid set from entity @s Passengers[0].item.components.\"minecraft:custom_data\".gm4_liquid_minecarts.liquid_tag\n\nexecute if score @s gm4_lm_data matches 0 run function gm4_liquid_minecarts:load_liquid\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/compare_unload_liquid.mcfunction",
    "content": "#@s = liquid minecart containing a liquid with a liquid tank containing liquid below it\n#run from try_to_unload\n\ndata modify storage gm4_liquid_minecarts:compare liquid set from entity @e[type=marker,limit=1,sort=nearest,distance=..0.1,tag=gm4_liquid_tank] data.gm4_liquid_tanks.liquid_tag\nexecute store success score @s gm4_lm_data run data modify storage gm4_liquid_minecarts:compare liquid set from entity @s Passengers[0].item.components.\"minecraft:custom_data\".gm4_liquid_minecarts.liquid_tag\n\nexecute if score @s gm4_lm_data matches 0 run function gm4_liquid_minecarts:unload_liquid\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/copy_tank_data.mcfunction",
    "content": "#@s = gm4_liquid_minecart_display copying tank data to it's item, at location of tank\n#run from init_liquid\n\ndata modify entity @s item.components.\"minecraft:custom_data\".gm4_liquid_minecarts.liquid_tag set from entity @e[type=marker,limit=1,tag=gm4_liquid_tank,sort=nearest,distance=..2] data.gm4_liquid_tanks.liquid_tag\ndata modify entity @s item.components.\"minecraft:custom_data\".gm4_liquid_minecarts.tank.texture set from entity @e[type=item_display,tag=gm4_liquid_tank_liquid_display,limit=1,sort=nearest,distance=..2] item\ndata modify entity @s item.components.\"minecraft:custom_data\".gm4_liquid_minecarts.tank.CustomName set from block ~ ~ ~ CustomName\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/drain_minecart.mcfunction",
    "content": "#@s = liquid minecart going over active activator rail\n#run from command_block_minecart (liquid minecart)\n\nscoreboard players set @s gm4_lt_value 0\ntag @s add gm4_liquid_minecart_empty\nexecute as @e[type=item_display,limit=1,sort=nearest,tag=gm4_liquid_minecart_display] run function gm4_liquid_minecarts:set_empty_data\nfunction gm4_liquid_minecarts:liquid_value_update\nplaysound minecraft:block.brewing_stand.brew block @a ~ ~ ~ 1.0 0.0\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_lm_data dummy\nscoreboard players set #5 gm4_lm_data 5\nscoreboard players set #2 gm4_lm_data 2\nscoreboard players set #100 gm4_lm_data 100\n\ndata merge storage gm4_liquid_minecarts:compare {liquid:\"null\"}\n\nexecute unless score liquid_minecarts gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Liquid Minecarts\"}\nexecute unless score liquid_minecarts gm4_earliest_version < liquid_minecarts gm4_modules run scoreboard players operation liquid_minecarts gm4_earliest_version = liquid_minecarts gm4_modules\nscoreboard players set liquid_minecarts gm4_modules 1\n\nschedule function gm4_liquid_minecarts:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/init_liquid.mcfunction",
    "content": "#@s = empty liquid minecart next to a liquid tank pointed at it containing liquid, at tank location\n#run from liquid_minecarts:try_to_load\n\nexecute anchored feet facing entity @s feet positioned ^ ^ ^1 as @e[type=item_display,limit=1,sort=nearest,distance=..1,tag=gm4_liquid_minecart_display] positioned ^ ^ ^-1 run function gm4_liquid_minecarts:copy_tank_data\ntag @s remove gm4_liquid_minecart_empty\n\n#set tank max based on 40% of hopper max\nscoreboard players operation @s gm4_lt_max = @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest] gm4_lt_max\nscoreboard players operation @s gm4_lt_max /= #5 gm4_lm_data\nscoreboard players operation @s gm4_lt_max *= #2 gm4_lm_data\n\n#fill the tank\nfunction gm4_liquid_minecarts:load_liquid\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/init_tank.mcfunction",
    "content": "#@s = liquid minecart\n#run from try_to_unload\n\n#summon item_display\nsummon item_display ~ ~ ~ {CustomName:\"gm4_liquid_tank_liquid_display\",Tags:[\"gm4_liquid_tank_liquid_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_lm_needs_texture\"],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation: [0f,0f,0f,1f],translation:[0f,0.2185f,0f],scale:[0.83,0.83,0.83]},item_display:head}\ndata modify entity @e[type=item_display,tag=gm4_lm_needs_texture,limit=1,sort=nearest] item set from entity @s Passengers[0].item.components.\"minecraft:custom_data\".gm4_liquid_minecarts.tank.texture\ndata modify entity @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest,distance=..0.1] data.gm4_liquid_tanks.liquid_tag set from entity @s Passengers[0].item.components.\"minecraft:custom_data\".gm4_liquid_minecarts.liquid_tag\ntag @e[type=item_display] remove gm4_lm_needs_texture\n\n#setup tank data\ndata modify block ~ ~ ~ CustomName set from entity @s Passengers[0].item.components.\"minecraft:custom_data\".gm4_liquid_minecarts.tank.CustomName\nscoreboard players operation @s gm4_lm_data = @s gm4_lt_max\nscoreboard players operation @s gm4_lm_data *= #5 gm4_lm_data\nscoreboard players operation @s gm4_lm_data /= #2 gm4_lm_data\nscoreboard players operation @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest,distance=..0.1] gm4_lt_max = @s gm4_lm_data\n\n#apply liquid tag\ndata modify entity @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest,distance=..0.1] Tags append from entity @s Passengers[0].item.components.\"minecraft:custom_data\".gm4_liquid_minecarts.liquid_tag\ntag @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest,distance=..0.1] remove gm4_lt_empty\n\n#load all cart liquid into tank\nscoreboard players operation @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest,distance=..0.1] gm4_lt_value = @s gm4_lt_value\nexecute as @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank,distance=..0.1] run function gm4_liquid_tanks:liquid_value_update\nscoreboard players set @s gm4_lt_value 0\ntag @s add gm4_liquid_minecart_empty\nexecute as @e[type=armor_stand,limit=1,sort=nearest,tag=gm4_liquid_minecart_stand] run function gm4_liquid_minecarts:set_empty_data\n\nplaysound minecraft:block.brewing_stand.brew block @a ~ ~ ~ 1.0 1.5\nfunction gm4_liquid_minecarts:liquid_value_update\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/level_report.mcfunction",
    "content": "#@s = players looking at liquid minecart\n#run from level_report_ray\n\nexecute as @e[type=command_block_minecart,tag=gm4_liquid_minecart,distance=..1,limit=1,sort=nearest] run function gm4_liquid_minecarts:liquid_value_update\ntitle @s actionbar [{\"score\":{\"name\":\"@e[type=command_block_minecart,tag=gm4_liquid_minecart,distance=..1,limit=1,sort=nearest]\",\"objective\":\"gm4_lm_data\"},\"color\":\"dark_green\"},{\"translate\":\"text.gm4.liquid_minecarts.level_report\",\"fallback\":\"% Full\",\"color\":\"dark_green\"}]\ntag @s add gm4_lt_found_tank\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/level_report_ray.mcfunction",
    "content": "#@s = all players at @s\n#run from main\n\nexecute anchored eyes positioned ^ ^ ^.5 positioned ~ ~-0.5 ~ if entity @e[distance=..1,type=command_block_minecart,tag=gm4_liquid_minecart,limit=1,sort=nearest] run function gm4_liquid_minecarts:level_report\nexecute unless entity @s[tag=gm4_lt_found_tank] anchored eyes positioned ^ ^ ^1.5 positioned ~ ~-0.5 ~ if entity @e[distance=..0.5,type=command_block_minecart,tag=gm4_liquid_minecart,limit=1,sort=nearest] run function gm4_liquid_minecarts:level_report\nexecute unless entity @s[tag=gm4_lt_found_tank] anchored eyes positioned ^ ^ ^2.5 positioned ~ ~-0.5 ~ if entity @e[distance=..0.5,type=command_block_minecart,tag=gm4_liquid_minecart,limit=1,sort=nearest] run function gm4_liquid_minecarts:level_report\nexecute unless entity @s[tag=gm4_lt_found_tank] anchored eyes positioned ^ ^ ^3.5 positioned ~ ~-0.5 ~ if entity @e[distance=..0.5,type=command_block_minecart,tag=gm4_liquid_minecart,limit=1,sort=nearest] run function gm4_liquid_minecarts:level_report\n\ntag @s remove gm4_lt_found_tank\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/liquid_value_update.mcfunction",
    "content": "#@s = liquid minecart\n#run from load_liquid, unload_liquid and create\n\n#calculate tank fullness percentage\nscoreboard players operation @s gm4_lm_data = @s gm4_lt_value\nscoreboard players operation @s gm4_lm_data *= #100 gm4_lm_data\nscoreboard players operation @s gm4_lm_data /= @s gm4_lt_max\n\n#1%-50%\nexecute if score @s gm4_lt_value matches 1.. if score @s gm4_lm_data matches 0..50 on passengers run data modify entity @s[type=item_display,tag=gm4_liquid_minecart_display] item merge value {id:\"minecraft:player_head\",count:1,components:{\"minecraft:profile\":\"$liquid_minecart_display/low\"}}\n#51%-99%\nexecute unless score @s gm4_lt_value = @s gm4_lt_max if score @s gm4_lm_data matches 51..100 on passengers run data modify entity @s[type=item_display,tag=gm4_liquid_minecart_display] item merge value {id:\"minecraft:player_head\",count:1,components:{\"minecraft:profile\":\"$liquid_minecart_display/high\"}}\n#100%\nexecute if score @s gm4_lt_value = @s gm4_lt_max on passengers run data modify entity @s[type=item_display,tag=gm4_liquid_minecart_display] item merge value {id:\"minecraft:player_head\",count:1,components:{\"minecraft:profile\":\"$liquid_minecart_display/full\"}}\n#0%\nexecute if score @s gm4_lt_value matches 0 on passengers run data modify entity @s[type=item_display,tag=gm4_liquid_minecart_display] item merge value {id:\"minecraft:player_head\",count:1,components:{\"minecraft:profile\":\"$liquid_minecart_display/empty\"}}\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/load_check.mcfunction",
    "content": "#@s = liquid minecart\n#run from main\n\n#load\nexecute if block ~1 ~ ~ hopper[facing=west] align xyz positioned ~1.5 ~0.5 ~0.5 run function gm4_liquid_minecarts:try_to_load\nexecute if block ~-1 ~ ~ hopper[facing=east] align xyz positioned ~-0.5 ~0.5 ~0.5 run function gm4_liquid_minecarts:try_to_load\nexecute if block ~ ~ ~1 hopper[facing=north] align xyz positioned ~0.5 ~0.5 ~1.5 run function gm4_liquid_minecarts:try_to_load\nexecute if block ~ ~ ~-1 hopper[facing=south] align xyz positioned ~0.5 ~0.5 ~-0.5 run function gm4_liquid_minecarts:try_to_load\nexecute if block ~ ~1 ~ hopper[facing=down] positioned ~ ~1.5 ~ run function gm4_liquid_minecarts:try_to_load\n\n#unload\nexecute if block ~ ~-1 ~ hopper positioned ~ ~-0.5 ~ run function gm4_liquid_minecarts:try_to_unload\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/load_liquid.mcfunction",
    "content": "#@s liquid minecart that can accept the current tank's liquid, at liquid tank block location\n#run from compare_load_liquid and init_liquid\n\n#take all the liquid in the tank (or as much as the minecart can hold) (amount of liquid to take stored in gm4_lm_data)\n#get remaining space in minecart\nscoreboard players operation @s gm4_lm_data = @s gm4_lt_max\nscoreboard players operation @s gm4_lm_data -= @s gm4_lt_value\n#lower lm_data if tank has less liquid than the remaining space\nscoreboard players operation @s gm4_lm_data < @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] gm4_lt_value\n\n#add liquid to minecart\nscoreboard players operation @s gm4_lt_value += @s gm4_lm_data\n#take liquid from tank\nscoreboard players operation @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] gm4_lt_value -= @s gm4_lm_data\n#update display\nfunction gm4_liquid_minecarts:liquid_value_update\nexecute as @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] run function gm4_liquid_tanks:liquid_value_update\nplaysound minecraft:block.brewing_stand.brew block @a\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/create_cart.mcfunction",
    "content": "# places the liquid_minecart down\n# @s = hopper_minecart with the liquid_minecart name\n# located at @s\n# run from gm4_liquid_minecarts:machine/verify_place_cart\n\nscoreboard players set $placed_block gm4_machine_data 1\n\n# summon new command block minecart\nsummon command_block_minecart ~ ~ ~ {Command:\"execute if score @s gm4_lt_value matches 1.. run function gm4_liquid_minecarts:drain_minecart\",CustomName:{\"text\":\"Liquid Minecart\",\"italic\":false},Tags:[\"gm4_liquid_minecart\",\"gm4_liquid_minecart_empty\",\"gm4_machine_cart\",\"gm4_new_machine\"],DisplayState:{\"Name\":\"minecraft:hopper\"},DisplayOffset:1,Passengers:[{id:\"minecraft:item_display\",Tags:[\"gm4_liquid_minecart_display\",\"gm4_machine_cart\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:profile\":\"$liquid_minecart_display/empty\",\"minecraft:custom_data\":{gm4_liquid_minecarts:{liquid_tag:\"null\"}}}},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0.0,0.7275,0.0],scale:[0.83,0.83,0.83]},item_display:\"head\"}]}\ntp @e[type=command_block_minecart,distance=..0.1,tag=gm4_new_machine] @s\nscoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2\nexecute as @e[type=command_block_minecart,distance=..0.1,tag=gm4_new_machine,limit=1] run function gm4_liquid_minecarts:liquid_value_update\n\n# clean up\nkill @s\ntag @e[distance=..2] remove gm4_new_machine\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/destroy_cart/drop_item.mcfunction",
    "content": "# drops the correct item\n# @s = invalid item entity\n# located at @s\n# run from gm4_liquid_minecarts:machine/destroy_cart\n\n# drop item, and set flag\nexecute store success score $dropped_item gm4_machine_data run loot spawn ~ ~ ~ loot gm4_liquid_minecarts:entities/liquid_minecart\n\n# kill original (invalid) item\nkill @s\n\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/destroy_cart/scan_hoppers.mcfunction",
    "content": "# searches for hoppers with invalid items\n# @s = liquid_minecart marker\n# located at @s\n# run from gm4_liquid_minecarts:machine/destroy_cart\n\n# find hopper with the invalid item\nscoreboard players set $found_item gm4_machine_data 0\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\n\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\n\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~00 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~01 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~-1 if block ~ ~ ~ hopper{Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper\n\n# if no hoppers found, find hopper minecarts with the invalid item\nexecute if score $found_item gm4_machine_data matches 0 as @e[type=hopper_minecart,distance=..3,nbt={Items:[{id:\"minecraft:minecart\",components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}]}] run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper_minecart\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/destroy_cart/update_hopper.mcfunction",
    "content": "# updates hoppers with invalid items\n# @s = liquid_minecart marker\n# located at the hopper with an invalid item\n# run from gm4_liquid_minecarts:machine/destroy_cart/scan_hoppers\n\n# replace correct slot with proper item\ndata modify storage gm4_machines:temp Items set from block ~ ~ ~ Items\nexecute if data storage gm4_machines:temp Items[{Slot:0b,components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}] run loot replace block ~ ~ ~ container.0 loot gm4_liquid_minecarts:entities/liquid_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:1b,components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}] run loot replace block ~ ~ ~ container.1 loot gm4_liquid_minecarts:entities/liquid_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:2b,components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}] run loot replace block ~ ~ ~ container.2 loot gm4_liquid_minecarts:entities/liquid_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:3b,components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}] run loot replace block ~ ~ ~ container.3 loot gm4_liquid_minecarts:entities/liquid_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:4b,components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}] run loot replace block ~ ~ ~ container.4 loot gm4_liquid_minecarts:entities/liquid_minecart\n\n# clean up\ndata remove storage gm4_machines:temp Items\nscoreboard players set $found_item gm4_machine_data 1\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/destroy_cart/update_hopper_minecart.mcfunction",
    "content": "# updates hopper minecarts with invalid items\n# @s = hopper minecart with invalid item\n# located at @s\n# run from gm4_liquid_minecarts:machine/destroy_cart/scan_hoppers\n\n# replace correct slot with proper item\ndata modify storage gm4_machines:temp Items set from entity @s Items\nexecute if data storage gm4_machines:temp Items[{Slot:0b,components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}] run loot replace entity @s container.0 loot gm4_liquid_minecarts:entities/liquid_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:1b,components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}] run loot replace entity @s container.1 loot gm4_liquid_minecarts:entities/liquid_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:2b,components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}] run loot replace entity @s container.2 loot gm4_liquid_minecarts:entities/liquid_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:3b,components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}] run loot replace entity @s container.3 loot gm4_liquid_minecarts:entities/liquid_minecart\nexecute if data storage gm4_machines:temp Items[{Slot:4b,components:{\"minecraft:custom_name\":{\"text\":\"Liquid Minecart\",\"italic\":false}}}] run loot replace entity @s container.4 loot gm4_liquid_minecarts:entities/liquid_minecart\n\n# clean up\ndata remove storage gm4_machines:temp Items\nscoreboard players set $found_item gm4_machine_data 1\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/destroy_cart.mcfunction",
    "content": "# destroys the liquid_minecart\n# @s = liquid_minecart marker\n# located at @s\n# run from gm4_liquid_minecarts:machine/verify_destroy\n\n# drop item\nscoreboard players set $dropped_item gm4_machine_data 0\nexecute as @e[type=item,distance=..3,nbt={Age:0s,Item:{id:\"minecraft:minecart\",count:1,components:{\"minecraft:custom_name\":{\"italic\":false,\"text\":\"Liquid Minecart\"}}}},limit=1,sort=nearest] at @s run function gm4_liquid_minecarts:machine/destroy_cart/drop_item\n\n# scan hoppers if no item was broken\nexecute if score $dropped_item gm4_machine_data matches 0 run function gm4_liquid_minecarts:machine/destroy_cart/scan_hoppers\n\n# kill marker\nkill @s\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/verify_destroy_cart.mcfunction",
    "content": "# verifies that the destroyed machine was from this module\n# @s = machine block marker\n# located at @s\n# run from #gm4_machines:destroy\n\nexecute if entity @s[tag=gm4_liquid_minecart_display] run function gm4_liquid_minecarts:machine/destroy_cart\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/verify_place_cart.mcfunction",
    "content": "# verifies that the placed down machine minecart was from this module\n# @s = machine minecart\n# located at the machine minecart\n# run from #gm4_machines:place_cart\n\nexecute if score $placed_block gm4_machine_data matches 0 if data entity @s {CustomName:{\"translate\":\"item.gm4.liquid_minecart\",\"fallback\":\"Minecart with Liquid Tank\",\"italic\":false}} run function gm4_liquid_minecarts:machine/create_cart\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/main.mcfunction",
    "content": "#look for hoppers pointing into or below the liquid minecart\nexecute as @e[type=command_block_minecart,tag=gm4_liquid_minecart] at @s run function gm4_liquid_minecarts:load_check\n\n#minecart level report\nexecute as @a[gamemode=!spectator] at @s run function gm4_liquid_minecarts:level_report_ray\n\n#self-perpetuating clock\nschedule function gm4_liquid_minecarts:main 16t\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/set_empty_data.mcfunction",
    "content": "#@s liquid minecart display of a minecart that has 0 liquid in it\n#run from unload_liquid or init_tank or drain_minecart\n\ndata modify entity @s item.components.\"minecraft:custom_data\".gm4_liquid_minecarts.liquid_tag set value \"empty\"\ndata modify entity @s item.components.\"minecraft:custom_data\".gm4_liquid_minecarts.tank set value {texture:\"null\",CustomName:\"null\"}\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/try_to_load.mcfunction",
    "content": "#@s = liquid minecart with a hopper pointing at it\n#run from liquid_minecarts:load_check\n\n#if the minecart has a liquid in it and the tank does too\nexecute if entity @s[scores={gm4_lt_value=1..}] if entity @e[type=marker,distance=..0.1,tag=gm4_liquid_tank,tag=!gm4_volatile_liquid,scores={gm4_lt_value=1..}] if score @s gm4_lt_value < @s gm4_lt_max run function gm4_liquid_minecarts:compare_load_liquid\n\n#if the minecart is empty and the tank has contents\nexecute if entity @s[tag=gm4_liquid_minecart_empty] if entity @e[type=marker,distance=..0.1,tag=gm4_liquid_tank,tag=!gm4_volatile_liquid,scores={gm4_lt_value=1..}] run function gm4_liquid_minecarts:init_liquid\n\n#if the minecart is empty and the tank has volitile contents\nexecute if entity @s[tag=gm4_liquid_minecart_empty] if entity @e[type=marker,distance=..0.1,tag=gm4_liquid_tank,tag=gm4_volatile_liquid,scores={gm4_lt_value=1..}] run playsound minecraft:entity.generic.extinguish_fire block @a\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/try_to_unload.mcfunction",
    "content": "#@s = liquid minecart with a hopper below it\n#run from load_check\n\n#if the minecart has a liquid in it and the tank does too\nexecute if entity @s[scores={gm4_lt_value=1..}] if entity @e[type=marker,distance=..0.1,tag=gm4_liquid_tank,scores={gm4_lt_value=1..}] align xyz positioned ~.5 ~.5 ~.5 if score @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest] gm4_lt_value < @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest] gm4_lt_max run function gm4_liquid_minecarts:compare_unload_liquid\n\n#if the minecart has liquid but the tank is empty\nexecute if entity @s[scores={gm4_lt_value=1..}] if entity @e[type=marker,distance=..0.1,tag=gm4_liquid_tank,scores={gm4_lt_value=0}] align xyz positioned ~.5 ~.5 ~.5 run function gm4_liquid_minecarts:init_tank\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/unload_liquid.mcfunction",
    "content": "#@s liquid minecart above a liquid tank that can accept the liquid\n#run from compare_unload_liquid\n\n#take all the liquid in the tank (or as much as the minecart can hold) (amount of liquid to take stored in gm4_lm_data)\n#get remaining space in tank\nscoreboard players operation @s gm4_lm_data = @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] gm4_lt_max\nscoreboard players operation @s gm4_lm_data -= @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] gm4_lt_value\n#lower lm_data if tank has less space than minecart's liquid level\nscoreboard players operation @s gm4_lm_data < @s gm4_lt_value\n\n#remove liquid from minecart\nscoreboard players operation @s gm4_lt_value -= @s gm4_lm_data\n#give liquid to tank\nscoreboard players operation @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] gm4_lt_value += @s gm4_lm_data\n#update display\nfunction gm4_liquid_minecarts:liquid_value_update\nexecute as @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] run function gm4_liquid_tanks:liquid_value_update\nplaysound minecraft:block.brewing_stand.brew block @a ~ ~ ~ 1.0 1.5\n\n#if cart is empty, reset cart\nexecute if score @s gm4_lt_value matches 0 run tag @s add gm4_liquid_minecart_empty\nexecute if score @s gm4_lt_value matches 0 as @e[type=item_display,limit=1,sort=nearest,tag=gm4_liquid_minecart_display] run function gm4_liquid_minecarts:set_empty_data\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/upgrade_paths/1.8/entity_replacement.mcfunction",
    "content": "# @s = gm4_liquid_minecart cart\n# at self\n# run by upgrade_paths/1.8\n\n# add new block offset data\ndata merge entity @s {DisplayOffset:1}\n\n# replace armor stand with item display\nsummon item_display ~ ~ ~ {Tags:[\"gm4_liquid_minecart_display\",\"gm4_machine_cart\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:profile\":\"$liquid_minecart_display/empty\",\"minecraft:custom_data\":{gm4_liquid_minecarts:{liquid_tag:\"null\"}}}},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0.0,0.7275,0.0],scale:[0.83,0.83,0.83]},item_display:\"head\"}\ndata modify entity @e[tag=gm4_new_machine,distance=..2,limit=1] item.components.\"minecraft:custom_data\".gm4_liquid_minecarts set from entity @e[type=armor_stand,limit=1,distance=..1,sort=nearest,tag=gm4_liquid_minecart_stand] equipment.feet\nride @e[tag=gm4_new_machine,tag=gm4_liquid_minecart_display,limit=1] mount @s\nexecute on passengers run kill @s[type=armor_stand,tag=gm4_liquid_minecart_stand]\ntag @e[tag=gm4_new_machine,distance=..1] remove gm4_new_machine\n\nscoreboard players set @s gm4_entity_version 2\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/upgrade_paths/1.8.mcfunction",
    "content": "execute as @e[type=command_block_minecart,tag=gm4_liquid_minecart,scores={gm4_entity_version=1}] at @s run function gm4_liquid_minecarts:upgrade_paths/1.8/entity_replacement\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/guidebook/liquid_minecarts.json",
    "content": "{\n  \"id\": \"liquid_minecarts\",\n  \"name\": \"Liquid Minecarts\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"liquid_tanks\",\n  \"icon\": {\n    \"id\": \"minecraft:hopper_minecart\"\n  },\n  \"criteria\": {\n    \"obtain_liquid_tank\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"liquid_tank\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_liquid_minecart\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:hopper_minecart\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"liquid_minecart\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"crafting\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_liquid_tank\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.liquid_minecarts.crafting\",\n            \"fallback\": \"Combining a liquid tank and a minecart in a crafting table will craft a liquid minecart.\\n\\nLiquid minecarts can be used to move liquids from one tank to another.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_liquid_minecart\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.liquid_minecarts.usage\",\n            \"fallback\": \"Unlike liquid tanks, liquid minecarts cannot interact with any entities or blocks in the world.\\n\\nLiquid minecarts can be filled by a tank pointing into the minecart and can be drained by driving one over a tank.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.liquid_minecarts.usage_1\",\n            \"fallback\": \"Similar to a tank, if a liquid minecart already has liquid in it, it will only accept the contents of tanks with the same liquid.\\n\\nDriving a liquid minecart over an activator rail will discard any liquid inside.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/loot_table/entities/liquid_minecart.json",
    "content": "{\n  \"type\": \"minecraft:entity\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_liquid_minecarts:items/liquid_minecart\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/loot_table/items/liquid_minecart.json",
    "content": "{\n  \"type\": \"generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:hopper_minecart\",\n          \"functions\": [\n            {\n              \"function\": \"set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_liquid_minecarts:item/liquid_minecart\"]}\n              }\n            },\n            {\n              \"function\": \"set_custom_data\",\n              \"tag\": \"{gm4_machines:{id:'liquid_minecart'}}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"translate\": \"item.gm4.liquid_minecart\",\n                  \"fallback\": \"Minecart with Liquid Tank\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/recipe/liquid_minecart.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"redstone\",\n  \"pattern\": [\n    \"IGI\",\n    \"ICI\",\n    \" H \"\n  ],\n  \"key\": {\n    \"I\": \"minecraft:iron_ingot\",\n    \"G\": \"minecraft:glass\",\n    \"C\": \"minecraft:comparator\",\n    \"H\": \"minecraft:hopper_minecart\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:hopper_minecart\",\n    \"components\": {\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_liquid_minecarts:item/liquid_minecart\"]},\n      \"minecraft:custom_data\": \"{gm4_machines:{id:'liquid_minecart'}}\",\n      \"minecraft:custom_name\": {\"translate\":\"item.gm4.liquid_minecart\",\"fallback\":\"Minecart with Liquid Tank\",\"color\":\"white\",\"italic\":false}\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/tags/function/load.json",
    "content": "{\n    \"values\": [\n        \"gm4_liquid_minecarts:load\"\n    ]\n}\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/test/place.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n# @optional\n\nsetblock ~1 ~1 ~1 rail\nloot give @s loot gm4_liquid_minecarts:items/liquid_minecart\nexecute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1\ndummy @s use block ~1 ~1 ~1\n\nawait entity @e[tag=gm4_liquid_minecart,distance=..3]\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_minecarts/test/transport.mcfunction",
    "content": "# @template gm4_liquid_minecarts:test_transport\n# @dummy ~1 ~1 ~\n\nexecute positioned ~2 ~1 ~2 run tag @e[tag=gm4_liquid_tank,distance=..1] add test_source\nexecute positioned ~4 ~1 ~1 run tag @e[tag=gm4_liquid_tank,distance=..1] add test_destination\n\n# create lava tank\nitem replace block ~2 ~1 ~2 container.0 with minecraft:lava_bucket\n\nawait items block ~2 ~1 ~2 container.0 minecraft:bucket\nawait entity @e[tag=gm4_liquid_tank,tag=test_source,tag=gm4_lt_lava,scores={gm4_lt_value=3}]\n\n# place liquid minecart\nloot replace entity @s weapon.mainhand loot gm4_liquid_minecarts:items/liquid_minecart\nexecute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1\ndummy @s use block ~2 ~1 ~1\n\nawait entity @e[tag=gm4_liquid_minecart,scores={gm4_lt_value=3}]\nassert entity @e[tag=gm4_liquid_tank,tag=test_source,tag=gm4_lt_empty,scores={gm4_lt_value=0}]\n\n# send the minecart\nsetblock ~2 ~ ~1 redstone_block\n\nawait entity @e[tag=gm4_liquid_tank,tag=test_destination,tag=gm4_lt_lava,scores={gm4_lt_value=3}]\nassert entity @e[tag=gm4_liquid_minecart,scores={gm4_lt_value=0}]\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_liquid_tanks/tags/function/load.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_machines/tags/function/destroy_cart.json",
    "content": "{\n    \"values\": [\n        \"gm4_liquid_minecarts:machine/verify_destroy_cart\"\n    ]\n}\n"
  },
  {
    "path": "gm4_liquid_minecarts/data/gm4_machines/tags/function/place_cart.json",
    "content": "{\n    \"values\": [\n        \"gm4_liquid_minecarts:machine/verify_place_cart\"\n    ]\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/README.md",
    "content": "# Liquid Tanks<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nStore liquids like water and lava or liquids like soup and honey in a compact form to enable autobottling!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Enables the maximum storage of 100 buckets in one tank\r\n- Entities below and above a tank can interact with it - with above depositing and below extracting\r\n- The tank can be disabled with redstone, to block extraction and insertion\r\n- Out of the box, liquid tanks supports Milk, Honey, Water, Lava, XP and Soup.\r\n\r\nRead more about the other liquids supported on the [Wiki](https://wiki.gm4.co/Liquid_Tanks/Standard_Liquids).\r\n"
  },
  {
    "path": "gm4_liquid_tanks/assets/gm4_liquid_tanks/models/block/liquid_tank.json",
    "content": "{\n\t\"textures\": {\n\t\t\"top\": \"gm4_liquid_tanks:block/liquid_tank_top\",\n\t\t\"bottom\": \"gm4_liquid_tanks:block/liquid_tank_top\",\n\t\t\"side\": \"gm4_liquid_tanks:block/liquid_tank_side\",\n\t\t\"particle\": \"gm4_liquid_tanks:block/liquid_tank_side\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [4, 11, 4],\n\t\t\t\"to\": [12, 18, 12],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 16, 16], \"rotation\": 180, \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/assets/gm4_liquid_tanks/models/item/liquid_tank_full.json",
    "content": "{\n  \"parent\": \"minecraft:block/block\",\n  \"ambientocclusion\": false,\n  \"textures\": {\n    \"particle\": \"minecraft:block/hopper_outside\",\n    \"top\": \"minecraft:block/hopper_top\",\n    \"side\": \"minecraft:block/hopper_outside\",\n    \"inside\": \"minecraft:block/hopper_inside\",\n    \"5\": \"gm4_liquid_tanks:block/liquid_tank_side\",\n    \"6\": \"gm4_liquid_tanks:block/liquid_tank_top\"\n  },\n  \"elements\": [\n    {\n      \"from\": [\n        0,\n        10,\n        0\n      ],\n      \"to\": [\n        16,\n        11,\n        16\n      ],\n      \"faces\": {\n        \"down\": {\n          \"texture\": \"#side\"\n        },\n        \"up\": {\n          \"texture\": \"#inside\",\n          \"cullface\": \"up\"\n        },\n        \"north\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"north\"\n        },\n        \"south\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"south\"\n        },\n        \"west\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"west\"\n        },\n        \"east\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"east\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        0,\n        11,\n        0\n      ],\n      \"to\": [\n        2,\n        16,\n        16\n      ],\n      \"faces\": {\n        \"up\": {\n          \"texture\": \"#top\",\n          \"cullface\": \"up\"\n        },\n        \"north\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"north\"\n        },\n        \"south\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"south\"\n        },\n        \"west\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"west\"\n        },\n        \"east\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"up\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        14,\n        11,\n        0\n      ],\n      \"to\": [\n        16,\n        16,\n        16\n      ],\n      \"faces\": {\n        \"up\": {\n          \"texture\": \"#top\",\n          \"cullface\": \"up\"\n        },\n        \"north\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"north\"\n        },\n        \"south\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"south\"\n        },\n        \"west\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"up\"\n        },\n        \"east\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"east\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        2,\n        11,\n        0\n      ],\n      \"to\": [\n        14,\n        16,\n        2\n      ],\n      \"faces\": {\n        \"up\": {\n          \"texture\": \"#top\",\n          \"cullface\": \"up\"\n        },\n        \"north\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"north\"\n        },\n        \"south\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"up\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        2,\n        11,\n        14\n      ],\n      \"to\": [\n        14,\n        16,\n        16\n      ],\n      \"faces\": {\n        \"up\": {\n          \"texture\": \"#top\",\n          \"cullface\": \"up\"\n        },\n        \"north\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"up\"\n        },\n        \"south\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"south\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        4,\n        4,\n        4\n      ],\n      \"to\": [\n        12,\n        10,\n        12\n      ],\n      \"faces\": {\n        \"down\": {\n          \"texture\": \"#side\"\n        },\n        \"north\": {\n          \"texture\": \"#side\"\n        },\n        \"south\": {\n          \"texture\": \"#side\"\n        },\n        \"west\": {\n          \"texture\": \"#side\"\n        },\n        \"east\": {\n          \"texture\": \"#side\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        6,\n        0,\n        6\n      ],\n      \"to\": [\n        10,\n        4,\n        10\n      ],\n      \"faces\": {\n        \"down\": {\n          \"texture\": \"#side\",\n          \"cullface\": \"down\"\n        },\n        \"north\": {\n          \"texture\": \"#side\"\n        },\n        \"south\": {\n          \"texture\": \"#side\"\n        },\n        \"west\": {\n          \"texture\": \"#side\"\n        },\n        \"east\": {\n          \"texture\": \"#side\"\n        }\n      }\n    },\n    {\n      \"from\": [\n        4,\n        11,\n        4\n      ],\n      \"to\": [\n        12,\n        18,\n        12\n      ],\n      \"rotation\": {\n        \"angle\": 0,\n        \"axis\": \"y\",\n        \"origin\": [\n          4.5,\n          10.5,\n          4.5\n        ]\n      },\n      \"faces\": {\n        \"north\": {\n          \"uv\": [\n            0,\n            0,\n            16,\n            14\n          ],\n          \"texture\": \"#5\"\n        },\n        \"east\": {\n          \"uv\": [\n            0,\n            0,\n            16,\n            14\n          ],\n          \"texture\": \"#5\"\n        },\n        \"south\": {\n          \"uv\": [\n            0,\n            0,\n            16,\n            14\n          ],\n          \"texture\": \"#5\"\n        },\n        \"west\": {\n          \"uv\": [\n            0,\n            0,\n            16,\n            14\n          ],\n          \"texture\": \"#5\"\n        },\n        \"up\": {\n          \"uv\": [\n            0,\n            0,\n            16,\n            16\n          ],\n          \"texture\": \"#6\"\n        }\n      }\n    }\n  ]\n  \n}\n"
  },
  {
    "path": "gm4_liquid_tanks/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.liquid_tanks.description,Find out that a liquid tank is not an epic submarine\nadvancement.gm4.liquid_tanks.title,\"Oh, That Kind of Tank\"\nadvancement.gm4.standard_liquids.description,Bottle your own experience from a liquid tank\nadvancement.gm4.standard_liquids.title,Experience Quicksave\nblock.gm4.liquid_tank,Liquid Tank\ncontainer.gm4.liquid_tank.beetroot_soup,Beetroot Soup Tank\ncontainer.gm4.liquid_tank.empty,Empty Tank\ncontainer.gm4.liquid_tank.experience,Experience Tank\ncontainer.gm4.liquid_tank.glow_ink,Glow Ink Tank\ncontainer.gm4.liquid_tank.honey,Honey Tank\ncontainer.gm4.liquid_tank.ink,Ink Tank\ncontainer.gm4.liquid_tank.lava,Lava Tank\ncontainer.gm4.liquid_tank.milk,Milk Tank\ncontainer.gm4.liquid_tank.mushroom_stew,Mushroom Stew Tank\ncontainer.gm4.liquid_tank.powder_snow,Powder Snow Tank\ncontainer.gm4.liquid_tank.rabbit_stew,Rabbit Stew Tank\ncontainer.gm4.liquid_tank.water,Water Tank\ntext.gm4.liquid_tanks.level_report.buckets,Buckets\ntext.gm4.liquid_tanks.level_report.levels,Levels\nitem.gm4.glow_ink_bottle,Glow Ink Bottle\nitem.gm4.ink_bottle,Ink Bottle\ntext.gm4.guidebook.module_desc.liquid_tanks,\"Store liquids like Water, Lava, Milk, or Soup compactly in special tanks and interact with them!\"\ntext.gm4.guidebook.liquid_tanks.description,Liquid Tanks can store various liquids in bulk.\\n\\nThe first slot of the liquid tank acts as both the input and output of the liquid tank.\ntext.gm4.guidebook.liqud_tanks.crafting,Liquid Tanks can be crafted in a crafting table:\ntext.gm4.guidebook.module_desc.standard_liquids,\"Store liquids like Water, Lava, Milk, or Soup compactly in special tanks and interact with them!\"\ntext.gm4.guidebook.standard_liquids.water,\"Standard liquids can be stored by liquid tanks.\\n\\nWater Tank\\n- Drains water buckets, water bottles\\n- Fills buckets, bottles\\n- Fills adjacent cauldrons\"\ntext.gm4.guidebook.standard_liquids.lava,Lava Tank\\n- Drains lava buckets\\n- Fills buckets\\n- Fuels adjacent furnaces\\n- Drains lava cauldrons\\n- Fills adjacent cauldrons\ntext.gm4.guidebook.standard_liquids.rabbit_stew_and_beetroot_soup,\"Rabbit Stew Tank\\n- Drains rabbit stew\\n- Fills bowls\\n- Feeds drinkers\\n\\nBeetroot Soup Tank\\n- Drains beetroot soup, beetroot\\n- Fills bowls\\n- Feeds drinkers\"\ntext.gm4.guidebook.standard_liquids.mushroom_stew_and_milk,Mushroom Stew Tank\\n- Drains mushroom stew\\n- Fills bowls\\n- Milks mooshrooms\\n- Feeds drinkers\\n\\nMilk Tank\\n- Drains milk buckets\\n- Fills buckets\\n- Milks cows\\n- Clear mob effects\ntext.gm4.guidebook.standard_liquids.honey,\"Honey Tanks\\n- Drains honey bottles, honey blocks\\n- Fills bottles\\n- Casts honey blocks into cauldrons\\n- Clears mob poison\\n- Feeds drinkers\"\ntext.gm4.guidebook.standard_liquids.experience,\"Experience Tanks\\n- Drains bottles o' enchanting, enchanted books\\n- Fills bottles\\n- Absorbs experience orbs, experience points\\n- Fills experience points\"\ncontainer.gm4.liquid_tank.ominous_bottle_0,Ominous I Tank\ncontainer.gm4.liquid_tank.ominous_bottle_1,Ominous II Tank\ncontainer.gm4.liquid_tank.ominous_bottle_2,Ominous III Tank\ncontainer.gm4.liquid_tank.ominous_bottle_3,Ominous IV Tank\ncontainer.gm4.liquid_tank.ominous_bottle_4,Ominous V Tank\n"
  },
  {
    "path": "gm4_liquid_tanks/beet.yaml",
    "content": "id: gm4_liquid_tanks\nname: Liquid Tanks\nversion: 3.1.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\nrequire:\n  - bolt\n\npipeline:\n  - override_formatting\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_machines\n\nmeta:\n  bolt:\n    entrypoint:\n      - gm4_standard_liquids:main\n  gm4:\n    versioning:\n      required:\n        lib_machines: 1.5.0\n      schedule_loops: [main]\n    model_data:\n      - item: player_head\n        reference: item/liquid_tank\n        model: item/liquid_tank_full\n      - item: glass\n        template: custom\n        broadcast:\n          - reference: block/liquid_tank\n          - reference: block/liquid_tank_side\n            model: block/liquid_tank\n        transforms:\n          - name: item_display\n            origin: [0.5,0.9,0.5]\n            scale: [0.438,0.438,0.438]\n            translation: [0,0,0]\n            display: head\n      - item: honey_block\n        reference: block/cast_honey_block\n        template: vanilla\n      - item: potion\n        template: vanilla\n        broadcast:\n          - reference: gm4_standard_liquids:item/ink_bottle\n          - reference: gm4_standard_liquids:item/glow_ink_bottle\n      - item: hopper\n        reference: gui/advancement/liquid_tanks_create\n        template: \n          name: advancement\n          forward: item/liquid_tank_full\n      - item: experience_bottle\n        reference: standard_liquids:gui/advancement/standard_liquids\n        template: advancement\n    gui_fonts:\n      - translation: gui.gm4.liquid_tank\n        container: hopper\n        texture: gui/container/liquid_tank\n    website:\n      description: Store liquids like Water, Lava, Milk, or Soup compactly in special tanks and interact with them!\n      recommended:\n        - gm4_resource_pack\n        - gm4_potion_liquids\n        - gm4_zauber_liquids\n        - gm4_liquid_minecarts\n        - gm4_cement_mixers\n      notes: []\n    modrinth:\n      project_id: h4BcuD3C\n    video: https://www.youtube.com/watch?v=qa9lcbii1BE\n    wiki: https://wiki.gm4.co/wiki/Liquid_Tanks\n    credits:\n      Creator:\n        - SpecialBuilder32\n      Updated by:\n        - SpecialBuilder32\n        - BPR\n      Textures by:\n        - Vilder50\n        - Kyrius\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_liquid_tanks/bolt-docs.md",
    "content": "# Liquid Tanks Bolt Wrappers\nLiquid tanks has a bolt-powered interface to define the myriad of liquid types and items that interact with them, without needing to create lots of redundant function files directly. \n\nThis interface is an *experimental* design, and so maybe not recommended to be replicated for other modules without careful thought. \n\n# Prereqs\n- Add `bolt` to the beet.yaml requirements\n- Add `gm4_liquid_tanks.bolt_liquid_wrappers` to the beet.yaml pipeline\n- Configure a beet entrypoint; typically:\n```\nmeta:\n  bolt:\n    entrypoint: \n      - gm4_potion_liquids:main\n```\n\n# Basic Usage\nLiquids are defined through a class definitions, typically done in a `main.bolt` file, located in `data/gm4_module_namespace/modules/main.bolt`. At the start of the file, import the wrapper with `from gm4_liquid_tanks:liquid_wrappers import liquid`\n\nEach liquid type is a class, defined with the `@liquid` decorator, with 4 class attributes. \n - `id`: internal id of the liquid\n - `name`: display name in the hopper ie \"Water\" becomes \"Water Tank\"\n - `capacity`: maximum fluid units the tank holds\n - `skin`: (optional) resource location for the liquid's skin texture. If omitted, defaults to `liquids/id`\n\nAdditional behavior is added by calling or defining methods within the class. \n\n## Tank Init\nThe default tank init function is created by calling `liquid.init()`. Additional commands can be appended to the end of the init function by decorating a method:\n```py\n@liquid.init()\ndef arbitrary_fcn_name():\n    say additional commands done here!\n    advancement grant @a[distance=..2] gm4:blood_tank\n```\n\n## Item Fill/Drain\nEach item that a tank fills or drains is registered by calling `liquid.item_fill` or `liquid.item_drain`. Most items that can be both filled or drained (like a bucket or bottle) only need to call `item_fill`, which also in turn defines its `item_drain` reverse direction. \n\nAn item that only is fillable (like adding water to concrete powder) can be created with `item_fill(reversible=False)`. \nSimilarly, an item that is only drainable (like enchanted pages) can be created with `item_drain` directly. \n\nThe arguments of the method define the two items and the amount of liquid imparted to/from the tank by that item. These items are defined by their item stack component test. e.g. `paper[custom_data~{gm4_book_binders:{item:\"enchanted_page\"}}]`\n\n```py\nliquid.item_fill('bucket', 'water_bucket', 3)\nliquid.item_fill('glass_bottle', 'minecraft:potion[potion_contents={potion:\"water\"}]', 1)\nliquid.item_drain('paper[custom_data~{gm4_book_binders:{item:\"enchanted_page\"}}]', 'paper', 5)\n```\n\nIf the output item requires additional data to be set after being processed by the liquid tank, or if any additional commands are present at the end of the item process file (for advancements for example), then the decorator approach is required. The first set of commands placed before a `yield` is called at the step where the final item data is applied to the `weapon.mainhand` of the forceload armorstand (UUID=`344d47-4-4-4-f04ce104d`), generally following the form: \n`loot replace entity 344d47-4-4-4-f04ce104d weapon.mainhand loot gm4_standard_liquids:ink_bottle`. The second set of commands after a `yield` generates at the end of the function. \n\n```py\n@liquid.item_fill('glass_bottle', 'experience_bottle', 9)\n    def experience_bottle():\n        item replace entity 344d47-4-4-4-f04ce104d weapon.mainhand with minecraft:experience_bottle\n        yield\n        execute if score $smart_success gm4_lt_value matches 1 run advancement grant @a[distance=..4,gamemode=!spectator] only gm4:standard_liquids\n```\n\n## Util Below\nSome basic util-below functionality is available for liquids that have a \"dispense\" function. Other util-below functionality should be added directly through the creation of the usual function files.\n\nThis set of commands is called on tanks of the matching type, and run as provided by a decorated method. \n```py\n@liquid.util_below\n    def dispense_ink():\n        execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:blindness'}]}] run function gm4_standard_liquids:util/liquid_dispensing/ink\n```\n\n# Advanced Usage\n## Standard Units\nLiquid containers that are commonly used by many items can easily be defined as a \"Standard Unit\", which will reuse function files wherever possible. Glass bottles and buckets are examples of this. \n\nA defined standard unit acts in place of the normal `liquid.item_fill` method, with all set arguments already bound. \n\n```py\nbottle = liquid.standard_unit('glass_bottle', 1)\n\nliquid.item_fill('glass_bottle', 'honey_bottle', 1) # then becomes\nbottle('honey_bottle')\n```\n\nStandard units take an optional `f_name` string parameter that allows the actual function name to be defined, which may prevent collisions when more than one standard unit uses the same item type. \n\n## Naming Schemes\nBy default, function files are names according to a preset number of schemes, usually by the item name or potion type if available. Additioinal schemes can be registered to the wrapper via its `schemes` attribute. This functionality is not used yet in the codebase, so please refer to the source code for more details. \n\n## Partially Bound Liquid Defaults\nLiquids with commonly repeated properties (mainly liquid value) can be made with a new instance of the \"Liquid\" object, replacing the usage of the included `liquid` instance. \n"
  },
  {
    "path": "gm4_liquid_tanks/bolt_liquid_wrappers.py",
    "content": "# beet plugin to add the liquid_wrappers.bolt module to other gm4 datapacks more easily\nfrom beet import Context\nfrom bolt import Module\nfrom pathlib import Path\n\n\ndef beet_default(ctx: Context):\n    ctx.data[Module]['gm4_liquid_tanks:liquid_wrappers'] = Module(source_path=Path(\"gm4_liquid_tanks/data/gm4_liquid_tanks/modules/liquid_wrappers.bolt\"))\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4/advancement/liquid_tanks_create.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"hopper\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_liquid_tanks:gui/advancement/liquid_tanks_create\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.liquid_tanks.title\",\n      \"fallback\": \"Oh, That Kind of Tank\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.liquid_tanks.description\",\n      \"fallback\": \"Find out that a liquid tank is not an epic submarine\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"obtain_liquid_tank\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"liquid_tank\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4/advancement/standard_liquids.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"experience_bottle\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"standard_liquids:gui/advancement/standard_liquids\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.standard_liquids.title\",\n      \"fallback\": \"Experience Quicksave\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.standard_liquids.description\",\n      \"fallback\": \"Bottle your own experience from a liquid tank\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:liquid_tanks_create\",\n  \"criteria\": {\n    \"bottle_experience\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/advancement/recipes/liquid_tank.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_liquid_tanks:liquid_tank\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:hopper\",\n              \"minecraft:comparator\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_liquid_tanks:liquid_tank\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/apply_output.mcfunction",
    "content": "# run from liquid_tanks:smart_item_drain and smart_item_fill\n# @s = processing tank\n\n# merge count from input and set to tank\nitem_modifier gm4_liquid_tanks:apply_output_count:\n    function: \"minecraft:set_count\"\n    count:\n        type: \"minecraft:score\"\n        target: \n            type: \"minecraft:fixed\"\n            name: \"$stack_size\"\n        score: \"gm4_lt_value\"\n\nitem replace block ~ ~ ~ container.0 from entity 344d47-4-4-4-f04ce104d weapon.mainhand gm4_liquid_tanks:apply_output_count\nitem replace entity 344d47-4-4-4-f04ce104d weapon.mainhand with air\n\n# apply value delta\nscoreboard players operation @s gm4_lt_value += $stack_value gm4_lt_value\n\n# record success\nscoreboard players set $smart_success gm4_lt_value 1\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/empty.mcfunction",
    "content": "#@s = liquid tank\n#run from liquid_tanks:liquid_value_update\n\nscoreboard players set @s gm4_lt_value 0\nexecute positioned ~ ~ ~ run kill @e[type=item_display,tag=gm4_liquid_tank_liquid_display,distance=..0.5]\ndata merge block ~ ~ ~ {CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.liquid_tank.empty\",\"fallback\":\"Empty Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.liquid_tank.empty\",\"fallback\":\"Empty Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\ndata modify entity @s data.gm4_liquid_tanks.liquid_tag set value \"empty\"\nfunction #gm4_liquid_tanks:remove_liquid_tags\ntag @s add gm4_lt_empty\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_lt_value dummy\nscoreboard objectives add gm4_lt_max dummy\nscoreboard objectives add gm4_lt_prior_val dummy\nscoreboard objectives add gm4_lt_disp_val dummy\nscoreboard objectives add gm4_lt_util dummy\n\nexecute unless score liquid_tanks gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Liquid Tanks\"}\nexecute unless score liquid_tanks gm4_earliest_version < liquid_tanks gm4_modules run scoreboard players operation liquid_tanks gm4_earliest_version = liquid_tanks gm4_modules\nscoreboard players set liquid_tanks gm4_modules 1\n\nschedule function gm4_liquid_tanks:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/item_process.mcfunction",
    "content": "#@s = liquid tank with item in first slot\n#run from liquid_tanks:process\n\n# get stack count for smart interface\nexecute store result score $stack_size gm4_lt_value if items block ~ ~ ~ container.0 *\n\n#tank init\nexecute if score @s[tag=gm4_lt_empty] gm4_lt_value matches 0 unless entity @s[tag=gm4_lt_fill] run function #gm4_liquid_tanks:tank_init\n\n#item drain\nexecute unless entity @s[tag=gm4_lt_fill] run function #gm4_liquid_tanks:item_drain\n\n#item fill\nexecute unless entity @s[tag=gm4_lt_drain] run function #gm4_liquid_tanks:item_fill\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/level_report_ray.mcfunction",
    "content": "#@s = all players at @s\n#run from main\n\nexecute anchored eyes positioned ^ ^ ^.5 if block ~ ~ ~ hopper align xyz positioned ~0.5 ~0.5 ~0.5 if entity @e[type=marker,tag=gm4_liquid_tank,distance=..0.1] run function #gm4_liquid_tanks:level_report_check\nexecute unless entity @s[tag=gm4_lt_found_tank] anchored eyes positioned ^ ^ ^1.5 if block ~ ~ ~ hopper align xyz positioned ~0.5 ~0.5 ~0.5 if entity @e[type=marker,tag=gm4_liquid_tank,distance=..0.1] run function #gm4_liquid_tanks:level_report_check\nexecute unless entity @s[tag=gm4_lt_found_tank] anchored eyes positioned ^ ^ ^2.5 if block ~ ~ ~ hopper align xyz positioned ~0.5 ~0.5 ~0.5 if entity @e[type=marker,tag=gm4_liquid_tank,distance=..0.1] run function #gm4_liquid_tanks:level_report_check\nexecute unless entity @s[tag=gm4_lt_found_tank] anchored eyes positioned ^ ^ ^3.5 if block ~ ~ ~ hopper align xyz positioned ~0.5 ~0.5 ~0.5 if entity @e[type=marker,tag=gm4_liquid_tank,distance=..0.1] run function #gm4_liquid_tanks:level_report_check\n\ntag @s remove gm4_lt_found_tank\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/liquid_value_update.mcfunction",
    "content": "#@s = liquid tank\n#run from liquid_tanks:process\n\n#normalize incase of overflow\nscoreboard players operation @s gm4_lt_value < @s gm4_lt_max\n\n#store new value of prior_value\nscoreboard players operation @s gm4_lt_prior_val = @s gm4_lt_value\n\n#if value of 0, set to empty\nexecute if score @s gm4_lt_value matches ..0 at @s run function gm4_liquid_tanks:empty\n\n#calculating teleport distance\nscoreboard players operation last_liquid_height gm4_lt_disp_val = @s gm4_lt_disp_val\nscoreboard players operation liquid_height_calc gm4_lt_disp_val = @s gm4_lt_value\nscoreboard players set #10 gm4_lt_disp_val 10\nscoreboard players operation liquid_height_calc gm4_lt_disp_val *= #10 gm4_lt_disp_val\nscoreboard players operation liquid_height_calc gm4_lt_disp_val /= @s gm4_lt_max\nscoreboard players operation @s gm4_lt_disp_val = liquid_height_calc gm4_lt_disp_val\nscoreboard players operation liquid_height_calc gm4_lt_disp_val -= last_liquid_height gm4_lt_disp_val\n\n#teleport proper number of times.\nexecute if score liquid_height_calc gm4_lt_disp_val matches 1.. at @s run function gm4_liquid_tanks:teleport_display_up\nexecute if score liquid_height_calc gm4_lt_disp_val matches ..-1 at @s run function gm4_liquid_tanks:teleport_display_down\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/create.mcfunction",
    "content": "# places the liquid_tank down\n# @s = player who placed the liquid_tank\n# located at the center of the placed block\n# run from gm4_liquid_tanks:machine/verify_place_down\n\n# place block depending on face_placement\nexecute if score $face_placement gm4_machine_data matches 1..2 run function gm4_liquid_tanks:machine/rotate/down\nexecute if score $face_placement gm4_machine_data matches 3 run function gm4_liquid_tanks:machine/rotate/south\nexecute if score $face_placement gm4_machine_data matches 4 run function gm4_liquid_tanks:machine/rotate/west\nexecute if score $face_placement gm4_machine_data matches 5 run function gm4_liquid_tanks:machine/rotate/north\nexecute if score $face_placement gm4_machine_data matches 6 run function gm4_liquid_tanks:machine/rotate/east\n\n# initialize scores\nexecute as @e[type=marker,tag=gm4_new_machine,limit=1] run function gm4_liquid_tanks:machine/init_tank_scores\n\n# mark block as placed\nplaysound block.end_portal_frame.fill block @a[distance=..30] ~ ~ ~ 1 0.5\nscoreboard players set $placed_block gm4_machine_data 1\nscoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2\ntag @e[distance=..2] remove gm4_new_machine\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/destroy.mcfunction",
    "content": "# destroys the liquid_tank\n# @s = liquid_tank marker\n# located at @s\n# run from gm4_liquid_tanks:machine/verify_destroy\n\n# kill entities related to machine block\nexecute positioned ~ ~0.4 ~ run kill @e[type=item_display,tag=gm4_liquid_tank_display,limit=1,distance=..0.01]\nexecute positioned ~ ~0.15 ~ run kill @e[type=item_display,tag=gm4_liquid_tank_liquid_display,distance=..0.3,limit=1]\n\nexecute positioned ~ ~0.5 ~ run kill @e[type=area_effect_cloud,distance=..0.5,tag=gm4_lt_util_block]\nexecute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:\"minecraft:hopper\",count:1,components:{}}},limit=1,sort=nearest]\nkill @s\n\n\n# drop item (unless broken in creative mode)\nparticle minecraft:block{block_state:\"minecraft:glass\"} ~ ~0.5 ~ .1 .25 .1 .05 30 normal @a\nexecute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_liquid_tanks:items/liquid_tank\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/init_tank_scores.mcfunction",
    "content": "# @s = new liquid tank marker\n# run from machine/create\n\nscoreboard players set @s gm4_lt_value 0\nscoreboard players set @s gm4_lt_max 100\nscoreboard players set @s gm4_lt_prior_val 0\ntag @s add gm4_lt_empty\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/rotate/down.mcfunction",
    "content": "# places the liquid_tank down based on rotation\n# @s = player who placed the liquid_tank\n# located at the center of the placed block\n# run from gm4_liquid_tanks:machine/create\n\n# place hopper\nsetblock ~ ~ ~ hopper[facing=down]{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.liquid_tank.empty\",\"fallback\":\"Empty Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.liquid_tank.empty\",\"fallback\":\"Empty Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon display entity and marker entity\nsummon item_display ~ ~0.4 ~ {Tags:[\"gm4_liquid_tank_display\",\"gm4_machine_stand\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_liquid_tank_display\",item:{id:\"glass\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_liquid_tanks:block/liquid_tank\"]}}},Rotation:[0.0f,0.0f],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.438,0.438,0.438]},item_display:'head'}\nsummon marker ~ ~ ~ {Tags:[\"gm4_liquid_tank\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_liquid_tank\",Rotation:[0.0f,0.0f]}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/rotate/east.mcfunction",
    "content": "# places the liquid_tank down based on rotation\n# @s = player who placed the liquid_tank\n# located at the center of the placed block\n# run from gm4_liquid_tanks:machine/create\n\n# place hopper\nsetblock ~ ~ ~ hopper[facing=east]{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.liquid_tank.empty\",\"fallback\":\"Empty Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.liquid_tank.empty\",\"fallback\":\"Empty Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon display entity and marker entity\nsummon item_display ~ ~0.4 ~ {Tags:[\"gm4_liquid_tank_display\",\"gm4_machine_stand\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_liquid_tank_display\",item:{id:\"glass\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_liquid_tanks:block/liquid_tank_side\"]}}},Rotation:[-90.0f,0.0f],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.438,0.438,0.438]},item_display:'head'}\nsummon marker ~ ~ ~ {Tags:[\"gm4_liquid_tank\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_liquid_tank\",Rotation:[-90.0f,0.0f]}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/rotate/north.mcfunction",
    "content": "# places the liquid_tank down based on rotation\n# @s = player who placed the liquid_tank\n# located at the center of the placed block\n# run from gm4_liquid_tanks:machine/create\n\n# place hopper\nsetblock ~ ~ ~ hopper[facing=north]{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.liquid_tank.empty\",\"fallback\":\"Empty Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.liquid_tank.empty\",\"fallback\":\"Empty Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon display entity and marker entity\nsummon item_display ~ ~0.4 ~ {Tags:[\"gm4_liquid_tank_display\",\"gm4_machine_stand\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_liquid_tank_display\",item:{id:\"glass\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_liquid_tanks:block/liquid_tank_side\"]}}},Rotation:[180.0f,0.0f],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.438,0.438,0.438]},item_display:'head'}\nsummon marker ~ ~ ~ {Tags:[\"gm4_liquid_tank\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_liquid_tank\",Rotation:[180.0f,0.0f]}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/rotate/south.mcfunction",
    "content": "# places the liquid_tank down based on rotation\n# @s = player who placed the liquid_tank\n# located at the center of the placed block\n# run from gm4_liquid_tanks:machine/create\n\n# place hopper\nsetblock ~ ~ ~ hopper[facing=south]{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.liquid_tank.empty\",\"fallback\":\"Empty Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.liquid_tank.empty\",\"fallback\":\"Empty Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon display entity and marker entity\nsummon item_display ~ ~0.4 ~ {Tags:[\"gm4_liquid_tank_display\",\"gm4_machine_stand\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_liquid_tank_display\",item:{id:\"glass\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_liquid_tanks:block/liquid_tank_side\"]}}},Rotation:[0.0f,0.0f],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.438,0.438,0.438]},item_display:'head'}\n\nsummon marker ~ ~ ~ {Tags:[\"gm4_liquid_tank\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_liquid_tank\",Rotation:[0.0f,0.0f]}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/rotate/west.mcfunction",
    "content": "# places the liquid_tank down based on rotation\n# @s = player who placed the liquid_tank\n# located at the center of the placed block\n# run from gm4_liquid_tanks:machine/create\n\n# place hopper\nsetblock ~ ~ ~ hopper[facing=west]{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.liquid_tank.empty\",\"fallback\":\"Empty Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.liquid_tank.empty\",\"fallback\":\"Empty Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon display entity and marker entity\nsummon item_display ~ ~0.4 ~ {Tags:[\"gm4_liquid_tank_display\",\"gm4_machine_stand\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_liquid_tank_display\",item:{id:\"glass\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_liquid_tanks:block/liquid_tank_side\"]}}},Rotation:[90.0f,0.0f],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.438,0.438,0.438]},item_display:'head'}\n\nsummon marker ~ ~ ~ {Tags:[\"gm4_liquid_tank\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_liquid_tank\",Rotation:[90.0f,0.0f]}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/verify_destroy.mcfunction",
    "content": "# verifies that the destroyed machine was from this module\n# @s = machine block marker\n# located at @s\n# run from #gm4_machines:destroy\n\nexecute if entity @s[tag=gm4_liquid_tank] run function gm4_liquid_tanks:machine/destroy\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/verify_place_down.mcfunction",
    "content": "# verifies that the placed down machine was from this module\n# @s = player who placed down the machine\n# located at the machine block marker (at the center of the placed down block)\n# run from #gm4_machines:place_down\n\nexecute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:\"liquid_tank\"} run function gm4_liquid_tanks:machine/create\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/main.mcfunction",
    "content": "# process machine\nexecute as @e[type=marker,tag=gm4_liquid_tank] at @s run function gm4_liquid_tanks:process\n\n#tank level report\nexecute as @a[gamemode=!spectator] at @s run function gm4_liquid_tanks:level_report_ray\n\n#self-perpetuating clock\nschedule function gm4_liquid_tanks:main 16t\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/process.mcfunction",
    "content": "#@s = liquid tanks\n#run from main\n\n#item processing\nexecute if items block ~ ~ ~ container.0 * run function gm4_liquid_tanks:item_process\n\n#last item action resetting (requires updated tank data, so no refrence to storage)\nexecute unless items block ~ ~ ~ container.0 * run tag @s remove gm4_lt_drain\nexecute unless items block ~ ~ ~ container.0 * run tag @s remove gm4_lt_fill\n\n#entity processing\nexecute if block ~ ~ ~ hopper[enabled=true] align xyz positioned ~ ~1 ~ if entity @e[type=!armor_stand,dx=0] run function #gm4_liquid_tanks:util_above\nexecute if block ~ ~ ~ hopper[enabled=true] align xyz positioned ~ ~-1 ~ if entity @e[type=!armor_stand,dx=0] run function #gm4_liquid_tanks:util_below\n\n#display level update\nexecute unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/smart_item_drain.mcfunction",
    "content": "# run from expansions in their recipe files (ie standard_liquids:item_drain/bottle)\n# @s = liquid tank to be processed\n\n# calculate space required in tank for item stack\nscoreboard players operation $stack_value gm4_lt_value = $stack_size gm4_lt_value\nscoreboard players operation $stack_value gm4_lt_value *= $item_value gm4_lt_value\n\n# calculate available room in tank\nscoreboard players operation $tank_room gm4_lt_value = @s gm4_lt_max\nscoreboard players operation $tank_room gm4_lt_value -= @s gm4_lt_value\n\n# if there is room, continue\nscoreboard players set $smart_success gm4_lt_value 0\nexecute if score $stack_value gm4_lt_value <= $tank_room gm4_lt_value run function gm4_liquid_tanks:apply_output\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/smart_item_fill.mcfunction",
    "content": "# run from expansions in their recipe files (ie standard_liquids:item_fill/water_bucket)\n# @s = liquid tank to be processed\n\n# calculate space required in tank for item stack\nscoreboard players operation $stack_value gm4_lt_value = $stack_size gm4_lt_value\nscoreboard players operation $stack_value gm4_lt_value *= $item_value gm4_lt_value\n\n# calculate positive of stack_value\nscoreboard players set #-1 gm4_lt_value -1\nscoreboard players operation $stack_value_pos gm4_lt_value = $stack_value gm4_lt_value\nscoreboard players operation $stack_value_pos gm4_lt_value *= #-1 gm4_lt_value\n\n# if there is enough liquid, continue\nscoreboard players set $smart_success gm4_lt_value 0\nexecute if score $stack_value_pos gm4_lt_value <= @s gm4_lt_value run function gm4_liquid_tanks:apply_output\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/teleport_display_down.mcfunction",
    "content": "#@s = liquid tank\n#run from liquid_value_update\n\n#teleport display down\nexecute as @e[type=item_display,tag=gm4_liquid_tank_liquid_display,distance=..0.5,limit=1] at @s run teleport @s ~ ~-.04 ~\n\nscoreboard players add liquid_height_calc gm4_lt_disp_val 1\n\n#loop if needed\nexecute if score liquid_height_calc gm4_lt_disp_val matches ..-1 run function gm4_liquid_tanks:teleport_display_down\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/teleport_display_up.mcfunction",
    "content": "#@s = liquid tank\n#run from liquid_value_update\n\n#teleport display up\nexecute as @e[type=item_display,tag=gm4_liquid_tank_liquid_display,distance=..0.5,limit=1] at @s run teleport @s ~ ~.04 ~\n\nscoreboard players remove liquid_height_calc gm4_lt_disp_val 1\n\n#loop if needed\nexecute if score liquid_height_calc gm4_lt_disp_val matches 1.. run function gm4_liquid_tanks:teleport_display_up\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/upgrade_paths/2.8/entity_replacement.mcfunction",
    "content": "# @s = gm4_liquid_tank marker\n# at center of block\n# run by upgrade_paths/2.5\n\n# replace primary armor stand with item display\nsummon item_display ~ ~0.4 ~ {Tags:[\"gm4_liquid_tank_display\",\"gm4_machine_stand\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_liquid_tank_display\",item:{id:\"glass\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_liquid_tanks:block/liquid_tank\"]}}},Rotation:[0.0f,0.0f],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.438,0.438,0.438]}}\ndata modify entity @e[type=item_display,limit=1,distance=..1,tag=gm4_new_machine] Rotation set from entity @e[type=armor_stand,limit=1,distance=..1,tag=gm4_liquid_tank_stand] Rotation\nkill @e[type=armor_stand,limit=1,distance=..1,tag=gm4_liquid_tank_stand]\nscoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2\ntag @e[tag=gm4_new_machine,distance=..1] remove gm4_new_machine\n\n# replace liquid armor stand with item display\nexecute at @e[type=armor_stand,limit=1,tag=gm4_liquid_tank_display,distance=..1] positioned ~ ~1.15 ~ run summon item_display ~ ~ ~ {CustomName:\"gm4_liquid_tank_liquid_display\",Tags:[\"gm4_liquid_tank_liquid_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_liquid\"],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.83,0.83,0.83]},item_display:'head'}\ndata modify entity @e[type=item_display,tag=gm4_new_liquid,limit=1,distance=..1] item set from entity @e[type=armor_stand,limit=1,tag=gm4_liquid_tank_display,distance=..1] equipment.head\nkill @e[type=armor_stand,limit=1,tag=gm4_liquid_tank_display,distance=..1]\ntag @e[tag=gm4_new_liquid,distance=..1] remove gm4_new_liquid\n\n\nscoreboard players set @s gm4_entity_version 2\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/function/upgrade_paths/2.8.mcfunction",
    "content": "execute as @e[type=marker,tag=gm4_liquid_tank,scores={gm4_entity_version=1}] at @s run function gm4_liquid_tanks:upgrade_paths/2.8/entity_replacement\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/guidebook/liquid_tanks.json",
    "content": "{\n  \"id\": \"liquid_tanks\",\n  \"name\": \"Liquid Tanks\",\n  \"module_type\": \"base\",\n  \"icon\": {\n    \"id\": \"minecraft:glass\"\n  },\n  \"criteria\": {\n    \"obtain_hopper\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:hopper\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_comparator\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:comparator\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.liquid_tanks.description\",\n            \"fallback\": \"Liquid Tanks can store various liquids in bulk.\\n\\nThe first slot of the liquid tank acts as both the input and output of the liquid tank.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"crafting\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_hopper\"\n        ],\n        [\n          \"obtain_comparator\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.liqud_tanks.crafting\",\n            \"fallback\": \"Liquid Tanks can be crafted in a crafting table:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_liquid_tanks:liquid_tank\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/loot_table/items/liquid_tank.json",
    "content": "{\n  \"type\": \"block\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_liquid_tanks:item/liquid_tank\"]},\n                \"minecraft:profile\": \"$liquid_tank\"\n              }\n            },\n            {\n              \"function\": \"set_custom_data\",\n              \"tag\": \"{gm4_machines:{id:'liquid_tank'}}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"translate\": \"block.gm4.liquid_tank\",\n                  \"fallback\": \"Liquid Tank\",\n                  \"color\": \"white\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/modules/liquid_wrappers.bolt",
    "content": "from functools import wraps, partial\nimport re\nfrom inspect import isgeneratorfunction\n\nfrom beet import Context\nfrom mecha import Mecha, AstItemStack\nfrom bolt.contrib.defer import Defer\n\nfrom gm4.utils import add_namespace\n\nfrom gm4_liquid_tanks.mcmeta_stacksize import retrieve_stacksizes\nunstackables, stackable_16, _ = retrieve_stacksizes(ctx.cache, \"26.1\")\n\n# function that generates no mcfunction\ndef emptyfunc():\n    pass\n\nclass Liquid:\n    \"\"\"Base class providing decorators and infrastructure for adding Liquid Tanks liquids\"\"\"\n    id: str = None\n    capacity: int = None\n    name: str = None\n    skin: str = None # defaults to value of `liquids/id` if not otherwise set\n    _fields = ['id', 'capacity', 'name']\n    _generators = [] # functions that create mcfunction using bolt\n    _defer_counters = {\n        '_singleton_util_below_tail': 0,\n        '_singleton_util_below_head': 0\n    } # classvar for util_below cleanup defers\n   \n\n\n    def __init__(self, *args, **kwargs):\n        # create instance attributes (named defined by _fields) based on constructor\n        input_args = dict(zip(self._fields, args)) | kwargs\n        for field in self._fields:\n            if input_args.get(field, None):\n                setattr(self, field, input_args.get(field, None))\n        self.units = {} # reusable quantities shared amongst liquids\n        self.naming_schemes = NamingSchemes() # stores which function names are taken and generates new ones\n        self.struc = Liquid\n        self.mc = ctx.inject(Mecha)\n        self.defer = ctx.inject(Defer)\n\n    def __call__(self, cls):\n        \"\"\"instance acts as decorator for defining new class-structures\"\"\"\n        @wraps(cls, updated=())\n        class DecoratedLiquid(cls, Liquid):\n            pass\n\n        # set unbound DecoratedLiquid class attributes\n        for field in self._fields:\n            if getattr(self, field, None):\n                setattr(DecoratedLiquid, field, getattr(self, field, None))\n\n        # use the skin file of \"id\" if not otherwise specified.\n        if not DecoratedLiquid.skin:\n            DecoratedLiquid.skin = \"liquids/\"+DecoratedLiquid.id\n\n        self.struc = DecoratedLiquid # link access to class variables through `self`\n        for fcn in DecoratedLiquid._generators:\n            fcn() # create the mcfunction \n        DecoratedLiquid._generators.clear()\n\n        return DecoratedLiquid\n    \n    def init(self, fcn=emptyfunc):\n        @wraps(fcn)\n        def wrapped_fcn():\n            function ~/../liquid_init/{self.struc.id}:\n                data merge block ~ ~ ~ {CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":f\"container.gm4.liquid_tank.{self.struc.id}\",\"fallback\":f\"{self.struc.name} Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":f\"container.gm4.liquid_tank.{self.struc.id}\",\"fallback\":f\"{self.struc.name} Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n                summon item_display ~ ~ ~:\n                    CustomName: \"gm4_liquid_tank_liquid_display\"\n                    Tags: [\"gm4_liquid_tank_liquid_display\",\"smithed.entity\",\"smithed.strict\"]\n                    item: \n                        id: player_head\n                        count:1b\n                        components:{\n                            \"minecraft:profile\": f\"${(~/).split(':')[0]}:{self.struc.skin}\"\n                        }\n                    transformation:\n                        left_rotation: [0f,0f,0f,1f]\n                        right_rotation: [0f,0f,0f,1f]\n                        translation: [0f,0.2185f,0f]\n                        scale: [0.83, 0.83, 0.83]\n                    item_display: head\n                data modify entity @s data.gm4_liquid_tanks.liquid_tag set value f\"gm4_lt_{self.struc.id}\"\n                scoreboard players set @s gm4_lt_max self.struc.capacity\n                tag @s add f'gm4_lt_{self.struc.id}'\n                tag @s remove gm4_lt_empty\n                fcn()\n            \n            append function ~/../remove_liquid_tags:\n                append function_tag gm4_liquid_tanks:remove_liquid_tags {\"values\": [(~/)]}\n                tag @s remove f'gm4_lt_{self.struc.id}'\n            \n            # add function-tag hooks\n            append function_tag gm4_liquid_tanks:tank_init {\"values\": [(~/../tank_init)]}\n            append function_tag gm4_liquid_tanks:item_fill {\"values\": [(~/../item_fill)]}\n            append function_tag gm4_liquid_tanks:item_drain {\"values\": [(~/../item_drain)]}\n            append function_tag gm4_liquid_tanks:util_below {\"values\": [(~/../util_below)]}\n            # append function_tag gm4_liquid_tanks:util_above {\"values\": [(~/../util_above)]}\n\n        # give nicer info about this wrapped function if not used as decorator\n        if fcn:\n            wrapped_fcn.__qualname__ = \"Liquid.init\"\n        else:\n             wrapped_fcn.__qualname__ = fcn.__qualname__\n\n        self.struc._generators.append(wrapped_fcn)\n        return wrapped_fcn\n    \n    @staticmethod\n    def _default_set_output(item:str):\n        item replace entity 344d47-4-4-4-f04ce104d weapon.mainhand with item\n    \n    \n    def item_fill(self, input: str, output: str, value: int, reversable: bool = True, ignore_standard_units: bool = False):\n        def dec_with_args(fcn, fcn_to_replace):\n            @wraps(fcn)\n            def wrapped_fcn():\n                output_id = output.split('[', 1)[0].removeprefix('minecraft:')\n                ns_output = add_namespace(output_id, \"minecraft\")\n\n                # retrieve max allowable stack size\n                if ns_output in unstackables:\n                    stack_limit = \"1\"\n                elif ns_output in stackable_16:\n                    stack_limit = \"..16\"\n                else:\n                    stack_limit = \"..64\" # FIXME this should remove that execute subcommand from the chain.. somehow\n\n                # retrieve name for generated function\n                if not isinstance(fcn, partial): # not Liquid._default_set_output:\n                    func_name = fcn.__name__\n                    self.naming_schemes.register(func_name, ~/../item_fill)\n                else:\n                    func_name = self.naming_schemes.retrieve_and_register(input, output, ~/../item_fill)\n\n                # transform any supplied mcfunction into generator\n                genfcn = self._multiple_mcfunction(fcn)\n\n                append function ~/../item_fill:\n                    execute if entity @s[tag=f'gm4_lt_{self.struc.id}'] if score $stack_size gm4_lt_value matches stack_limit if items block ~ ~ ~ container.0 input run function ~/{func_name}:\n                        scoreboard players set $item_value gm4_lt_value (-value)\n                        next(genfcn) # runs _default_set_output unless alternative is supplied\n                        function gm4_liquid_tanks:smart_item_fill\n                        tag @s add gm4_lt_fill\n                        next(genfcn)\n\n            # give nicer info about this wrapped function if not used as decorator\n            if isinstance(fcn, partial):\n                wrapped_fcn.__qualname__ = \"Liquid.item_fill\" \n            else:\n                wrapped_fcn.__qualname__ = fcn.__qualname__\n\n            if fcn_to_replace in self.struc._generators:\n                self.struc._generators.remove(fcn_to_replace)\n            self.struc._generators.append(wrapped_fcn)\n            return wrapped_fcn\n        \n        # create reverse\n        if reversable:\n            self.item_drain(output, input, value)\n        \n        default_dec = dec_with_args(partial(self._default_set_output, item=output), None)\n\n        return_dec = partial(dec_with_args, fcn_to_replace=default_dec)\n        return return_dec\n    \n    def standard_unit(self, item: str, value: int, f_name: str = None):\n        if not f_name: # mcfunction name\n            f_name = item\n        self.units.update({(item, value): f_name})\n        # let unit act as an 'item_fill' decorator with input already set\n        def dispatch(output: str):\n            return partial(self.item_fill, input=item, value=value)(output=output)\n        return dispatch\n    \n\n    def item_drain(self, input: str, output: str, value: int):\n        def dec_with_args(fcn, fcn_to_replace):\n            @wraps(fcn)\n            def wrapped_fcn():\n                # see if we can reuse a standard unit\n                func_name = self.units.get((output, value), None)\n                if func_name:\n                    self.naming_schemes.register(func_name, ~/../item_drain)\n\n                # if not, retrive the name for the generated function\n                if not func_name:\n                    func_name = self.naming_schemes.retrieve_and_register(input, output, ~/../item_drain)\n\n                # transform any supplied mcfunction into generator\n                genfcn = self._multiple_mcfunction(fcn)\n\n                append function ~/../item_drain:\n                    execute if entity @s[tag=f'gm4_lt_{self.struc.id}'] if items block ~ ~ ~ container.0 input run function ~/{func_name}:\n                        scoreboard players set $item_value gm4_lt_value value\n                        next(genfcn) # runs _default_set_output unless alternative is supplied\n                        function gm4_liquid_tanks:smart_item_drain\n                        tag @s add gm4_lt_drain\n                \n                append function ~/../tank_init:\n                    execute if items block ~ ~ ~ container.0 input run function ~/../liquid_init/{self.struc.id}\n\n            # give nicer info about this wrapped function if not used as decorator\n            if isinstance(fcn, partial):\n                wrapped_fcn.__qualname__ = \"Liquid.item_fill\" \n            else:\n                wrapped_fcn.__qualname__ = fcn.__qualname__\n\n            if fcn_to_replace in self.struc._generators:\n                self.struc._generators.remove(fcn_to_replace)\n            self.struc._generators.append(wrapped_fcn)\n            return wrapped_fcn\n        \n        default_dec = dec_with_args(partial(self._default_set_output, item=output), None)\n\n        return_dec = partial(dec_with_args, fcn_to_replace=default_dec)\n        return return_dec\n    \n    def util_below(self, fcn=emptyfunc):\n        # util below must always be used as a decorator - there is no \"standard\" interface\n            # util is designed to work alongside existing functions (and not entirely in bolt)\n        @wraps(fcn)\n        def wrapped_fcn():\n            # function header if needed\n            if ~/../util_below not in ctx.data.functions or \"tag @s add gm4_processing_tank\" not in ctx.data.functions[~/../util_below].lines:\n                Liquid._defer_counters['_singleton_util_below_head'] += 1\n                @self.defer\n                def _end_util_below():\n                    Liquid._defer_counters['_singleton_util_below_head'] -= 1\n                    if Liquid._defer_counters['_singleton_util_below_head'] <= 0: # only emit the commands if this is the last section of util_below\n                        prepend function ~/../util_below:\n                            tag @s add gm4_processing_tank\n                \n            # NOTE the function tail (tag remove processing_tank) cannot be removed easily by bolt, \n            # so modules using both these wrappers and normal files will need to leave that line omitted\n\n            # add commands\n            append function ~/../util_below:\n                execute if score @s[tag=f'gm4_lt_{self.struc.id}'] gm4_lt_value matches 1.. expand:\n                    fcn()\n                @self.defer\n                def _end_util_below():\n                    Liquid._defer_counters['_singleton_util_below_tail'] -= 1\n                    if Liquid._defer_counters['_singleton_util_below_tail'] <= 0: # only emit the commands if this is the last section of util_below\n                        append function ~/../util_below:\n                            tag @s remove gm4_processing_tank\n\n        self.struc._generators.append(wrapped_fcn)\n        Liquid._defer_counters['_singleton_util_below_tail'] += 1\n        return wrapped_fcn        \n    \n    @staticmethod\n    def _multiple_mcfunction(fcn):\n        \"\"\"Ensures the given function operates as a generator, allowing for multiple chunks of returned mcfunction\"\"\"\n        if isgeneratorfunction(fcn):\n            def accept_stopiteration(): # bolt does not have try/except yet, so this is an alternate implementation\n                fcninst = fcn()\n                while True:\n                    yield next(fcninst, None)\n            return accept_stopiteration()\n        else:\n            def genfunc():\n                yield fcn()\n                while True:\n                    yield None\n            return genfunc()\n    \nclass NamingSchemes():\n    \"\"\"Helper class for controlling how item_drain/ and item_fill/ functions are named\"\"\"\n    used_names: dict[str, set[str]] = {}\n\n    def __init__(self):\n        self.schemes = [\n            self.potion,\n            self.not_air,\n            self.output_name,\n            self.input_name,\n            self.combined_name\n            ]\n\n    def retrieve_and_register(self, input: str, output: str, location: str) -> str:\n        local_used_names = self.used_names.setdefault(location, set())\n        for scheme in self.schemes:\n            func_name = scheme(input, output)\n            if func_name and func_name not in local_used_names:\n                local_used_names.add(func_name)\n                return func_name\n        return \"NULL\" # FIXME error logging from bolt? How to\n    \n    def register(self, func_name: str, location: str):\n        local_used_names = self.used_names.setdefault(location, set())\n        local_used_names.add(func_name)\n\n    @staticmethod\n    def output_name(input_name: str, output_name: str) -> str:\n        return output_name.split('[', 1)[0].removeprefix('minecraft:')\n    \n    @staticmethod\n    def input_name(input_name: str, output_name: str) -> str:\n        return input_name.split('[', 1)[0].removeprefix('minecraft:')\n    \n    @staticmethod\n    def combined_name(input_name: str, output_name: str) -> str:\n        return f\"{input_name.split('[', 1)[0].removeprefix('minecraft:')}_{output_name.split('[', 1)[0].removeprefix('minecraft:')}\"\n\n    @staticmethod\n    def potion(input_name: str, output_name: str) -> str | bool:\n        m = re.match(r'.+?potion_contents=\\{potion:\\\"(.+)\\\"\\}', output_name)\n        if m:\n            return f\"{m.group(1)}_potion\"\n        return False\n    \n    @staticmethod\n    def not_air(input_name: str, output_name: str) -> str | bool:\n        if output_name == \"air\": \n            return input_name # always name a clear item operation after what is being cleared\n        return False\n    \nliquid = Liquid() # common instance for most cases\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/recipe/liquid_tank.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"redstone\",\n  \"pattern\": [\n    \"IGI\",\n    \"ICI\",\n    \" H \"\n  ],\n  \"key\": {\n    \"I\": \"minecraft:iron_ingot\",\n    \"G\": \"minecraft:glass\",\n    \"C\": \"minecraft:comparator\",\n    \"H\": \"minecraft:hopper\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:player_head\",\n    \"components\": {\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_liquid_tanks:item/liquid_tank\"]},\n      \"minecraft:profile\": \"$liquid_tank\",\n      \"minecraft:custom_data\": \"{gm4_machines:{id:'liquid_tank'}}\",\n      \"minecraft:custom_name\": {\"translate\":\"block.gm4.liquid_tank\",\"fallback\":\"Liquid Tank\",\"color\":\"white\",\"italic\":false}\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/item_drain.json",
    "content": "{\n    \"values\":[\n      \"gm4_standard_liquids:item_drain\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/item_fill.json",
    "content": "{\n    \"values\":[\n      \"gm4_standard_liquids:item_fill\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/level_report_check.json",
    "content": "{\n    \"values\":[\n      \"gm4_standard_liquids:level_report_check\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/remove_liquid_tags.json",
    "content": "{\n    \"values\":[\n      \"gm4_standard_liquids:remove_liquid_tags\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/tank_init.json",
    "content": "{\n    \"values\":[\n      \"gm4_standard_liquids:tank_init\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/util_above.json",
    "content": "{\n    \"values\":[\n      \"gm4_standard_liquids:util_above\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/util_below.json",
    "content": "{\n    \"values\":[\n      \"gm4_standard_liquids:util_below\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/test/change_type.mcfunction",
    "content": "# @template gm4_liquid_tanks:test_setup\n# @timeout 200\n\n# create lava tank\nitem replace block ~1 ~3 ~1 container.0 with minecraft:lava_bucket\n\nawait entity @e[tag=gm4_liquid_tank,tag=gm4_lt_lava,scores={gm4_lt_value=3,gm4_lt_max=300}] inside\n\n# make sure it doesn't accept water\nitem replace block ~1 ~3 ~1 container.0 with minecraft:water_bucket\n\nawait delay 1s\n\nassert items block ~1 ~3 ~1 container.0 minecraft:water_bucket\nassert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_lava,scores={gm4_lt_value=3,gm4_lt_max=300}] inside\n\n# empty the lava\ndata merge block ~1 ~3 ~1 {Items:[]}\nawait delay 1s\n\nitem replace block ~1 ~3 ~1 container.0 with minecraft:bucket\n\nawait items block ~1 ~3 ~1 container.0 minecraft:lava_bucket\nassert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_empty,scores={gm4_lt_value=0}] inside\n\n# change to water tank\ndata merge block ~1 ~3 ~1 {Items:[]}\nawait delay 1s\n\nitem replace block ~1 ~3 ~1 container.0 with minecraft:water_bucket\n\nawait items block ~1 ~3 ~1 container.0 minecraft:bucket\nassert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_water,scores={gm4_lt_value=3,gm4_lt_max=300}] inside\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/test/deposit_xp.mcfunction",
    "content": "# @template gm4_liquid_tanks:test_setup\n# @dummy ~ ~1 ~\n\nxp add @s 100\nexecute at @s run tp @s ~1 ~4 ~1\n\nawait entity @s[level=0]\n\n# there is a slight loss of xp points\nassert score @e[tag=gm4_liquid_tank,distance=..5,limit=1] gm4_lt_value matches 80..100\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/test/drain_xp.mcfunction",
    "content": "# @template gm4_liquid_tanks:test_setup\n# @dummy ~ ~1 ~\n\nitem replace block ~1 ~3 ~1 container.0 with minecraft:experience_bottle 10\nexecute at @s run tp @s ~1 ~1 ~1\n\nawait entity @s[level=6]\n\nawait score @e[tag=gm4_liquid_tank,distance=..5,limit=1] gm4_lt_value matches 0\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/test/honey_cast.mcfunction",
    "content": "# @template gm4_liquid_tanks:test_setup\n# @dummy ~ ~1 ~\n# @timeout 800\n\n# create honey tank\nitem replace block ~1 ~3 ~1 container.0 with minecraft:honey_block\nawait not items block ~1 ~3 ~1 container.0 minecraft:honey_block\n\n# place cauldron\nsetblock ~2 ~3 ~1 cauldron\n\n# link cauldron (dummy faces tank)\nexecute at @s run tp @s ~ ~ ~ -45 -45\nawait delay 1s\nassert entity @e[tag=gm4_lt_util_block,type=area_effect_cloud] inside\n\n# check casting success\nawait entity @e[type=item_display,tag=gm4_lt_honey_display] inside\nawait delay 5s\nassert entity @e[type=item,nbt={Item:{id:\"minecraft:honey_block\"}}] inside\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/test/lava_fuel.mcfunction",
    "content": "# @template gm4_liquid_tanks:test_setup\n# @dummy ~ ~1 ~\n\n# create lava tank\nitem replace block ~1 ~3 ~1 container.0 with minecraft:lava_bucket\nawait not items block ~1 ~3 ~1 container.0 minecraft:lava_bucket\n\n# place furnace\nsetblock ~2 ~3 ~1 furnace\n\n# link furnace (dummy faces tank)\nexecute at @s run tp @s ~ ~ ~ -45 ~-45\nawait delay 1s\nassert entity @e[tag=gm4_lt_util_block,type=area_effect_cloud] inside\n\n# check furnace fueling\nitem replace block ~2 ~3 ~1 container.0 with minecraft:raw_iron\nawait delay 1s\nassert block ~2 ~3 ~1 minecraft:furnace[lit=true]\nassert score @n[tag=gm4_liquid_tank] gm4_lt_value matches 2\n\n# check we don't duplicate fuel\nsetblock ~2 ~3 ~1 stone\nsetblock ~1 ~3 ~ blast_furnace\nsetblock ~1 ~3 ~2 furnace\nsetblock ~ ~3 ~1 furnace\nawait entity @e[tag=gm4_lt_util_block,type=area_effect_cloud,y_rotation=90] inside\nitem replace block ~1 ~3 ~ container.0 with minecraft:raw_iron\nitem replace block ~1 ~3 ~2 container.0 with minecraft:raw_iron\nitem replace block ~ ~3 ~1 container.0 with minecraft:raw_iron\nawait delay 1s\n\nscoreboard objectives add gm4_test dummy\nscoreboard players set $fueled gm4_test 0\nexecute if block ~1 ~3 ~ minecraft:blast_furnace[lit=true] run scoreboard players add $fueled gm4_test 1\nexecute if block ~1 ~3 ~2 minecraft:furnace[lit=true] run scoreboard players add $fueled gm4_test 1\nexecute if block ~ ~3 ~1 minecraft:furnace[lit=true] run scoreboard players add $fueled gm4_test 1\n\nassert score $fueled gm4_test matches 2\nassert score @n[tag=gm4_liquid_tank] gm4_lt_value matches 0\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/test/lava_tank.mcfunction",
    "content": "# @template gm4_liquid_tanks:test_setup\n\n# create lava tank\nitem replace block ~1 ~3 ~1 container.0 with minecraft:lava_bucket\n\nawait items block ~1 ~3 ~1 container.0 minecraft:bucket\nassert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_lava,scores={gm4_lt_value=3,gm4_lt_max=300}] inside\n\n# empty the tank\ndata merge block ~1 ~3 ~1 {Items:[]}\nawait delay 1s\n\nitem replace block ~1 ~3 ~1 container.0 with minecraft:bucket\n\nawait items block ~1 ~3 ~1 container.0 minecraft:lava_bucket\nassert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_empty,scores={gm4_lt_value=0}] inside\n\n# try bucket on empty tank\nitem replace block ~1 ~3 ~1 container.0 with minecraft:bucket\n\nawait delay 1s\n\nawait items block ~1 ~3 ~1 container.0 minecraft:bucket\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/test/milk_tank.mcfunction",
    "content": "# @template gm4_liquid_tanks:test_setup\n\n# create milk tank\nawait delay 1s\n\nsummon cow ~1.5 ~4 ~1.5\n\nawait entity @e[tag=gm4_liquid_tank,tag=gm4_lt_milk,scores={gm4_lt_value=3,gm4_lt_max=300}] inside\n\n# check cow is on cooldown\nawait delay 2s\n\nassert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_milk,scores={gm4_lt_value=3,gm4_lt_max=300}] inside\n\n# empty the tank\nitem replace block ~1 ~3 ~1 container.0 with minecraft:bucket\n\nawait items block ~1 ~3 ~1 container.0 minecraft:milk_bucket\nassert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_empty,scores={gm4_lt_value=0}] inside\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_liquid_tanks/test/place.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~ ~1 ~\n\nloot give @s loot gm4_liquid_tanks:items/liquid_tank\nexecute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1\ndummy @s use block ~1 ~ ~1\n\nassert block ~1 ~1 ~1 hopper\nassert entity @e[tag=gm4_liquid_tank,distance=..3]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_machines/tags/function/destroy.json",
    "content": "{\n    \"values\": [\n        \"gm4_liquid_tanks:machine/verify_destroy\"\n    ]\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_machines/tags/function/place_down.json",
    "content": "{\n    \"values\": [\n        \"gm4_liquid_tanks:machine/verify_place_down\"\n    ]\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/advancement/use_glow_ink_bottle_on_sign.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:any_block_use\",\n            \"conditions\": {\n                \"location\": [\n                    {\n                        \"condition\": \"minecraft:match_tool\",\n                        \"predicate\": {\n                            \"items\": [\n                                \"minecraft:potion\"\n                            ],\n                            \"predicates\": {\n                              \"minecraft:custom_data\": \"{gm4_standard_liquids:{potion:\\\"glowing\\\"}}\"\n                            }\n                        }\n                    },\n                    {\n                        \"condition\": \"minecraft:location_check\",\n                        \"predicate\": {\n                            \"block\": {\n                                \"blocks\": \"#minecraft:all_signs\"\n                            }\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_standard_liquids:util/signs/glow_ink_sign\"\n    }\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/advancement/use_ink_bottle_on_sign.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:any_block_use\",\n            \"conditions\": {\n                \"location\": [\n                    {\n                        \"condition\": \"minecraft:match_tool\",\n                        \"predicate\": {\n                            \"items\": [\n                                \"minecraft:potion\"\n                            ],\n                            \"predicates\": {\n                              \"minecraft:custom_data\": \"{gm4_standard_liquids:{potion:\\\"blindness\\\"}}\"\n                            }\n                        }\n                    },\n                    {\n                        \"condition\": \"minecraft:location_check\",\n                        \"predicate\": {\n                            \"block\": {\n                                \"blocks\": \"#minecraft:all_signs\"\n                            }\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_standard_liquids:util/signs/ink_sign\"\n    }\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/level_report/100.mcfunction",
    "content": "#@s = player looking at tank positioned as tank stand\n#run from standard_liquids:level_report_check\n\ntitle @s actionbar [{\"score\":{\"name\":\"@e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1]\",\"objective\":\"gm4_lt_value\"},\"color\":\"dark_green\"},{\"text\":\" / 100  \",\"color\":\"dark_green\"},{\"translate\":\"text.gm4.liquid_tanks.level_report.buckets\",\"fallback\":\"Buckets\",\"color\":\"dark_green\"}]\n\ntag @s add gm4_lt_found_tank\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/level_report/300.mcfunction",
    "content": "#@s = player looking at tank positioned as tank stand\n#run from standard_liquids:level_report_check\n\n#calculate displayed value from raw value\nscoreboard players operation $gm4_lt_report_calc gm4_lt_value = @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_value\nscoreboard players operation $gm4_lt_report_remain gm4_lt_value = $gm4_lt_report_calc gm4_lt_value\nscoreboard players set #3 gm4_lt_value 3\nscoreboard players operation $gm4_lt_report_calc gm4_lt_value /= #3 gm4_lt_value\nscoreboard players operation $gm4_lt_report_remain gm4_lt_value %= #3 gm4_lt_value\n\nexecute if score $gm4_lt_report_calc gm4_lt_value matches 0 if score $gm4_lt_report_remain gm4_lt_value matches 1.. run scoreboard players reset $gm4_lt_report_calc gm4_lt_value\nexecute if score $gm4_lt_report_remain gm4_lt_value matches 0 run title @s actionbar [{\"score\":{\"name\":\"$gm4_lt_report_calc\",\"objective\":\"gm4_lt_value\"},\"color\":\"dark_green\"},{\"text\":\" / 100  \",\"color\":\"dark_green\"},{\"translate\":\"text.gm4.liquid_tanks.level_report.buckets\",\"fallback\":\"Buckets\",\"color\":\"dark_green\"}]\nexecute if score $gm4_lt_report_remain gm4_lt_value matches 1 run title @s actionbar [{\"score\":{\"name\":\"$gm4_lt_report_calc\",\"objective\":\"gm4_lt_value\"},\"color\":\"dark_green\"},{\"text\":\"⅓ / 100  \",\"color\":\"dark_green\"},{\"translate\":\"text.gm4.liquid_tanks.level_report.buckets\",\"fallback\":\"Buckets\",\"color\":\"dark_green\"}]\nexecute if score $gm4_lt_report_remain gm4_lt_value matches 2 run title @s actionbar [{\"score\":{\"name\":\"$gm4_lt_report_calc\",\"objective\":\"gm4_lt_value\"},\"color\":\"dark_green\"},{\"text\":\"⅔ / 100  \",\"color\":\"dark_green\"},{\"translate\":\"text.gm4.liquid_tanks.level_report.buckets\",\"fallback\":\"Buckets\",\"color\":\"dark_green\"}]\n\nscoreboard players reset $gm4_lt_report_calc gm4_lt_value\nscoreboard players reset $gm4_lt_report_remain gm4_lt_value\ntag @s add gm4_lt_found_tank\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/level_report/400.mcfunction",
    "content": "#@s = player looking at tank positioned as tank stand\n#run from standard_liquids:level_report_check\n\n#calculate displayed value from raw value\nscoreboard players operation $gm4_lt_report_calc gm4_lt_value = @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_value\nscoreboard players operation $gm4_lt_report_remain gm4_lt_value = $gm4_lt_report_calc gm4_lt_value\nscoreboard players set #4 gm4_lt_value 4\nscoreboard players operation $gm4_lt_report_calc gm4_lt_value /= #4 gm4_lt_value\nscoreboard players operation $gm4_lt_report_remain gm4_lt_value %= #4 gm4_lt_value\n\nexecute if score $gm4_lt_report_calc gm4_lt_value matches 0 if score $gm4_lt_report_remain gm4_lt_value matches 1.. run scoreboard players reset $gm4_lt_report_calc gm4_lt_value\nexecute if score $gm4_lt_report_remain gm4_lt_value matches 0 run title @s actionbar [{\"score\":{\"name\":\"$gm4_lt_report_calc\",\"objective\":\"gm4_lt_value\"},\"color\":\"dark_green\"},{\"text\":\" / 100  \",\"color\":\"dark_green\"},{\"translate\":\"text.gm4.liquid_tanks.level_report.buckets\",\"fallback\":\"Buckets\",\"color\":\"dark_green\"}]\nexecute if score $gm4_lt_report_remain gm4_lt_value matches 1 run title @s actionbar [{\"score\":{\"name\":\"$gm4_lt_report_calc\",\"objective\":\"gm4_lt_value\"},\"color\":\"dark_green\"},{\"text\":\"¼ / 100  \",\"color\":\"dark_green\"},{\"translate\":\"text.gm4.liquid_tanks.level_report.buckets\",\"fallback\":\"Buckets\",\"color\":\"dark_green\"}]\nexecute if score $gm4_lt_report_remain gm4_lt_value matches 2 run title @s actionbar [{\"score\":{\"name\":\"$gm4_lt_report_calc\",\"objective\":\"gm4_lt_value\"},\"color\":\"dark_green\"},{\"text\":\"½ / 100  \",\"color\":\"dark_green\"},{\"translate\":\"text.gm4.liquid_tanks.level_report.buckets\",\"fallback\":\"Buckets\",\"color\":\"dark_green\"}]\nexecute if score $gm4_lt_report_remain gm4_lt_value matches 3 run title @s actionbar [{\"score\":{\"name\":\"$gm4_lt_report_calc\",\"objective\":\"gm4_lt_value\"},\"color\":\"dark_green\"},{\"text\":\"¾ / 100  \",\"color\":\"dark_green\"},{\"translate\":\"text.gm4.liquid_tanks.level_report.buckets\",\"fallback\":\"Buckets\",\"color\":\"dark_green\"}]\n\nscoreboard players reset gm4_lt_report_calc gm4_lt_value\ntag @s add gm4_lt_found_tank\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/level_report/experience.mcfunction",
    "content": "#@s = player looking at tank positioned as tank stand\n#run from standard_liquids:level_report_check\n\n#getting value of tank being looked at\nscoreboard players operation gm4_lt_report_calc gm4_lt_value = @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_value\n\n#values hardcoded\n# 0-15 formula\nprior_points = 0\nfor lvl in range(1,52):\n    if lvl <= 16:\n        current_points = lvl**2 + 6*lvl\n    elif lvl <= 31:\n        current_points = 2.5*lvl**2 - 40.5*lvl + 360\n    else:\n        current_points = 4.5*lvl**2 - 162.5*lvl + 2220\n    execute if score gm4_lt_report_calc gm4_lt_value matches (int(prior_points), int(current_points-1)) run title @s actionbar [{\"text\":f\"{lvl-1} / 50  \",\"color\":\"dark_green\"},{\"translate\":\"text.gm4.liquid_tanks.level_report.levels\",\"fallback\":\"Levels\",\"color\":\"dark_green\"}]\n    prior_points = current_points\n\nscoreboard players reset gm4_lt_report_calc gm4_lt_value\ntag @s add gm4_lt_found_tank\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/level_report_check.mcfunction",
    "content": "#@s = player looking at tank positioned at tank marker\n#run from #gm4_liquid_tanks:level_report_check in liquid_tanks:level_report_ray\n\n#actual max of 100\nexecute if score @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_max matches 100 run function gm4_standard_liquids:level_report/100\n\n#actual max of 300\nexecute if score @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_max matches 300 run function gm4_standard_liquids:level_report/300\n\n#actual max of 400\nexecute if score @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_max matches 400 run function gm4_standard_liquids:level_report/400\n\n#max 5345 (xp)\nexecute if score @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_max matches 5345 run function gm4_standard_liquids:level_report/experience\n\n\n#linking of util tanks to adjacent blocks\nexecute as @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] positioned ~ ~-0.5 ~ run function gm4_standard_liquids:util/link_blocks\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/cauldrons/drain_lava_cauldron.mcfunction",
    "content": "#@s = lava tank below a cauldron, at the cauldron\n# run from standard_liquids:util/drain_cauldron\n\nscoreboard players add @s gm4_lt_value 3\nsetblock ~ ~ ~ cauldron\nplaysound item.bucket.fill_lava block @a[distance=..10]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/cauldrons/drain_powder_snow_cauldron.mcfunction",
    "content": "#@s = snow tank below a cauldron, at the cauldron\n# run from standard_liquids:util/drain_cauldron\n\nscoreboard players set $drain_success gm4_lt_util 0\nexecute store success score $drain_success gm4_lt_util if block ~ ~ ~ minecraft:powder_snow_cauldron[level=1] if score @s gm4_lt_value matches ..299 run scoreboard players add @s gm4_lt_value 1\nexecute unless score $drain_success gm4_lt_util matches 1 store success score $drain_success gm4_lt_util if block ~ ~ ~ minecraft:powder_snow_cauldron[level=2] if score @s gm4_lt_value matches ..298 run scoreboard players add @s gm4_lt_value 2\nexecute unless score $drain_success gm4_lt_util matches 1 store success score $drain_success gm4_lt_util if block ~ ~ ~ minecraft:powder_snow_cauldron[level=3] if score @s gm4_lt_value matches ..297 run scoreboard players add @s gm4_lt_value 3\n\nexecute if score $drain_success gm4_lt_util matches 1 run setblock ~ ~ ~ cauldron\nexecute if score $drain_success gm4_lt_util matches 1 run playsound item.bucket.fill_powder_snow block @a[distance=..10]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/cauldrons/drain_water_cauldron.mcfunction",
    "content": "#@s = water tank below a cauldron, at the cauldron\n# run from standard_liquids:util/drain_cauldron\n\nscoreboard players set $drain_success gm4_lt_util 0\nexecute store success score $drain_success gm4_lt_util if block ~ ~ ~ minecraft:water_cauldron[level=1] if score @s gm4_lt_value matches ..299 run scoreboard players add @s gm4_lt_value 1\nexecute unless score $drain_success gm4_lt_util matches 1 store success score $drain_success gm4_lt_util if block ~ ~ ~ minecraft:water_cauldron[level=2] if score @s gm4_lt_value matches ..298 run scoreboard players add @s gm4_lt_value 2\nexecute unless score $drain_success gm4_lt_util matches 1 store success score $drain_success gm4_lt_util if block ~ ~ ~ minecraft:water_cauldron[level=3] if score @s gm4_lt_value matches ..297 run scoreboard players add @s gm4_lt_value 3\n\nexecute if score $drain_success gm4_lt_util matches 1 run setblock ~ ~ ~ cauldron\nexecute if score $drain_success gm4_lt_util matches 1 run playsound item.bucket.fill block @a[distance=..10]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/cauldrons/fill_lava_cauldron.mcfunction",
    "content": "#@s = liquid tank, positioned at empty cauldron\n#run from standard_liquids:util/water_tank\n\nexecute if score @s gm4_lt_util matches 3.. run scoreboard players remove @s gm4_lt_value 3\nexecute if score @s gm4_lt_util matches 3.. run setblock ~ ~ ~ minecraft:lava_cauldron\nexecute if score @s gm4_lt_util matches 3.. run playsound item.bucket.empty_lava block @a[distance=..10]\nexecute if score @s gm4_lt_util matches 3.. run scoreboard players remove @s gm4_lt_util 3"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/cauldrons/fill_powder_snow_cauldron.mcfunction",
    "content": "#@s = liquid tank, positioned at empty cauldron\n#run from standard_liquids:util/water_tank\n\nexecute if score @s gm4_lt_util matches 3.. run scoreboard players remove @s gm4_lt_value 3\nexecute if score @s gm4_lt_util matches 3.. run setblock ~ ~ ~ minecraft:powder_snow_cauldron[level=3]\nexecute if score @s gm4_lt_util matches 3.. run playsound item.bucket.empty_powder_snow block @a[distance=..10]\nexecute if score @s gm4_lt_util matches 3.. run scoreboard players remove @s gm4_lt_util 3"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/cauldrons/fill_water_cauldron.mcfunction",
    "content": "#@s = liquid tank, positioned at empty cauldron\n#run from standard_liquids:util/water_tank\n\nexecute if score @s gm4_lt_util matches 3.. run scoreboard players remove @s gm4_lt_value 3\nexecute if score @s gm4_lt_util matches 3.. run setblock ~ ~ ~ minecraft:water_cauldron[level=3]\nexecute if score @s gm4_lt_util matches 3.. run playsound item.bucket.empty block @a[distance=..10]\nexecute if score @s gm4_lt_util matches 3.. run scoreboard players remove @s gm4_lt_util 3\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/drain_cauldron.mcfunction",
    "content": "#@s = liquid tank with cauldron above it, at cauldron\n#run from util_above\n\n#init tank\nexecute if entity @s[tag=gm4_lt_empty] if block ~ ~ ~ minecraft:water_cauldron at @s run function gm4_standard_liquids:liquid_init/water\nexecute if entity @s[tag=gm4_lt_empty] if block ~ ~ ~ minecraft:lava_cauldron at @s run function gm4_standard_liquids:liquid_init/lava\nexecute if entity @s[tag=gm4_lt_empty] if block ~ ~ ~ minecraft:powder_snow_cauldron at @s run function gm4_standard_liquids:liquid_init/powder_snow\n\n#water\nexecute if entity @s[tag=gm4_lt_water] if score @s gm4_lt_value matches ..299 run function gm4_standard_liquids:util/cauldrons/drain_water_cauldron\n\n#powder_snow\nexecute if entity @s[tag=gm4_lt_powder_snow] if score @s gm4_lt_value matches ..299 run function gm4_standard_liquids:util/cauldrons/drain_powder_snow_cauldron\n\n#lava\nexecute if entity @s[tag=gm4_lt_lava] if block ~ ~ ~ minecraft:lava_cauldron if score @s gm4_lt_value matches ..297 run function gm4_standard_liquids:util/cauldrons/drain_lava_cauldron\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/deposit_levels.mcfunction",
    "content": "#@s = player above experience tank at center of tank\n#run from standard_liquids:util/experience/scheduled_deposit\n\nexecute unless score @s gm4_lt_util matches 0.. run scoreboard players set @s gm4_lt_util 16\n\nscoreboard players remove @s gm4_lt_util 1\n\nexecute if score @s gm4_lt_util matches ..0 run function gm4_standard_liquids:util/experience/deposit_one_level\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/deposit_one_level.mcfunction",
    "content": "#@s = player above experience tank at center of tank\n#run from standard_liquids:util/experience/deposit_levels\n\n# calculate points to remove one level\nexecute store result score $points gm4_lt_util run experience query @s points\nexecute store result score $levels gm4_lt_util run experience query @s levels\n\nscoreboard players set #2 gm4_lt_util 2\nscoreboard players set #5 gm4_lt_util 5\nscoreboard players set #9 gm4_lt_util 9\n\nscoreboard players operation $level_calc gm4_lt_util = $levels gm4_lt_util\nexecute unless score $levels gm4_lt_util matches 0 run scoreboard players remove $level_calc gm4_lt_util 1\nexecute if score $points gm4_lt_util matches 1.. run scoreboard players operation $level_calc gm4_lt_util = $points gm4_lt_util\nexecute if score $points gm4_lt_util matches 0 if score $levels gm4_lt_util matches 1..15 run scoreboard players operation $level_calc gm4_lt_util *= #2 gm4_lt_util\nexecute if score $points gm4_lt_util matches 0 if score $levels gm4_lt_util matches 1..15 run scoreboard players add $level_calc gm4_lt_util 7\nexecute if score $points gm4_lt_util matches 0 if score $levels gm4_lt_util matches 16..30 run scoreboard players operation $level_calc gm4_lt_util *= #5 gm4_lt_util\nexecute if score $points gm4_lt_util matches 0 if score $levels gm4_lt_util matches 16..30 run scoreboard players remove $level_calc gm4_lt_util 38\nexecute if score $points gm4_lt_util matches 0 if score $levels gm4_lt_util matches 31.. run scoreboard players operation $level_calc gm4_lt_util *= #9 gm4_lt_util\nexecute if score $points gm4_lt_util matches 0 if score $levels gm4_lt_util matches 31.. run scoreboard players remove $level_calc gm4_lt_util 158\n\n# decrease points to whatever will fit into the tank\nscoreboard players set $overflow_calc gm4_lt_util 5345\nscoreboard players operation $overflow_calc gm4_lt_util -= @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value\nscoreboard players operation $level_calc gm4_lt_util < $overflow_calc gm4_lt_util\n\n# add points to tank and remove from player\nscoreboard players operation @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value += $level_calc gm4_lt_util\nscoreboard players set #-1 gm4_lt_util -1\nscoreboard players operation $level_calc gm4_lt_util *= #-1 gm4_lt_util\nexecute store result storage gm4_liquid_tanks:temp exp.points int 1.0 run scoreboard players get $level_calc gm4_lt_util\nfunction gm4_standard_liquids:util/experience/macro_experience with storage gm4_liquid_tanks:temp exp\nexecute as @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update\n\n# vfx\nexecute unless score $level_calc gm4_lt_util matches 0 run playsound minecraft:entity.experience_orb.pickup block @s\nfunction #gm4_liquid_tanks:level_report_check\n\n# reset accelerating clock\nscoreboard players add @s gm4_lt_value 1\nexecute if score @s gm4_lt_value matches 1..4 run scoreboard players set @s gm4_lt_util 16\nexecute if score @s gm4_lt_value matches 5..10 run scoreboard players set @s gm4_lt_util 12\nexecute if score @s gm4_lt_value matches 11..18 run scoreboard players set @s gm4_lt_util 8\nexecute if score @s gm4_lt_value matches 19.. run scoreboard players set @s gm4_lt_util 4\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/deposit_points.mcfunction",
    "content": "#@s = player above experience tank at center of tank\n#run from standard_liquids:tick\n\n#dumps 5 (or 1) points of experience from player into tank\nexecute store result score $available_points gm4_lt_util run experience query @s points\nexecute if score $available_points gm4_lt_util matches 0 if entity @s[level=1..] run scoreboard players set $available_points gm4_lt_util 5\n\nexecute if score $available_points gm4_lt_util matches 4.. if score @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value matches ..5340 run experience add @s -4 points\nexecute if score $available_points gm4_lt_util matches 4.. if score @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value matches ..5340 run scoreboard players add @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value 4\n\nexecute if score $available_points gm4_lt_util matches 1.. run experience add @s -1 points\nexecute if score $available_points gm4_lt_util matches 1.. run scoreboard players add @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value 1\n\nfunction #gm4_liquid_tanks:level_report_check\n\nexecute as @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/macro_experience.mcfunction",
    "content": "# macro-function to add/remove a dynamic number of experience points\n# run from util/experience/deposit_one_level, util/experience/withdraw_one_level\n$experience add @s $(points) points\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/scheduled_deposit.mcfunction",
    "content": "# scheduled from standard_liquids:util_above\n\n# initialize empty tanks\nexecute as @a[gamemode=!spectator,level=1..] at @s if block ~ ~-0.4 ~ hopper[enabled=true] positioned ~ ~-0.4 ~ align xyz positioned ~0.5 ~0.5 ~0.5 as @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5,tag=gm4_lt_empty] run function gm4_standard_liquids:liquid_init/experience\n\n# non-sneaking deposits points\nexecute as @a[gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] at @s if block ~ ~-0.4 ~ hopper[enabled=true] positioned ~ ~-0.4 ~ align xyz positioned ~0.5 ~0.5 ~0.5 if score @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5,tag=gm4_lt_experience] gm4_lt_value matches ..5344 run function gm4_standard_liquids:util/experience/deposit_points\n\n# sneaking deposits levels\nscoreboard players reset @a[gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] gm4_lt_value\nscoreboard players reset @a[gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] gm4_lt_util\nexecute as @a[gamemode=!spectator,predicate=gm4_standard_liquids:sneaking] at @s if block ~ ~-0.4 ~ hopper[enabled=true] positioned ~ ~-0.4 ~ align xyz positioned ~0.5 ~0.5 ~0.5 if score @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5,tag=gm4_lt_experience] gm4_lt_value matches ..5344 run function gm4_standard_liquids:util/experience/deposit_levels\n\n\nscoreboard players set $schedule_deposit_exp gm4_lt_util 2\nschedule function gm4_standard_liquids:util/experience/scheduled_deposit 1t\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/scheduled_withdraw.mcfunction",
    "content": "# scheduled from standard_liquids:util_below\n\n# non-sneaking retrieves points\nexecute as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_lt_experience] at @s if block ~ ~ ~ hopper[enabled=true] positioned ~ ~-2.5 ~ if entity @a[distance=..0.5,gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] if score @s gm4_lt_value matches 1.. run function gm4_standard_liquids:util/experience/withdraw_points\n\n# sneaking retrieves levels\nscoreboard players reset @a[gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] gm4_lt_value\nscoreboard players reset @a[gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] gm4_lt_util\nexecute as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_lt_experience] at @s if block ~ ~ ~ hopper[enabled=true] positioned ~ ~-2.5 ~ if score @s gm4_lt_value matches 1.. as @a[distance=..0.5,gamemode=!spectator,predicate=gm4_standard_liquids:sneaking,limit=1] positioned ~ ~2.5 ~ run function gm4_standard_liquids:util/experience/withdraw_levels\n\nscoreboard players set $schedule_withdraw_exp gm4_lt_util 2\nschedule function gm4_standard_liquids:util/experience/scheduled_withdraw 1t\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/withdraw_levels.mcfunction",
    "content": "#@s = player below experience tank at center of tank\n#run from standard_liquids:util/experience/scheduled_withdraw\n\nexecute unless score @s gm4_lt_util matches 0.. run scoreboard players set @s gm4_lt_util 16\n\nscoreboard players remove @s gm4_lt_util 1\n\nexecute if score @s gm4_lt_util matches ..0 run function gm4_standard_liquids:util/experience/withdraw_one_level\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/withdraw_one_level.mcfunction",
    "content": "#@s = player below experience tank at center of tank\n#run from standard_liquids:util/experience/deposit_levels\n\n# calculate points to add one level\nexecute store result score $points gm4_lt_util run experience query @s points\nexecute store result score $levels gm4_lt_util run experience query @s levels\n\nscoreboard players set #2 gm4_lt_util 2\nscoreboard players set #5 gm4_lt_util 5\nscoreboard players set #9 gm4_lt_util 9\n\nscoreboard players operation $level_calc gm4_lt_util = $levels gm4_lt_util\nexecute if score $levels gm4_lt_util matches 0..15 run scoreboard players operation $level_calc gm4_lt_util *= #2 gm4_lt_util\nexecute if score $levels gm4_lt_util matches 0..15 run scoreboard players add $level_calc gm4_lt_util 7\nexecute if score $levels gm4_lt_util matches 16..30 run scoreboard players operation $level_calc gm4_lt_util *= #5 gm4_lt_util\nexecute if score $levels gm4_lt_util matches 16..30 run scoreboard players remove $level_calc gm4_lt_util 38\nexecute if score $levels gm4_lt_util matches 31.. run scoreboard players operation $level_calc gm4_lt_util *= #9 gm4_lt_util\nexecute if score $levels gm4_lt_util matches 31.. run scoreboard players remove $level_calc gm4_lt_util 158\nscoreboard players operation $level_calc gm4_lt_util -= $points gm4_lt_util\n\n# decrease points to not take more than tank has\nscoreboard players operation $level_calc gm4_lt_util < @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value\n\n# remove points from tank and add to player\nscoreboard players operation @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value -= $level_calc gm4_lt_util\nexecute store result storage gm4_liquid_tanks:temp exp.points int 1.0 run scoreboard players get $level_calc gm4_lt_util\nfunction gm4_standard_liquids:util/experience/macro_experience with storage gm4_liquid_tanks:temp exp\nexecute as @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update\n\n# vfx\nexecute unless score $level_calc gm4_lt_util matches 0 run playsound minecraft:entity.experience_orb.pickup block @s\nfrom itertools import product, count\nc = count(0)\nfor offset in product([0, -0.05, 0.05], repeat=2):\n# summons 5 xp orbs at different locations, for a \"bigger\" looking withdrawl\n    if 0 not in offset:\n        continue\n    dx, dz = offset\n    execute unless score $level_calc gm4_lt_util matches 0 run summon experience_orb ~dx ~-0.6 ~dz {Age:(5994-next(c)),Value:0}\nfunction #gm4_liquid_tanks:level_report_check\n\n# reset accelerating clock\nscoreboard players add @s gm4_lt_value 1\nexecute if score @s gm4_lt_value matches 1..4 run scoreboard players set @s gm4_lt_util 16\nexecute if score @s gm4_lt_value matches 5..10 run scoreboard players set @s gm4_lt_util 12\nexecute if score @s gm4_lt_value matches 11..18 run scoreboard players set @s gm4_lt_util 8\nexecute if score @s gm4_lt_value matches 19.. run scoreboard players set @s gm4_lt_util 4\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/withdraw_points.mcfunction",
    "content": "#@s = tank with player below it positioned ~ ~-2.5 ~\n#run from standard_liquids:tick\n\nexecute if score @s gm4_lt_value matches 4.. run experience add @a[distance=..0.5,limit=1,gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] 4\nexecute if score @s gm4_lt_value matches 4.. run scoreboard players remove @s gm4_lt_value 4\n\nexecute if score @s gm4_lt_value matches 1.. run experience add @a[distance=..0.5,limit=1,gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] 1\nexecute if score @s gm4_lt_value matches 1.. run scoreboard players remove @s gm4_lt_value 1\n\nexecute if score @s gm4_lt_value matches 1.. run summon experience_orb ~ ~1.8 ~ {Age:5995,Value:0}\n\nexecute as @a[distance=..0.5,limit=1,gamemode=!spectator] positioned ~ ~2.5 ~ align xyz positioned ~0.5 ~0.5 ~0.5 run function #gm4_liquid_tanks:level_report_check\n\nexecute unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience_orb.mcfunction",
    "content": "#@s = xp-orb above liquid tank\n#run from standard_liquids:util_above\n\n#get xp orb's value\nexecute store result score experience_value gm4_lt_util run data get entity @s Value\n\n#try to add to tank\nexecute store success score deposit_success gm4_lt_util run scoreboard players operation @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,limit=1,scores={gm4_lt_value=..1394}] gm4_lt_value += experience_value gm4_lt_util\n\n#if added, kill self\nexecute if score deposit_success gm4_lt_util matches 1 run kill @s\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/fill_cauldrons.mcfunction",
    "content": "#@s = liquid tank filling a cauldron\n#run from util_above\n\nexecute at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_cauldron,dx=0] run scoreboard players add @s gm4_lt_util 3\nscoreboard players operation @s gm4_lt_util < @s gm4_lt_value\nexecute if entity @s[tag=gm4_lt_water] at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_cauldron,dx=0,limit=4] positioned ^ ^-1 ^1 if block ~ ~ ~ minecraft:cauldron run function gm4_standard_liquids:util/cauldrons/fill_water_cauldron\nexecute if entity @s[tag=gm4_lt_lava] at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_cauldron,dx=0,limit=4] positioned ^ ^-1 ^1 if block ~ ~ ~ minecraft:cauldron run function gm4_standard_liquids:util/cauldrons/fill_lava_cauldron\nexecute if entity @s[tag=gm4_lt_powder_snow] at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_cauldron,dx=0,limit=4] positioned ^ ^-1 ^1 if block ~ ~ ~ minecraft:cauldron run function gm4_standard_liquids:util/cauldrons/fill_powder_snow_cauldron\nscoreboard players reset @s gm4_lt_util\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/furnace_fueling/fuel_furnace.mcfunction",
    "content": "#@s = liquid tank, positioned at furnace\n#scheduled run from standard_liquids:util/furnace_fueling/furnace_start\n\n#remove hoe if not furnace not started\nexecute if block ~ ~ ~ #gm4_standard_liquids:furnace[lit=false] if items block ~ ~ ~ container.1 *[custom_data~{tankhoe:1b}] run item replace block ~ ~ ~ container.1 with air\n\n#adjust burntime and remove lava\nscoreboard players operation @s gm4_lt_prior_val = @s gm4_lt_value\n\nexecute unless block ~ ~ ~ #gm4_standard_liquids:double_speed store success score lava_fueling gm4_lt_util if block ~ ~ ~ #gm4_standard_liquids:furnace[lit=true]{cooking_time_spent:1s,lit_time_remaining:200s} run data merge block ~ ~ ~ {lit_time_remaining:6600s}\nexecute if block ~ ~ ~ #gm4_standard_liquids:double_speed store success score lava_fueling gm4_lt_util if block ~ ~ ~ #gm4_standard_liquids:furnace[lit=true]{cooking_time_spent:1s,lit_time_remaining:100s} run data merge block ~ ~ ~ {lit_time_remaining:3300s}\n\nexecute if score lava_fueling gm4_lt_util matches 1.. run scoreboard players remove @s gm4_lt_value 1\nscoreboard players reset lava_fueling gm4_lt_util\n\ntag @s remove gm4_lt_furnace_start\n\nexecute unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/furnace_fueling/furnace_start.mcfunction",
    "content": "#@s = liquid tank, positioned at furnace\n#run from standard_liquids:util/furnace_fueling/lava_tank\n\nexecute if score @s gm4_lt_util matches 1.. run item replace block ~ ~ ~ container.1 with wooden_hoe[damage=59,item_name=\"Bug\",custom_data={tankhoe:1b}] 1\nexecute if score @s gm4_lt_util matches 1.. run data merge block ~ ~ ~ {cooking_time_spent:0}\nexecute if score @s gm4_lt_util matches 1.. run tag @s add gm4_lt_furnace_start\nexecute if score @s gm4_lt_util matches 1.. run scoreboard players remove @s gm4_lt_util 1\n\n#schedule furnace fueling one tick later; when furnace processes hoe and ignites\nschedule function gm4_standard_liquids:util/furnace_fueling/scheduled_furnace_fuel 1t\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/furnace_fueling/lava_tank.mcfunction",
    "content": "#@s = lava liquid tank\n#run from util_above\n\nexecute at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_furnace,dx=0] run scoreboard players add @s gm4_lt_util 1\nscoreboard players operation @s gm4_lt_util < @s gm4_lt_value\nexecute at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_furnace,dx=0,limit=4] positioned ^ ^-1 ^1 if block ~ ~ ~ #gm4_standard_liquids:furnace[lit=false]{Items:[{Slot:0b}]} unless block ~ ~ ~ #gm4_standard_liquids:furnace{Items:[{Slot:1b}]} run function gm4_standard_liquids:util/furnace_fueling/furnace_start\nscoreboard players reset @s gm4_lt_util\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/furnace_fueling/scheduled_furnace_fuel.mcfunction",
    "content": "#@s = server. Scheduled function\n#scheduled by standard_liquids:util/furnace_fueling/furnace_start\n\n#provide lava to tanks ignited last tick\nexecute as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_lt_furnace_start] at @s align xyz positioned ~ ~1 ~ at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_furnace,dx=0,limit=4] positioned ^ ^-1 ^1 run function gm4_standard_liquids:util/furnace_fueling/fuel_furnace\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/honey_casting/honey_cauldron.mcfunction",
    "content": "#@s = liquid tank, positioned at empty cauldron\n#run from standard_liquids:util_above\n\nexecute if score @s gm4_lt_util matches 4.. run scoreboard players remove @s gm4_lt_value 4\nexecute if score @s gm4_lt_util matches 4.. run summon item_display ~0.5 ~ ~0.5 :\n    Tags:[\"gm4_lt_honey_display\",\"gm4_no_edit\"]\n    CustomName:\"gm4_lt_honey_display\"\n    item:\n        id: \"minecraft:honey_block\"\n        count: 1\n        components: {\"minecraft:custom_model_data\":{\"strings\":[\"gm4_liquid_tanks:block/cast_honey_block\"]}}\n    transformation:\n        left_rotation: [0,0,0,1]\n        right_rotation: [0,0,0,1]\n        scale: [0.9,0.01,0.9]\n        translation: [0.0,0.2,0.0]\n    teleport_duration: 4\n\nexecute if score @s gm4_lt_util matches 4.. run playsound block.honey_block.slide block @a[distance=..10] ~ ~ ~ 1 0.5\nexecute if score @s gm4_lt_util matches 4.. run scoreboard players remove @s gm4_lt_util 4\n\nexecute unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update\n\nschedule function gm4_standard_liquids:util/honey_casting/scheduled_honey_rise 4t\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/honey_casting/honey_rise.mcfunction",
    "content": "#@s = gm4_honey_display\n#run from standard_liquids:util/honey_casting/scheduled_honey_rise\n\nscoreboard players add @s gm4_lt_util 1\nexecute if score @s gm4_lt_util matches ..12 run teleport @s ~ ~0.060 ~\n\nexecute unless block ~ ~ ~ #minecraft:cauldrons run kill @s\n\nexecute if score @s gm4_lt_util matches 16.. run function gm4_standard_liquids:util/honey_casting/honey_stop\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/honey_casting/honey_stop.mcfunction",
    "content": "#@s = gm4_lt_honey_display\n#run from standard_liquids:util/honey_casting/honey_rise\n\nsummon item ~ ~ ~ {Item:{id:\"honey_block\",count:1}}\nplaysound block.honey_block.place block @a[distance=..10]\nkill @s\n\nexecute unless entity @e[type=item_display,tag=gm4_lt_honey_display,limit=1] run schedule clear gm4_standard_liquids:util/honey_casting/honey_rise\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/honey_casting/honey_tank.mcfunction",
    "content": "#@s = honey liquid tank\n#run from util_above\n\nexecute at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_cauldron,dx=0] run scoreboard players add @s gm4_lt_util 4\nscoreboard players operation @s gm4_lt_util < @s gm4_lt_value\nexecute at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_cauldron,dx=0,limit=4] positioned ^ ^-1 ^1 if block ~ ~ ~ minecraft:cauldron align xz unless entity @e[type=item_display,tag=gm4_lt_honey_display,dx=0] run function gm4_standard_liquids:util/honey_casting/honey_cauldron\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/honey_casting/scheduled_honey_rise.mcfunction",
    "content": "#@s = server\n#scheduled from standard_liquids:util/honey_casting/honey_cauldron and self\n\nexecute as @e[type=item_display,tag=gm4_lt_honey_display] at @s run function gm4_standard_liquids:util/honey_casting/honey_rise\n\nschedule function gm4_standard_liquids:util/honey_casting/scheduled_honey_rise 4t\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/link_blocks.mcfunction",
    "content": "#@s = tank stand being looked at\n#run from standard_liquids:level_report_check\n\n#checks adjacent blocks and summons corresponding area_effect_clouds\nexecute positioned ~ ~1 ~ run kill @e[type=area_effect_cloud,distance=..0.5,tag=gm4_lt_util_block]\n\n#cauldron\nexecute if block ~-1 ~ ~ #minecraft:cauldrons run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"},CustomName:\"gm4_lt_util_block\",Tags:[\"gm4_lt_util_block\",\"gm4_ltu_west\",\"gm4_ltu_cauldron\"],Rotation:[90.0f,0.0f],Radius:0,Duration:-1}\nexecute if block ~1 ~ ~ #minecraft:cauldrons run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"},CustomName:\"gm4_lt_util_block\",Tags:[\"gm4_lt_util_block\",\"gm4_ltu_east\",\"gm4_ltu_cauldron\"],Rotation:[-90.0f,0.0f],Radius:0,Duration:-1}\nexecute if block ~ ~ ~-1 #minecraft:cauldrons run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"},CustomName:\"gm4_lt_util_block\",Tags:[\"gm4_lt_util_block\",\"gm4_ltu_north\",\"gm4_ltu_cauldron\"],Rotation:[180.0f,0.0f],Radius:0,Duration:-1}\nexecute if block ~ ~ ~1 #minecraft:cauldrons run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"},CustomName:\"gm4_lt_util_block\",Tags:[\"gm4_lt_util_block\",\"gm4_ltu_south\",\"gm4_ltu_cauldron\"],Rotation:[0.0f,0.0f],Radius:0,Duration:-1}\n\nexecute if block ~ ~1 ~ #minecraft:cauldrons run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"},CustomName:\"gm4_lt_util_block\",Tags:[\"gm4_lt_util_block\",\"gm4_ltu_dripstone_cauldron\"],Rotation:[0.0f,-90.0f],Radius:0,Duration:-1}\n\n#furnace\nexecute if block ~-1 ~ ~ #gm4_standard_liquids:furnace run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"},CustomName:\"gm4_lt_util_block\",Tags:[\"gm4_lt_util_block\",\"gm4_ltu_west\",\"gm4_ltu_furnace\"],Rotation:[90.0f,0.0f],Radius:0,Duration:-1}\nexecute if block ~1 ~ ~ #gm4_standard_liquids:furnace run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"},CustomName:\"gm4_lt_util_block\",Tags:[\"gm4_lt_util_block\",\"gm4_ltu_east\",\"gm4_ltu_furnace\"],Rotation:[-90.0f,0.0f],Radius:0,Duration:-1}\nexecute if block ~ ~ ~-1 #gm4_standard_liquids:furnace run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"},CustomName:\"gm4_lt_util_block\",Tags:[\"gm4_lt_util_block\",\"gm4_ltu_north\",\"gm4_ltu_furnace\"],Rotation:[180.0f,0.0f],Radius:0,Duration:-1}\nexecute if block ~ ~ ~1 #gm4_standard_liquids:furnace run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"},CustomName:\"gm4_lt_util_block\",Tags:[\"gm4_lt_util_block\",\"gm4_ltu_south\",\"gm4_ltu_furnace\"],Rotation:[0.0f,0.0f],Radius:0,Duration:-1}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/beetroot_soup.mcfunction",
    "content": "#@s = living-base entity below beetroot soup tank\n#run from standard_liquids:util_below\n\neffect give @s saturation 1 5\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\nparticle minecraft:item{item:\"minecraft:red_concrete\"} ~0.5 ~1 ~0.5 0.2 0.2 0.2 0 20 normal @a[distance=..16]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/glow_ink.mcfunction",
    "content": "#@s = living-base entity below glow ink tank\n#run from standard_liquids:util_below\n\neffect give @s glowing 60 0\neffect give @s night_vision 90 0\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/honey.mcfunction",
    "content": "#@s = living-base entity below honey tank\n#run from standard_liquids:util_below\n\neffect give @s saturation 1 5\neffect clear @s poison\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1\nplaysound item.honey_bottle.drink block @a[distance=..8] ~ ~ ~ .5 1.5\nparticle falling_honey ~0.5 ~1 ~0.5 0.2 0.2 0.2 0 20 normal @a[distance=..16]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/ink.mcfunction",
    "content": "#@s = living-base entity below ink tank\n#run from standard_liquids:util_below\n\neffect give @s blindness 120 0\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/milk.mcfunction",
    "content": "#@s = living-base entity below milk tank\n#run from standard_liquids:util_below\n\neffect clear @s\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 3\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\nparticle minecraft:item{item:\"minecraft:snow\"} ~0.5 ~1 ~0.5 0.2 0.2 0.2 0 20 normal @a[distance=..16]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/mushroom_stew.mcfunction",
    "content": "#@s = living-base entity below mushroom stew tank\n#run from standard_liquids:util_below\n\neffect give @s saturation 1 5\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\nparticle minecraft:item{item:\"minecraft:white_terracotta\"} ~0.5 ~1 ~0.5 0.2 0.2 0.2 0 20 normal @a[distance=..16]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/rabbit_stew.mcfunction",
    "content": "#@s = living-base entity below rabbit stew tank\n#run from standard_liquids:util_below\n\neffect give @s saturation 1 9\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\nparticle minecraft:item{item:\"minecraft:smooth_red_sandstone\"} ~0.5 ~1 ~0.5 0.2 0.2 0.2 0 20 normal @a[distance=..16]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/mobs/cow.mcfunction",
    "content": "#@s = cow above liquid tank\n#run from standard_liquids:util_above\n\nscoreboard players add @s gm4_lt_util 1\n\n#init empty tanks\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_standard_liquids:liquid_init/milk\n\n#add milk to tank\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_milk,distance=..8] if score @s gm4_lt_value matches ..297 run scoreboard players add @s gm4_lt_value 3\n\n#reset score after 5 mins\nexecute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/mobs/glow_squid.mcfunction",
    "content": "#@s = cow above liquid tank\n#run from standard_liquids:util_above\n\nscoreboard players add @s gm4_lt_util 1\n\n#init empty tanks\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_standard_liquids:liquid_init/glow_ink\n\n#add milk to tank\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_glow_ink,distance=..8] if score @s gm4_lt_value matches ..297 run scoreboard players add @s gm4_lt_value 1\n\n#reset score after 5 mins\nexecute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/mobs/mooshroom.mcfunction",
    "content": "#@s = mooshroom above liquid tank\n#run from standard_liquids:util_above\n\nscoreboard players add @s gm4_lt_util 1\n\n#init empty tanks\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_standard_liquids:liquid_init/mushroom_stew\n\n#add mushroom stew to tank\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_mushroom_stew,distance=..8] if score @s gm4_lt_value matches ..299 run scoreboard players add @s gm4_lt_value 1\n\n#reset score after 5 mins\nexecute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/mobs/snow_golem.mcfunction",
    "content": "#@s = snow_golem above liquid tank\n#run from standard_liquids:util_above\n\nscoreboard players add @s gm4_lt_util 1\nexecute at @s run particle minecraft:snowflake ~ ~0.2 ~ 0.25 0 0.25 0 5\n\n#init empty tanks\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_standard_liquids:liquid_init/powder_snow\n\n#add snow to tank\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_powder_snow,distance=..8] if score @s gm4_lt_value matches ..297 run scoreboard players add @s gm4_lt_value 1\n\n#reset score after 5 mins\nexecute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/mobs/squid.mcfunction",
    "content": "#@s = squid above liquid tank\n#run from standard_liquids:util_above\n\nscoreboard players add @s gm4_lt_util 1\n\n#init empty tanks\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_standard_liquids:liquid_init/ink\n\n#add milk to tank\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_ink,distance=..8] if score @s gm4_lt_value matches ..297 run scoreboard players add @s gm4_lt_value 3\n\n#reset score after 5 mins\nexecute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/apply_glow_ink_sac_back.mcfunction",
    "content": "# @s = player clicked a sign with an ink bottle\n# at the sign they clicked\n# run from ink_sign\n\ndata merge block ~ ~ ~ {back_text:{has_glowing_text:1b}}\nexecute if entity @s[gamemode=!creative] run item replace entity @s weapon.mainhand with minecraft:glass_bottle\nplaysound minecraft:item.glow_ink_sac.use block @p[distance=..8]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/apply_glow_ink_sac_front.mcfunction",
    "content": "# @s = player clicked a sign with an ink bottle\n# at the sign they clicked\n# run from ink_sign\n\ndata merge block ~ ~ ~ {front_text:{has_glowing_text:1b}}\nexecute if entity @s[gamemode=!creative] run item replace entity @s weapon.mainhand with minecraft:glass_bottle\nplaysound minecraft:item.glow_ink_sac.use block @p[distance=..8]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/apply_ink_sac_back.mcfunction",
    "content": "# @s = player clicked a sign with an ink bottle\n# at the sign they clicked, alixn xyz\n# run from ink_sign\n\ndata merge block ~ ~ ~ {back_text:{has_glowing_text:0b}}\nexecute if entity @s[gamemode=!creative] run item replace entity @s weapon.mainhand with minecraft:glass_bottle\nplaysound minecraft:item.ink_sac.use block @p[distance=..8]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/apply_ink_sac_front.mcfunction",
    "content": "# @s = player clicked a sign with an ink bottle\n# at the sign they clicked, alixn xyz\n# run from ink_sign\n\ndata merge block ~ ~ ~ {front_text:{has_glowing_text:0b}}\nexecute if entity @s[gamemode=!creative] run item replace entity @s weapon.mainhand with minecraft:glass_bottle\nplaysound minecraft:item.ink_sac.use block @p[distance=..8]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/front_back_detection.mcfunction",
    "content": "# @s = player attempting to apply ink\n# at sign block, align xyz\n# run from ink_sign and glow_ink_sign\n\n# lookup table converting blockstate to normal direction\nexecute summon marker run function gm4_standard_liquids:util/signs/sign_normal_lookup\n\n# detection for which side of the sign center-plane is the player on\nscoreboard players set $sign_front gm4_lt_util 0\nexecute at @e[type=marker,tag=gm4_ink_normal,limit=1,distance=..4] positioned ^ ^ ^-1 facing entity @s feet rotated ~ 0 positioned ^ ^ ^1 if entity @e[type=marker,tag=gm4_ink_normal,distance=..1.414] run scoreboard players set $sign_front gm4_lt_util 1\n\nkill @e[tag=gm4_ink_normal,type=marker,distance=..4]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/glow_ink_sign.mcfunction",
    "content": "# @s = player that just used an glow ink bottle on a sign\n# run from advancement use_ink_bottle_on_sign\n\nadvancement revoke @s only gm4_standard_liquids:use_glow_ink_bottle_on_sign\nsummon marker ~ ~ ~ {Tags:[\"gm4_ink_ray\"]}\nexecute anchored eyes positioned ^ ^ ^ anchored feet run tp @e[type=marker,tag=gm4_ink_ray,limit=1] ^ ^ ^ ~ ~\nscoreboard players set $ray gm4_lt_util 0\nexecute as @e[tag=gm4_ink_ray,distance=..8] at @s run function gm4_standard_liquids:util/signs/ray\nexecute at @e[tag=gm4_ink_ray,distance=..8] align xyz run function gm4_standard_liquids:util/signs/front_back_detection\nexecute at @e[tag=gm4_ink_ray,distance=..8] if block ~ ~ ~ #minecraft:all_signs{is_waxed:1b} run playsound minecraft:block.sign.waxed_interact_fail block @p[distance=..8]\nexecute if score $sign_front gm4_lt_util matches 1 at @e[tag=gm4_ink_ray,distance=..8] align xyz unless block ~ ~ ~ #minecraft:all_signs{is_waxed:1b} unless block ~ ~ ~ #minecraft:all_signs{front_text:{has_glowing_text:1b}} run function gm4_standard_liquids:util/signs/apply_glow_ink_sac_front\nexecute if score $sign_front gm4_lt_util matches 0 at @e[tag=gm4_ink_ray,distance=..8] align xyz unless block ~ ~ ~ #minecraft:all_signs{is_waxed:1b} unless block ~ ~ ~ #minecraft:all_signs{back_text:{has_glowing_text:1b}} run function gm4_standard_liquids:util/signs/apply_glow_ink_sac_back\nkill @e[tag=gm4_ink_ray,type=marker,distance=..8]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/ink_sign.mcfunction",
    "content": "# @s = player that just used an ink bottle on a sign\n# run from advancement use_ink_bottle_on_sign\n\nadvancement revoke @s only gm4_standard_liquids:use_ink_bottle_on_sign\nsummon marker ~ ~ ~ {Tags:[\"gm4_ink_ray\"]}\nexecute anchored eyes positioned ^ ^ ^ anchored feet run tp @e[type=marker,tag=gm4_ink_ray,limit=1] ^ ^ ^ ~ ~\nscoreboard players set $ray gm4_lt_util 0\nexecute as @e[tag=gm4_ink_ray,distance=..8] at @s run function gm4_standard_liquids:util/signs/ray\nexecute at @e[tag=gm4_ink_ray,distance=..8] align xyz run function gm4_standard_liquids:util/signs/front_back_detection\nexecute at @e[tag=gm4_ink_ray,distance=..8] if block ~ ~ ~ #minecraft:all_signs{is_waxed:1b} run playsound minecraft:block.sign.waxed_interact_fail block @p[distance=..8]\nexecute if score $sign_front gm4_lt_util matches 1 at @e[tag=gm4_ink_ray,distance=..8] align xyz unless block ~ ~ ~ #minecraft:all_signs{is_waxed:1b} unless block ~ ~ ~ #minecraft:all_signs{front_text:{has_glowing_text:0b}} run function gm4_standard_liquids:util/signs/apply_ink_sac_front\nexecute if score $sign_front gm4_lt_util matches 0 at @e[tag=gm4_ink_ray,distance=..8] align xyz unless block ~ ~ ~ #minecraft:all_signs{is_waxed:1b} unless block ~ ~ ~ #minecraft:all_signs{back_text:{has_glowing_text:0b}} run function gm4_standard_liquids:util/signs/apply_ink_sac_back\nkill @e[tag=gm4_ink_ray,type=marker,distance=..8]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/ray.mcfunction",
    "content": "# @s = marker ray used to detect the sign\n# run from both ink_sign and glow_ink_sign\n\nscoreboard players add $ray gm4_lt_util 1\ntp @s ^ ^ ^0.01\nexecute if score $ray gm4_lt_util matches 0..500 at @s unless block ~ ~ ~ #minecraft:all_signs run function gm4_standard_liquids:util/signs/ray\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/sign_normal_lookup.mcfunction",
    "content": "# @s = gm4_ink_normal marker\n# at sign block align xyz\n# run from front_back_detection\ntag @s add gm4_ink_normal\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=0] positioned ~0.5 ~0.5 ~0.5 rotated 0 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=1] positioned ~0.5 ~0.5 ~0.5 rotated 22.5 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=2] positioned ~0.5 ~0.5 ~0.5 rotated 45 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=3] positioned ~0.5 ~0.5 ~0.5 rotated 67.5 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=4] positioned ~0.5 ~0.5 ~0.5 rotated 90 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=5] positioned ~0.5 ~0.5 ~0.5 rotated 112.5 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=6] positioned ~0.5 ~0.5 ~0.5 rotated 135 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=7] positioned ~0.5 ~0.5 ~0.5 rotated 157.5 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=8] positioned ~0.5 ~0.5 ~0.5 rotated 180 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=9] positioned ~0.5 ~0.5 ~0.5 rotated 202.5 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=10] positioned ~0.5 ~0.5 ~0.5 rotated 225 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=11] positioned ~0.5 ~0.5 ~0.5 rotated 247.5 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=12] positioned ~0.5 ~0.5 ~0.5 rotated 270 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=13] positioned ~0.5 ~0.5 ~0.5 rotated 292.5 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=14] positioned ~0.5 ~0.5 ~0.5 rotated 315 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:all_signs[rotation=15] positioned ~0.5 ~0.5 ~0.5 rotated 337.5 0 run teleport @s ^ ^ ^1 ~ ~\n\nexecute if block ~ ~ ~ #minecraft:wall_hanging_signs[facing=south] positioned ~0.5 ~0.5 ~0.5 rotated 0 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:wall_hanging_signs[facing=west] positioned ~0.5 ~0.5 ~0.5 rotated 90 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:wall_hanging_signs[facing=north] positioned ~0.5 ~0.5 ~0.5 rotated 180 0 run teleport @s ^ ^ ^1 ~ ~\nexecute if block ~ ~ ~ #minecraft:wall_hanging_signs[facing=east] positioned ~0.5 ~0.5 ~0.5 rotated -90 0 run teleport @s ^ ^ ^1 ~ ~\n\nexecute if block ~ ~ ~ #minecraft:wall_signs[facing=south] positioned ~0.5 ~0.5 ~0.5 rotated 0 0 run teleport @s ^ ^ ^0.5625 ~ ~\nexecute if block ~ ~ ~ #minecraft:wall_signs[facing=west] positioned ~0.5 ~0.5 ~0.5 rotated 90 0 run teleport @s ^ ^ ^0.5625 ~ ~\nexecute if block ~ ~ ~ #minecraft:wall_signs[facing=north] positioned ~0.5 ~0.5 ~0.5 rotated 180 0 run teleport @s ^ ^ ^0.5625 ~ ~\nexecute if block ~ ~ ~ #minecraft:wall_signs[facing=east] positioned ~0.5 ~0.5 ~0.5 rotated -90 0 run teleport @s ^ ^ ^0.5625 ~ ~\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util_above.mcfunction",
    "content": "#@s = tank with entity above it positioned ~ ~1 ~\n#run from liquid_tanks:process via #gm4_liquid_tanks:util_above\n\ntag @s add gm4_processing_tank\n\n#cow\nexecute as @e[dx=0,type=cow,tag=!smithed.entity] run function gm4_standard_liquids:util/mobs/cow\n\n#mooshroom\nexecute as @e[dx=0,type=mooshroom,tag=!smithed.entity] run function gm4_standard_liquids:util/mobs/mooshroom\n\n#snow golem\nexecute as @e[dx=0,type=snow_golem,tag=!smithed.entity,predicate=gm4_standard_liquids:suspended_snow_golem] run function gm4_standard_liquids:util/mobs/snow_golem\n\n#squids\nexecute as @e[dx=0,type=squid,tag=!smithed.entity] run function gm4_standard_liquids:util/mobs/squid\nexecute as @e[dx=0,type=glow_squid,tag=!smithed.entity] run function gm4_standard_liquids:util/mobs/glow_squid\n\n#experience orb\nexecute positioned ~0.5 ~ ~0.5 if entity @e[distance=..0.5,type=experience_orb] if score @s[tag=gm4_lt_empty] gm4_lt_value matches 0 at @s run function gm4_standard_liquids:liquid_init/experience\nexecute positioned ~0.5 ~ ~0.5 if score @s[tag=gm4_lt_experience] gm4_lt_value matches ..5344 as @e[distance=..0.5,type=experience_orb] run function gm4_standard_liquids:util/experience_orb\n\n#player depositing experience\nexecute if score $schedule_deposit_exp gm4_lt_util matches 2.. run schedule clear gm4_standard_liquids:util/experience/scheduled_deposit\nexecute positioned ~0.5 ~ ~0.5 if entity @a[distance=..0.5,gamemode=!spectator] run scoreboard players set $schedule_deposit_exp gm4_lt_util 1\nexecute positioned ~0.5 ~ ~0.5 if entity @a[distance=..0.5,gamemode=!spectator] run schedule function gm4_standard_liquids:util/experience/scheduled_deposit 1t\n\n#dripstone cauldron\nexecute if entity @e[dx=0,type=area_effect_cloud,tag=gm4_ltu_dripstone_cauldron] run function gm4_standard_liquids:util/drain_cauldron\n\n#cauldrons\nexecute if entity @s[tag=gm4_lt_water] run function gm4_standard_liquids:util/fill_cauldrons\nexecute if entity @s[tag=gm4_lt_lava] run function gm4_standard_liquids:util/fill_cauldrons\nexecute if entity @s[tag=gm4_lt_powder_snow] run function gm4_standard_liquids:util/fill_cauldrons\n\n#honey cauldron\nexecute if entity @s[tag=gm4_lt_honey] run function gm4_standard_liquids:util/honey_casting/honey_tank\n\n#furnace\nexecute if entity @s[tag=gm4_lt_lava] run function gm4_standard_liquids:util/furnace_fueling/lava_tank\n\n\ntag @s remove gm4_processing_tank\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/function/util_below.mcfunction",
    "content": "#@s = tank with entity above it positioned ~ ~-1 ~\n#run from liquid_tanks:process via #gm4_liquid_tanks:util_below\n\ntag @s add gm4_processing_tank\n\n#milk clearing potion effects\nexecute if score @s[tag=gm4_lt_milk] gm4_lt_value matches 3.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt={active_effects:[{}]}] run function gm4_standard_liquids:util/liquid_dispensing/milk\n\n#honey clearing poison and applying saturation\nexecute if score @s[tag=gm4_lt_honey] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt={active_effects:[{id:'minecraft:poison'}]}] run function gm4_standard_liquids:util/liquid_dispensing/honey\nexecute if score @s[tag=gm4_lt_honey] gm4_lt_value matches 1.. as @a[gamemode=!spectator,limit=1,dx=0] unless entity @s[nbt={foodLevel:20}] run function gm4_standard_liquids:util/liquid_dispensing/honey\n\n#mushroom soup applying saturation\nexecute if score @s[tag=gm4_lt_mushroom_stew] gm4_lt_value matches 1.. as @a[gamemode=!spectator,limit=1,dx=0] unless entity @s[nbt={foodLevel:20}] run function gm4_standard_liquids:util/liquid_dispensing/mushroom_stew\n\n#rabbit stew applying saturation\nexecute if score @s[tag=gm4_lt_rabbit_stew] gm4_lt_value matches 1.. as @a[gamemode=!spectator,limit=1,dx=0] unless entity @s[nbt={foodLevel:20}] run function gm4_standard_liquids:util/liquid_dispensing/rabbit_stew\n\n#beetroot soup applying saturation\nexecute if score @s[tag=gm4_lt_beetroot_soup] gm4_lt_value matches 1.. as @a[gamemode=!spectator,limit=1,dx=0] unless entity @s[nbt={foodLevel:20}] run function gm4_standard_liquids:util/liquid_dispensing/beetroot_soup\n\n#ink tanks applying effects\nexecute if score @s[tag=gm4_lt_ink] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:blindness'}]}] run function gm4_standard_liquids:util/liquid_dispensing/ink\nexecute if score @s[tag=gm4_lt_glow_ink] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:glowing'}]}] run function gm4_standard_liquids:util/liquid_dispensing/glow_ink\n\n#player withdrawing experience\nexecute if score $schedule_withdraw_exp gm4_lt_util matches 2.. run schedule clear gm4_standard_liquids:util/experience/scheduled_withdraw\nexecute if entity @s[tag=gm4_lt_experience] positioned ~0.5 ~-1 ~0.5 if entity @a[distance=..0.5,gamemode=!spectator] run scoreboard players set $schedule_withdraw_exp gm4_lt_util 1\nexecute if entity @s[tag=gm4_lt_experience] positioned ~0.5 ~-1 ~0.5 if entity @a[distance=..0.5,gamemode=!spectator] run schedule function gm4_standard_liquids:util/experience/scheduled_withdraw 1t\n\n# tag @s remove gm4_processing_tank # this line is now added by main.bolt\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/guidebook/standard_liquids.json",
    "content": "{\n  \"id\": \"standard_liquids\",\n  \"name\": \"Standard Liquids\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"liquid_tanks\",\n  \"base_module\": \"liquid_tanks\",\n  \"wiki_link\": \"https://wiki.gm4.co/Liquid_Tanks/Standard_Liquids\",\n  \"icon\": {\n    \"id\": \"minecraft:lava_bucket\"\n  },\n  \"criteria\": {\n    \"obtain_liquid_tank\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"liquid_tank\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"interactions\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_liquid_tank\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.standard_liquids.water\",\n            \"fallback\": \"Standard liquids can be stored by liquid tanks.\\n\\nWater Tank\\n- Drains water buckets, water bottles\\n- Fills buckets, bottles\\n- Fills adjacent cauldrons\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.standard_liquids.lava\",\n            \"fallback\": \"Lava Tank\\n- Drains lava buckets\\n- Fills buckets\\n- Fuels adjacent furnaces\\n- Drains lava cauldrons\\n- Fills adjacent cauldrons\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.standard_liquids.rabbit_stew_and_beetroot_soup\",\n            \"fallback\": \"Rabbit Stew Tank\\n- Drains rabbit stew\\n- Fills bowls\\n- Feeds drinkers\\n\\nBeetroot Soup Tank\\n- Drains beetroot soup, beetroot\\n- Fills bowls\\n- Feeds drinkers\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.standard_liquids.mushroom_stew_and_milk\",\n            \"fallback\": \"Mushroom Stew Tank\\n- Drains mushroom stew\\n- Fills bowls\\n- Milks mooshrooms\\n- Feeds drinkers\\n\\nMilk Tank\\n- Drains milk buckets\\n- Fills buckets\\n- Milks cows\\n- Clear mob effects\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.standard_liquids.honey\",\n            \"fallback\": \"Honey Tanks\\n- Drains honey bottles, honey blocks\\n- Fills bottles\\n- Casts honey blocks into cauldrons\\n- Clears mob poison\\n- Feeds drinkers\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.standard_liquids.experience\",\n            \"fallback\": \"Experience Tanks\\n- Drains bottles o' enchanting, enchanted books\\n- Fills bottles\\n- Absorbs experience orbs, experience points\\n- Fills experience points\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/loot_table/glow_ink_bottle.json",
    "content": "{\n    \"type\": \"generic\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"potion\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_standard_liquids:item/glow_ink_bottle\"]},\n                                \"minecraft:potion_contents\": {\n                                    \"custom_color\": 9828808,\n                                    \"custom_effects\": [\n                                        {\n                                            \"id\": \"minecraft:glowing\",\n                                            \"amplifier\": 0,\n                                            \"duration\": 1200\n                                        },\n                                        {\n                                            \"id\": \"minecraft:night_vision\",\n                                            \"amplifier\": 0,\n                                            \"duration\": 1800\n                                        }\n                                    ]\n                                }\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_standard_liquids:{potion:'glowing'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.glow_ink_bottle\",\n                                \"fallback\": \"Glow Ink Bottle\",\n                                \"italic\": false\n                            },\n                            \"target\": \"item_name\"\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/loot_table/ink_bottle.json",
    "content": "{\n    \"type\": \"generic\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"potion\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_standard_liquids:item/ink_bottle\"]},\n                                \"minecraft:potion_contents\": {\n                                    \"custom_color\": 68378,\n                                    \"custom_effects\": [\n                                        {\n                                            \"id\": \"minecraft:blindness\",\n                                            \"amplifier\": 0,\n                                            \"duration\": 2400\n                                        }\n                                    ]\n                                }\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_standard_liquids:{potion:'blindness'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.ink_bottle\",\n                                \"fallback\": \"Ink Bottle\",\n                                \"italic\": false\n                            },\n                            \"target\": \"item_name\"\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/modules/main.bolt",
    "content": "import re\nfrom gm4_liquid_tanks:liquid_wrappers import liquid\n\nbucket = liquid.standard_unit('bucket', 3)\nbowl = liquid.standard_unit('bowl', 1)\nbottle = liquid.standard_unit('glass_bottle', 1)\n\n@liquid\nclass Lava:\n    id = 'lava'\n    name = 'Lava'\n    capacity = 300\n\n    liquid.init()\n    bucket('lava_bucket') # item_fill on a standard unit\n\n@liquid\nclass Water:\n    id = 'water'\n    name = 'Water'\n    capacity = 300\n\n    liquid.init()\n    bucket('water_bucket')\n    bottle('minecraft:potion[potion_contents={potion:\"water\"}]')\n\n@liquid\nclass Milk:\n    id = 'milk'\n    name = 'Milk'\n    capacity = 300\n\n    liquid.init()\n    bucket('milk_bucket')\n\n@liquid\nclass PowderSnow:\n    id = 'powder_snow'\n    name = 'Powder Snow'\n    capacity = 300\n\n    liquid.init()\n    bucket('powder_snow_bucket')\n\n@liquid\nclass MushroomStew:\n    id = 'mushroom_stew'\n    name = 'Mushroom Stew'\n    capacity = 300\n\n    liquid.init()\n    bowl('mushroom_stew')\n\n@liquid\nclass RabbitStew:\n    id = 'rabbit_stew'\n    name = 'Rabbit Stew'\n    capacity = 300\n\n    liquid.init()\n    bowl('rabbit_stew')\n\n@liquid\nclass BeetrootSoup:\n    id = 'beetroot_soup'\n    name = 'Beetroot Soup'\n    capacity = 300\n\n    liquid.init()\n    bowl('beetroot_soup')\n    liquid.item_drain('beetroot', 'air', 1)\n\n@liquid\nclass Honey:\n    id = 'honey'\n    name = 'Honey'\n    capacity = 400\n\n    liquid.init()\n    bottle('honey_bottle')\n    liquid.item_drain('honey_block', 'air', 4)\n\n@liquid\nclass Experience:\n    id = 'experience'\n    name = 'Experience'\n    capacity = 5345\n\n    liquid.init()\n\n    @liquid.item_fill('glass_bottle', 'experience_bottle', 9)\n    def experience_bottle():\n        item replace entity 344d47-4-4-4-f04ce104d weapon.mainhand with minecraft:experience_bottle\n        yield\n        execute if score $smart_success gm4_lt_value matches 1 run advancement grant @a[distance=..4,gamemode=!spectator] only gm4:standard_liquids\n                                                                                        \n    liquid.item_drain('enchanted_book', 'book', 7)\n    liquid.item_drain('paper[custom_data~{gm4_book_binders:{item:\"enchanted_page\"}}]', 'paper', 5)\n\n    #TODO I could add a custom naming rule here - more as an example than necessary - for enchanted_page\n\n@liquid\nclass Ink:\n    id = 'ink'\n    name = 'Ink'\n    capacity = 300\n\n    liquid.init()\n    liquid.item_drain('ink_sac', 'air', 1)\n\n    @bottle('minecraft:potion[custom_data~{gm4_standard_liquids:{potion:\"blindness\"}}]')\n    def ink_bottle():\n        loot replace entity 344d47-4-4-4-f04ce104d weapon.mainhand loot gm4_standard_liquids:ink_bottle\n\n    @liquid.util_below\n    def dispense_ink():\n        execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:blindness'}]}] run function gm4_standard_liquids:util/liquid_dispensing/ink\n    \n@liquid\nclass GlowInk:\n    id = 'glow_ink'\n    name = 'Glow Ink'\n    capacity = 300\n\n    liquid.init()\n    liquid.item_drain('glow_ink_sac', 'air', 1)\n    \n    @bottle('minecraft:potion[custom_data~{gm4_standard_liquids:{potion:\"glowing\"}}]')\n    def glow_ink_bottle():\n        loot replace entity 344d47-4-4-4-f04ce104d weapon.mainhand loot gm4_standard_liquids:glow_ink_bottle\n    \n    liquid.item_fill('item_frame', 'glow_item_frame', 1, reversable=False)\n\n    @liquid.util_below\n    def dispense_ink():\n        execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:glowing'}]}] run function gm4_standard_liquids:util/liquid_dispensing/glow_ink\n\n# tell bolt how to name different ominous bottles - they have the same item id so this is a special case\ndef omnious_naming_scheme(input_name: str, output_name: str) -> str | bool:\n        m = re.match(r'ominous_bottle\\[ominous_bottle_amplifier=(\\d+)\\]', output_name)\n        if m:\n            return f\"ominous_bottle_{m.group(1)}\"\n        return False\nliquid.naming_schemes.schemes.insert(0, omnious_naming_scheme)\n\nfor lvl, numeral_lvl in zip((0,1,2,3,4), (\"I\", \"II\", \"III\", \"IV\", \"V\")):\n    @liquid\n    class OminousBottle:\n        id = f'ominous_bottle_{lvl}'\n        name = f'Ominous {numeral_lvl}'\n        capacity = 300\n        skin = 'liquids/ominous_bottle'\n\n        liquid.init()\n        bottle(f\"ominous_bottle[ominous_bottle_amplifier={lvl}]\")\n\n        @liquid.util_below\n        def dispense_omen():\n            execute\n                as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0]\n                unless entity @s[gamemode=spectator]\n                if entity @s[nbt=!{active_effects:[{id:'minecraft:bad_omen'}]}]\n                run function f\"gm4_standard_liquids:util/liquid_dispensing/ominous_bottle_{lvl}\":\n                    effect give @s bad_omen 6000 (0+lvl)\n                    scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1\n                    playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\n\n\n    \n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/predicate/sneaking.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"flags\": {\n            \"is_sneaking\": true\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/predicate/suspended_snow_golem.json",
    "content": "[\n    {\n        \"condition\": \"minecraft:entity_properties\",\n        \"entity\": \"this\",\n        \"predicate\": {\n            \"nbt\": \"{OnGround:0b}\"\n        }\n    },\n    {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n                \"vehicle\": {}\n            }\n        }\n    }\n]\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/tags/block/double_speed.json",
    "content": "{\n  \"values\": [\n    \"minecraft:blast_furnace\",\n    \"minecraft:smoker\"\n  ]\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/data/gm4_standard_liquids/tags/block/furnace.json",
    "content": "{\n  \"values\": [\n    \"minecraft:furnace\",\n    \"minecraft:blast_furnace\",\n    \"minecraft:smoker\"\n  ]\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/mcmeta_stacksize.py",
    "content": "# beet plugin to generate lists of items of each stack size, using misodes mcmeta git repo\n\nimport json\nfrom beet import ProjectCache\nfrom gm4.utils import add_namespace\n\ndef retrieve_stacksizes(cache: ProjectCache, version: str) -> tuple[list[str], list[str], list[str]]:\n    # retrieve item_components.json\n    url = f\"https://raw.githubusercontent.com/misode/mcmeta/refs/tags/{version}-summary/item_components/data.json\"\n    path = cache[\"mcmeta_stacksize\"].download(url)\n    with open(path) as f:\n        default_components = json.load(f)\n\n    # parse components into stack size lists\n    unstackables: list[str] = []\n    stackable_16: list[str] = []\n    stackable_64: list[str] = []\n\n    for item_id, components in default_components.items():\n        match components[\"minecraft:max_stack_size\"]:\n            case 1:\n                unstackables.append(add_namespace(item_id, \"minecraft\"))\n            case 16:\n                stackable_16.append(add_namespace(item_id, \"minecraft\"))\n            case 64:\n                stackable_64.append(add_namespace(item_id, \"minecraft\"))\n            case _:\n                pass\n\n    return unstackables, stackable_16, stackable_64\n"
  },
  {
    "path": "gm4_liquid_tanks/mod.mcdoc",
    "content": "dispatch minecraft:storage[gm4_liquid_tanks:temp] to struct {\n  exp?: struct {\n    points: int,\n  },\n}\n"
  },
  {
    "path": "gm4_liquid_tanks/override_formatting.py",
    "content": "from beet import Context\nfrom mecha import Mecha\n\ndef beet_default(ctx: Context):\n    ctx.inject(Mecha).serialize.formatting.layout = 'dense'"
  },
  {
    "path": "gm4_live_catch/README.md",
    "content": "# Live Catch<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nCatch live fish whilst pulling in a fishing reel!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- When reeling in a fishing rod, instead of producing a fish item, a live/mob variant will be spawned\r\n- Fish that spawn have 1 health so easily die\r\n"
  },
  {
    "path": "gm4_live_catch/beet.yaml",
    "content": "id: gm4_live_catch\nname: Live Catch\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    model_data:\n      - item: pufferfish\n        reference: gui/advancement/live_catch\n        template: advancement\n    website:\n      description: Catch live fish when fishing! But watch out for Pufferfish, those might make for a nasty surprise!\n      recommended: \n        - gm4_end_fishing\n        - gm4_reeling_rods\n      notes: []\n      search_keywords: \n        - fishing\n    modrinth:\n      project_id: uSXn7pVW\n    wiki: https://wiki.gm4.co/wiki/Live_Catch\n    credits:\n      Creator:\n        - Modulorium\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_live_catch/data/gm4/advancement/live_catch.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"pufferfish\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_live_catch:gui/advancement/live_catch\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.live_catch.title\",\n      \"fallback\": \"Watch Out!\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.live_catch.description\",\n      \"fallback\": \"Catch a pufferfish to the face.\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"impossible\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/advancement/catch_cod.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:fishing_rod_hooked\",\n      \"conditions\": {\n        \"entity\": [],\n        \"item\": {\n          \"items\": [\n            \"minecraft:cod\"\n          ]\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_live_catch:fish/cod/catch\"\n  }\n}\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/advancement/catch_pufferfish.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:fishing_rod_hooked\",\n      \"conditions\": {\n        \"entity\": [],\n        \"item\": {\n          \"items\": [\n            \"minecraft:pufferfish\"\n          ]\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_live_catch:fish/pufferfish/catch\"\n  }\n}\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/advancement/catch_salmon.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:fishing_rod_hooked\",\n      \"conditions\": {\n        \"entity\": [],\n        \"item\": {\n          \"items\": [\n            \"minecraft:salmon\"\n          ]\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_live_catch:fish/salmon/catch\"\n  }\n}\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/advancement/catch_tropical_fish.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:fishing_rod_hooked\",\n      \"conditions\": {\n        \"entity\": [],\n        \"item\": {\n          \"items\": [\n            \"minecraft:tropical_fish\"\n          ]\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_live_catch:fish/tropical_fish/catch\"\n  }\n}\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/function/fish/cod/catch.mcfunction",
    "content": "# Executes when player catches a fish\n# @s = player that caught a fish\n# at @s\n# run from advancement, gm4_live_catch:catch_FISH_TYPE\n\n\nadvancement revoke @s only gm4_live_catch:catch_cod\n\n# add fisher tag\ntag @s add gm4_lc_fished_cod\n\n# item doesnt spawn until after 1 tick\nschedule function gm4_live_catch:fish/cod/target 1t\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/function/fish/cod/summon.mcfunction",
    "content": "# Summons the fish at the fish item\n# @s = item that was fished\n# at @s\n# run from gm4_live_catch:fish/FISH_TYPE/target\n\n\n# prepare storage\ndata modify storage gm4_live_catch:temp/input Target set from entity @s\ndata modify storage gm4_live_catch:temp/output Target set value {Motion:[0d,0d,0d]}\n\n# modify storage\nexecute store result storage gm4_live_catch:temp/output Target.Motion[0] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[0] 13000\nexecute store result storage gm4_live_catch:temp/output Target.Motion[1] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[1] 13000\nexecute store result storage gm4_live_catch:temp/output Target.Motion[2] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[2] 15000\n\n# summon fish / store data\nsummon cod ~ ~1 ~ {Health:1f,Tags:[\"gm4_lc_cod_new\"]}\ndata modify entity @e[type=cod,limit=1,tag=gm4_lc_cod_new] {} merge from storage gm4_live_catch:temp/output Target\n\n# remove \ntag @e[type=cod] remove gm4_lc_cod_new\n\n# kill item\nkill @s\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/function/fish/cod/target.mcfunction",
    "content": "# Executes as the fish item a tick after the player catches it\n# @s = player that caught a fish\n# at @s\n# run from gm4_live_catch:fish/FISH_TYPE/catch\n\n\n# summon fish at item\nexecute at @a[tag=gm4_lc_fished_cod] as @e[type=item,limit=1,sort=furthest,nbt={Item:{id:\"minecraft:cod\",count:1},OnGround:0b,Age:0s}] unless data entity @s Item.components at @s run function gm4_live_catch:fish/cod/summon\n\n# remove fisher tag\ntag @a remove gm4_lc_fished_cod\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/function/fish/pufferfish/catch.mcfunction",
    "content": "# Executes when player catches a fish\n# @s = player that caught a fish\n# at @s\n# run from advancement, gm4_live_catch:catch_FISH_TYPE\n\n\nadvancement revoke @s only gm4_live_catch:catch_pufferfish\n\n# advancement\nadvancement grant @s only gm4:live_catch\n\n# add fisher tag\ntag @s add gm4_lc_fished_pufferfish\n\n# item doesnt spawn until after 1 tick\nschedule function gm4_live_catch:fish/pufferfish/target 1t\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/function/fish/pufferfish/summon.mcfunction",
    "content": "# Summons the fish at the fish item\n# @s = item that was fished\n# at @s\n# run from gm4_live_catch:fish/FISH_TYPE/target\n\n\n# prepare storage\ndata modify storage gm4_live_catch:temp/input Target set from entity @s\ndata modify storage gm4_live_catch:temp/output Target set value {Motion:[0d,0d,0d]}\n\n# modify storage\nexecute store result storage gm4_live_catch:temp/output Target.Motion[0] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[0] 13000\nexecute store result storage gm4_live_catch:temp/output Target.Motion[1] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[1] 13000\nexecute store result storage gm4_live_catch:temp/output Target.Motion[2] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[2] 15000\n\n# summon fish / store data\nsummon pufferfish ~ ~1 ~ {Health:1f,Tags:[\"gm4_lc_pufferfish_new\"]}\ndata modify entity @e[type=pufferfish,limit=1,tag=gm4_lc_pufferfish_new] {} merge from storage gm4_live_catch:temp/output Target\n\n# remove \ntag @e[type=pufferfish] remove gm4_lc_pufferfish_new\n\n# kill item\nkill @s\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/function/fish/pufferfish/target.mcfunction",
    "content": "# Executes as the fish item a tick after the player catches it\n# @s = player that caught a fish\n# at @s\n# run from gm4_live_catch:fish/FISH_TYPE/catch\n\n\n# summon fish at item\nexecute at @a[tag=gm4_lc_fished_pufferfish] as @e[type=item,limit=1,sort=furthest,nbt={Item:{id:\"minecraft:pufferfish\",count:1},OnGround:0b,Age:0s}] unless data entity @s Item.components at @s run function gm4_live_catch:fish/pufferfish/summon\n\n# remove fisher tag\ntag @a remove gm4_lc_fished_pufferfish\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/function/fish/salmon/catch.mcfunction",
    "content": "# Executes when player catches a fish\n# @s = player that caught a fish\n# at @s\n# run from advancement, gm4_live_catch:catch_FISH_TYPE\n\n\nadvancement revoke @s only gm4_live_catch:catch_salmon\n\n# add fisher tag\ntag @s add gm4_lc_fished_salmon\n\n# item doesnt spawn until after 1 tick\nschedule function gm4_live_catch:fish/salmon/target 1t\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/function/fish/salmon/summon.mcfunction",
    "content": "# Summons the fish at the fish item\n# @s = item that was fished\n# at @s\n# run from gm4_live_catch:fish/FISH_TYPE/target\n\n\n# prepare storage\ndata modify storage gm4_live_catch:temp/input Target set from entity @s\ndata modify storage gm4_live_catch:temp/output Target set value {Motion:[0d,0d,0d]}\n\n# modify storage\nexecute store result storage gm4_live_catch:temp/output Target.Motion[0] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[0] 13000\nexecute store result storage gm4_live_catch:temp/output Target.Motion[1] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[1] 13000\nexecute store result storage gm4_live_catch:temp/output Target.Motion[2] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[2] 15000\n\n# summon fish / store data\nexecute store result score $salmon_size gm4_live_catch.data run random value 1..1000\nexecute if score $salmon_size gm4_live_catch.data matches 1..316 run summon salmon ~ ~1 ~ {Health:1f,Tags:[\"gm4_lc_salmon_new\"],type:\"small\"}\nexecute if score $salmon_size gm4_live_catch.data matches 317..842 run summon salmon ~ ~1 ~ {Health:1f,Tags:[\"gm4_lc_salmon_new\"],type:\"medium\"}\nexecute if score $salmon_size gm4_live_catch.data matches 843..1000 run summon salmon ~ ~1 ~ {Health:1f,Tags:[\"gm4_lc_salmon_new\"],type:\"large\"}\ndata modify entity @e[type=salmon,limit=1,tag=gm4_lc_salmon_new] {} merge from storage gm4_live_catch:temp/output Target\n\n# remove \ntag @e[type=salmon] remove gm4_lc_salmon_new\n\n# kill item\nkill @s\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/function/fish/salmon/target.mcfunction",
    "content": "# Executes as the fish item a tick after the player catches it\n# @s = player that caught a fish\n# at @s\n# run from gm4_live_catch:fish/FISH_TYPE/catch\n\n\n# summon fish at item\nexecute at @a[tag=gm4_lc_fished_salmon] as @e[type=item,limit=1,sort=furthest,nbt={Item:{id:\"minecraft:salmon\",count:1},OnGround:0b,Age:0s}] unless data entity @s Item.components at @s run function gm4_live_catch:fish/salmon/summon\n\n# remove fisher tag\ntag @a remove gm4_lc_fished_salmon\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/function/fish/tropical_fish/catch.mcfunction",
    "content": "# Executes when player catches a fish\n# @s = player that caught a fish\n# at @s\n# run from advancement, gm4_live_catch:catch_FISH_TYPE\n\n\nadvancement revoke @s only gm4_live_catch:catch_tropical_fish\n\n# add fisher tag\ntag @s add gm4_lc_fished_tropical_fish\n\n# item doesnt spawn until after 1 tick\nschedule function gm4_live_catch:fish/tropical_fish/target 1t\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/function/fish/tropical_fish/summon.mcfunction",
    "content": "# Summons the fish at the fish item\n# @s = item that was fished\n# at @s\n# run from gm4_live_catch:fish/FISH_TYPE/target\n\n\n# prepare storage\ndata modify storage gm4_live_catch:temp/input Target set from entity @s\ndata modify storage gm4_live_catch:temp/output Target set value {Motion:[0d,0d,0d]}\n\n# modify storage\nexecute store result storage gm4_live_catch:temp/output Target.Motion[0] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[0] 13000\nexecute store result storage gm4_live_catch:temp/output Target.Motion[1] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[1] 13000\nexecute store result storage gm4_live_catch:temp/output Target.Motion[2] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[2] 15000\ndata modify storage gm4_live_catch:temp/output Target merge value {Health:1f,Tags:[\"gm4_lc_tropical_fish_new\"]}\n\n# summon fish / store data\nsummon tropical_fish ~ ~ ~\ndata modify entity @e[type=tropical_fish,limit=1,distance=0] {} merge from storage gm4_live_catch:temp/output Target\n\n# remove \ntag @e[type=tropical_fish] remove gm4_lc_tropical_fish_new\n\n# kill item\nkill @s\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/function/fish/tropical_fish/target.mcfunction",
    "content": "# Executes as the fish item a tick after the player catches it\n# @s = player that caught a fish\n# at @s\n# run from gm4_live_catch:fish/FISH_TYPE/catch\n\n\n# summon fish at item\nexecute at @a[tag=gm4_lc_fished_tropical_fish] as @e[type=item,limit=1,sort=furthest,nbt={Item:{id:\"minecraft:tropical_fish\",count:1},OnGround:0b,Age:0s}] unless data entity @s Item.components at @s run function gm4_live_catch:fish/tropical_fish/summon\n\n# remove fisher tag\ntag @a remove gm4_lc_fished_tropical_fish\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/function/init.mcfunction",
    "content": "\nexecute unless score live_catch gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Live Catch\"}\nexecute unless score live_catch gm4_earliest_version < live_catch gm4_modules run scoreboard players operation live_catch gm4_earliest_version = live_catch gm4_modules\nscoreboard players set live_catch gm4_modules 1\n\nscoreboard objectives add gm4_live_catch.data dummy\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_live_catch/data/gm4_live_catch/guidebook/live_catch.json",
    "content": "{\n  \"id\": \"live_catch\",\n  \"name\": \"Live Catch\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:cod\"\n  },\n  \"criteria\": {\n    \"use_fishing_rod\": {\n      \"trigger\": \"minecraft:fishing_rod_hooked\",\n      \"conditions\": {}\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"use_fishing_rod\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.live_catch.description\",\n            \"fallback\": \"When fishing, if a fisher reels in a fish, instead of an item, an actual fish will be launched towards the fisher.\\n\\nThe fish that spawn have half a heart of health, so they will easily die.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_live_catch/mod.mcdoc",
    "content": "dispatch minecraft:storage[gm4_live_catch:temp/input] to struct {\n  Target?: minecraft:entity[%fallback],\n}\n\ndispatch minecraft:storage[gm4_live_catch:temp/output] to struct {\n  Target?: minecraft:entity[%fallback],\n}\n"
  },
  {
    "path": "gm4_live_catch/translations.csv",
    "content": "key,en_us\nadvancement.gm4.live_catch.title,Watch Out!\nadvancement.gm4.live_catch.description,Catch a pufferfish to the face.\ntext.gm4.guidebook.module_desc.live_catch,\"Catch live fish when fishing! But watch out for Pufferfish, those might make for a nasty surprise!\"\ntext.gm4.guidebook.live_catch.description,\"When fishing, if a fisher reels in a fish, instead of an item, an actual fish will be launched towards the fisher.\\n\\nThe fish that spawn have half a heart of health, so they will easily die.\"\n"
  },
  {
    "path": "gm4_lively_lily_pads/README.md",
    "content": "# Lively Lily Pads<!--$headerTitle--><!--$pmc:delete-->\n\nPlace decorations on lily pads! <!--$pmc:headerSize-->\n\n<img src=\"images/lively_lily_pads.webp\" alt=\"A spore blossom being placed on a lily pad\" width=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\nPlace the following on lily pads:\n- Candles*\n- Lanterns*\n- Torches*\n- Coral Fans\n- Cactus Flowers\n- Spore Blossoms\n\n\\* Emit light. Candles need to be lit.\n"
  },
  {
    "path": "gm4_lively_lily_pads/beet.yaml",
    "content": "id: gm4_lively_lily_pads\nname: Lively Lily Pads\nversion: 3.3.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main,tick]\n    website:\n      description: Place decorations on Lily Pads!\n      recommended: \n        - gm4_blossoming_pots\n      notes: []\n      search_keywords: \n        - candle\n        - plant\n        - coral\n        - spore\n        - lantern\n    modrinth:\n      project_id: 7wnTwrbr\n    smithed:\n      pack_id: gm4_lively_lily_pads\n    planetminecraft:\n      uid: 6138391\n    wiki: https://wiki.gm4.co/wiki/Lively_Lily_Pads\n    credits:\n      Creator:\n        - runcows\n      Icon Design:\n        - runcows\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/candle_rcd.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"minecraft:player\",\n                \"gamemode\": [\n                  \"survival\",\n                  \"creative\"\n                ]\n              }\n            }\n          }\n        ],\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:interaction\",\n              \"nbt\": \"{Tags:[\\\"gm4_llp_candle_rcd\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_lively_lily_pads:mechanics/interactions/candle/interact_rcd\"\n  }\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/id_init.json",
    "content": "{\n  \"criteria\": {\n    \"no_score\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_scores\",\n              \"entity\": \"this\",\n              \"scores\": {\n                \"gm4_llp.id\": {}\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_lively_lily_pads:player/set_id\"\n  }\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/placement_rcd.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_lively_lily_pads:holding_placeable_item\"\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"minecraft:player\",\n                \"gamemode\": [\n                  \"survival\",\n                  \"creative\"\n                ]\n              },\n              \"nbt\": \"{Tags:[\\\"gm4_llp_holding_item\\\"]}\"\n            }\n          }\n        ],\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:interaction\",\n              \"nbt\": \"{Tags:[\\\"gm4_llp_placement_rcd\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_lively_lily_pads:mechanics/interactions/placement/interact_rcd\"\n  }\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/punch_perma_rcd.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"minecraft:player\",\n                \"gamemode\": [\n                  \"survival\",\n                  \"creative\"\n                ]\n              }\n            }\n          }\n        ],\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:interaction\",\n              \"nbt\": \"{Tags:[\\\"gm4_llp_perma_rcd\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_lively_lily_pads:mechanics/attacks/perma/hit_rcd\"\n  }\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/punch_placement_rcd.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"minecraft:player\",\n                \"gamemode\": [\n                  \"survival\",\n                  \"creative\"\n                ]\n              }\n            }\n          }\n        ],\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:interaction\",\n              \"nbt\": \"{Tags:[\\\"gm4_llp_placement_rcd\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_lively_lily_pads:mechanics/attacks/placement/hit_rcd\"\n  }\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/unwaxed_copper_rcd.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"minecraft:player\",\n                \"gamemode\": [\n                  \"survival\",\n                  \"creative\"\n                ]\n              }\n            }\n          }\n        ],\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:interaction\",\n              \"nbt\": \"{Tags:[\\\"gm4_llp_unwaxed_copper_rcd\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_lively_lily_pads:mechanics/interactions/unwaxed_copper_lantern/interact_rcd\"\n  }\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/waxed_copper_rcd.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"minecraft:player\",\n                \"gamemode\": [\n                  \"survival\",\n                  \"creative\"\n                ]\n              }\n            }\n          }\n        ],\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:interaction\",\n              \"nbt\": \"{Tags:[\\\"gm4_llp_waxed_copper_rcd\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/interact_rcd\"\n  }\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/init.mcfunction",
    "content": "execute unless score lively_lily_pads gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Lively Lily Pads\"}\nexecute unless score lively_lily_pads gm4_earliest_version < lively_lily_pads gm4_modules run scoreboard players operation lively_lily_pads gm4_earliest_version = lively_lily_pads gm4_modules\nscoreboard players set lively_lily_pads gm4_modules 1\n\n# detect pre-gm4 lively lily pads\n# | We do this in mechanics/interactions/placement/interact_rcd\n\nscoreboard objectives add gm4_llp.data dummy\nscoreboard objectives add gm4_llp.id dummy\nexecute unless score $next gm4_llp.id matches 0.. run scoreboard players set $next gm4_llp.id 0\n\nschedule function gm4_lively_lily_pads:main 1t\nschedule function gm4_lively_lily_pads:tick 1t\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/main.mcfunction",
    "content": "schedule function gm4_lively_lily_pads:main 16t\n\n# execute as player\nexecute as @a[gamemode=!adventure,gamemode=!spectator] at @s run function gm4_lively_lily_pads:player/as\n\n# clean up\nexecute as @e[type=minecraft:block_display,tag=gm4_llp_display] at @s unless block ~ ~ ~ minecraft:lily_pad run function gm4_lively_lily_pads:mechanics/cleanup/kill\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/attacks/perma/hit_rcd.mcfunction",
    "content": "# perma rcd hit, need to break\n# @s = player who left clicked on a perma rcd\n# at @s\n# run from advancement: punch_perma_rcd\n\nadvancement revoke @s only gm4_lively_lily_pads:punch_perma_rcd\n\n# set creative flag\nexecute if entity @s[gamemode=creative] run scoreboard players set $creative gm4_llp.data 1\n\n# process attack\nexecute as @e[type=interaction,tag=gm4_llp_perma_rcd,distance=..8] if data entity @s attack at @s run function gm4_lively_lily_pads:mechanics/attacks/perma/process_interaction\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/attacks/perma/process_interaction.mcfunction",
    "content": "# @s = punched gm4_llp_perma_rcd interaction\n# at @s\n# run from mechanics/attacks/perma/hit_rcd\n\n# store time to check\nexecute store result score $gametime gm4_llp.data run time query gametime\nexecute store result score $check_gametime gm4_llp.data run data get entity @s attack.timestamp 1\n\n# clean\ndata remove entity @s attack\n\n# fail if old attack\nexecute unless score $gametime gm4_llp.data = $check_gametime gm4_llp.data run return fail\n\n# break decoration and perma rcd\nexecute align xyz as @e[type=block_display,tag=gm4_llp_display,dx=0,limit=1] at @s run function gm4_lively_lily_pads:mechanics/cleanup/kill\n\n# reset creative score, was checked in mechanics/cleanup/kill\nscoreboard players reset $creative gm4_llp.data\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/attacks/placement/hit_rcd.mcfunction",
    "content": "# rcd hit, need to break rcd and lily pad\n# @s = player who left clicked a placement rcd\n# at @s\n# run from advancement: punch_placement_rcd\n\nadvancement revoke @s only gm4_lively_lily_pads:punch_placement_rcd\n\n# set creative flag\nexecute if entity @s[gamemode=creative] run scoreboard players set $creative gm4_llp.data 1\n\n# process interaction\nexecute as @e[type=interaction,tag=gm4_llp_placement_rcd,distance=..8] if data entity @s attack at @s run function gm4_lively_lily_pads:mechanics/attacks/placement/process_interaction\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/attacks/placement/process_interaction.mcfunction",
    "content": "# @s = punched gm4_llp_candle_rcd interaction\n# at @s\n# run from mechanics/attacks/placement/hit_rcd\n\n# store time to check\nexecute store result score $gametime gm4_llp.data run time query gametime\nexecute store result score $check_gametime gm4_llp.data run data get entity @s attack.timestamp 1\n\n# clean\ndata remove entity @s attack\n\n# fail if old attack\nexecute unless score $gametime gm4_llp.data = $check_gametime gm4_llp.data run return fail\n\n# kill placement rcd\nkill @s\n\n# if survival, break lily pad with item\nexecute unless score $creative gm4_llp.data matches 1 run return run setblock ~ ~ ~ air destroy\n\n# if creative\nsetblock ~ ~ ~ air\nscoreboard players reset $creative gm4_llp.data\nplaysound minecraft:block.big_dripleaf.break block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/cleanup/kill.mcfunction",
    "content": "# cleans up block display and drops item if needed\n# @s = gm4_llp_display block_display\n# at @s\n# run from main and mechanics/attacks/perma/process_interaction\n\n# delete light\nexecute if entity @s[tag=gm4_llp_light] run fill ~ ~1 ~ ~ ~1 ~ air replace light\n\n# set up item data\ndata remove storage gm4_llp:temp item\ndata modify storage gm4_llp:temp item.id set from entity @s block_state.Name\ndata merge storage gm4_llp:temp {item:{count:1,motion:[0.0d,0.2d,0.0d]}}\nexecute if entity @s[tag=gm4_llp_candle] run data modify storage gm4_llp:temp item.count set from entity @s block_state.Properties.candles\nexecute store result storage gm4_llp:temp item.motion[0] double .01 run random value -10..10\nexecute store result storage gm4_llp:temp item.motion[2] double .01 run random value -10..10\n# drop item unless a player in creative hit it\nexecute unless score $creative gm4_llp.data matches 1 run function gm4_lively_lily_pads:mechanics/cleanup/summon_item with storage gm4_llp:temp item\n\n# break sound\nexecute if entity @s[tag=gm4_llp_candle] run playsound minecraft:block.candle.break block @a[distance=..16] ~ ~ ~\nexecute if entity @s[tag=gm4_llp_wood_sound] run playsound minecraft:block.wood.break block @a[distance=..16] ~ ~ ~\nexecute if entity @s[tag=gm4_llp_lantern_sound] run playsound minecraft:block.lantern.break block @a[distance=..16] ~ ~ ~\nexecute if entity @s[tag=gm4_llp_wet_grass_sound] run playsound minecraft:block.wet_grass.break block @a[distance=..16] ~ ~ ~\nexecute if entity @s[tag=gm4_llp_stone_sound] run playsound minecraft:block.stone.break block @a[distance=..16] ~ ~ ~\nexecute if entity @s[tag=gm4_llp_spore_blossom_sound] run playsound minecraft:block.spore_blossom.break block @a[distance=..16] ~ ~ ~\nexecute if entity @s[tag=gm4_llp_cactus_flower_sound] run playsound minecraft:block.cactus_flower.break block @a[distance=..16] ~ ~ ~\n\n# kill entities\nkill @e[type=minecraft:interaction,tag=gm4_llp_perma_rcd,limit=1,distance=..0.1]\nkill @s\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/cleanup/summon_item.mcfunction",
    "content": "# summons item\n# @s = gm4_llp_display block_display\n# at @s\n# with {id, count, motion}\n# run from mechanics/cleanup/kill\n\n$summon minecraft:item ~ ~-.02 ~ {Item:{id:\"$(id)\",count:$(count)},Motion:$(motion)}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/add_candle.mcfunction",
    "content": "# adds candles if needed\n# @s = candle block display\n# at @s\n# run from mechanics/interactions/candle/process_display\n\n# fail if different candle\nexecute store success score $different_candle gm4_llp.data run data modify storage gm4_llp:temp held_item set from entity @s block_state.Name\nexecute if score $different_candle gm4_llp.data matches 1 run return fail\n\n# fail if 4 candles already\nexecute if data entity @s {block_state:{Properties:{candles:\"4\"}}} run return 1\n\n# set flag to remove item\nscoreboard players set $placement_success gm4_llp.data 1\n\n# sound\nplaysound minecraft:block.candle.place block @a[distance=..16] ~ ~ ~\n\n# increase candle count\nexecute if data entity @s {block_state:{Properties:{candles:\"3\"}}} run data modify entity @s block_state.Properties.candles set value \"4\"\nexecute if data entity @s {block_state:{Properties:{candles:\"2\"}}} run data modify entity @s block_state.Properties.candles set value \"3\"\nexecute if data entity @s {block_state:{Properties:{candles:\"1\"}}} run data modify entity @s block_state.Properties.candles set value \"2\"\n\n# update light blocks if needed\nexecute if entity @s[tag=gm4_llp_lit_candle] run function gm4_lively_lily_pads:mechanics/interactions/candle/update_light_blocks\n\nreturn 1\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/find_igniter.mcfunction",
    "content": "# @s = player who ignited candle\n# at @s\n# run from mechanics/interactions/candle/interact_rcd\n\nscoreboard players reset $ignited gm4_llp.data\n\nexecute if score $mainhand gm4_llp.data matches 1 if items entity @s weapon.mainhand fire_charge run function gm4_lively_lily_pads:mechanics/interactions/candle/used_mainhand_fire_charge\nexecute if score $mainhand gm4_llp.data matches 1 if items entity @s weapon.mainhand flint_and_steel run function gm4_lively_lily_pads:mechanics/interactions/candle/used_mainhand_flint_and_steel\nexecute if score $offhand gm4_llp.data matches 1 if items entity @s weapon.offhand fire_charge run function gm4_lively_lily_pads:mechanics/interactions/candle/used_offhand_fire_charge\nexecute if score $offhand gm4_llp.data matches 1 if items entity @s weapon.offhand flint_and_steel run function gm4_lively_lily_pads:mechanics/interactions/candle/used_offhand_flint_and_steel\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/get_mainhand_data.mcfunction",
    "content": "# stores mainhand item data\n# @s = player who right clicked on a candle\n# at @s\n# run from mechanics/interactions/candle/interact_rcd\n\nscoreboard players set $mainhand gm4_llp.data 1\n\ndata modify storage gm4_llp:temp held_item set from entity @s SelectedItem.id\n\nexecute store success score $holding_lighter gm4_llp.data if items entity @s weapon.mainhand #gm4_lively_lily_pads:candle_igniters\nexecute store success score $holding_candle gm4_llp.data if items entity @s weapon.mainhand #minecraft:candles\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/get_offhand_data.mcfunction",
    "content": "# stores offhand item data\n# @s = player who right clicked on a candle\n# at @s\n# run from mechanics/interactions/candle/interact_rcd\n\nscoreboard players set $offhand gm4_llp.data 1\n\ndata modify storage gm4_llp:temp held_item set from entity @s equipment.offhand.id\n\nexecute store success score $holding_lighter gm4_llp.data if items entity @s weapon.offhand #gm4_lively_lily_pads:candle_igniters\nexecute store success score $holding_candle gm4_llp.data if items entity @s weapon.offhand #minecraft:candles\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/interact_rcd.mcfunction",
    "content": "# candle right click\n# @s = player who right clicked on a candle\n# at @s\n# run from advancement: candle_rcd\n\nadvancement revoke @s only gm4_lively_lily_pads:candle_rcd\n\n# reset\nscoreboard players set $mainhand gm4_llp.data 0\nscoreboard players set $offhand gm4_llp.data 0\nscoreboard players set $holding_lighter gm4_llp.data 0\nscoreboard players set $holding_candle gm4_llp.data 0\nscoreboard players set $ignited gm4_llp.data 0\nscoreboard players set $extinguished gm4_llp.data 0\n\n# item information\nexecute if items entity @s weapon.mainhand #gm4_lively_lily_pads:candle_interactable run function gm4_lively_lily_pads:mechanics/interactions/candle/get_mainhand_data\nexecute unless score $mainhand gm4_llp.data matches 1 if items entity @s weapon.offhand #gm4_lively_lily_pads:candle_interactable run function gm4_lively_lily_pads:mechanics/interactions/candle/get_offhand_data\n\n# find interaction\nexecute as @e[type=interaction,tag=gm4_llp_candle_rcd,distance=..8] if data entity @s interaction at @s run function gm4_lively_lily_pads:mechanics/interactions/candle/process_interaction\n\n# player effects\nexecute if score $extinguished gm4_llp.data matches 1 run swing @s mainhand\n\nexecute if score $ignited gm4_llp.data matches 1 run function gm4_lively_lily_pads:mechanics/interactions/candle/find_igniter\n\nexecute if score $placement_success gm4_llp.data matches 1 if score $mainhand gm4_llp.data matches 1 run item modify entity @s[gamemode=!creative] weapon.mainhand {function:\"minecraft:set_count\",count:-1,add:1b}\nexecute if score $placement_success gm4_llp.data matches 1 if score $mainhand gm4_llp.data matches 1 run swing @s mainhand\nexecute if score $placement_success gm4_llp.data matches 1 if score $offhand gm4_llp.data matches 1 run item modify entity @s[gamemode=!creative] weapon.offhand {function:\"minecraft:set_count\",count:-1,add:1b}\nexecute if score $placement_success gm4_llp.data matches 1 if score $offhand gm4_llp.data matches 1 run swing @s offhand\n\n# reset\nscoreboard players reset $placement_success gm4_llp.data\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/light_candle.mcfunction",
    "content": "# light candle display\n# @s = candle block display\n# at @s\n# run from mechanics/interactions/candle/process_display\n\nexecute store success score $ignited gm4_llp.data run data modify entity @s block_state.Properties.lit set value \"true\"\n\n# return if not ignited\nexecute if score $ignited gm4_llp.data matches 0 run return fail\n\n# light\ntag @s add gm4_llp_lit_candle\nfunction gm4_lively_lily_pads:mechanics/interactions/candle/update_light_blocks\nreturn 1\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/process_display.mcfunction",
    "content": "# decides how to modify the candle that was interacted with\n# @s = candle block display\n# at @s\n# run from mechanics/interactions/candle/process_interaction\n\n# try to add candle\nexecute if score $holding_candle gm4_llp.data matches 1 if function gm4_lively_lily_pads:mechanics/interactions/candle/add_candle run return 1\n\n# not holding candle try to light\nexecute if score $holding_lighter gm4_llp.data matches 1 if function gm4_lively_lily_pads:mechanics/interactions/candle/light_candle run return 1\n\n# if ignition failed, but igniter was mainhand, don't extinguish\nexecute if score $ignited gm4_llp.data matches 0 if score $mainhand gm4_llp.data matches 1 run return fail\n\n# try to extinguish candle\nexecute store result score $extinguished gm4_llp.data run data modify entity @s block_state.Properties.lit set value \"false\"\nexecute if score $extinguished gm4_llp.data matches 0 run return fail\n# extinguish\ntag @s remove gm4_llp_lit_candle\nexecute if block ~ ~1 ~ light run setblock ~ ~1 ~ air\nplaysound block.candle.extinguish block @a[distance=..16]\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/process_interaction.mcfunction",
    "content": "# @s = interacted gm4_llp_candle_rcd interaction\n# at @s\n# run from mechanics/interactions/candle/interact_rcd\n\n# store time to check\nexecute store result score $gametime gm4_llp.data run time query gametime\nexecute store result score $check_gametime gm4_llp.data run data get entity @s interaction.timestamp 1\n\n# clean\ndata remove entity @s interaction\n\n# fail if old interaction\nexecute unless score $gametime gm4_llp.data = $check_gametime gm4_llp.data run return fail\n\n# process\nexecute align xyz as @e[type=block_display,tag=gm4_llp_candle,dx=0,limit=1] at @s run function gm4_lively_lily_pads:mechanics/interactions/candle/process_display\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/update_light_blocks.mcfunction",
    "content": "# updates light blocks\n# @s = candle block display\n# at @s\n# run from mechanics/interactions/candle/light_candle and mechanics/interactions/candle/add_candle and mechanics/particles/candle_count\n\nexecute if block ~ ~1 ~ light run setblock ~ ~1 ~ air\nexecute if data entity @s {block_state:{Properties:{candles:\"4\"}}} run setblock ~ ~1 ~ light[level=12] keep\nexecute if data entity @s {block_state:{Properties:{candles:\"3\"}}} run setblock ~ ~1 ~ light[level=9] keep\nexecute if data entity @s {block_state:{Properties:{candles:\"2\"}}} run setblock ~ ~1 ~ light[level=6] keep\nexecute if data entity @s {block_state:{Properties:{candles:\"1\"}}} run setblock ~ ~1 ~ light[level=3] keep\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/used_mainhand_fire_charge.mcfunction",
    "content": "# fire charge use logic\n# @s = player who ignited candle\n# at @s\n# run from mechanics/interactions/candle/find_igniter\n\nswing @s mainhand\n# sound\nplaysound minecraft:item.firecharge.use player @a[distance=..16]\n\n# return if creative\nexecute if entity @s[gamemode=creative] run return 1\n\n# use item\nitem modify entity @s weapon.mainhand {function:\"minecraft:set_count\",count:-1,add:1b}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/used_mainhand_flint_and_steel.mcfunction",
    "content": "# calculates damage for flint and steel\n# @s = player who ignited candle\n# at @s\n# run from mechanics/interactions/candle/find_igniter\n\nswing @s mainhand\n# sound\nplaysound minecraft:item.flintandsteel.use player @a[distance=..16] ~ ~ ~\n\n# return if creative\nexecute if entity @s[gamemode=creative] run return 1\n\n# damage\nexecute store result score $level gm4_llp.data run data get entity @s SelectedItem.components.\"minecraft:enchantments\".\"minecraft:unbreaking\"\nscoreboard players add $level gm4_llp.data 1\nscoreboard players set $chance gm4_llp.data 100\nscoreboard players operation $chance gm4_llp.data /= $level gm4_llp.data\nexecute store result score $rand gm4_llp.data run random value 1..100\nexecute if score $rand gm4_llp.data < $chance gm4_llp.data run item modify entity @s weapon.mainhand {\"function\":\"minecraft:set_damage\",\"damage\":-0.0205,\"add\":true}\n\nexecute unless items entity @s weapon.mainhand flint_and_steel[damage=64] run return 1\n# 0 durability remaining, break item\nitem replace entity @s weapon.mainhand with air\nplaysound minecraft:entity.item.break player @a[distance=..16]\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/used_offhand_fire_charge.mcfunction",
    "content": "# fire charge use logic\n# @s = player who ignited candle\n# at @s\n# run from mechanics/interactions/candle/find_igniter\n\nswing @s offhand\n# sound\nplaysound minecraft:item.firecharge.use player @a[distance=..16]\n\n# return if creative\nexecute if entity @s[gamemode=creative] run return 1\n\n# use item\nitem modify entity @s weapon.offhand {function:\"minecraft:set_count\",count:-1,add:1b}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/used_offhand_flint_and_steel.mcfunction",
    "content": "# calculates damage for flint and steel\n# @s = player who ignited candle\n# at @s\n# run from mechanics/interactions/candle/find_igniter\n\nswing @s offhand\n# sound\nplaysound minecraft:item.flintandsteel.use player @a[distance=..16] ~ ~ ~\n\n# return if creative\nexecute if entity @s[gamemode=creative] run return 1\n\n# damage\nexecute store result score $level gm4_llp.data run data get entity @s equipment.offhand.components.\"minecraft:enchantments\".\"minecraft:unbreaking\"\nscoreboard players add $level gm4_llp.data 1\nscoreboard players set $chance gm4_llp.data 100\nscoreboard players operation $chance gm4_llp.data /= $level gm4_llp.data\nexecute store result score $rand gm4_llp.data run random value 1..100\nexecute if score $rand gm4_llp.data < $chance gm4_llp.data run item modify entity @s weapon.offhand {\"function\":\"minecraft:set_damage\",\"damage\":-0.0205,\"add\":true}\n\nexecute unless items entity @s weapon.offhand flint_and_steel[damage=64] run return 1\n# 0 durability remaining, break item\nitem replace entity @s weapon.offhand with air\nplaysound minecraft:entity.item.break player @a[distance=..16]\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/cactus_flower.mcfunction",
    "content": "# places cactus_flower displays\n# @s = placement rcd or old block display if upgrade path\n# at lily_pad align xyz positioned ~.5 ~.02 ~.5\n# run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display\n\nsummon minecraft:block_display ~ ~ ~ {\\\n  Tags:[\"gm4_llp_display\",\"gm4_llp_cactus_flower_sound\",\"smithed.entity\"],\\\n  block_state:{\\\n    Name:\"minecraft:cactus_flower\"\\\n  },\\\n  transformation:{\\\n    scale:[0.8f,0.8f,0.8f],\\\n    translation:[-0.4f,0f,-0.4f],\\\n    left_rotation:[0f,0f,0f,1f],\\\n    right_rotation:[0f,0f,0f,1f]\\\n  }\\\n}\n\n# sound\nplaysound minecraft:block.cactus_flower.place block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/candles.mcfunction",
    "content": "# places candle displays\n# @s = placement rcd or old block display if upgrade path\n# at lily_pad align xyz positioned ~.5 ~.02 ~.5\n# with {DisplayType}\n# run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/upgrade_candle\n\n$summon minecraft:block_display ~ ~ ~ {\\\n  Tags:[\"gm4_llp_display\",\"gm4_llp_candle\",\"gm4_llp_light\",\"smithed.entity\"],\\\n  block_state:{\\\n    Name:\"$(DisplayType)\",\\\n    Properties:{\\\n      candles:\"1\"\\\n    }\\\n  },\\\n  transformation:{\\\n    scale:[0.8f,0.8f,0.8f],\\\n    translation:[-0.4f,0f,-0.4f],\\\n    left_rotation:[0f,0f,0f,1f],\\\n    right_rotation:[0f,0f,0f,1f]\\\n  }\\\n}\nsummon minecraft:interaction ~ ~ ~ {width:0.4f,height:0.4f,Tags:[\"gm4_llp_candle_rcd\",\"gm4_llp_perma_rcd\",\"smithed.entity\",\"smithed.strict\"]}\n\n# sound\nplaysound minecraft:block.candle.place block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/copper_lantern.mcfunction",
    "content": "# places copper lantern displays\n# @s = placement rcd\n# at lily_pad align xyz positioned ~.5 ~.02 ~.5\n# with {DisplayType}\n# run from mechanics/interactions/placement/process_interaction\n\n$summon minecraft:block_display ~ ~ ~ {\\\n  Tags:[\"gm4_llp_display\",\"gm4_llp_light\",\"gm4_llp_light.14\",\"gm4_llp_lantern_sound\",\"gm4_llp_unwaxed_copper_lantern\",\"smithed.entity\"],\\\n  block_state:{\\\n    Name:\"$(DisplayType)\"\\\n  },\\\n  transformation:{\\\n    scale:[0.8f,0.8f,0.8f],\\\n    translation:[-0.4f,0f,-0.4f],\\\n    left_rotation:[0f,0f,0f,1f],\\\n    right_rotation:[0f,0f,0f,1f]\\\n  }\\\n}\nsummon minecraft:interaction ~ ~ ~ {width:0.4f,height:0.4f,Tags:[\"gm4_llp_unwaxed_copper_rcd\",\"gm4_llp_perma_rcd\",\"smithed.entity\",\"smithed.strict\"]}\n\n# light block\nsetblock ~ ~1 ~ light[level=14] keep\n\n# sound\nplaysound minecraft:block.lantern.place block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/copper_torch.mcfunction",
    "content": "# places copper torch displays\n# @s = placement rcd\n# at lily_pad align xyz positioned ~.5 ~.02 ~.5\n# run from mechanics/interactions/placement/process_interaction\n\nsummon minecraft:block_display ~ ~ ~ {\\\n  Tags:[\"gm4_llp_display\",\"gm4_llp_light\",\"gm4_llp_light.14\",\"gm4_llp_wood_sound\",\"gm4_llp_smoke_torch\",\"smithed.entity\"],\\\n  block_state:{\\\n    Name:\"minecraft:copper_torch\"\\\n  },\\\n  transformation:{\\\n    scale:[0.8f,0.8f,0.8f],\\\n    translation:[-0.4f,0f,-0.4f],\\\n    left_rotation:[0f,0f,0f,1f],\\\n    right_rotation:[0f,0f,0f,1f]\\\n  }\\\n}\n# light block\nsetblock ~ ~1 ~ light[level=14] keep\n\n# sound\nplaysound minecraft:block.wood.place block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/coral_fan.mcfunction",
    "content": "# places coral_fan displays\n# @s = placement rcd or old block display if upgrade path\n# at lily_pad align xyz positioned ~.5 ~.02 ~.5\n# with {DisplayType}\n# run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display\n\n$summon minecraft:block_display ~ ~ ~ {\\\n  Tags:[\"gm4_llp_display\",\"gm4_llp_wet_grass_sound\",\"smithed.entity\"],\\\n  block_state:{\\\n    Name:\"$(DisplayType)\"\\\n  },\\\n  transformation:{\\\n    scale:[0.5f,0.6f,0.5f],\\\n    translation:[-0.25f,0f,-0.25f],\\\n    left_rotation:[0f,0f,0f,1f],\\\n    right_rotation:[0f,0f,0f,1f]\\\n  }\\\n}\n\n# sound\nplaysound minecraft:block.wet_grass.place block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/dead_coral_fan.mcfunction",
    "content": "# places dead_coral_fan displays\n# @s = placement rcd or old block display if upgrade path\n# at lily_pad align xyz positioned ~.5 ~.02 ~.5\n# with {DisplayType}\n# run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display\n\n$summon minecraft:block_display ~ ~ ~ {\\\n  Tags:[\"gm4_llp_display\",\"gm4_llp_stone_sound\",\"smithed.entity\"],\\\n  block_state:{\\\n    Name:\"$(DisplayType)\"\\\n  },\\\n  transformation:{\\\n    scale:[0.5f,0.6f,0.5f],\\\n    translation:[-0.25f,0f,-0.25f],\\\n    left_rotation:[0f,0f,0f,1f],\\\n    right_rotation:[0f,0f,0f,1f]\\\n  }\\\n}\n\n# sound\nplaysound minecraft:block.stone.place block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/get_mainhand_data.mcfunction",
    "content": "# stores mainhand item data\n# @s = player who right clicked on interaction holding a supported item\n# at @s\n# run from mechanics/interactions/placement/interact_rcd\n\nscoreboard players set $mainhand gm4_llp.data 1\n\ndata modify storage gm4_llp:temp DisplayType set from entity @s SelectedItem.id\n\nexecute if items entity @s weapon.mainhand #gm4_lively_lily_pads:coral_fan run \\\n  scoreboard players set $item_type gm4_llp.data 1\nexecute if items entity @s weapon.mainhand #gm4_lively_lily_pads:dead_coral_fan run \\\n  scoreboard players set $item_type gm4_llp.data 2\nexecute if items entity @s weapon.mainhand minecraft:torch run \\\n  scoreboard players set $item_type gm4_llp.data 3\nexecute if items entity @s weapon.mainhand minecraft:lantern run \\\n  scoreboard players set $item_type gm4_llp.data 4\nexecute if items entity @s weapon.mainhand minecraft:soul_torch run \\\n  scoreboard players set $item_type gm4_llp.data 5\nexecute if items entity @s weapon.mainhand minecraft:soul_lantern run \\\n  scoreboard players set $item_type gm4_llp.data 6\nexecute if items entity @s weapon.mainhand #minecraft:candles run \\\n  scoreboard players set $item_type gm4_llp.data 7\nexecute if items entity @s weapon.mainhand minecraft:cactus_flower run \\\n  scoreboard players set $item_type gm4_llp.data 8\nexecute if items entity @s weapon.mainhand minecraft:redstone_torch run \\\n  scoreboard players set $item_type gm4_llp.data 9\nexecute if items entity @s weapon.mainhand minecraft:spore_blossom run \\\n  scoreboard players set $item_type gm4_llp.data 10\nexecute if items entity @s weapon.mainhand #gm4_lively_lily_pads:copper_lanterns run \\\n  scoreboard players set $item_type gm4_llp.data 11\nexecute if items entity @s weapon.mainhand #gm4_lively_lily_pads:waxed_copper_lanterns run \\\n  scoreboard players set $item_type gm4_llp.data 12\nexecute if items entity @s weapon.mainhand minecraft:copper_torch run \\\n  scoreboard players set $item_type gm4_llp.data 13\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/get_offhand_data.mcfunction",
    "content": "# stores offhand item data\n# @s = player who right clicked on interaction holding a supported item\n# at @s\n# run from mechanics/interactions/placement/interact_rcd\n\nscoreboard players set $offhand gm4_llp.data 1\n\ndata modify storage gm4_llp:temp DisplayType set from entity @s equipment.offhand.id\n\nexecute if items entity @s weapon.offhand #gm4_lively_lily_pads:coral_fan run \\\n  scoreboard players set $item_type gm4_llp.data 1\nexecute if items entity @s weapon.offhand #gm4_lively_lily_pads:dead_coral_fan run \\\n  scoreboard players set $item_type gm4_llp.data 2\nexecute if items entity @s weapon.offhand minecraft:torch run \\\n  scoreboard players set $item_type gm4_llp.data 3\nexecute if items entity @s weapon.offhand minecraft:lantern run \\\n  scoreboard players set $item_type gm4_llp.data 4\nexecute if items entity @s weapon.offhand minecraft:soul_torch run \\\n  scoreboard players set $item_type gm4_llp.data 5\nexecute if items entity @s weapon.offhand minecraft:soul_lantern run \\\n  scoreboard players set $item_type gm4_llp.data 6\nexecute if items entity @s weapon.offhand #minecraft:candles run \\\n  scoreboard players set $item_type gm4_llp.data 7\nexecute if items entity @s weapon.offhand minecraft:cactus_flower run \\\n  scoreboard players set $item_type gm4_llp.data 8\nexecute if items entity @s weapon.offhand minecraft:redstone_torch run \\\n  scoreboard players set $item_type gm4_llp.data 9\nexecute if items entity @s weapon.offhand minecraft:spore_blossom run \\\n  scoreboard players set $item_type gm4_llp.data 10\nexecute if items entity @s weapon.offhand #gm4_lively_lily_pads:copper_lanterns run \\\n  scoreboard players set $item_type gm4_llp.data 11\nexecute if items entity @s weapon.offhand #gm4_lively_lily_pads:waxed_copper_lanterns run \\\n  scoreboard players set $item_type gm4_llp.data 12\nexecute if items entity @s weapon.offhand minecraft:copper_torch run \\\n  scoreboard players set $item_type gm4_llp.data 13\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/interact_rcd.mcfunction",
    "content": "# place interaction logic\n# @s = player who right clicked on interaction holding a supported item\n# at @s\n# run from advancement: placement_rcd\n\nadvancement revoke @s only gm4_lively_lily_pads:placement_rcd\n\n# brief check to enable Upgrade_Path 3.0\nexecute if entity @e[type=minecraft:interaction,tag=lilyPadInt,limit=1,distance=..64] run scoreboard players set lively_lily_pads gm4_earliest_version 0\n\n# reset\nscoreboard players set $mainhand gm4_llp.data 0\nscoreboard players set $offhand gm4_llp.data 0\n\n# item information\nexecute if predicate gm4_lively_lily_pads:mainhand_placeable_item run function gm4_lively_lily_pads:mechanics/interactions/placement/get_mainhand_data\nexecute unless score $mainhand gm4_llp.data matches 1 if predicate gm4_lively_lily_pads:offhand_placeable_item run function gm4_lively_lily_pads:mechanics/interactions/placement/get_offhand_data\n\n# process interaction\nexecute as @e[type=interaction,tag=gm4_llp_placement_rcd,distance=..8] if data entity @s interaction at @s run function gm4_lively_lily_pads:mechanics/interactions/placement/process_interaction\n\n# remove item if successful\nexecute if score $placement_success gm4_llp.data matches 1 if score $mainhand gm4_llp.data matches 1 run item modify entity @s[gamemode=!creative] weapon.mainhand {function:\"minecraft:set_count\",count:-1,add:1b}\nexecute if score $placement_success gm4_llp.data matches 1 if score $mainhand gm4_llp.data matches 1 run swing @s mainhand\nexecute if score $placement_success gm4_llp.data matches 1 if score $offhand gm4_llp.data matches 1 run item modify entity @s[gamemode=!creative] weapon.offhand {function:\"minecraft:set_count\",count:-1,add:1b}\nexecute if score $placement_success gm4_llp.data matches 1 if score $offhand gm4_llp.data matches 1 run swing @s offhand\n\n# reset\nscoreboard players reset $placement_success gm4_llp.data\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/lantern.mcfunction",
    "content": "# places lantern displays\n# @s = placement rcd or old block display if upgrade path\n# at lily_pad align xyz positioned ~.5 ~.02 ~.5\n# run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display\n\nsummon minecraft:block_display ~ ~ ~ {\\\n  Tags:[\"gm4_llp_display\",\"gm4_llp_light\",\"gm4_llp_light.14\",\"gm4_llp_lantern_sound\",\"smithed.entity\"],\\\n  block_state:{\\\n    Name:\"minecraft:lantern\"\\\n  },\\\n  transformation:{\\\n    scale:[0.8f,0.8f,0.8f],\\\n    translation:[-0.4f,0f,-0.4f],\\\n    left_rotation:[0f,0f,0f,1f],\\\n    right_rotation:[0f,0f,0f,1f]\\\n  }\\\n}\n# light block\nsetblock ~ ~1 ~ light[level=14] keep\n\n# sound\nplaysound minecraft:block.lantern.place block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/process_interaction.mcfunction",
    "content": "# placement decision\n# @s = placement rcd\n# at @s\n# run from mechanics/interactions/placement/interact_rcd\n\n# store time to check\nexecute store result score $gametime gm4_llp.data run time query gametime\nexecute store result score $check_gametime gm4_llp.data run data get entity @s interaction.timestamp 1\n\n# clean\ndata remove entity @s interaction\n\n# fail if old interaction\nexecute unless score $gametime gm4_llp.data = $check_gametime gm4_llp.data run return fail\n\n# select type\nexecute if score $item_type gm4_llp.data matches 1 run function gm4_lively_lily_pads:mechanics/interactions/placement/coral_fan with storage gm4_llp:temp\nexecute if score $item_type gm4_llp.data matches 2 run function gm4_lively_lily_pads:mechanics/interactions/placement/dead_coral_fan with storage gm4_llp:temp\nexecute if score $item_type gm4_llp.data matches 3 run function gm4_lively_lily_pads:mechanics/interactions/placement/torch\nexecute if score $item_type gm4_llp.data matches 4 run function gm4_lively_lily_pads:mechanics/interactions/placement/lantern\nexecute if score $item_type gm4_llp.data matches 5 run function gm4_lively_lily_pads:mechanics/interactions/placement/soul_torch\nexecute if score $item_type gm4_llp.data matches 6 run function gm4_lively_lily_pads:mechanics/interactions/placement/soul_lantern\nexecute if score $item_type gm4_llp.data matches 7 run function gm4_lively_lily_pads:mechanics/interactions/placement/candles with storage gm4_llp:temp\nexecute if score $item_type gm4_llp.data matches 8 run function gm4_lively_lily_pads:mechanics/interactions/placement/cactus_flower\nexecute if score $item_type gm4_llp.data matches 9 run function gm4_lively_lily_pads:mechanics/interactions/placement/redstone_torch\nexecute if score $item_type gm4_llp.data matches 10 run function gm4_lively_lily_pads:mechanics/interactions/placement/spore_blossom\nexecute if score $item_type gm4_llp.data matches 11 run function gm4_lively_lily_pads:mechanics/interactions/placement/copper_lantern with storage gm4_llp:temp\nexecute if score $item_type gm4_llp.data matches 12 run function gm4_lively_lily_pads:mechanics/interactions/placement/waxed_copper_lantern with storage gm4_llp:temp\nexecute if score $item_type gm4_llp.data matches 13 run function gm4_lively_lily_pads:mechanics/interactions/placement/copper_torch\n\n# set flag\nscoreboard players set $placement_success gm4_llp.data 1\n\n# remove placement rcd\nkill @s\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/redstone_torch.mcfunction",
    "content": "# places redstone_torch displays\n# @s = placement rcd or old block display if upgrade path\n# at lily_pad align xyz positioned ~.5 ~.02 ~.5\n# run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display\n\nsummon minecraft:block_display ~ ~ ~ {\\\n  Tags:[\"gm4_llp_display\",\"gm4_llp_light\",\"gm4_llp_light.6\",\"gm4_llp_wood_sound\",\"smithed.entity\"],\\\n  block_state:{\\\n    Name:\"minecraft:redstone_torch\"\\\n  },\\\n  transformation:{\\\n    scale:[0.8f,0.8f,0.8f],\\\n    translation:[-0.4f,0f,-0.4f],\\\n    left_rotation:[0f,0f,0f,1f],\\\n    right_rotation:[0f,0f,0f,1f]\\\n  }\\\n}\n# light block\nsetblock ~ ~1 ~ light[level=6] keep\n\n# sound\nplaysound minecraft:block.wood.place block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/soul_lantern.mcfunction",
    "content": "# places soul lantern displays\n# @s = placement rcd or old block display if upgrade path\n# at lily_pad align xyz positioned ~.5 ~.02 ~.5\n# run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display\n\nsummon minecraft:block_display ~ ~ ~ {\\\n  Tags:[\"gm4_llp_display\",\"gm4_llp_light\",\"gm4_llp_light.9\",\"gm4_llp_lantern_sound\",\"smithed.entity\"],\\\n  block_state:{\\\n    Name:\"minecraft:soul_lantern\"\\\n  },\\\n  transformation:{\\\n    scale:[0.8f,0.8f,0.8f],\\\n    translation:[-0.4f,0f,-0.4f],\\\n    left_rotation:[0f,0f,0f,1f],\\\n    right_rotation:[0f,0f,0f,1f]\\\n  }\\\n}\n# light block\nsetblock ~ ~1 ~ light[level=9] keep\n\n# sound\nplaysound minecraft:block.lantern.place block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/soul_torch.mcfunction",
    "content": "# places soul torch displays\n# @s = placement rcd or old block display if upgrade path\n# at lily_pad align xyz positioned ~.5 ~.02 ~.5\n# run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display\n\nsummon minecraft:block_display ~ ~ ~ {\\\n  Tags:[\"gm4_llp_display\",\"gm4_llp_light\",\"gm4_llp_light.9\",\"gm4_llp_wood_sound\",\"gm4_llp_smoke_torch\",\"smithed.entity\"],\\\n  block_state:{\\\n    Name:\"minecraft:soul_torch\"\\\n  },\\\n  transformation:{\\\n    scale:[0.8f,0.8f,0.8f],\\\n    translation:[-0.4f,0f,-0.4f],\\\n    left_rotation:[0f,0f,0f,1f],\\\n    right_rotation:[0f,0f,0f,1f]\\\n  }\\\n}\n# light block\nsetblock ~ ~1 ~ light[level=9] keep\n\n# sound\nplaysound minecraft:block.wood.place block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/spore_blossom.mcfunction",
    "content": "# places spore_blossom displays\n# @s = placement rcd or old block display if upgrade path\n# at lily_pad align xyz positioned ~.5 ~.02 ~.5\n# run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display\n\nsummon minecraft:block_display ~ ~ ~ {\\\n  Tags:[\"gm4_llp_display\",\"gm4_llp_spore_blossom_sound\",\"smithed.entity\"],\\\n  block_state:{\\\n    Name:\"minecraft:spore_blossom\"\\\n  },\\\n  transformation:{\\\n    scale:[0.5f,0.5f,0.7f],\\\n    translation:[-0.25f,0.7f,0.25f],\\\n    left_rotation:[0.707f,0f,0f,0.707f],\\\n    right_rotation:[0.707f,0f,0f,0.707f]\\\n  }\\\n}\n\n# sound\nplaysound minecraft:block.spore_blossom.place block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/torch.mcfunction",
    "content": "# places torch displays\n# @s = placement rcd or old block display if upgrade path\n# at lily_pad align xyz positioned ~.5 ~.02 ~.5\n# run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display\n\nsummon minecraft:block_display ~ ~ ~ {\\\n  Tags:[\"gm4_llp_display\",\"gm4_llp_light\",\"gm4_llp_light.14\",\"gm4_llp_wood_sound\",\"gm4_llp_smoke_torch\",\"smithed.entity\"],\\\n  block_state:{\\\n    Name:\"minecraft:torch\"\\\n  },\\\n  transformation:{\\\n    scale:[0.8f,0.8f,0.8f],\\\n    translation:[-0.4f,0f,-0.4f],\\\n    left_rotation:[0f,0f,0f,1f],\\\n    right_rotation:[0f,0f,0f,1f]\\\n  }\\\n}\n# light block\nsetblock ~ ~1 ~ light[level=14] keep\n\n# sound\nplaysound minecraft:block.wood.place block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/waxed_copper_lantern.mcfunction",
    "content": "# places waxed copper lantern displays\n# @s = placement rcd\n# at lily_pad align xyz positioned ~.5 ~.02 ~.5\n# with {DisplayType}\n# run from mechanics/interactions/placement/process_interaction\n\n$summon minecraft:block_display ~ ~ ~ {\\\n  Tags:[\"gm4_llp_display\",\"gm4_llp_light\",\"gm4_llp_light.14\",\"gm4_llp_lantern_sound\",\"gm4_llp_waxed_copper_lantern\",\"smithed.entity\"],\\\n  block_state:{\\\n    Name:\"$(DisplayType)\"\\\n  },\\\n  transformation:{\\\n    scale:[0.8f,0.8f,0.8f],\\\n    translation:[-0.4f,0f,-0.4f],\\\n    left_rotation:[0f,0f,0f,1f],\\\n    right_rotation:[0f,0f,0f,1f]\\\n  }\\\n}\nsummon minecraft:interaction ~ ~ ~ {width:0.4f,height:0.4f,Tags:[\"gm4_llp_waxed_copper_rcd\",\"gm4_llp_perma_rcd\",\"smithed.entity\",\"smithed.strict\"]}\n\n# light block\nsetblock ~ ~1 ~ light[level=14] keep\n\n# sound\nplaysound minecraft:block.lantern.place block @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/unwaxed_copper_lantern/attempt_oxidization.mcfunction",
    "content": "# simple oxidization logic with just a probability\n# @s = block display, tag=gm4_llp_light, tag=gm4_llp_unwaxed_copper_lantern\n# at @s\n# run from mechanics/particles/select_type\n\n# this is only run once per entity every 8 ticks (0.4 seconds)\n# with a 1/6500 chance every 0.4 seconds, in 30 minutes there will be a ~50% chance of oxidization\nexecute store result score $rand gm4_llp.data run random value 1..6500\nexecute if score $rand gm4_llp.data matches 2.. run return fail\n\n# oxidize\nexecute if data entity @s {block_state:{Name:\"minecraft:copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:exposed_copper_lantern\"\nexecute if data entity @s {block_state:{Name:\"minecraft:exposed_copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:weathered_copper_lantern\"\nexecute if data entity @s {block_state:{Name:\"minecraft:weathered_copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:oxidized_copper_lantern\"\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/unwaxed_copper_lantern/interact_rcd.mcfunction",
    "content": "# unwaxed copper lantern right click\n# @s = player who right clicked on an unwaxed copper lantern\n# at @s\n# run from advancement: unwaxed_copper_rcd\n\nadvancement revoke @s only gm4_lively_lily_pads:unwaxed_copper_rcd\n\n# reset scoreboards\nscoreboard players set $mainhand gm4_llp.data 0\nscoreboard players set $offhand gm4_llp.data 0\nscoreboard players set $wax_used gm4_llp.data 0\nscoreboard players set $axe_used gm4_llp.data 0\n\n# item data, need both mainhand and offhand\nexecute if items entity @s weapon.mainhand #minecraft:axes run scoreboard players set $mainhand gm4_llp.data 1\nexecute if items entity @s weapon.mainhand honeycomb run scoreboard players set $mainhand gm4_llp.data 2\nexecute if items entity @s weapon.offhand #minecraft:axes run scoreboard players set $offhand gm4_llp.data 1\nexecute if items entity @s weapon.offhand honeycomb run scoreboard players set $offhand gm4_llp.data 2\n\n# find interaction\nexecute as @e[type=interaction,tag=gm4_llp_unwaxed_copper_rcd,distance=..8] if data entity @s interaction at @s run function gm4_lively_lily_pads:mechanics/interactions/unwaxed_copper_lantern/process_interaction\n\n# item usage\nexecute if score $wax_used gm4_llp.data matches 1 run item modify entity @s[gamemode=!creative] weapon.mainhand {function:\"minecraft:set_count\",count:-1,add:1b}\nexecute if score $wax_used gm4_llp.data matches 1 run swing @s mainhand\nexecute if score $wax_used gm4_llp.data matches 2 run item modify entity @s[gamemode=!creative] weapon.offhand {function:\"minecraft:set_count\",count:-1,add:1b}\nexecute if score $wax_used gm4_llp.data matches 2 run swing @s offhand\n\nexecute if score $axe_used gm4_llp.data matches 1 if entity @s[gamemode=!creative] run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/used_mainhand_axe\nexecute if score $axe_used gm4_llp.data matches 1 run swing @s mainhand\nexecute if score $axe_used gm4_llp.data matches 2 if entity @s[gamemode=!creative] run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/used_offhand_axe\nexecute if score $axe_used gm4_llp.data matches 2 run swing @s offhand\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/unwaxed_copper_lantern/process_display.mcfunction",
    "content": "# @s = gm4_llp_unwaxed_copper_lantern block display\n# at associated interaction\n# run from mechanics/interactions/unwaxed_copper_lantern/process_interaction\n\nscoreboard players set $interaction_processed gm4_llp.data 0\n\n# if mainhand honeycomb, wax\nexecute if score $interaction_processed gm4_llp.data matches 0 if score $mainhand gm4_llp.data matches 2 store success score $interaction_processed gm4_llp.data run scoreboard players set $wax_used gm4_llp.data 1\n# if no neither item in mainhand, but honeycomb in offhand, wax\nexecute if score $interaction_processed gm4_llp.data matches 0 if score $mainhand gm4_llp.data matches 0 if score $offhand gm4_llp.data matches 2 store success score $interaction_processed gm4_llp.data run scoreboard players set $wax_used gm4_llp.data 2\n\n# check if can scrape\nexecute if score $interaction_processed gm4_llp.data matches 0 store success score $can_scrape gm4_llp.data unless data entity @s {block_state:{Name:\"minecraft:copper_lantern\"}}\n# if cant scrape, but offhand honeycomb, wax\nexecute if score $interaction_processed gm4_llp.data matches 0 if score $can_scrape gm4_llp.data matches 0 if score $offhand gm4_llp.data matches 2 store success score $interaction_processed gm4_llp.data run scoreboard players set $wax_used gm4_llp.data 2\n\n# if can scrape and mainhand axe, scrape\nexecute if score $interaction_processed gm4_llp.data matches 0 if score $can_scrape gm4_llp.data matches 1 if score $mainhand gm4_llp.data matches 1 store success score $interaction_processed gm4_llp.data run scoreboard players set $axe_used gm4_llp.data 1\n# if can scrape and offhand axe, scrape\nexecute if score $interaction_processed gm4_llp.data matches 0 if score $can_scrape gm4_llp.data matches 1 if score $offhand gm4_llp.data matches 1 store success score $interaction_processed gm4_llp.data run scoreboard players set $axe_used gm4_llp.data 2\n\n# fail if nothing to do\nexecute if score $interaction_processed gm4_llp.data matches 0 run return fail\n\n# modify display\nexecute if score $wax_used gm4_llp.data matches 1..2 run function gm4_lively_lily_pads:mechanics/interactions/unwaxed_copper_lantern/wax_display\nexecute if score $axe_used gm4_llp.data matches 1..2 run function gm4_lively_lily_pads:mechanics/interactions/unwaxed_copper_lantern/scrape_display\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/unwaxed_copper_lantern/process_interaction.mcfunction",
    "content": "# @s = gm4_llp_unwaxed_copper_rcd rcd\n# at @s\n# run from mechanics/interactions/unwaxed_copper_lantern/interact_rcd\n\n# store time to check\nexecute store result score $gametime gm4_llp.data run time query gametime\nexecute store result score $check_gametime gm4_llp.data run data get entity @s interaction.timestamp 1\n\n# clean\ndata remove entity @s interaction\n\n# fail if old interaction\nexecute unless score $gametime gm4_llp.data = $check_gametime gm4_llp.data run return fail\n\n# fail if neither item\nexecute if score $mainhand gm4_llp.data matches 0 if score $offhand gm4_llp.data matches 0 run return fail\n\n# redirect to display\nexecute as @e[type=block_display,tag=gm4_llp_unwaxed_copper_lantern,distance=..0.1,limit=1] run function gm4_lively_lily_pads:mechanics/interactions/unwaxed_copper_lantern/process_display\n\n# wax\nexecute if score $wax_used gm4_llp.data matches 1..2 run tag @s remove gm4_llp_unwaxed_copper_rcd\nexecute if score $wax_used gm4_llp.data matches 1..2 run tag @s add gm4_llp_waxed_copper_rcd\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/unwaxed_copper_lantern/scrape_display.mcfunction",
    "content": "# @s = gm4_llp_unwaxed_copper_lantern block display\n# at associated interaction\n# run from mechanics/interactions/unwaxed_copper_lantern/process_display\n\n# visuals\nparticle minecraft:scrape ~ ~.2 ~ 0.3 0.3 0.3 1 16\nplaysound item.axe.scrape block @a[distance=..16] ~ ~ ~\n\n# modify\nexecute if data entity @s {block_state:{Name:\"minecraft:exposed_copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:copper_lantern\"\nexecute if data entity @s {block_state:{Name:\"minecraft:weathered_copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:exposed_copper_lantern\"\nexecute if data entity @s {block_state:{Name:\"minecraft:oxidized_copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:weathered_copper_lantern\"\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/unwaxed_copper_lantern/wax_display.mcfunction",
    "content": "# @s = gm4_llp_unwaxed_copper_lantern block display\n# at associated interaction\n# run from mechanics/interactions/unwaxed_copper_lantern/process_display\n\n# visuals\nparticle minecraft:wax_on ~ ~.2 ~ 0.3 0.3 0.3 1 16\nplaysound item.honeycomb.wax_on block @a[distance=..16] ~ ~ ~\n\n# update tags\ntag @s remove gm4_llp_unwaxed_copper_lantern\ntag @s add gm4_llp_waxed_copper_lantern\n\n# modify\nexecute if data entity @s {block_state:{Name:\"minecraft:copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:waxed_copper_lantern\"\nexecute if data entity @s {block_state:{Name:\"minecraft:exposed_copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:waxed_exposed_copper_lantern\"\nexecute if data entity @s {block_state:{Name:\"minecraft:weathered_copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:waxed_weathered_copper_lantern\"\nexecute if data entity @s {block_state:{Name:\"minecraft:oxidized_copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:waxed_oxidized_copper_lantern\"\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/damage_mainhand_axe.mcfunction",
    "content": "# damages axe\n# @s = player holding axe\n# at @s\n# run from mechanics/interactions/waxed_copper_lantern/used_mainhand_axe\n\nexecute store result score $damage gm4_llp.data run data get entity @s SelectedItem.components.\"minecraft:damage\"\nexecute store result storage gm4_llp:temp damage int 1 run scoreboard players add $damage gm4_llp.data 1\nfunction gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/set_damage_mainhand with storage gm4_llp:temp\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/damage_offhand_axe.mcfunction",
    "content": "# damages axe\n# @s = player holding axe\n# at @s\n# run from mechanics/interactions/waxed_copper_lantern/used_offhand_axe\n\nexecute store result score $damage gm4_llp.data run data get entity @s equipment.offhand.components.\"minecraft:damage\"\nexecute store result storage gm4_llp:temp damage int 1 run scoreboard players add $damage gm4_llp.data 1\nfunction gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/set_damage_offhand with storage gm4_llp:temp\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/interact_rcd.mcfunction",
    "content": "# waxed copper lantern right click\n# @s = player who right clicked on an waxed copper lantern\n# at @s\n# run from advancement: waxed_copper_rcd\n\nadvancement revoke @s only gm4_lively_lily_pads:waxed_copper_rcd\n\n# reset scoreboards\nscoreboard players set $mainhand gm4_llp.data 0\nscoreboard players set $offhand gm4_llp.data 0\nscoreboard players set $holding_axe gm4_llp.data 0\nscoreboard players set $scraped gm4_llp.data 0\n\n# item data, only care about axes\nexecute if items entity @s weapon.mainhand #minecraft:axes store success score $holding_axe gm4_llp.data run scoreboard players set $mainhand gm4_llp.data 1\nexecute unless score $mainhand gm4_llp.data matches 1 if items entity @s weapon.offhand #minecraft:axes store success score $holding_axe gm4_llp.data run scoreboard players set $offhand gm4_llp.data 1\n\n# find interaction\nexecute as @e[type=interaction,tag=gm4_llp_waxed_copper_rcd,distance=..8] if data entity @s interaction at @s run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/process_interaction\n\n# fail if not scraped\nexecute if score $scraped gm4_llp.data matches 0 run return fail\n\n# update axe durability\nexecute if score $mainhand gm4_llp.data matches 1 if entity @s[gamemode=!creative] run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/used_mainhand_axe\nexecute if score $mainhand gm4_llp.data matches 1 run swing @s mainhand\nexecute if score $offhand gm4_llp.data matches 1 if entity @s[gamemode=!creative] run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/used_offhand_axe\nexecute if score $offhand gm4_llp.data matches 1 run swing @s offhand\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/max_durability_mainhand_axe.mcfunction",
    "content": "# returns 1 if max durability reached\n# @s = player holding axe\n# at @s\n# run from mechanics/interactions/waxed_copper_lantern/used_mainhand_axe\n\nexecute if items entity @s weapon.mainhand golden_axe[damage=32] run return 1\nexecute if items entity @s weapon.mainhand wooden_axe[damage=59] run return 1\nexecute if items entity @s weapon.mainhand stone_axe[damage=131] run return 1\nexecute if items entity @s weapon.mainhand copper_axe[damage=190] run return 1\nexecute if items entity @s weapon.mainhand iron_axe[damage=250] run return 1\nexecute if items entity @s weapon.mainhand diamond_axe[damage=1561] run return 1\nexecute if items entity @s weapon.mainhand netherite_axe[damage=2031] run return 1\n\nreturn fail\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/max_durability_offhand_axe.mcfunction",
    "content": "# returns 1 if max durability reached\n# @s = player holding axe\n# at @s\n# run from mechanics/interactions/waxed_copper_lantern/used_offhand_axe\n\nexecute if items entity @s weapon.offhand golden_axe[damage=32] run return 1\nexecute if items entity @s weapon.offhand wooden_axe[damage=59] run return 1\nexecute if items entity @s weapon.offhand stone_axe[damage=131] run return 1\nexecute if items entity @s weapon.offhand copper_axe[damage=190] run return 1\nexecute if items entity @s weapon.offhand iron_axe[damage=250] run return 1\nexecute if items entity @s weapon.offhand diamond_axe[damage=1561] run return 1\nexecute if items entity @s weapon.offhand netherite_axe[damage=2031] run return 1\n\nreturn fail\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/process_interaction.mcfunction",
    "content": "# @s = gm4_llp_waxed_copper_rcd rcd\n# at @s\n# run from mechanics/interactions/waxed_copper_lantern/interact_rcd\n\n# store time to check\nexecute store result score $gametime gm4_llp.data run time query gametime\nexecute store result score $check_gametime gm4_llp.data run data get entity @s interaction.timestamp 1\n\n# clean\ndata remove entity @s interaction\n\n# fail if old interaction\nexecute unless score $gametime gm4_llp.data = $check_gametime gm4_llp.data run return fail\n\n# no axe, no effect\nexecute if score $holding_axe gm4_llp.data matches 0 run return fail\n\n# scrape off wax\nparticle minecraft:wax_off ~ ~.2 ~ 0.3 0.3 0.3 1 16\nplaysound item.axe.wax_off block @a[distance=..16] ~ ~ ~\ntag @s remove gm4_llp_waxed_copper_rcd\ntag @s add gm4_llp_unwaxed_copper_rcd\n# modify display to match\nexecute as @e[type=minecraft:block_display,tag=gm4_llp_waxed_copper_lantern,distance=..0.1,limit=1] run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/scrape_display\n# set flag\nscoreboard players set $scraped gm4_llp.data 1\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/scrape_display.mcfunction",
    "content": "# @s = gm4_llp_waxed_copper_lantern block display\n# at associated gm4_llp_waxed_copper_rcd rcd\n# run from mechanics/interactions/waxed_copper_lantern/process_interaction\n\n# update tags\ntag @s remove gm4_llp_waxed_copper_lantern\ntag @s add gm4_llp_unwaxed_copper_lantern\n\n# modify\nexecute if data entity @s {block_state:{Name:\"minecraft:waxed_copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:copper_lantern\"\nexecute if data entity @s {block_state:{Name:\"minecraft:waxed_exposed_copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:exposed_copper_lantern\"\nexecute if data entity @s {block_state:{Name:\"minecraft:waxed_weathered_copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:weathered_copper_lantern\"\nexecute if data entity @s {block_state:{Name:\"minecraft:waxed_oxidized_copper_lantern\"}} run return run data modify entity @s block_state.Name set value \"minecraft:oxidized_copper_lantern\"\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/set_damage_mainhand.mcfunction",
    "content": "# @s = player who scraped wax\n# at @s\n# run from mechanics/interactions/waxed_copper_lantern/damage_mainhand_axe\n\n$item modify entity @s weapon.mainhand {function:\"minecraft:set_components\",components:{\"minecraft:damage\":$(damage)}}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/set_damage_offhand.mcfunction",
    "content": "# @s = player who scraped wax\n# at @s\n# run from mechanics/interactions/waxed_copper_lantern/damage_offhand_axe\n\n$item modify entity @s weapon.offhand {function:\"minecraft:set_components\",components:{\"minecraft:damage\":$(damage)}}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/used_mainhand_axe.mcfunction",
    "content": "# calculates damage for axe\n# @s = player who scraped wax\n# at @s\n# run from mechanics/interactions/waxed_copper_lantern/interact_rcd and mechanics/interactions/unwaxed_copper_lantern/interact_rcd\n\n# damage\nexecute store result score $level gm4_llp.data run data get entity @s SelectedItem.components.\"minecraft:enchantments\".\"minecraft:unbreaking\"\nscoreboard players add $level gm4_llp.data 1\nscoreboard players set $chance gm4_llp.data 100\nscoreboard players operation $chance gm4_llp.data /= $level gm4_llp.data\nexecute store result score $rand gm4_llp.data run random value 1..100\nexecute if score $rand gm4_llp.data < $chance gm4_llp.data run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/damage_mainhand_axe\n\n# fail if not max durability\nexecute unless function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/max_durability_mainhand_axe run return fail\n\n# 0 durability remaining, break item\nitem replace entity @s weapon.mainhand with air\nplaysound minecraft:entity.item.break player @a[distance=..16]\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/used_offhand_axe.mcfunction",
    "content": "# calculates damage for axe\n# @s = player who scraped wax\n# at @s\n# run from mechanics/interactions/waxed_copper_lantern/interact_rcd and mechanics/interactions/unwaxed_copper_lantern/interact_rcd\n\n# damage\nexecute store result score $level gm4_llp.data run data get entity @s equipment.offhand.components.\"minecraft:enchantments\".\"minecraft:unbreaking\"\nscoreboard players add $level gm4_llp.data 1\nscoreboard players set $chance gm4_llp.data 100\nscoreboard players operation $chance gm4_llp.data /= $level gm4_llp.data\nexecute store result score $rand gm4_llp.data run random value 1..100\nexecute if score $rand gm4_llp.data < $chance gm4_llp.data run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/damage_offhand_axe\n\n# fail if not max durability\nexecute unless function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/max_durability_offhand_axe run return fail\n\n# 0 durability remaining, break item\nitem replace entity @s weapon.offhand with air\nplaysound minecraft:entity.item.break player @a[distance=..16]\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/particles/1_candle.mcfunction",
    "content": "# displays flames for a 1 candle display\n# @s = candle display\n# at @s\n# run from mechanics/particles/candle_count\n\nparticle small_flame ~ ~.42 ~\nexecute if score $rand gm4_llp.data matches 1 run particle smoke ~ ~.43 ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/particles/2_candle.mcfunction",
    "content": "# displays flames for a 2 candle display\n# @s = candle display\n# at @s\n# run from mechanics/particles/candle_count\n\nparticle small_flame ~.1 ~.42 ~-.05\nparticle small_flame ~-.1 ~.37 ~\nexecute if score $rand gm4_llp.data matches 1 run particle smoke ~.1 ~.43 ~-.05\nexecute if score $rand gm4_llp.data matches 2 run particle smoke ~-.1 ~.38 ~\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/particles/3_candle.mcfunction",
    "content": "# displays flames for a 3 candle display\n# @s = candle display\n# at @s\n# run from mechanics/particles/candle_count\n\nparticle small_flame ~.05 ~.42 ~-.05\nparticle small_flame ~-.1 ~.37 ~\nparticle small_flame ~ ~.27 ~.1\nexecute if score $rand gm4_llp.data matches 1 run particle smoke ~.05 ~.43 ~-.05\nexecute if score $rand gm4_llp.data matches 2 run particle smoke ~-.1 ~.38 ~\nexecute if score $rand gm4_llp.data matches 3 run particle smoke ~ ~.28 ~.1\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/particles/4_candle.mcfunction",
    "content": "# displays flames for a 4 candle display\n# @s = candle display\n# at @s\n# run from mechanics/particles/candle_count\n\nparticle small_flame ~.05 ~.42 ~-.1\nparticle small_flame ~-.1 ~.37 ~-.1\nparticle small_flame ~.1 ~.37 ~.05\nparticle small_flame ~-.05 ~.27 ~.05\nexecute if score $rand gm4_llp.data matches 1 run particle smoke ~.05 ~.43 ~-.1\nexecute if score $rand gm4_llp.data matches 2 run particle smoke ~-.1 ~.38 ~-.1\nexecute if score $rand gm4_llp.data matches 3 run particle smoke ~.1 ~.38 ~.05\nexecute if score $rand gm4_llp.data matches 4 run particle smoke ~-.05 ~.28 ~.05\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/particles/candle_count.mcfunction",
    "content": "# checks candle count and redirects to correct function\n# @s = candle display\n# at @s\n# run from mechanics/particles/select_type\n\n# light block\nfunction gm4_lively_lily_pads:mechanics/interactions/candle/update_light_blocks\n\n# particles\nexecute store result score $rand gm4_llp.data run random value 1..4\nexecute if data entity @s {block_state:{Properties:{candles:\"1\"}}} run return run function gm4_lively_lily_pads:mechanics/particles/1_candle\nexecute if data entity @s {block_state:{Properties:{candles:\"2\"}}} run return run function gm4_lively_lily_pads:mechanics/particles/2_candle\nexecute if data entity @s {block_state:{Properties:{candles:\"3\"}}} run return run function gm4_lively_lily_pads:mechanics/particles/3_candle\nfunction gm4_lively_lily_pads:mechanics/particles/4_candle\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/particles/select_type.mcfunction",
    "content": "# dispatches type\n# @s = block display, tag=gm4_llp_light\n# at @s\n# run from tick\n\nexecute if entity @s[tag=gm4_llp_lit_candle] run return run function gm4_lively_lily_pads:mechanics/particles/candle_count\n\nexecute store result score $rand gm4_llp.data run random value 1..10\nexecute if entity @s[tag=gm4_llp_smoke_torch] \\\n  if score $rand gm4_llp.data matches 1..6 run particle smoke ~ ~.6 ~\nexecute if data entity @s {block_state:{Name:\"minecraft:soul_torch\"}} \\\n  if score $rand gm4_llp.data matches 1..9 run particle soul_fire_flame ~ ~.58 ~\nexecute if data entity @s {block_state:{Name:\"minecraft:torch\"}} \\\n  if score $rand gm4_llp.data matches 1..9 run particle flame ~ ~.58 ~\nexecute if data entity @s {block_state:{Name:\"minecraft:copper_torch\"}} \\\n  if score $rand gm4_llp.data matches 1..9 run particle copper_fire_flame ~ ~.58 ~\nexecute if data entity @s {block_state:{Name:\"minecraft:redstone_torch\"}} \\\n  if score $rand gm4_llp.data matches 1..8 run particle dust{color:[1,0,0],scale:0.8} ~ ~.58 ~\n\n# refresh light block\nexecute if block ~ ~1 ~ light run setblock ~ ~1 ~ air\nexecute if entity @s[tag=gm4_llp_light.14] run setblock ~ ~1 ~ light[level=14] keep\nexecute if entity @s[tag=gm4_llp_light.9] run setblock ~ ~1 ~ light[level=9] keep\nexecute if entity @s[tag=gm4_llp_light.6] run setblock ~ ~1 ~ light[level=6] keep\n\n# copper lantern oxidization\nexecute if entity @s[tag=gm4_llp_unwaxed_copper_lantern] run function gm4_lively_lily_pads:mechanics/interactions/unwaxed_copper_lantern/attempt_oxidization\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/right_click_detection/create.mcfunction",
    "content": "# Sets up rcd\n# @s = new interaction\n# at @s\n# run from mechanics/right_click_detection/found\n\ndata merge entity @s {width:0.4f,height:0.3f,Tags:[\"gm4_llp_placement_rcd\",\"smithed.entity\",\"smithed.strict\"]}\nscoreboard players operation @s gm4_llp.id = $player gm4_llp.id\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/right_click_detection/found.mcfunction",
    "content": "# execute at nearest lily pad in front of player\n# @s = player holding supported item\n# at lily_pad align xyz\n# run from mechanics/right_click_detection/ray\n\n# visuals\n particle scrape ~.5 ~.12 ~.5 0 0 0 0 1\n\n# spawn an interaction if needed\nscoreboard players operation $player gm4_llp.id = @s gm4_llp.id\nexecute unless entity @e[type=interaction,tag=gm4_llp_placement_rcd,dx=0,limit=1] positioned ~.5 ~.02 ~.5 \\\n  summon minecraft:interaction run function gm4_lively_lily_pads:mechanics/right_click_detection/create\n\n# start loop\nscoreboard players set $timer gm4_llp.data 10\nfunction gm4_lively_lily_pads:mechanics/right_click_detection/loop\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/right_click_detection/loop.mcfunction",
    "content": "# loops as long as a \"right click detection\" interaction exists\n# @s = arbitrary\n# at unknown\n# run from mechanics/right_click_detection/found and scheduled from self\n\n# count down\nscoreboard players remove $timer gm4_llp.data 1\n\nexecute as @e[type=interaction,tag=gm4_llp_placement_rcd] at @s run function gm4_lively_lily_pads:mechanics/right_click_detection/process\n\n# loop if needed\nexecute if score $timer gm4_llp.data matches 0.. run schedule function gm4_lively_lily_pads:mechanics/right_click_detection/loop 10t\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/right_click_detection/process.mcfunction",
    "content": "# processes the \"right click detection\" interaction so that it is despawned when unneeded\n# @s = gm4_llp_placement_rcd interaction \n# at @s\n# run from mechanics/right_click_detection/loop\n\n# refresh timer\nscoreboard players set $timer gm4_llp.data 10\n\n# kill rcd if uneeded\nexecute unless entity @p[tag=gm4_llp_holding_item,distance=..6] run return run kill @s\nexecute unless block ~ ~ ~ lily_pad run return run kill @s\nexecute align xyz if entity @e[type=block_display,tag=gm4_llp_display,dx=0] run return run kill @s\n\n# kill if multiple interaction with the same id, which therefore belong to the same player\nscoreboard players set $duplicate_exists gm4_llp.data 0\nscoreboard players operation $check_id gm4_llp.id = @s gm4_llp.id\nexecute as @e[type=interaction,tag=gm4_llp_placement_rcd,distance=0.1..16] if score @s gm4_llp.id = $check_id gm4_llp.id run scoreboard players set $duplicate_exists gm4_llp.data 1\nexecute if score $duplicate_exists gm4_llp.data matches 1 run kill @s\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/right_click_detection/ray.mcfunction",
    "content": "# raycasts from the players head that moves forward until it finds a lily_pad block\n# @s = player holding supported item\n# at @s anchored eyes, moving forward\n# run from player/holding_item and self\n\n# Vertical Offset   =   1 - Detection Height\nexecute if block ~ ~.5 ~ minecraft:lily_pad if block ~ ~ ~ minecraft:lily_pad align xyz \\\n  unless entity @e[type=minecraft:block_display,limit=1,dx=0,tag=gm4_llp_display] \\\n  run return run function gm4_lively_lily_pads:mechanics/right_click_detection/found\n\n# loop\nscoreboard players remove $ray gm4_llp.data 1\nexecute if score $ray gm4_llp.data matches 0.. positioned ^ ^ ^.5 run function gm4_lively_lily_pads:mechanics/right_click_detection/ray\n# Raycast Step    =   Detection Height\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/player/as.mcfunction",
    "content": "# @s = player\n# at @s\n# run from main\n\ntag @s remove gm4_llp_holding_item\nexecute if predicate gm4_lively_lily_pads:holding_placeable_item run function gm4_lively_lily_pads:player/holding_item\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/player/holding_item.mcfunction",
    "content": "# @s = player holding supported item\n# at @s\n# run from player/as\n\ntag @s add gm4_llp_holding_item\n\n# raycast for lily_pad\n# | 6 blocks, 0.5 forward at a time\nscoreboard players set $ray gm4_llp.data 12\nexecute anchored eyes positioned ^ ^ ^ run function gm4_lively_lily_pads:mechanics/right_click_detection/ray\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/player/set_id.mcfunction",
    "content": "# @s = player\n# at @s \n# run from advancement: id_init\n\n# revoke to handle username changes\nadvancement revoke @s only gm4_lively_lily_pads:id_init\n\nscoreboard players operation @s gm4_llp.id = $next gm4_llp.id\nscoreboard players add $next gm4_llp.id 1\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/tick.mcfunction",
    "content": "schedule function gm4_lively_lily_pads:tick 8t\n\n# selects displays for particles, light_block refreshing, oxidization\nexecute as @e[type=block_display,tag=gm4_llp_light] at @s run function gm4_lively_lily_pads:mechanics/particles/select_type\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/upgrade_paths/3.0/update_legacy_display.mcfunction",
    "content": "# upgrades and then kills legacy lilyPadLight\n# @s = old block display, tag=lilyPadLight\n# at @s align xyz positioned ~.5 ~.02 ~.5\n# run from upgrade_paths/3.0\n\n# block_state.Name needed for coral fan and candle type info\ndata modify storage gm4_llp:temp DisplayType set from entity @s block_state.Name\n\n## Select Type\nexecute if data entity @s {block_state:{Name:\"minecraft:torch\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/torch\nexecute if data entity @s {block_state:{Name:\"minecraft:soul_torch\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/soul_torch\nexecute if data entity @s {block_state:{Name:\"minecraft:redstone_torch\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/redstone_torch\nexecute if data entity @s {block_state:{Name:\"minecraft:lantern\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/lantern\nexecute if data entity @s {block_state:{Name:\"minecraft:soul_lantern\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/soul_lantern\nexecute if data entity @s {block_state:{Name:\"minecraft:cactus_flower\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/cactus_flower\nexecute if data entity @s {block_state:{Name:\"minecraft:spore_blossom\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/spore_blossom\n\nexecute if data entity @s block_state.Properties.candles run function gm4_lively_lily_pads:upgrade_paths/3.0/upgrade_candle with storage gm4_llp:temp\n\nexecute if data entity @s {block_state:{Name:\"minecraft:brain_coral_fan\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/coral_fan with storage gm4_llp:temp\nexecute if data entity @s {block_state:{Name:\"minecraft:bubble_coral_fan\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/coral_fan with storage gm4_llp:temp\nexecute if data entity @s {block_state:{Name:\"minecraft:fire_coral_fan\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/coral_fan with storage gm4_llp:temp\nexecute if data entity @s {block_state:{Name:\"minecraft:horn_coral_fan\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/coral_fan with storage gm4_llp:temp\nexecute if data entity @s {block_state:{Name:\"minecraft:tube_coral_fan\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/coral_fan with storage gm4_llp:temp\n\nexecute if data entity @s {block_state:{Name:\"minecraft:dead_brain_coral_fan\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/dead_coral_fan with storage gm4_llp:temp\nexecute if data entity @s {block_state:{Name:\"minecraft:dead_bubble_coral_fan\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/dead_coral_fan with storage gm4_llp:temp\nexecute if data entity @s {block_state:{Name:\"minecraft:dead_fire_coral_fan\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/dead_coral_fan with storage gm4_llp:temp\nexecute if data entity @s {block_state:{Name:\"minecraft:dead_horn_coral_fan\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/dead_coral_fan with storage gm4_llp:temp\nexecute if data entity @s {block_state:{Name:\"minecraft:dead_tube_coral_fan\"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/dead_coral_fan with storage gm4_llp:temp\n\n# kill old\nkill @s\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/upgrade_paths/3.0/upgrade_candle.mcfunction",
    "content": "# string manipulation and data transfer from legacy candles\n# @s = block display, tag=lilyPadLight\n# at @s align xyz positioned ~.5 ~.02 ~.5\n# run from upgrade_paths/3.0/update_legacy_display\n\n# summon new display\nfunction gm4_lively_lily_pads:mechanics/interactions/placement/candles with storage gm4_llp:temp\n\n# set additional data from old display\ndata modify entity @e[type=minecraft:block_display,tag=gm4_llp_candle,limit=1,distance=..0.1] block_state.Properties.candles \\\n  set from entity @s block_state.Properties.candles\ndata modify entity @e[type=minecraft:block_display,tag=gm4_llp_candle,limit=1,distance=..0.1] block_state.Properties.lit \\\n  set from entity @s block_state.Properties.lit\nexecute if data entity @s {block_state:{Properties:{lit:\"true\"}}} \\\n  run tag @e[type=minecraft:block_display,tag=gm4_llp_candle,limit=1,distance=..0.1] add gm4_llp_lit_candle\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/upgrade_paths/3.0.mcfunction",
    "content": "# upgrade path from pre-gm4 LLP\n# @s = player\n# at @s\n# run via upgrade paths util\n\n# kill old non-useful entities\nkill @e[type=minecraft:interaction,tag=lilyPadInt]\nkill @e[type=minecraft:block_display,tag=lilyPadLight2]\n\n# upgrade remaining\nexecute as @e[type=minecraft:block_display,tag=lilyPadLight] at @s align xyz positioned ~.5 ~0.02 ~.5 \\\n  run function gm4_lively_lily_pads:upgrade_paths/3.0/update_legacy_display\n\n# CHECK TO ENABLE UPGRADE PATH IN mechanics/interactions/placement/interact_rcd\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/upgrade_paths/3.1.mcfunction",
    "content": "# add gm4_llp_perma_rcd tag to gm4_llp_candle_rcd\n# @s = player\n# at @s\n# run via upgrade paths util\n\ntag @e[type=interaction,tag=gm4_llp_candle_rcd,tag=!gm4_llp_perma_rcd] add gm4_llp_perma_rcd\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/upgrade_paths/3.3.mcfunction",
    "content": "# remove `response:1b` from gm4_llp_perma_rcd interactions\n# @s = player\n# at @s\n# run via upgrade paths util\n\nexecute as @e[type=interaction,tag=gm4_llp_perma_rcd,nbt={response:1b}] run data modify entity @s response set value 0b\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/guidebook/lively_lily_pads.json",
    "content": "{\n  \"id\": \"lively_lily_pads\",\n  \"name\": \"Lively Lily Pads\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:lily_pad\"\n  },\n  \"criteria\": {\n    \"obtain_pad\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:lily_pad\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_placeable_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#gm4_lively_lily_pads:placeable_item\"\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"display\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_pad\",\n          \"obtain_placeable_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.lively_lily_pads.description\",\n            \"fallback\": \"Simply right click the particles on lily pads with decorations to add them on top!\\nCandles will need lighting.\"\n          }\n        ],\n        [\n          {\n            \"translate\":\"text.gm4.guidebook.lively_lily_pads.item_list.header\",\n            \"fallback\":\"Decorations:\",\n            \"underlined\":true\n          },\n          {\n            \"text\":\"\\n\\n\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.lively_lily_pads.item_list\",\n            \"fallback\": \"Candles\\nLanterns\\nTorches\\nCoral Fans\\nCactus Flower\\nSpore Blossom\",\n            \"underlined\":false\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/predicate/holding_placeable_item.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:reference\",\n      \"name\": \"gm4_lively_lily_pads:mainhand_placeable_item\"\n    },\n    {\n      \"condition\": \"minecraft:reference\",\n      \"name\": \"gm4_lively_lily_pads:offhand_placeable_item\"\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/predicate/mainhand_placeable_item.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": \"#gm4_lively_lily_pads:placeable_item\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/predicate/offhand_placeable_item.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": \"#gm4_lively_lily_pads:placeable_item\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/candle_igniters.json",
    "content": "{\n  \"values\": [\n    \"minecraft:fire_charge\",\n    \"minecraft:flint_and_steel\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/candle_interactable.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:candles\",\n    \"#gm4_lively_lily_pads:candle_igniters\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/copper_lanterns.json",
    "content": "{\n  \"values\": [\n    \"minecraft:copper_lantern\",\n    \"minecraft:exposed_copper_lantern\",\n    \"minecraft:weathered_copper_lantern\",\n    \"minecraft:oxidized_copper_lantern\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/coral_fan.json",
    "content": "{\n  \"values\": [\n    \"minecraft:brain_coral_fan\",\n    \"minecraft:bubble_coral_fan\",\n    \"minecraft:fire_coral_fan\",\n    \"minecraft:horn_coral_fan\",\n    \"minecraft:tube_coral_fan\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/dead_coral_fan.json",
    "content": "{\n  \"values\": [\n    \"minecraft:dead_brain_coral_fan\",\n    \"minecraft:dead_bubble_coral_fan\",\n    \"minecraft:dead_fire_coral_fan\",\n    \"minecraft:dead_horn_coral_fan\",\n    \"minecraft:dead_tube_coral_fan\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/placeable_item.json",
    "content": "{\n  \"values\": [\n    \"#gm4_lively_lily_pads:copper_lanterns\",\n    \"#gm4_lively_lily_pads:coral_fan\",\n    \"#gm4_lively_lily_pads:dead_coral_fan\",\n    \"#gm4_lively_lily_pads:waxed_copper_lanterns\",\n    \"#minecraft:candles\",\n    \"minecraft:cactus_flower\",\n    \"minecraft:copper_torch\",\n    \"minecraft:lantern\",\n    \"minecraft:redstone_torch\",\n    \"minecraft:torch\",\n    \"minecraft:soul_lantern\",\n    \"minecraft:soul_torch\",\n    \"minecraft:spore_blossom\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/waxed_copper_lanterns.json",
    "content": "{\n  \"values\": [\n    \"minecraft:waxed_copper_lantern\",\n    \"minecraft:waxed_exposed_copper_lantern\",\n    \"minecraft:waxed_weathered_copper_lantern\",\n    \"minecraft:waxed_oxidized_copper_lantern\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/mod.mcdoc",
    "content": "use ::java::world::item::ItemStack\n\ndispatch minecraft:storage[gm4_llp:temp] to struct {\n  item?: struct {\n    id: #[id=\"item\"] string,\n    count: int,\n    motion: [double] @ 3,\n  },\n  held_item?: #[id=\"item\"] string,\n  DisplayType?: #[id=\"item\"] string,\n  damage?: int,\n}\n"
  },
  {
    "path": "gm4_lively_lily_pads/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.lively_lily_pads,\"Place decorations on Lily Pads!\"\ntext.gm4.guidebook.lively_lily_pads.description,\"Simply right click the particles on lily pads with decorations to add them on top!\\nCandles will need lighting.\"\ntext.gm4.guidebook.lively_lily_pads.item_list.header,\"Decorations:\"\ntext.gm4.guidebook.lively_lily_pads.item_list,\"Candles\\nLanterns\\nTorches\\nCoral Fans\\nCactus Flower\\nSpore Blossom\"\n"
  },
  {
    "path": "gm4_lumos_shamir/README.md",
    "content": "# Lumo Shamir<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nThe darkness is now a little less lonely when you can auto-place torches!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- When a tool with Lumos on it detects a player is in a light level below 2, a torch from the inventory will be used\r\n- The torch is placed a the feet of the player\r\n- Builds on Gamemode 4's fun extension of the Enchantment system, [Metallurgy]($dynamicLink:gm4_metallurgy)\r\n"
  },
  {
    "path": "gm4_lumos_shamir/assets/translations.csv",
    "content": "key,en_us\nitem.gm4.shamir.lumos,Lumos Shamir\ntext.gm4.guidebook.module_desc.lumos_shamir,Adds the shamir 'Lumos' to Metallurgy. It places torches when it is dark.\ntext.gm4.guidebook.lumos_shamir.description,Lumos takes torches from the inventory and places them if the light level is too low.\ntext.gm4.guidebook.lumos_shamir.usage,The Lumos Shamir is found on Curie's Bismium Bands. It can be placed onto pickaxes and shovels.\\n\\nHolding the tool will cause torches to be placed when standing in low light levels.\n"
  },
  {
    "path": "gm4_lumos_shamir/beet.yaml",
    "content": "id: gm4_lumos_shamir\nname: Lumos Shamir\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: ../gm4_metallurgy\n\npipeline:\n  - gm4_metallurgy.shamir_model_template\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_metallurgy: 1.8.0\n      schedule_loops: [main]\n    model_data:\n      - item: [pickaxes, shovels]\n        reference: shamir/lumos\n        template:\n          name: shamir\n          metal: curies_bismium\n          textures_path: gm4_metallurgy:item/shamir/curies_bismium\n    website:\n      description: Adds the shamir 'Lumos' to Metallurgy. It places torches when it is dark.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: vYbLApXc\n    wiki: https://wiki.gm4.co/wiki/Metallurgy/Lumos_Shamir\n    credits:\n      Creators:\n        - InternetAlien\n        - SirSheepe\n      Idea By:\n        - Misode\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/function/active.mcfunction",
    "content": "#run from main\n#@s = players holding a lumos tool\n\nexecute store success score $has_torches gm4_ml_data run clear @s torch 0\nexecute at @s if score $has_torches gm4_ml_data matches 1 if predicate gm4_lumos_shamir:check_air unless block ~ ~ ~ #gm4:water unless block ~ ~-1 ~ #gm4_lumos_shamir:torch_unplaceable if predicate gm4_lumos_shamir:check_block run function gm4_lumos_shamir:place_torch\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/function/check_item_validity.mcfunction",
    "content": "#@s = band is trying to apply to\n#run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'lumos'}}] if items entity @s contents #gm4_lumos_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/function/init.mcfunction",
    "content": "execute unless score lumos_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Lumos Shamir\"}\nexecute unless score lumos_shamir gm4_earliest_version < lumos_shamir gm4_modules run scoreboard players operation lumos_shamir gm4_earliest_version = lumos_shamir gm4_modules\nscoreboard players set lumos_shamir gm4_modules 1\n\nschedule function gm4_lumos_shamir:main 4t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/function/main.mcfunction",
    "content": "execute as @a[gamemode=!spectator,gamemode=!adventure,predicate=gm4_lumos_shamir:holding_lumos] at @s run function gm4_lumos_shamir:active\nscoreboard players reset has_torches gm4_ml_data\n\nschedule function gm4_lumos_shamir:main 16t\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/function/place_torch.mcfunction",
    "content": "#run from active\n#@s = player with torches\n\nsetblock ~ ~ ~ minecraft:torch\nclear @s[gamemode=!creative] torch 1\n\nplaysound minecraft:block.wood.place block @a ~ ~ ~ 1 1\nexecute align xyz positioned ~0.5 ~0.5 ~0.5 run particle minecraft:firework ~ ~0.4 ~ 0.08 0 0.08 0.01 3\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/lumos via #gm4_metallurgy:summon_band/lumos\n\nloot spawn ~ ~ ~ loot gm4_lumos_shamir:band\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/guidebook/lumos_shamir.json",
    "content": "{\n  \"id\": \"lumos_shamir\",\n  \"name\": \"Lumos Shamir\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"metallurgy\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_lumos_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'lumos'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_lumos_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'lumos'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.lumos_shamir.description\",\n            \"fallback\": \"Lumos takes torches from the inventory and places them if the light level is too low.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_lumos_shamir\",\n          \"obtain_lumos_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.lumos_shamir.usage\",\n            \"fallback\": \"The Lumos Shamir is found on Curie's Bismium Bands. It can be placed onto pickaxes and shovels.\\n\\nHolding the tool will cause torches to be placed when standing in low light levels.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/loot_table/band.json",
    "content": "{\n\t\"pools\": [\n\t\t{\n\t\t\t\"rolls\": 1,\n\t\t\t\"entries\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"minecraft:loot_table\",\n\t\t\t\t\t\"value\": \"gm4_metallurgy:curies_bismium_band\",\n\t\t\t\t\t\"functions\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_components\",\n\t\t\t\t\t\t\t\"components\": {\n\t\t\t\t\t\t\t\t\"minecraft:custom_model_data\": {\"strings\":[\"gm4_lumos_shamir:shamir/lumos\"]}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_custom_data\",\n\t\t\t\t\t\t\t\"tag\": \"{gm4_metallurgy:{stored_shamir:'lumos'}}\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_lore\",\n\t\t\t\t\t\t\t\"mode\": \"append\",\n\t\t\t\t\t\t\t\"lore\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"translate\": \"item.gm4.shamir.lumos\",\n\t\t\t\t\t\t\t\t\t\"fallback\": \"Lumos Shamir\",\n\t\t\t\t\t\t\t\t\t\"italic\": false,\n\t\t\t\t\t\t\t\t\t\"color\": \"gray\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/predicate/check_air.json",
    "content": "{\n\t\"condition\": \"minecraft:any_of\",\n\t\"terms\": [\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"light\": {\n\t\t\t\t\t\"light\": {\n\t\t\t\t\t\t\"min\": 0,\n\t\t\t\t\t\t\"max\": 1\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#gm4:replaceable\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"predicate\": {\n\t\t\t\t\"light\": {\n\t\t\t\t\t\"light\": {\n\t\t\t\t\t\t\"min\": 0,\n\t\t\t\t\t\t\"max\": 1\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:snow\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"layers\": \"1\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/predicate/check_block.json",
    "content": "{\n\t\"condition\": \"minecraft:any_of\",\n\t\"terms\": [\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"offsetY\": -1,\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:trapdoors\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"half\": \"top\",\n\t\t\t\t\t\t\"open\": \"false\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"offsetY\": -1,\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#gm4_lumos_shamir:torch_placeable\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"offsetY\": -1,\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:grindstone\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"face\": \"floor\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"offsetY\": -1,\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:piston_head\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"facing\": \"up\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"offsetY\": -1,\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:fence_gates\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"open\": \"false\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"offsetY\": -1,\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:slabs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"type\": \"top\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"offsetY\": -1,\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:slabs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"type\": \"double\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"offsetY\": -1,\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": \"#minecraft:stairs\",\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"half\": \"top\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"offsetY\": -1,\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:end_portal_frame\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"eye\": \"true\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"condition\": \"minecraft:location_check\",\n\t\t\t\"offsetY\": -1,\n\t\t\t\"predicate\": {\n\t\t\t\t\"block\": {\n\t\t\t\t\t\"blocks\": [\n\t\t\t\t\t\t\"minecraft:bell\"\n\t\t\t\t\t],\n\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\"attachment\": \"floor\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/predicate/holding_lumos.json",
    "content": "{\n\t\"condition\": \"minecraft:entity_properties\",\n\t\"entity\": \"this\",\n\t\"predicate\": {\n\t\t\"slots\": {\n\t\t\t\"weapon.*\": {\n\t\t\t\t\"predicates\": {\n\t\t\t\t\t\"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'lumos'}}\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/tags/block/torch_placeable.json",
    "content": "{\n\t\"values\": [\n\t\t\"#gm4:full_collision\",\n\t\t\"#minecraft:anvil\",\n\t\t\"#minecraft:fences\",\n\t\t\"#minecraft:walls\",\n\t\t\"minecraft:piston\",\n\t\t\"minecraft:red_stained_glass_pane\",\n\t\t\"minecraft:green_stained_glass_pane\",\n\t\t\"minecraft:glass_pane\",\n\t\t\"minecraft:chorus_flower\",\n\t\t\"minecraft:sticky_piston\",\n\t\t\"minecraft:flowering_azalea\",\n\t\t\"minecraft:blue_stained_glass_pane\",\n\t\t\"minecraft:brown_stained_glass_pane\",\n\t\t\"minecraft:purple_stained_glass_pane\",\n\t\t\"minecraft:white_stained_glass_pane\",\n\t\t\"minecraft:yellow_stained_glass_pane\",\n\t\t\"minecraft:lime_stained_glass_pane\",\n\t\t\"minecraft:light_gray_stained_glass_pane\",\n\t\t\"minecraft:magenta_stained_glass_pane\",\n\t\t\"minecraft:dragon_egg\",\n\t\t\"minecraft:iron_bars\",\n\t\t\"minecraft:light_blue_stained_glass_pane\",\n\t\t\"minecraft:azalea\",\n\t\t\"minecraft:scaffolding\",\n\t\t\"minecraft:pink_stained_glass_pane\",\n\t\t\"minecraft:gray_stained_glass_pane\",\n\t\t\"minecraft:orange_stained_glass_pane\",\n\t\t\"minecraft:cyan_stained_glass_pane\",\n\t\t\"minecraft:black_stained_glass_pane\"\n\t]\n}\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/tags/block/torch_unplaceable.json",
    "content": "{\n\t\"values\": [\n\t\t\"#minecraft:air\",\n\t\t\"#minecraft:flowers\",\n\t\t\"#minecraft:saplings\",\n\t\t\"#minecraft:leaves\",\n\t\t\"#minecraft:wool_carpets\",\n\t\t\"#minecraft:cauldrons\",\n\t\t\"#minecraft:wooden_pressure_plates\",\n\t\t\"#minecraft:signs\",\n\t\t\"#minecraft:banners\",\n\t\t\"#minecraft:beds\",\n\t\t\"#minecraft:rails\",\n\t\t\"#minecraft:doors\",\n\t\t\"#minecraft:buttons\",\n\t\t\"minecraft:water\",\n\t\t\"minecraft:stone_pressure_plate\",\n\t\t\"minecraft:red_mushroom\",\n\t\t\"minecraft:brown_mushroom\",\n\t\t\"minecraft:ladder\",\n\t\t\"minecraft:composter\",\n\t\t\"minecraft:cobweb\",\n\t\t\"minecraft:chorus_plant\",\n\t\t\"minecraft:chest\",\n\t\t\"minecraft:cactus\",\n\t\t\"minecraft:lily_pad\",\n\t\t\"minecraft:ender_chest\",\n\t\t\"minecraft:enchanting_table\",\n\t\t\"minecraft:dirt_path\",\n\t\t\"minecraft:sea_pickle\",\n\t\t\"minecraft:honey_block\",\n\t\t\"minecraft:stonecutter\",\n\t\t\"minecraft:campfire\",\n\t\t\"minecraft:flower_pot\",\n\t\t\"minecraft:bamboo_sapling\",\n\t\t\"minecraft:bamboo\",\n\t\t\"minecraft:brewing_stand\",\n\t\t\"minecraft:daylight_detector\",\n\t\t\"minecraft:hopper\",\n\t\t\"minecraft:tripwire_hook\",\n\t\t\"minecraft:repeater\",\n\t\t\"minecraft:comparator\",\n\t\t\"minecraft:lectern\",\n\t\t\"minecraft:light_weighted_pressure_plate\",\n\t\t\"minecraft:heavy_weighted_pressure_plate\",\n\t\t\"minecraft:trapped_chest\",\n\t\t\"minecraft:redstone_wire\",\n\t\t\"minecraft:farmland\",\n\t\t\"minecraft:lever\",\n\t\t\"minecraft:conduit\",\n\t\t\"minecraft:turtle_egg\",\n\t\t\"minecraft:skeleton_skull\",\n\t\t\"minecraft:wither_skeleton_skull\",\n\t\t\"minecraft:player_head\",\n\t\t\"minecraft:zombie_head\",\n\t\t\"minecraft:creeper_head\",\n\t\t\"minecraft:dragon_head\",\n\t\t\"minecraft:tube_coral\",\n\t\t\"minecraft:brain_coral\",\n\t\t\"minecraft:bubble_coral\",\n\t\t\"minecraft:fire_coral\",\n\t\t\"minecraft:horn_coral\",\n\t\t\"minecraft:tube_coral_fan\",\n\t\t\"minecraft:brain_coral_fan\",\n\t\t\"minecraft:bubble_coral_fan\",\n\t\t\"minecraft:fire_coral_fan\",\n\t\t\"minecraft:horn_coral_fan\",\n\t\t\"minecraft:dead_tube_coral\",\n\t\t\"minecraft:dead_brain_coral\",\n\t\t\"minecraft:dead_bubble_coral\",\n\t\t\"minecraft:dead_fire_coral\",\n\t\t\"minecraft:dead_horn_coral\",\n\t\t\"minecraft:dead_tube_coral_fan\",\n\t\t\"minecraft:dead_brain_coral_fan\",\n\t\t\"minecraft:dead_bubble_coral_fan\",\n\t\t\"minecraft:dead_fire_coral_fan\",\n\t\t\"minecraft:dead_horn_coral_fan\"\n\t]\n}\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:pickaxes\",\n    \"#minecraft:shovels\"\n  ]\n}\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/test/already_light.mcfunction",
    "content": "# @template gm4_lumos_shamir:test_dark\n# @dummy ~1 ~1 ~1\n# @optional\n\nsetblock ~1 ~3 ~1 minecraft:glowstone\n\ngive @s diamond_pickaxe[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:\"lumos\"}}]\ngive @s torch 16\n\nawait delay 1s\n\nawait block ~1 ~1 ~1 minecraft:air\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/test/invalid_spot.mcfunction",
    "content": "# @template gm4_lumos_shamir:test_dark\n# @dummy ~1 ~1 ~1\n\nsetblock ~1 ~1 ~1 minecraft:ladder\n\ngive @s diamond_pickaxe[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:\"lumos\"}}]\ngive @s torch 16\n\nawait delay 1s\n\nawait block ~1 ~1 ~1 minecraft:ladder\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_lumos_shamir/test/place_torch.mcfunction",
    "content": "# @template gm4_lumos_shamir:test_dark\n# @dummy ~1 ~1 ~1\n\ngive @s diamond_pickaxe[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:\"lumos\"}}]\n\nawait delay 1s\n\ngive @s torch 16\n\nawait block ~1 ~1 ~1 torch\n\nassert items entity @s container.* minecraft:torch[count=15]\n"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json",
    "content": "{\n\t\"values\": [\n\t\t\"gm4_lumos_shamir:check_item_validity\"\n\t]\n}"
  },
  {
    "path": "gm4_lumos_shamir/data/gm4_metallurgy/tags/function/summon_band/curies_bismium.json",
    "content": "{\n\t\"values\": [\n\t\t\"gm4_lumos_shamir:summon_band\"\n\t]\n}"
  },
  {
    "path": "gm4_mending_tanks/README.md",
    "content": "# Mending Tanks<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nMending items but using a Gamemode 4 Liquid Tank! <!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Extends the features of the Gamemode 4 [Liquid Tanks]($dynamicLink:gm4_liquid_tanks) data pack\r\n- Allows XP fluid in a tank to repair damaged items if they have the mending enchant\r\n"
  },
  {
    "path": "gm4_mending_tanks/beet.yaml",
    "content": "id: gm4_mending_tanks\nname: Mending Tanks\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_liquid_tanks: 3.1.0\n    website:\n      description: Enables Liquid Tanks filled with Experience to repair tools with the mending enchant on them.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: DPYixL7Y\n    wiki: https://wiki.gm4.co/wiki/Liquid_Tanks/Mending_Tanks\n    credits:\n      Creator:\n        - Kroppeb\n      Icon Design:\n        - Sparks\n"
  },
  {
    "path": "gm4_mending_tanks/data/gm4_liquid_tanks/tags/function/item_fill.json",
    "content": "{\n    \"values\":[\n      \"gm4_mending_tanks:item_fill\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_mending_tanks/data/gm4_mending_tanks/function/check_item.mcfunction",
    "content": "#@s = experience liquid tank with item in first slot\n#run from mending_tanks:item_fill\n\nexecute store result score $damage gm4_lt_util run data get block ~ ~ ~ Items[0].components.\"minecraft:damage\"\nexecute if score $damage gm4_lt_util matches 1.. run function gm4_mending_tanks:repair\n\n# smart storage is bypassed within repair, which merges the data back to the tool itself.\n"
  },
  {
    "path": "gm4_mending_tanks/data/gm4_mending_tanks/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_lt_util dummy\nscoreboard players set #mt_repair_per_xp gm4_lt_util 2\nscoreboard players set #mt_max_repair gm4_lt_util 32\n\nexecute unless score mending_tanks gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Mending Tanks\"}\nexecute unless score mending_tanks gm4_earliest_version < mending_tanks gm4_modules run scoreboard players operation mending_tanks gm4_earliest_version = mending_tanks gm4_modules\nscoreboard players set mending_tanks gm4_modules 1\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_mending_tanks/data/gm4_mending_tanks/function/item_fill.mcfunction",
    "content": "#@s = liquid tank with item in first slot\n#run from liquid_tanks:item_process\n\n#experience tank\nexecute if entity @s[tag=gm4_lt_experience] if items block ~ ~ ~ container.0 *[minecraft:enchantments~[{enchantments:[\"minecraft:mending\"]}]] run function gm4_mending_tanks:check_item\n"
  },
  {
    "path": "gm4_mending_tanks/data/gm4_mending_tanks/function/repair.mcfunction",
    "content": "#@s = experience liquid tank with item in first slot\n#run from mending_tanks:check_item\n\n\n# we will repair min(Damage, repair_points, max_repair)\nscoreboard players operation $repair gm4_lt_util = @s gm4_lt_value\nexecute if score $repair gm4_lt_util matches ..-1 run scoreboard players set $repair gm4_lt_util 0\n## convert xp points to repair points\nscoreboard players operation $repair gm4_lt_util *= #mt_repair_per_xp gm4_lt_util\nscoreboard players operation $repair gm4_lt_util < $damage gm4_lt_util\nscoreboard players operation $repair gm4_lt_util < #mt_max_repair gm4_lt_util\n\n# subtract $repair from Damage\nscoreboard players operation $damage gm4_lt_util -= $repair gm4_lt_util\nexecute store result block ~ ~ ~ Items[0].components.\"minecraft:damage\" int 1 run scoreboard players get $damage gm4_lt_util\n\n# convert repair cost to xp_points (rounded up) and add to value\nscoreboard players remove $repair gm4_lt_util 1\nscoreboard players operation $repair gm4_lt_util /= #mt_repair_per_xp gm4_lt_util\nscoreboard players add $repair gm4_lt_util 1\n\nscoreboard players operation @s gm4_lt_value -= $repair gm4_lt_util\n"
  },
  {
    "path": "gm4_mending_tanks/data/gm4_mending_tanks/guidebook/mending_tanks.json",
    "content": "{\n  \"id\": \"mending_tanks\",\n  \"name\": \"Mending Tanks\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"liquid_tanks\",\n  \"icon\": {\n    \"id\": \"minecraft:diamond_axe\",\n    \"components\": {\n      \"minecraft:enchantments\": {\n        \"minecraft:mending\": 1\n      }\n    }\n  },\n  \"criteria\": {\n    \"obtain_liquid_tank\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"liquid_tank\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_mending_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"enchantments\": [\n              {\n                \"enchantments\": \"minecraft:mending\"\n              }\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_liquid_tank\"\n        ],\n        [\n          \"obtain_mending_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.mending_tanks.usage\",\n            \"fallback\": \"Items with the Mending enchantment will be reapaired when placed inside an Experience Tank.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_mending_tanks/data/gm4_mending_tanks/test/repair_item.mcfunction",
    "content": "# @template gm4_liquid_tanks:test_setup\n\nitem replace block ~1 ~3 ~1 container.0 with minecraft:experience_bottle 10\n\nawait items block ~1 ~3 ~1 container.* minecraft:glass_bottle\n\nitem replace block ~1 ~3 ~1 container.0 with air\n\nawait delay 1s\n\nitem replace block ~1 ~3 ~1 container.0 with minecraft:elytra[damage=30,enchantments={mending:1}]\n\nawait items block ~1 ~3 ~1 container.0 minecraft:elytra[damage=0]\n"
  },
  {
    "path": "gm4_mending_tanks/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.mending_tanks,Enables Liquid Tanks filled with Experience to repair tools with the mending enchant on them.\ntext.gm4.guidebook.mending_tanks.usage,Items with the Mending enchantment will be reapaired when placed inside an Experience Tank.\n"
  },
  {
    "path": "gm4_metallurgy/README.md",
    "content": "# Metallurgy<!--$headerTitle--><!--$pmc:delete-->\n\nCustom enchantment system for armor and tools. Comes with a builtin set of \"Shamirs\" but can be expanded by other data packs!<!--$pmc:headerSize-->\n\n### Features\n- Block up stone types with TNT to obtain special ores\n- Create a Mould by dropping Clay and Obsidian on a block of Sand\n- After a complex sequence of heating and adding ores, a Shamir will be made\n- Apply Shamirs to tools and armor by using a Piston and Anvil\n\nRead more about all the details on the [Wiki](https://wiki.gm4.co/Metallurgy).\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/chainmail_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/chainmail_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/chainmail_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/chainmail_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/chainmail_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/chainmail_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/diamond_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/diamond_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/diamond_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/diamond_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/diamond_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/diamond_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/elytra.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/elytra_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/elytra.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/gold_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/gold_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/gold_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/gold_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/gold_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/gold_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/iron_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/iron_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/iron_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/iron_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/iron_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/iron_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/leather_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/leather_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/leather_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/leather_layer_1_overlay.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/leather_layer_1_overlay_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/leather_layer_1_overlay.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/leather_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/leather_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/leather_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/leather_layer_2_overlay.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/leather_layer_2_overlay_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/leather_layer_2_overlay.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/netherite_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/netherite_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/netherite_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/netherite_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/netherite_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/netherite_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/turtle_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/aluminium/turtle_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/aluminium/turtle_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/chainmail_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/chainmail_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/chainmail_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/chainmail_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/chainmail_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/chainmail_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/diamond_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/diamond_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/diamond_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/diamond_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/diamond_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/diamond_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/elytra.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/elytra_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/elytra.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/gold_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/gold_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/gold_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/gold_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/gold_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/gold_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/iron_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/iron_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/iron_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/iron_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/iron_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/iron_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/leather_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/leather_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/leather_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/leather_layer_1_overlay.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/leather_layer_1_overlay_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/leather_layer_1_overlay.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/leather_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/leather_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/leather_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/leather_layer_2_overlay.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/leather_layer_2_overlay_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/leather_layer_2_overlay.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/netherite_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/netherite_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/netherite_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/netherite_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/netherite_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/netherite_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/turtle_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barimium/turtle_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barimium/turtle_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/chainmail_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/chainmail_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barium/chainmail_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/chainmail_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/chainmail_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/barium/chainmail_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/diamond_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/diamond_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barium/diamond_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/diamond_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/diamond_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/barium/diamond_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/elytra.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/elytra_anim.png\nto=gm4_metallurgy:optifine/cit/barium/elytra.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/gold_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/gold_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barium/gold_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/gold_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/gold_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/barium/gold_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/iron_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/iron_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barium/iron_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/iron_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/iron_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/barium/iron_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/leather_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/leather_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barium/leather_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/leather_layer_1_overlay.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/leather_layer_1_overlay_anim.png\nto=gm4_metallurgy:optifine/cit/barium/leather_layer_1_overlay.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/leather_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/leather_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/barium/leather_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/leather_layer_2_overlay.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/leather_layer_2_overlay_anim.png\nto=gm4_metallurgy:optifine/cit/barium/leather_layer_2_overlay.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/netherite_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/netherite_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barium/netherite_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/netherite_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/netherite_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/barium/netherite_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/turtle_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/barium/turtle_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/barium/turtle_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/chainmail_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/chainmail_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/chainmail_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/chainmail_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/chainmail_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/chainmail_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/diamond_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/diamond_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/diamond_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/diamond_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/diamond_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/diamond_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/elytra.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/elytra_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/elytra.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/gold_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/gold_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/gold_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/gold_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/gold_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/gold_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/iron_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/iron_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/iron_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/iron_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/iron_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/iron_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/leather_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/leather_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/leather_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/leather_layer_1_overlay.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/leather_layer_1_overlay_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/leather_layer_1_overlay.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/leather_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/leather_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/leather_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/leather_layer_2_overlay.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/leather_layer_2_overlay_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/leather_layer_2_overlay.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/netherite_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/netherite_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/netherite_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/netherite_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/netherite_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/netherite_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/turtle_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/bismuth/turtle_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/bismuth/turtle_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/chainmail_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/chainmail_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/chainmail_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/chainmail_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/chainmail_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/chainmail_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/diamond_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/diamond_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/diamond_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/diamond_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/diamond_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/diamond_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/elytra.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/elytra_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/elytra.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/gold_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/gold_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/gold_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/gold_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/gold_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/gold_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/iron_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/iron_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/iron_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/iron_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/iron_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/iron_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/leather_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/leather_layer_1_overlay.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_1_overlay_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_1_overlay.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/leather_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/leather_layer_2_overlay.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_2_overlay_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_2_overlay.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/netherite_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/netherite_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/netherite_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/netherite_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/netherite_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/netherite_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/spyglass.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/spyglass_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/spyglass.png\nx=0\ny=0\nw=16\nh=16\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/turtle_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/curies_bismium/turtle_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/curies_bismium/turtle_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/chainmail_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/chainmail_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/chainmail_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/chainmail_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/chainmail_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/chainmail_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/diamond_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/diamond_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/diamond_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/diamond_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/diamond_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/diamond_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/elytra.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/elytra_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/elytra.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/gold_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/gold_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/gold_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/gold_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/gold_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/gold_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/iron_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/iron_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/iron_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/iron_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/iron_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/iron_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/leather_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/leather_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/leather_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/leather_layer_1_overlay.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/leather_layer_1_overlay_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/leather_layer_1_overlay.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/leather_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/leather_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/leather_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/leather_layer_2_overlay.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/leather_layer_2_overlay_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/leather_layer_2_overlay.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/netherite_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/netherite_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/netherite_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/netherite_layer_2.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/netherite_layer_2_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/netherite_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/turtle_layer_1.properties",
    "content": "from=gm4_metallurgy:optifine/cit/thorium/turtle_layer_1_anim.png\nto=gm4_metallurgy:optifine/cit/thorium/turtle_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=54\ntile.1=0\nduration.1=1\ntile.2=1\nduration.2=1\ntile.3=2\nduration.3=1\ntile.4=3\nduration.4=1\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/cit/barimium/trident.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/cit/curies_bismium/spyglass.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/cit/curies_bismium/trident.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/optifine/cit/thorium/trident.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/axe.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/boots.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/broken_elytra.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/chestplate.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/elytra.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/helmet.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/hoe.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/leather_leggings.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/leggings.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/netherite_helmet.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/pickaxe.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/shears.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/shovel.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/turtle_helmet.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barimium/compass.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barimium/hoe.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barimium/sword.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barimium/trident.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barium/axe.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barium/chestplate.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barium/compass.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barium/hoe.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barium/pickaxe.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barium/shovel.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/bismuth/axe.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/bismuth/boots.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/bismuth/fishing_rod.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/bismuth/pickaxe.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/bismuth/shovel.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/bismuth/sword.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/axe.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/boots.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/bow.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/broken_elytra.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/bucket.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/chestplate.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/clock.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/compass.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/crossbow.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/elytra.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/fishing_rod.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/flint_and_steel.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/helmet.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/hoe.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/leather_leggings.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/leggings.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/netherite_helmet.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/pickaxe.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/shears.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/shovel.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/spyglass.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/sword.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/trident.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t\t{\n\t\t\t\t\"index\": 0,\n\t\t\t\t\"time\": 55\n\t\t\t},\n\t\t\t1,\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/turtle_helmet.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/thorium/boots.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/thorium/sword.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/thorium/trident.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3]\t\n\t} \n}"
  },
  {
    "path": "gm4_metallurgy/assets/model_data.yaml",
    "content": "model_data:\n  - item: player_head\n    template: generated\n    broadcast:\n      - textures: item/band/mundane_band\n        reference: item/mundane_band\n      - reference: item/lump/baryte\n      - reference: item/lump/bauxite\n      - reference: item/lump/bismutite\n      - reference: item/lump/thorianite\n  - item: player_head\n    template: vanilla\n    broadcast:\n      - reference: block/mould/cool_empty\n      - reference: block/mould/hot_empty\n      - reference: block/mould/cool_metal\n      - reference: block/mould/hot_metal\n  - item: obsidian\n    reference: item/slightly_damaged_obsidian\n    template: vanilla\n  - reference: shamir/defuse\n    item: armor\n    template: \n      name: shamir\n      metal: aluminium\n      textures_path: item/shamir/aluminium\n  - reference: shamir/moneo\n    item: [tools, elytra, shears]\n    template: \n      name: shamir\n      metal: aluminium\n      textures_path: item/shamir/aluminium\n  - reference: shamir/arborenda\n    item: axes\n    template: \n      name: shamir\n      metal: barium\n      textures_path: item/shamir/barium\n  - reference: shamir/sensus\n    item: compass\n    template: \n      name: shamir\n      metal: barium\n      textures_path: item/shamir/barium\n  - reference: shamir/gemini\n    item: hoes\n    template: \n      name: shamir\n      metal: barimium\n      textures_path: item/shamir/barimium\n  - reference: shamir/musical\n    item: [swords, trident]\n    template: \n      name: shamir\n      metal: barimium\n      textures_path: item/shamir/barimium\n  - reference: shamir/forterra\n    item: pickaxes\n    template: \n      name: shamir\n      metal: bismuth\n      textures_path: item/shamir/bismuth\n  - reference: shamir/hypexperia\n    item: [swords, pickaxes, axes, shovels, fishing_rod]\n    template: \n      name: shamir\n      metal: bismuth\n      textures_path: item/shamir/bismuth\n  - reference: shamir/vibro\n    item: boots\n    template: \n      name: shamir\n      metal: thorium\n      textures_path: item/shamir/thorium\n  - reference: shamir/ender_bolt\n    item: [swords, trident]\n    template: \n      name: shamir\n      metal: thorium\n      textures_path: item/shamir/thorium\n  - reference: shamir/infinitas\n    item: buckets\n    template: \n      name: shamir\n      metal: curies_bismium\n      textures_path: item/shamir/curies_bismium\n  - reference: shamir/tinker\n    item: [pickaxes, shovels, hoes, swords]\n    template: \n      name: shamir\n      metal: curies_bismium\n      textures_path: item/shamir/curies_bismium\n  - item: lava_bucket\n    reference: gui/advancement/metallurgy_overheat_cast\n    template: advancement\n  - item: player_head\n    reference: gui/advancement/metallurgy_blast_ore\n    template:\n      name: advancement\n      forward: item/lump/bauxite\n  - item: player_head\n    reference: gui/advancement/metallurgy_cast\n    template:\n      name: advancement\n      forward: shamir/defuse/band\n"
  },
  {
    "path": "gm4_metallurgy/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.metallurgy.blast_ore.description,Blast open some rock and find the metal within.\nadvancement.gm4.metallurgy.blast_ore.title,How Ad-ore-able\nadvancement.gm4.metallurgy.cast.description,Create a mould and add some metal.\nadvancement.gm4.metallurgy.cast.title,Firebender\nadvancement.gm4.metallurgy.overheat_cast.description,Destroy a mould containing molten metal.\nadvancement.gm4.metallurgy.overheat_cast.title,Blame Me for the Mess\nitem.gm4.metallurgy.aluminium,Aluminium\nitem.gm4.metallurgy.band,%s Band\nitem.gm4.metallurgy.barimium,Barimium\nitem.gm4.metallurgy.barium,Barium\nitem.gm4.metallurgy.baryte_lump,Baryte Lump\nitem.gm4.metallurgy.bauxite_lump,Bauxite Lump\nitem.gm4.metallurgy.mundane_band,Mundane Band\nitem.gm4.metallurgy.obsidian_cast,Obsidian Cast\nitem.gm4.metallurgy.shamir,Shamir\nitem.gm4.metallurgy.thorianite_lump,Thorianite Lump\nitem.gm4.metallurgy.thorium,Thorium\nitem.gm4.shamir.arborenda,Arborenda Shamir\nitem.gm4.shamir.defuse,Defuse Shamir\nitem.gm4.shamir.ender_bolt,Ender Bolt Shamir\nitem.gm4.shamir.forterra,Forterra Shamir\nitem.gm4.shamir.gemini,Gemini Shamir\nitem.gm4.shamir.hypexperia,Hypexperia Shamir\nitem.gm4.shamir.moneo,Moneo Shamir\nitem.gm4.shamir.musical,Musical Shamir\nitem.gm4.shamir.sensus,Sensus Shamir\nitem.gm4.shamir.tinker,Tinker Shamir\nitem.gm4.slightly_damaged_obsidian,Slightly Damaged Obsidian\nitem.gm4.slightly_overheated_obsidian,Slightly Overheated Obsidian\ntext.gm4.metallurgy.aluminium,Aluminium\ntext.gm4.metallurgy.barium,Barium\ntext.gm4.metallurgy.contains,Contains \ntext.gm4.metallurgy.thorium,Thorium\nitem.gm4.shamir.vibro,Vibro Shamir\ntext.gm4.metallurgy.copper,Copper\nitem.gm4.metallurgy.malachite_lump,Malachite Lump\nitem.gm4.shamir.infinitas,Infinitas Shamir\nitem.gm4.metallurgy.curies_bismium,Curie's Bismium\nitem.gm4.metallurgy.bismuth.red,B\nitem.gm4.metallurgy.bismuth.orange,i\nitem.gm4.metallurgy.bismuth.yellow,s\nitem.gm4.metallurgy.bismuth.green,m\nitem.gm4.metallurgy.bismuth.blue,u\nitem.gm4.metallurgy.bismuth.purple,t\nitem.gm4.metallurgy.bismuth.magenta,h\nitem.gm4.metallurgy.bismuth_band.red,Bi\nitem.gm4.metallurgy.bismuth_band.orange,sm\nitem.gm4.metallurgy.bismuth_band.yellow,ut\nitem.gm4.metallurgy.bismuth_band.green,\"h \"\nitem.gm4.metallurgy.bismuth_band.blue,Ba\nitem.gm4.metallurgy.bismuth_band.purple,nd\nitem.gm4.metallurgy.bismuth_band.magenta,\\u200c\nitem.gm4.metallurgy.thorium_brass,Thorium Brass\nitem.gm4.metallurgy.bismutite_lump,Bismutite Lump\nitem.gm4.metallurgy.copper,Copper\ntext.gm4.guidebook.module_desc.arborenda_shamir,\"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\"\ntext.gm4.guidebook.arborenda_shamir.description,Arborenda boosts a single swing to be able to knock down an entire tree.\ntext.gm4.guidebook.arborenda_shamir.usage,\"The Arborenda Shamir is found on Barium Bands. It can be placed onto axes.\\n\\nWhen mining a log, the entire tree will also break, taking up durability of the axe for each log broken.\"\ntext.gm4.guidebook.module_desc.defuse_shamir,\"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\"\ntext.gm4.guidebook.defuse_shamir.description,Defuse prevents nearby Creepers from exploding.\ntext.gm4.guidebook.defuse_shamir.usage,\"The Defuse Shamir is found on Aluminium Bands. It can be placed onto armour.\\n\\nNearby creepers will become defused, and will never be able to explode.\"\ntext.gm4.guidebook.module_desc.ender_bolt_shamir,\"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\"\ntext.gm4.guidebook.ender_bolt_shamir.description,Ender Bolt creates a damaging wither chain when attacking a mob.\ntext.gm4.guidebook.ender_bolt_shamir.usage,\"The Ender Bolt Shamir is found on Thorium Bands. It can be placed onto swords and tridents.\\n\\nA mob hit will Ender Bolt will wither away, passing the effect to other nearby mobs.\"\ntext.gm4.guidebook.module_desc.forterra_shamir,\"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\"\ntext.gm4.guidebook.forterra_shamir.description,\"Forterra causes extra raw metals, redstone, and amethyst to be found when mining stone.\"\ntext.gm4.guidebook.forterra_shamir.usage,\"The Forterra Shamir is found on Bismuth Bands. It can be placed onto pickaxes.\\n\\nWhen mining stone, raw copper, raw iron, raw gold, redstone, and amethyst shards will drop. Drop rates are height dependent.\"\ntext.gm4.guidebook.module_desc.gemini_shamir,\"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\"\ntext.gm4.guidebook.gemini_shamir.description,Gemini modifies breeding to always produce twins.\ntext.gm4.guidebook.gemini_shamir.usage,The Gemini Shamir is found on Barimium Bands. It can be placed onto hoes.\\n\\nHolding the hoe in the offhand will cause any bred animals to produce identical twins.\ntext.gm4.guidebook.module_desc.hypexperia_shamir,\"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\"\ntext.gm4.guidebook.hypexperia_shamir.description,Hypexperia causes extra experience to drop from all sources of experience orbs.\ntext.gm4.guidebook.hypexperia_shamir.usage,\"The Hypexperia Shamir is found on Bismuth Bands. It can be placed onto tools, swords, and fishing rods.\\n\\nNearby experience orbs will double in value when the item is held.\"\ntext.gm4.guidebook.module_desc.infinitas_shamir,\"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\"\ntext.gm4.guidebook.infinitas_shamir.description,Infinitas items are infinite liquid sources. It also pulls mobs and items towards the user.\ntext.gm4.guidebook.infinitas_shamir.usage,The Infinitas Shamir is found on Curie's Bismium Bands. It can be placed onto empty or filled buckets.\\n\\nInfinitas buckets can be used infinitely and will never get filled (if empty) or drained (if full).\ntext.gm4.guidebook.infinitas_shamir.vacuum,Holding an empty infinitas bucket will attract mobs and items in an 11x11 area.\\n\\nMobs affected by infinitas will be on cooldown until the user moves away or deselects the bucket.\ntext.gm4.guidebook.module_desc.metallurgy,\"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\"\ntext.gm4.guidebook.metallurgy.description,\"Custom abilities, called shamirs, can be added to tools and armour, like enchantments.\\n\\nShamirs are exclusive, meaning only one can be applied to an item at a time.\"\ntext.gm4.guidebook.metallurgy.section.lump_obtaining,Obtaining Ore\ntext.gm4.guidebook.metallurgy.lump_obtaining,\"Blowing up stone-type blocks with tnt will drop metal ore lumps.\\n\\nEach of the four stone types (stone, granite, andesite, and diorite) drop a different metal lump.\"\ntext.gm4.guidebook.metallurgy.section.casting,Casting\ntext.gm4.guidebook.metallurgy.mould,A mould can be created by dropping 1 obsidian and 1 clay ball on a sand block.\\n\\nMoulds must be heated by placing lava on top of them. Overheating a mould causes it to smoke and break.\ntext.gm4.guidebook.metallurgy.mould_1,\"Without lava, the mould will cool over time and must be reheated to added metal.\\n\\nIf no metal is added to the cast before it completely cools down, the obsidian will drop, losing the clay ball.\"\ntext.gm4.guidebook.metallurgy.adding_metal,Ore lumps can be dropped in one by one into a heated mould. 23 ore lumps must be added for a proper cast.\\n\\nAlloys can be made using a 17-6 ratio: Aluminium + Barium or Thorium + Bismuth.\ntext.gm4.guidebook.metallurgy.recycling,\"If a cast is dropped into the mould, it will return the obsidian and about half of its metal will recycled.\\n\\nPure metal bands supply 12 ore of their metal, while alloy metal bands supply 9 primary ore and 3 secondary ore.\"\ntext.gm4.guidebook.metallurgy.cooling,\"Once a mould completely cools down, a Shamir Band will form.\\n\\nIf the casting process was done incorrectly, a useless Mundane Band will be on the cast.\"\ntext.gm4.guidebook.metallurgy.section.shamirs,Shamirs\ntext.gm4.guidebook.metallurgy.metal_properties,\"Each band type has a specific attribute.\\n\\nBismuth is creation, Thorium is destruction, and Curie's Bismium is equivalence.\"\ntext.gm4.guidebook.metallurgy.metal_properties_1,\"Alluminium is supression, Barium is amplification, and Barimium is modification.\"\ntext.gm4.guidebook.metallurgy.smooshing,\"To attach a shamir to an item, drop the cast and item on an anvil.\\n\\n'Smoosh' them together by powering a downwards facing piston placed two blocks above the anvil.\"\ntext.gm4.guidebook.metallurgy.smooshing_1,\"To detach a shamir, do the same 'smooshing' process after dropping the shamir-bearing item and one obsidian.\"\ntext.gm4.guidebook.module_desc.moneo_shamir,\"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\"\ntext.gm4.guidebook.moneo_shamir.description,Moneo slows mining and flying when durability is low.\ntext.gm4.guidebook.moneo_shamir.usage,\"The Moneo Shamir is found on Aluminium Bands. It can be placed onto tools, shears, and elytra.\\n\\nLow durability tools will cause mining fatigue, and low durability elytra will cause slowness and blindness.\"\ntext.gm4.guidebook.module_desc.musical_shamir,\"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\"\ntext.gm4.guidebook.musical_shamir.description,Musical modifies strength and speed based on consecutive mob kills.\ntext.gm4.guidebook.musical_shamir.usage,\"The Musical Shamir is found on Barimium Bands. It can be placed onto swords.\\n\\nWhen killing mobs, music is played and Slowness and Strength I are granted.\"\ntext.gm4.guidebook.musical_shamir.usage_1,\"After many kills, the music will become darker, and Speed and Strength III are granted instead.\"\ntext.gm4.guidebook.module_desc.sensus_shamir,\"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\"\ntext.gm4.guidebook.sensus_shamir.description,\"Sensus enhances mining, by playing sounds from neaby ores.\"\ntext.gm4.guidebook.sensus_shamir.usage,The Sensus Shamir is found on Barium Bands. It can be placed onto compasses.\\n\\nHolding the compass will play sounds from nearby ores in a 7x7x5 area centered at the user.\ntext.gm4.guidebook.module_desc.tinker_shamir,\"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\"\ntext.gm4.guidebook.tinker_shamir.description,Tinker causes items to be converted to their equivalent storage block form.\ntext.gm4.guidebook.tinker_shamir.usage,\"The Tinker Shamir is found on Curie's Bismium Bands. It can be placed onto pickaxes, shovels, hoes, and swords.\\n\\nHolding the tool will convert items into their block form, such as iron ingots to iron blocks.\"\ntext.gm4.guidebook.tinker_shamir.usage_pickaxes,\"Each tool tinkers a set of items, matching the tool.\\n\\nPickaxes will tinker emeralds, diamonds, redstone, coal, lapis, gold ingots, iron ingots, gold nuggets, and iron nuggets.\"\ntext.gm4.guidebook.tinker_shamir.usage_other_tools,Shovels will tinker snow balls and clay balls.\\n\\nHoes will tinker melon slices and wheat.\\n\\nSwords will tinker slime balls.\ntext.gm4.guidebook.module_desc.vibro_shamir,\"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\"\ntext.gm4.guidebook.vibro_shamir.description,Vibro grants high jumps and creates deadly shockwaves.\ntext.gm4.guidebook.vibro_shamir.usage,\"The Vibro Shamir is found on Thorium Bands. It can be placed onto boots.\\n\\nWhen sneaking, users who take fall damage will hurt mobs within a 6 block radius. Damage is based on distance from the user and the blocks between.\"\ntext.gm4.guidebook.vibro_shamir.jump_boost,\"Sneaking on the ground will allow the user to gain temporary jump boost. The level of jump boost is dependent on the sneak time.\\n\\nWhen using the Vibro Jump, the user will take damage when landing.\"\n"
  },
  {
    "path": "gm4_metallurgy/beet.yaml",
    "content": "id: gm4_metallurgy\nname: Metallurgy\nversion: 1.8.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - shamir_model_template\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_lore\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_lore: 1.4.0\n      schedule_loops:\n        - main\n        - tick\n    website:\n      description: Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!\n      recommended:\n        - gm4_resource_pack\n        - gm4_audere_shamir\n        - gm4_fulcio_shamir\n        - gm4_iacio_shamir\n        - gm4_lumos_shamir\n        - gm4_orb_of_ankou\n        - gm4_percurro_shamir\n        - gm4_vecto_shamir\n      notes:\n        - Modifies the stone block loot table. May cause incompatibilities with Datapacks that also modify this loot table.\n      search_keywords: \n        - arborenda\n        - defuse\n        - forterra\n        - gemini\n        - hypexperia\n        - infinitas\n        - moneo\n        - musical\n        - sensus\n        - tinker\n        - vibro\n        - shamir\n    modrinth:\n      project_id: raWyrHxi\n    wiki: https://wiki.gm4.co/wiki/Metallurgy\n    credits:\n      Creators:\n        - Sparks\n        - SpecialBuilder32\n        - Bloo\n        - BPR\n        - SirSheepe\n      Updated by:\n        - Denniss\n        - Misode\n        - Modulorium\n        - TheEpyonProject\n      Textures by:\n        - Memo\n      Icon Design:\n        - DuckJr\n    \n"
  },
  {
    "path": "gm4_metallurgy/data/gm4/advancement/metallurgy_blast_ore.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:player_head\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:gui/advancement/metallurgy_blast_ore\"]},\n        \"minecraft:profile\": \"$gm4_metallurgy:ore/aluminium\"\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.metallurgy.blast_ore.title\",\n      \"fallback\": \"How Ad-ore-able\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.metallurgy.blast_ore.description\",\n      \"fallback\": \"Blast open some rock and find the metal within.\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"pickup_ore\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{item:\\\"ore\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4/advancement/metallurgy_cast.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:player_head\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:gui/advancement/metallurgy_cast\"]},\n        \"minecraft:profile\": \"$gm4_metallurgy:band/aluminium\"\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.metallurgy.cast.title\",\n      \"fallback\": \"Firebender\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.metallurgy.cast.description\",\n      \"fallback\": \"Create a mould and add some metal.\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:metallurgy_blast_ore\",\n  \"criteria\": {\n    \"metallurgy_cast\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4/advancement/metallurgy_overheat_cast.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:lava_bucket\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:gui/advancement/metallurgy_overheat_cast\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.metallurgy.overheat_cast.title\",\n      \"fallback\": \"Blame Me for the Mess\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.metallurgy.overheat_cast.description\",\n      \"fallback\": \"Destroy a mould containing molten metal.\",\n      \"color\": \"gray\"\n    },\n    \"hidden\": true\n  },\n  \"parent\": \"gm4:metallurgy_cast\",\n  \"criteria\": {\n    \"metallurgy_overheat_cast\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/active.mcfunction",
    "content": "# Grants a tag to players holding arborenda. This tag semms to be unused.\n# @s = player with the arborenda shamir in their hands\n# at @s\n# run from metallurgy:shamir_in_hand\n\ntag @s add gm4_has_arborenda\nscoreboard players set $arborenda_active gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/check_item_validity.mcfunction",
    "content": "# @s = band is trying to apply to\n# run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'arborenda'}}] if items entity @s contents #gm4_arborenda_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/init_scoreboards.mcfunction",
    "content": "# @s = unspecified\n# at = unspecified\n# run from gm4_metallurgy:init\n\nscoreboard objectives add gm4_use_axe_net minecraft.used:minecraft.netherite_axe\nscoreboard objectives add gm4_use_axe_dia minecraft.used:minecraft.diamond_axe\nscoreboard objectives add gm4_use_axe_gol minecraft.used:minecraft.golden_axe\nscoreboard objectives add gm4_use_axe_iro minecraft.used:minecraft.iron_axe\nscoreboard objectives add gm4_use_axe_cop minecraft.used:minecraft.copper_axe\nscoreboard objectives add gm4_use_axe_sto minecraft.used:minecraft.stone_axe\nscoreboard objectives add gm4_use_axe_woo minecraft.used:minecraft.wooden_axe\nscoreboard objectives add gm4_arb_depth dummy\nscoreboard objectives add gm4_arb_data dummy\nscoreboard players set #1 gm4_arb_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/player/analyze_axe.mcfunction",
    "content": "# Calculates the speed of the axe used to break blocks.\n# @s = player that just used an axe with arborenda\n# at @s\n# run from gm4_arborenda:player/chop\n\n# safe axe nbt (also used to calculate unbreaking numbers in gm4_arborenda_shamir:player/modify_axe_durability)\ndata modify storage gm4_arborenda_shamir:temp tool set from entity @s SelectedItem\n\n# set base material speed / breaking delay between block breaks\nexecute if score @s gm4_use_axe_net matches 1.. run scoreboard players set $axe_delay gm4_arb_data 5\nexecute if score @s gm4_use_axe_dia matches 1.. run scoreboard players set $axe_delay gm4_arb_data 6\nexecute if score @s gm4_use_axe_gol matches 1.. run scoreboard players set $axe_delay gm4_arb_data 3\nexecute if score @s gm4_use_axe_iro matches 1.. run scoreboard players set $axe_delay gm4_arb_data 8\nexecute if score @s gm4_use_axe_cop matches 1.. run scoreboard players set $axe_delay gm4_arb_data 10\nexecute if score @s gm4_use_axe_sto matches 1.. run scoreboard players set $axe_delay gm4_arb_data 13\nexecute if score @s gm4_use_axe_woo matches 1.. run scoreboard players set $axe_delay gm4_arb_data 22\n\n# efficiency bonus (simplified formula, does not match vanilla)\nexecute store result score $efficiency_level gm4_arb_data run data get storage gm4_arborenda_shamir:temp tool.components.\"minecraft:enchantments\".\"minecraft:efficiency\"\nscoreboard players operation $axe_delay gm4_arb_data -= $efficiency_level gm4_arb_data\n\n# limit to min delay of 1 tick between block breaks\nscoreboard players operation $axe_delay gm4_arb_data > #1 gm4_arb_data\n\n# calculate max depth\nscoreboard players set $max_depth gm4_arb_data 32\nscoreboard players operation $max_depth gm4_arb_data *= $axe_delay gm4_arb_data\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/player/check_for_axe.mcfunction",
    "content": "# Checks whether the player has used an arborenda axe.\n# @s = all players\n# at world spawn\n# run from gm4_metallurgy:tick\n\nexecute if entity @s[scores={gm4_use_axe_net=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop\nexecute if entity @s[scores={gm4_use_axe_dia=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop\nexecute if entity @s[scores={gm4_use_axe_gol=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop\nexecute if entity @s[scores={gm4_use_axe_cop=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop\nexecute if entity @s[scores={gm4_use_axe_iro=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop\nexecute if entity @s[scores={gm4_use_axe_sto=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop\nexecute if entity @s[scores={gm4_use_axe_woo=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop\nscoreboard players reset @s gm4_use_axe_net\nscoreboard players reset @s gm4_use_axe_dia\nscoreboard players reset @s gm4_use_axe_gol\nscoreboard players reset @s gm4_use_axe_cop\nscoreboard players reset @s gm4_use_axe_iro\nscoreboard players reset @s gm4_use_axe_sto\nscoreboard players reset @s gm4_use_axe_woo\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/player/chop.mcfunction",
    "content": "# Starts arborenda chopping sequence.\n# @s = player that just used an axe with arborenda\n# at @s\n# run from gm4_arborenda:player/check_for_axe\n\n# place marker on first trunk block\nscoreboard players set $success gm4_arb_data 0\nexecute as @e[type=item,limit=1,distance=..5,sort=nearest,nbt={Age:0s}] at @s store success score $success gm4_arb_data \\\n  if items entity @s container.* #gm4_arborenda_shamir:trunks align xyz run summon marker ~0.5 ~0.5 ~0.5 {Tags:[gm4_arborenda_trunk_source,gm4_arborenda_trunk,gm4_arborenda_init]}\n\n# identify axe (used for enchantment support)\nexecute if score $success gm4_arb_data matches 1 run function gm4_arborenda_shamir:player/analyze_axe\n\n# identify tree\nscoreboard players set $chop_count gm4_arb_data -1\nscoreboard players set $current_depth gm4_arb_data 0\nexecute if score $success gm4_arb_data matches 1 run function gm4_arborenda_shamir:trunk/next_depth\n\n# chop tree and use durability\nexecute if score $chop_count gm4_arb_data matches 1.. run function gm4_arborenda_shamir:player/modify_axe_durability\nexecute if score $chop_count gm4_arb_data matches 1.. run schedule function gm4_arborenda_shamir:trunk/destroy_sequenced 1t\n\n# kill first trunk marker (does not need to be processed by module, as it was already broken by the axe itself)\nkill @e[type=marker,tag=gm4_arborenda_trunk_source]\n\n# clear storage\ndata remove storage gm4_arborenda_shamir:temp tool\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/player/modify_axe_durability.mcfunction",
    "content": "# Reduces the durability on an arborenda axe according to the amount of blocks broken.\n# @s = player that just used an axe with arborenda\n# at @s\n# run from gm4_arborenda:player/chop\n\n# get max damage - 1 for material type\nexecute if score @s gm4_use_axe_net matches 1.. run scoreboard players set $max_damage gm4_arb_data 2030\nexecute if score @s gm4_use_axe_dia matches 1.. run scoreboard players set $max_damage gm4_arb_data 1560\nexecute if score @s gm4_use_axe_gol matches 1.. run scoreboard players set $max_damage gm4_arb_data 31\nexecute if score @s gm4_use_axe_iro matches 1.. run scoreboard players set $max_damage gm4_arb_data 249\nexecute if score @s gm4_use_axe_cop matches 1.. run scoreboard players set $max_damage gm4_arb_data 189\nexecute if score @s gm4_use_axe_sto matches 1.. run scoreboard players set $max_damage gm4_arb_data 130\nexecute if score @s gm4_use_axe_woo matches 1.. run scoreboard players set $max_damage gm4_arb_data 58\n\n# get unbreaking level\nexecute store result score $unbreaking_level gm4_arb_data run data get storage gm4_arborenda_shamir:temp tool.components.\"minecraft:enchantments\".\"minecraft:unbreaking\"\nscoreboard players add $unbreaking_level gm4_arb_data 1\nscoreboard players set $damage_chance gm4_arb_data 100\nscoreboard players operation $damage_chance gm4_arb_data /= $unbreaking_level gm4_arb_data\n\n# calclulate and apply damage\nexecute store result score $current_damage gm4_arb_data run data get storage gm4_arborenda_shamir:temp tool.components.\"minecraft:damage\"\nexecute store result score $incoming_damage gm4_arb_data run loot spawn ~ -4096 ~ loot gm4_arborenda_shamir:roll_binomial_distribution\nscoreboard players operation $current_damage gm4_arb_data += $incoming_damage gm4_arb_data\nscoreboard players operation $current_damage gm4_arb_data < $max_damage gm4_arb_data\n\nexecute store result storage gm4_arborenda_shamir:temp damage int 1 run scoreboard players get $current_damage gm4_arb_data\nfunction gm4_arborenda_shamir:player/set_damage with storage gm4_arborenda_shamir:temp\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/player/set_damage.mcfunction",
    "content": "# run from player/modify_axe_durability\n\n$item modify entity @s weapon.mainhand {function:\"minecraft:set_components\",components:{\"minecraft:damage\":$(damage)}}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n# run from metallurgy:casting/summon_band/barium via #gm4_metallurgy:summon_band/barium\n\nloot spawn ~ ~ ~ loot gm4_arborenda_shamir:band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/check_depth.mcfunction",
    "content": "# Checks whether the trunk block should be destroyed.\n# @s = trunk marker with depth score\n# at @s\n# run from gm4_arborenda_shamir:trunk/destroy_sequenced\n\n# destroy this trunk if depth is negative\nexecute if score @s gm4_arb_depth matches ..0 at @s run function gm4_arborenda_shamir:trunk/destroy_block\n\n# reschedule gm4_arborenda_shamir:trunk/destroy_sequenced\nschedule function gm4_arborenda_shamir:trunk/destroy_sequenced 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/destroy_block.mcfunction",
    "content": "# Destroys the block at a trunks location and kills the marker.\n# @s = trunk marker\n# at @s\n# run from gm4_arborenda_shamir:trunk/check_depth\n\nexecute if block ~ ~ ~ #gm4_arborenda_shamir:trunks run setblock ~ ~ ~ air destroy\nkill @s\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/destroy_sequenced.mcfunction",
    "content": "# Destroys marked trunk block one by one according to their depth score (in sequence).\n# @s = none\n# at world spawn\n# scheduled from gm4_arborenda_shamir:player/chop and self via gm4_arborenda_shamir:trunk/check_depth if trunk markers remain\n\nscoreboard players remove @e[type=marker,tag=gm4_arborenda_trunk] gm4_arb_depth 1\nexecute as @e[type=marker,tag=gm4_arborenda_trunk,scores={gm4_arb_depth=-2147483648..2147483647}] run function gm4_arborenda_shamir:trunk/check_depth\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/neighbors/mark.mcfunction",
    "content": "# Checks for adjacent trunk blocks and summons a marker at their locations.\n# @s = trunk marker on the furthest depth (with gm4_arborenda_init tag)\n# at @s\n# run from gm4_arborenda_shamir:trunk/next_depth\n\nexecute positioned ~ ~1 ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\n\nexecute positioned ~1 ~ ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~-1 ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~ ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~-1 ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~-1 ~ ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~-1 ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~ ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~-1 ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\n\nexecute positioned ~1 ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~-1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~-1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~1 ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~-1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~-1 ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~-1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~-1 ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\n\nexecute positioned ~ ~1 ~ unless block ~ ~ ~ #gm4_arborenda_shamir:trunks run function gm4_arborenda_shamir:trunk/neighbors/mark_top\n\nexecute if block ~ ~ ~ #gm4_arborenda_shamir:foliage positioned ~ ~-1 ~ run function gm4_arborenda_shamir:trunk/neighbors/mark_bottom\n\nscoreboard players add $chop_count gm4_arb_data 1\ntag @s remove gm4_arborenda_init\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/neighbors/mark_bottom.mcfunction",
    "content": "# Breaks fungus cap foliage and mangrove roots from the top to the bottom.\n# @s = trunk marker within foliage (#gm4_arborenda_shamir:foliage)\n# at @s positioned ~ ~-1 ~\n# run from gm4_arborenda_shamir:trunk/neighbors/mark\n\nexecute if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\n\nexecute positioned ~1 ~ ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~ ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~-1 ~ ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~ ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\n\nexecute positioned ~1 ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~-1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~-1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~1 ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~-1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~-1 ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~-1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~-1 ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/neighbors/mark_top.mcfunction",
    "content": "# Checks for adjacent trunk blocks generated diagonally above a trunk.\n# @s = trunk marker on the furthest depth without a log above it\n# at @s positioned ~ ~1 ~\n# run from gm4_arborenda_shamir:trunk/neighbors/mark\n\nexecute positioned ~1 ~ ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~ ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~-1 ~ ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~ ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\n\nexecute positioned ~1 ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~-1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~-1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~1 ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~-1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~-1 ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~-1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\nexecute positioned ~-1 ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:\"gm4_arborenda_trunk\",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/next_depth.mcfunction",
    "content": "# Recurses over connected trunk blocks to summon a marker at each.\n# @s = player that just used an axe with arborenda\n# at @s\n# run from gm4_arborenda:player/chop and self\n\nexecute as @e[type=marker,tag=gm4_arborenda_init] at @s run function gm4_arborenda_shamir:trunk/neighbors/mark\n\n# finish the new trunk markers\nexecute store result score @e[type=marker,tag=gm4_arborenda_init] gm4_arb_depth run scoreboard players operation $current_depth gm4_arb_data += $axe_delay gm4_arb_data\nexecute if score $current_depth gm4_arb_data <= $max_depth gm4_arb_data if score $chop_count gm4_arb_data matches ..256 if entity @e[type=marker,tag=gm4_arborenda_init] run function gm4_arborenda_shamir:trunk/next_depth\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/guidebook/arborenda_shamir.json",
    "content": "{\n  \"id\": \"arborenda_shamir\",\n  \"name\": \"Arborenda Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"metallurgy\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Arborenda_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_arborenda_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'arborenda'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_arborenda_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'arborenda'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.arborenda_shamir.description\",\n            \"fallback\": \"Arborenda boosts a single swing to be able to knock down an entire tree.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_arborenda_shamir\",\n          \"obtain_arborenda_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.arborenda_shamir.usage\",\n            \"fallback\": \"The Arborenda Shamir is found on Barium Bands. It can be placed onto axes.\\n\\nWhen mining a log, the entire tree will also break, taking up durability of the axe for each log broken.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:barium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:shamir/arborenda\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'arborenda'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.arborenda\",\n                                    \"fallback\": \"Arborenda Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/loot_table/roll_binomial_distribution.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": {\n                \"type\": \"minecraft:binomial\",\n                \"n\": {\n                    \"type\": \"minecraft:score\",\n                    \"target\": {\n                        \"type\": \"minecraft:fixed\",\n                        \"name\": \"$chop_count\"\n                    },\n                    \"score\": \"gm4_arb_data\"\n                },\n                \"p\": {\n                    \"type\": \"minecraft:score\",\n                    \"target\": {\n                        \"type\": \"minecraft:fixed\",\n                        \"name\": \"$damage_chance\"\n                    },\n                    \"score\": \"gm4_arb_data\",\n                    \"scale\": 0.01\n                }\n            },\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:stone\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": 0\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/tags/block/foliage.json",
    "content": "{\n\t\"values\": [\n\t\t\"#minecraft:wart_blocks\",\n\t\t\"minecraft:mangrove_roots\",\n\t\t\"minecraft:shroomlight\"\n\t]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/tags/block/trunks.json",
    "content": "{\n\t\"values\": [\n\t\t\"#gm4_arborenda_shamir:foliage\",\n\t\t\"minecraft:acacia_log\",\n\t\t\"minecraft:acacia_wood\",\n\t\t\"minecraft:birch_log\",\n\t\t\"minecraft:birch_wood\",\n\t\t\"minecraft:cherry_log\",\n\t\t\"minecraft:cherry_wood\",\n\t\t\"minecraft:crimson_stem\",\n\t\t\"minecraft:crimson_hyphae\",\n\t\t\"minecraft:dark_oak_log\",\n\t\t\"minecraft:dark_oak_wood\",\n\t\t\"minecraft:jungle_log\",\n\t\t\"minecraft:jungle_wood\",\n\t\t\"minecraft:mangrove_log\",\n\t\t\"minecraft:mangrove_wood\",\n\t\t\"minecraft:oak_log\",\n\t\t\"minecraft:oak_wood\",\n\t\t\"minecraft:pale_oak_log\",\n\t\t\"minecraft:pale_oak_wood\",\n\t\t\"minecraft:spruce_log\",\n\t\t\"minecraft:spruce_wood\",\n\t\t\"minecraft:warped_stem\",\n\t\t\"minecraft:warped_hyphae\"\n\t]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/tags/item/trunks.json",
    "content": "{\n\t\"values\": [\n\t\t\"minecraft:acacia_log\",\n\t\t\"minecraft:acacia_wood\",\n\t\t\"minecraft:birch_log\",\n\t\t\"minecraft:birch_wood\",\n\t\t\"minecraft:cherry_log\",\n\t\t\"minecraft:cherry_wood\",\n\t\t\"minecraft:crimson_stem\",\n\t\t\"minecraft:crimson_hyphae\",\n\t\t\"minecraft:dark_oak_log\",\n\t\t\"minecraft:dark_oak_wood\",\n\t\t\"minecraft:jungle_log\",\n\t\t\"minecraft:jungle_wood\",\n\t\t\"minecraft:mangrove_log\",\n\t\t\"minecraft:mangrove_roots\",\n\t\t\"minecraft:mangrove_wood\",\n\t\t\"minecraft:oak_log\",\n\t\t\"minecraft:oak_wood\",\n\t\t\"minecraft:pale_oak_log\",\n\t\t\"minecraft:pale_oak_wood\",\n\t\t\"minecraft:spruce_log\",\n\t\t\"minecraft:spruce_wood\",\n\t\t\"minecraft:warped_stem\",\n\t\t\"minecraft:warped_hyphae\"\n\t]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:axes\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_arborenda_shamir/test/chop.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1.5 ~1 ~0.5\n\nsetblock ~1 ~ ~1 dirt\nsetblock ~1 ~1 ~1 birch_log\nsetblock ~1 ~2 ~1 birch_log\nsetblock ~1 ~3 ~1 birch_log\nsetblock ~1 ~4 ~2 birch_log\n\ngive @s minecraft:iron_axe[damage=10,custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:\"arborenda\"}}]\n\ndummy @s mine ~1 ~2 ~1\n\nawait delay 2s\n\nassert block ~1 ~1 ~1 birch_log\nassert block ~1 ~2 ~1 air\nassert block ~1 ~3 ~1 air\nassert block ~1 ~4 ~2 air\n\nassert items entity @s weapon.mainhand *[damage=13]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_defuse_shamir/function/active.mcfunction",
    "content": "#@s = at players wearing a defuse armor piece\n#run from active\nexecute as @e[type=creeper,tag=!smithed.entity,distance=..6] run data merge entity @s {Fuse:32767s,ExplosionRadius:0}\ntag @e[type=bat,tag=!smithed.entity,distance=..6] add gm4_defused_bat\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_defuse_shamir/function/check_item_validity.mcfunction",
    "content": "#@s = band is trying to apply to\n#run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'defuse'}}] if items entity @s contents #gm4_defuse_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_defuse_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/aluminium via #gm4_metallurgy:summon_band/aluminium\n\nloot spawn ~ ~ ~ loot gm4_defuse_shamir:band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_defuse_shamir/guidebook/defuse_shamir.json",
    "content": "{\n  \"id\": \"defuse_shamir\",\n  \"name\": \"Defuse Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"metallurgy\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Defuse_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_defuse_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'defuse'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_defuse_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'defuse'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.defuse_shamir.description\",\n            \"fallback\": \"Defuse prevents nearby Creepers from exploding.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_defuse_shamir\",\n          \"obtain_defuse_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.defuse_shamir.usage\",\n            \"fallback\": \"The Defuse Shamir is found on Aluminium Bands. It can be placed onto armour.\\n\\nNearby creepers will become defused, and will never be able to explode.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_defuse_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:aluminium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:shamir/defuse\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'defuse'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.defuse\",\n                                    \"fallback\": \"Defuse Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_defuse_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:foot_armor\",\n    \"#minecraft:leg_armor\",\n    \"#minecraft:chest_armor\",\n    \"#minecraft:head_armor\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_defuse_shamir/test/creeper_defused.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1.5 ~1 ~0.5\n\nitem replace entity @s armor.chest with iron_chestplate[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:\"defuse\"}}]\n\nsummon creeper ~1.5 ~1 ~2.5\n\nawait delay 5s\n\nassert entity @e[type=creeper] inside\nassert entity @s[nbt={Health:20f}]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/advancement/join.json",
    "content": "{\n    \"criteria\": {\n        \"join_world\": {\n            \"trigger\": \"location\"\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_ender_bolt_shamir:id/assign_player\"\n    }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/advancement/use.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:player_hurt_entity\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:entity_properties\",\n                        \"entity\": \"this\",\n                        \"predicate\": {\n                            \"equipment\": {\n                                \"mainhand\": {\n                                    \"items\": \"#gm4_ender_bolt_shamir:valid_items\",\n                                    \"predicates\": {\n                                      \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"ender_bolt\\\"}}\"\n                                    }\n                                }\n                            }\n                        }\n                    }\n                ],\n                \"entity\": []\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_ender_bolt_shamir:infection/start\"\n    }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/function/check_item_validity.mcfunction",
    "content": "#@s = band is trying to apply to\n#run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'ender_bolt'}}] if items entity @s contents #gm4_ender_bolt_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/function/id/assign_pet.mcfunction",
    "content": "# gives pets the ender bolt id of their owner\n# @s = a pat that has not yet received an ender bolt id\n# run from gm4_ender_bolt_shamir:infection/check_ignore_list\n\nexecute store result score @s gm4_ender_bolt_own_id run data get entity @s Owner[3]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/function/id/assign_player.mcfunction",
    "content": "# @s = player who joined for the first time\n# run from advancement gm4_ender_bolt_shamir:join\n\nexecute store result score @s gm4_ender_bolt_own_id run data get entity @s UUID[3]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/active.mcfunction",
    "content": "# manages the ender bolt infection on infected entities\n# @s = entitiy infected with ender bolt\n# at @s\n# run from gm4_metallurgy:main\n\n# manage infection\nscoreboard players remove @s gm4_bolt_time 1\nexecute if score @s gm4_bolt_time matches -40 run function gm4_ender_bolt_shamir:infection/end\n\n# ender bolt effects\nparticle portal ~ ~ ~ .1 .5 .1 .8 10\nexecute if score @s gm4_bolt_time matches 1.. run function gm4_ender_bolt_shamir:infection/symptoms\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/check_ignore_list.mcfunction",
    "content": "# analyzes an entity that is about to be infected with ender bolt\n# @s = a living entity that is not an armor stand\n# at source of infection\n# run from infection/spread\n\n# store id of pet owner as own id for pets (in case they haven't been processed yet)\nexecute unless score @s gm4_ender_bolt_own_id matches -2147483648..2147483647 if entity @s[type=#gm4_ender_bolt_shamir:pets] if data entity @s Owner run function gm4_ender_bolt_shamir:id/assign_pet\n\n# start infection\nexecute if score $enable_pvp gm4_ender_bolt_foreign_id matches 0 unless score @s gm4_ender_bolt_own_id matches -2147483648..2147483647 run function gm4_ender_bolt_shamir:infection/infect\nexecute if score $enable_pvp gm4_ender_bolt_foreign_id matches 1 unless score @s gm4_ender_bolt_own_id = $source gm4_ender_bolt_foreign_id run function gm4_ender_bolt_shamir:infection/infect\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/end.mcfunction",
    "content": "# ends the ender bolt infection on an entity\n# @s = entitiy infected with ender bolt, at end of infection\n# at @s\n# run from gm4_ender_bolt_shamir:infection/active\n\nscoreboard players reset @s gm4_bolt_time\nscoreboard players reset @s gm4_ender_bolt_foreign_id\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/infect.mcfunction",
    "content": "# starts ender bolt on an entity\n# @s = a living entity that is not an armor stand\n# at source of infection\n# run from infection/check_ignore_list\n\n# get and store origin id\nscoreboard players operation @s gm4_ender_bolt_foreign_id = $source gm4_ender_bolt_foreign_id\n\n# apply ender bolt\nscoreboard players set @s gm4_bolt_time 10\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/spread.mcfunction",
    "content": "# spreads ender bolt to nearby entities\n# @s = varies, either player starting ender bolt or an infected entity\n# at @s\n# run from infection/start and infection/active\n\n# remember infection source id\nscoreboard players operation $source gm4_ender_bolt_foreign_id = @s gm4_ender_bolt_foreign_id\n\n# spread\nexecute as @e[distance=..1.6,type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict] unless score @s gm4_bolt_time matches -40.. run function gm4_ender_bolt_shamir:infection/check_ignore_list\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/start.mcfunction",
    "content": "# starts ender bolt on nearby entities\n# @s = player using ender bolt (dealt damage)\n# at @s\n# run from advancement gm4_ender_bolt_shamir:use\n\n# revoke advancement\nadvancement revoke @s only gm4_ender_bolt_shamir:use\n\n# spread\nscoreboard players operation @s gm4_ender_bolt_foreign_id = @s gm4_ender_bolt_own_id\nexecute if entity @s[gamemode=!spectator] positioned ^ ^ ^2 run function gm4_ender_bolt_shamir:infection/spread\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/symptoms.mcfunction",
    "content": "# applies ender bolt symptoms to infected entities\n# @s = entitiy infected with ender bolt\n# at @s\n# run from infection/active\n\n# additional particles and damage\nparticle portal ~ ~ ~ .1 .5 .1 .8 10\neffect give @s wither 2 0 true\n\n# spread\nfunction gm4_ender_bolt_shamir:infection/spread\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/thorium via #gm4_metallurgy:summon_band/thorium\n\nloot spawn ~ ~ ~ loot gm4_ender_bolt_shamir:band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/guidebook/ender_bolt_shamir.json",
    "content": "{\n  \"id\": \"ender_bolt_shamir\",\n  \"name\": \"Ender Bolt Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"metallurgy\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Ender_Bolt_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_ender_bolt_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'ender_bolt'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_ender_bolt_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'ender_bolt'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.ender_bolt_shamir.description\",\n            \"fallback\": \"Ender Bolt creates a damaging wither chain when attacking a mob.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_ender_bolt_shamir\",\n          \"obtain_ender_bolt_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.ender_bolt_shamir.usage\",\n            \"fallback\": \"The Ender Bolt Shamir is found on Thorium Bands. It can be placed onto swords and tridents.\\n\\nA mob hit will Ender Bolt will wither away, passing the effect to other nearby mobs.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:thorium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:shamir/ender_bolt\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'ender_bolt'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.ender_bolt\",\n                                    \"fallback\": \"Ender Bolt Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/tags/entity_type/pets.json",
    "content": "{\n    \"values\": [\n        \"minecraft:cat\",\n        \"minecraft:donkey\",\n        \"minecraft:horse\",\n        \"minecraft:llama\",\n        \"minecraft:mule\",\n        \"minecraft:nautilus\",\n        \"minecraft:parrot\",\n        \"minecraft:skeleton_horse\",\n        \"minecraft:trader_llama\",\n        \"minecraft:wolf\",\n        \"minecraft:zombie_horse\"\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:swords\",\n    \"minecraft:mace\",\n    \"minecraft:trident\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_ender_bolt_shamir/test/infect_and_spread.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~0.5 ~1 ~0.5\n\ngive @s iron_sword[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:\"ender_bolt\"}}]\n\nawait delay 1s\n\nsummon pig ~0.5 ~1 ~2.5 {NoAI:1b}\ndummy @s attack @e[type=pig,distance=..4,limit=1]\n\nawait entity @e[type=pig,nbt={active_effects:[{id:\"minecraft:wither\"}]}]\n\nsummon pig ~1.5 ~1 ~2.5 {NoAI:1b,Tags:[gm4_test_ender_bolt]}\n\nawait entity @e[type=pig,tag=gm4_test_ender_bolt,nbt={active_effects:[{id:\"minecraft:wither\"}]}]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_forterra_shamir/function/check_item_validity.mcfunction",
    "content": "# @s = band is trying to apply to\n# run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'forterra'}}] if items entity @s contents #gm4_forterra_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_forterra_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n# run from metallurgy:casting/summon_band/bismuth via #gm4_metallurgy:summon_band/bismuth\n\nloot spawn ~ ~ ~ loot gm4_forterra_shamir:band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_forterra_shamir/guidebook/forterra_shamir.json",
    "content": "{\n  \"id\": \"forterra_shamir\",\n  \"name\": \"Forterra Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"metallurgy\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Forterra_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_forterra_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'forterra'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_forterra_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'forterra'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.forterra_shamir.description\",\n            \"fallback\": \"Forterra causes extra raw metals, redstone, and amethyst to be found when mining stone.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_forterra_shamir\",\n          \"obtain_forterra_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.forterra_shamir.usage\",\n            \"fallback\": \"The Forterra Shamir is found on Bismuth Bands. It can be placed onto pickaxes.\\n\\nWhen mining stone, raw copper, raw iron, raw gold, redstone, and amethyst shards will drop. Drop rates are height dependent.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_forterra_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:bismuth_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:shamir/forterra\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'forterra'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.forterra\",\n                                    \"fallback\": \"Forterra Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_forterra_shamir/loot_table/deepslate.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:cobbled_deepslate\"\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 50,\n          \"name\": \"minecraft:redstone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              },\n              \"add\": false\n            },\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": 16\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:redstone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              },\n              \"add\": false\n            },\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": -40\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:lapis_lazuli\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 7\n              },\n              \"add\": false\n            },\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": 64\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:lapis_lazuli\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 7\n              },\n              \"add\": false\n            },\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": 15,\n                    \"max\": 16\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:amethyst_shard\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": 64\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:emerald\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": 64\n                  }\n                },\n                \"biomes\": \"minecraft:windswept_hills\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:diamond\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": 16\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 30,\n          \"name\": \"minecraft:raw_gold\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": 32\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:raw_gold\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -31,\n                    \"max\": 0\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 30,\n          \"name\": \"minecraft:raw_copper\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -15,\n                    \"max\": 112\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 70,\n          \"name\": \"minecraft:raw_copper\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": 17,\n                    \"max\": 48\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 30,\n          \"name\": \"minecraft:raw_iron\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": 64\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 50,\n          \"name\": \"minecraft:raw_iron\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -15,\n                    \"max\": 31\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:coal\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -7,\n                    \"max\": 128\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 60,\n          \"name\": \"minecraft:coal\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": 17,\n                    \"max\": 88\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 40,\n          \"name\": \"minecraft:coal\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": 33,\n                    \"max\": 64\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:empty\",\n          \"weight\": 400\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_forterra_shamir/loot_table/stone.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:cobblestone\"\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 50,\n          \"name\": \"minecraft:redstone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              },\n              \"add\": false\n            },\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": 16\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:redstone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              },\n              \"add\": false\n            },\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": -40\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:lapis_lazuli\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 7\n              },\n              \"add\": false\n            },\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": 64\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:lapis_lazuli\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 7\n              },\n              \"add\": false\n            },\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": 15,\n                    \"max\": 16\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:amethyst_shard\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": 64\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:emerald\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": 64\n                  }\n                },\n                \"biomes\": \"minecraft:windswept_hills\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 30,\n          \"name\": \"minecraft:raw_gold\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": 32\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:raw_gold\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -31,\n                    \"max\": 0\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 30,\n          \"name\": \"minecraft:raw_copper\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -15,\n                    \"max\": 112\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 70,\n          \"name\": \"minecraft:raw_copper\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": 17,\n                    \"max\": 48\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 30,\n          \"name\": \"minecraft:raw_iron\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -63,\n                    \"max\": 64\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 50,\n          \"name\": \"minecraft:raw_iron\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -15,\n                    \"max\": 31\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:coal\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": -7,\n                    \"max\": 128\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 60,\n          \"name\": \"minecraft:coal\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": 17,\n                    \"max\": 88\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 40,\n          \"name\": \"minecraft:coal\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:apply_bonus\",\n              \"enchantment\": \"minecraft:fortune\",\n              \"formula\": \"minecraft:uniform_bonus_count\",\n              \"parameters\": {\n                \"bonusMultiplier\": 1.25\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": 33,\n                    \"max\": 64\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:empty\",\n          \"weight\": 1000\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_forterra_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:pickaxes\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_allay.json",
    "content": "{\n  \"criteria\": {\n    \"duplicate_allay\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"item\": {\n          \"items\": [\n            \"minecraft:amethyst_shard\"\n          ]\n        },\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:allay\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_allay\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_armadillo.json",
    "content": "{\n  \"criteria\": {\n    \"breed_armadillos\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"armadillo\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_armadillo\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_axolotl.json",
    "content": "{\n  \"criteria\": {\n    \"breed_axolotls\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"axolotl\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_axolotl\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_bee.json",
    "content": "{\n  \"criteria\": {\n    \"breed_bees\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"bee\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_bee\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_cat.json",
    "content": "{\n  \"criteria\": {\n    \"breed_cats\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"cat\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_cat\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_chicken.json",
    "content": "{\n  \"criteria\": {\n    \"breed_chickens\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"chicken\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_chicken\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_cow.json",
    "content": "{\n  \"criteria\": {\n    \"breed_cows\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"cow\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_cow\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_donkey.json",
    "content": "{\n  \"criteria\": {\n    \"breed_donkeys\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"donkey\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_donkey\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_fox.json",
    "content": "{\n  \"criteria\": {\n    \"breed_foxes\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"fox\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_fox\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_frog.json",
    "content": "{\n  \"criteria\": {\n    \"breed_frogs\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"parent\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:frog\"\n            }\n          }\n        ],\n        \"partner\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:frog\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_frog\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_goat.json",
    "content": "{\n  \"criteria\": {\n    \"breed_goats\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"goat\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_goat\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_hoglin.json",
    "content": "{\n  \"criteria\": {\n    \"breed_hoglins\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"hoglin\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_hoglin\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_horse.json",
    "content": "{\n  \"criteria\": {\n    \"breed_horses\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"horse\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_horse\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_llama.json",
    "content": "{\n  \"criteria\": {\n    \"breed_llamas\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"llama\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_llama\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_mooshroom.json",
    "content": "{\n  \"criteria\": {\n    \"breed_mooshrooms\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"mooshroom\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_mooshroom\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_mule.json",
    "content": "{\n  \"criteria\": {\n    \"breed_mules\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"mule\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_mule\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_ocelot.json",
    "content": "{\n  \"criteria\": {\n    \"breed_ocelots\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"ocelot\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_ocelot\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_panda.json",
    "content": "{\n  \"criteria\": {\n    \"breed_pandas\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"panda\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_panda\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_pig.json",
    "content": "{\n  \"criteria\": {\n    \"breed_pigs\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"pig\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_pig\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_rabbit.json",
    "content": "{\n  \"criteria\": {\n    \"breed_rabbits\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"rabbit\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_rabbit\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_sheep.json",
    "content": "{\n  \"criteria\": {\n    \"breed_sheep\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"sheep\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_sheep\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_strider.json",
    "content": "{\n  \"criteria\": {\n    \"breed_striders\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"strider\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_strider\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_trader_llama.json",
    "content": "{\n  \"criteria\": {\n    \"breed_trader_llamas\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"trader_llama\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_trader_llama\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_turtle.json",
    "content": "{\n  \"criteria\": {\n    \"breed_turtles\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"parent\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:turtle\"\n            }\n          }\n        ],\n        \"partner\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:turtle\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_turtle\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_wolf.json",
    "content": "{\n  \"criteria\": {\n    \"breed_wolves\": {\n      \"trigger\": \"minecraft:bred_animals\",\n      \"conditions\": {\n        \"child\": {\n          \"type\": \"wolf\"\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_gemini_shamir:breed/check_wolf\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/find_baby.mcfunction",
    "content": "# finds recently gemini bred animals\n# scheduled from gm4_gemini_shamir:breed/check_*\n\nexecute as @e[type=marker,tag=gm4_gemini_bred] at @s run function gm4_gemini_shamir:baby/pick_type\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/pick_type.mcfunction",
    "content": "# determine type\n# run from gm4_gemini_shamir:baby/find_baby\n\nexecute if entity @s[tag=gm4_gemini_axolotl] as @e[type=axolotl,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_axolotl\nexecute if entity @s[tag=gm4_gemini_cat] as @e[type=cat,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_cat\nexecute if entity @s[tag=gm4_gemini_chicken] as @e[type=chicken,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_chicken\nexecute if entity @s[tag=gm4_gemini_cow] as @e[type=cow,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_cow\nexecute if entity @s[tag=gm4_gemini_donkey] as @e[type=donkey,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_donkey\nexecute if entity @s[tag=gm4_gemini_fox] as @e[type=fox,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_fox\nexecute if entity @s[tag=gm4_gemini_goat] as @e[type=goat,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_goat\nexecute if entity @s[tag=gm4_gemini_horse] as @e[type=horse,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_horse\nexecute if entity @s[tag=gm4_gemini_llama] as @e[type=llama,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_llama\nexecute if entity @s[tag=gm4_gemini_mule] as @e[type=mule,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_mule\nexecute if entity @s[tag=gm4_gemini_ocelot] as @e[type=ocelot,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_ocelot\nexecute if entity @s[tag=gm4_gemini_panda] as @e[type=panda,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_panda\nexecute if entity @s[tag=gm4_gemini_pig] as @e[type=pig,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_pig\nexecute if entity @s[tag=gm4_gemini_rabbit] as @e[type=rabbit,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_rabbit\nexecute if entity @s[tag=gm4_gemini_sheep] as @e[type=sheep,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_sheep\nexecute if entity @s[tag=gm4_gemini_trader_llama] as @e[type=trader_llama,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_trader_llama\nexecute if entity @s[tag=gm4_gemini_wolf] as @e[type=wolf,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_wolf\n\nkill @s\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_axolotl.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred axolotl\n\nsummon axolotl ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=axolotl,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Variant set from entity @s Variant\ndata modify entity @e[type=axolotl,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] PersistenceRequired set value 1b\ntag @e[type=axolotl,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_cat.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred cat\n\nsummon cat ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=cat,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] variant set from entity @s variant\ndata modify entity @e[type=cat,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Owner set from entity @s Owner\ndata modify entity @e[type=cat,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] PersistenceRequired set value 1b\ntag @e[type=cat,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_chicken.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred chicken\n\nsummon chicken ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=chicken,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] variant set from entity @s variant\ntag @e[type=chicken,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_cow.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred cow\n\nsummon cow ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=cow,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] variant set from entity @s variant\ntag @e[type=cow,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_donkey.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred donkey\n\nsummon donkey ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=donkey,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Owner set from entity @s Owner\ntag @e[type=donkey,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_fox.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred fox\n\nsummon fox ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=fox,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Trusted set from entity @s Trusted\ndata modify entity @e[type=fox,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Type set from entity @s Type\ntag @e[type=fox,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_goat.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred goat\n\nsummon goat ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=goat,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] IsScreamingGoat set from entity @s IsScreamingGoat\ntag @e[type=goat,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_horse.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred horse\n\nsummon horse ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=horse,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Variant set from entity @s Variant\ntag @e[type=horse,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_llama.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred llama\n\nsummon llama ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=llama,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Variant set from entity @s Variant\ntag @e[type=llama,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_mule.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred mule\n\nsummon mule ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=mule,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Owner set from entity @s Owner\ntag @e[type=mule,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_ocelot.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred ocelot\n\nsummon ocelot ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=ocelot,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Trusting set from entity @s Trusting\ndata modify entity @e[type=ocelot,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] PersistenceRequired set value 1b\ntag @e[type=ocelot,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_panda.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred panda\n\nsummon panda ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=panda,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] MainGene set from entity @s MainGene\ndata modify entity @e[type=panda,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] HiddenGene set from entity @s HiddenGene\ntag @e[type=panda,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_pig.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred pig\n\nsummon pig ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=pig,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] variant set from entity @s variant\ntag @e[type=pig,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_rabbit.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred rabbit\n\nsummon rabbit ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=rabbit,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] RabbitType set from entity @s RabbitType\ntag @e[type=rabbit,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_sheep.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred sheep\n\nsummon sheep ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=sheep,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Color set from entity @s Color\ntag @e[type=sheep,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_trader_llama.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred trader llama\n\nsummon trader_llama ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=trader_llama,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Variant set from entity @s Variant\ntag @e[type=trader_llama,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_wolf.mcfunction",
    "content": "# run from gm4_gemini_shamir:baby/pick_type\n# @s = recently bred wolf\n\nsummon wolf ~ ~ ~ {Tags:[\"gm4_gemini_baby\"],Age:-23999}\ndata modify entity @e[type=wolf,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Owner set from entity @s Owner\ndata modify entity @e[type=wolf,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] variant set from entity @s variant\ntag @e[type=wolf,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_allay.mcfunction",
    "content": "# run from breed_allay.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=allay,distance=..10,limit=1,sort=nearest,nbt={DuplicationCooldown:6000L}] at @s run summon allay ~ ~ ~ {DuplicationCooldown:6000L}\nadvancement revoke @s only gm4_gemini_shamir:breed_allay\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_armadillo.mcfunction",
    "content": "# run from breed_armadillo.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=armadillo,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon armadillo ~ ~ ~ {Age:-23999}\n\nadvancement revoke @s only gm4_gemini_shamir:breed_armadillo\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_axolotl.mcfunction",
    "content": "# run from breed_axolotl.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=axolotl,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_axolotl\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_axolotl\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_bee.mcfunction",
    "content": "# run from breed_bee.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=bee,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon bee ~ ~ ~ {Age:-23999}\n\nadvancement revoke @s only gm4_gemini_shamir:breed_bee\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_cat.mcfunction",
    "content": "# run from breed_cat.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=cat,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_cat\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_cat\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_chicken.mcfunction",
    "content": "# run from breed_chicken.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=chicken,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_chicken\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_chicken\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_cow.mcfunction",
    "content": "# run from breed_cow.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=cow,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_cow\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_cow\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_donkey.mcfunction",
    "content": "# run from breed_donkey.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=donkey,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_donkey\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_donkey\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_fox.mcfunction",
    "content": "# run from breed_fox.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=fox,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_fox\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_fox\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_frog.mcfunction",
    "content": "# run from breed_frog.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini run data modify entity @e[type=frog,distance=..10,limit=1,sort=nearest,nbt=!{Brain:{memories:{\"minecraft:is_pregnant\":{value:{}}}}}] Brain.memories.is_pregnant.value set value {}\n\nadvancement revoke @s only gm4_gemini_shamir:breed_frog\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_goat.mcfunction",
    "content": "# run from breed_goat.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=goat,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_goat\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_goat\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_hoglin.mcfunction",
    "content": "# run from breed_hoglin.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=hoglin,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon hoglin ~ ~ ~ {Age:-23999}\n\nadvancement revoke @s only gm4_gemini_shamir:breed_hoglin\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_horse.mcfunction",
    "content": "# run from breed_horse.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=horse,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_horse\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_horse\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_llama.mcfunction",
    "content": "# run from breed_llama.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=llama,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_llama\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_llama\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_mooshroom.mcfunction",
    "content": "# run from breed_mooshroom.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=mooshroom,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon mooshroom ~ ~ ~ {Age:-23999}\n\nadvancement revoke @s only gm4_gemini_shamir:breed_mooshroom\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_ocelot.mcfunction",
    "content": "# run from breed_ocelot.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=ocelot,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_ocelot\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_ocelot\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_panda.mcfunction",
    "content": "# run from breed_panda.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=panda,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_panda\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_panda\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_pig.mcfunction",
    "content": "# run from breed_pig.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=pig,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_pig\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_pig\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_rabbit.mcfunction",
    "content": "# run from breed_rabbit.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=rabbit,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_rabbit\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_rabbit\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_sheep.mcfunction",
    "content": "# run from breed_sheep.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=sheep,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_sheep\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_sheep\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_strider.mcfunction",
    "content": "# run from breed_strider.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=strider,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon strider ~ ~ ~ {Age:-23999}\n\nadvancement revoke @s only gm4_gemini_shamir:breed_strider\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_trader_llama.mcfunction",
    "content": "# run from breed_trader_llama.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=trader_llama,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_llama\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_trader_llama\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_turtle.mcfunction",
    "content": "# run from breed_turtle.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini run data modify entity @e[type=turtle,distance=..10,limit=1,sort=nearest,nbt=!{has_egg:1b}] has_egg set value 1b\n\nadvancement revoke @s only gm4_gemini_shamir:breed_turtle\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_wolf.mcfunction",
    "content": "# run from breed_wolf.json (advancement)\n# @s = player who has bred a mob\n\nexecute if predicate gm4_gemini_shamir:holding_gemini as @e[type=wolf,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:[\"gm4_gemini_bred\",\"gm4_gemini_wolf\"]}\nadvancement revoke @s only gm4_gemini_shamir:breed_wolf\nschedule function gm4_gemini_shamir:baby/find_baby 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/check_item_validity.mcfunction",
    "content": "# @s = band is trying to apply to\n# run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'gemini'}}] if items entity @s contents #gm4_gemini_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/main.mcfunction",
    "content": "# @s = player with gemini in off or mainhand\n# run from metallurgy main\n\ntag @s add gm4_has_gemini\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n# run from metallurgy:casting/summon_band/barimium via #gm4_metallurgy:summon_band/barimium\n\nloot spawn ~ ~ ~ loot gm4_gemini_shamir:band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/guidebook/gemini_shamir.json",
    "content": "{\n  \"id\": \"gemini_shamir\",\n  \"name\": \"Gemini Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"metallurgy\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Gemini_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_gemini_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'gemini'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_gemini_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'gemini'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.gemini_shamir.description\",\n            \"fallback\": \"Gemini modifies breeding to always produce twins.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_gemini_shamir\",\n          \"obtain_gemini_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.gemini_shamir.usage\",\n            \"fallback\": \"The Gemini Shamir is found on Barimium Bands. It can be placed onto hoes.\\n\\nHolding the hoe in the offhand will cause any bred animals to produce identical twins.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:barimium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:shamir/gemini\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'gemini'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.gemini\",\n                                    \"fallback\": \"Gemini Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/predicate/holding_gemini.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"weapon.*\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'gemini'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/predicate/test_is_baby.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"flags\": {\n      \"is_baby\": true\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:hoes\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_gemini_shamir/test/breed.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1.5 ~1 ~0.5\n\nsummon pig ~0.5 ~1 ~2.5 {Tags:[gm4_test_gemini_1]}\nsummon pig ~2.5 ~1 ~2.5 {Tags:[gm4_test_gemini_2]}\n\nitem replace entity @s weapon.offhand with minecraft:iron_hoe[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:\"gemini\"}}]\nitem replace entity @s weapon.mainhand with minecraft:carrot 2\n\ndummy @s use entity @e[type=pig,distance=..4,tag=gm4_test_gemini_1,limit=1]\ndummy @s use entity @e[type=pig,distance=..4,tag=gm4_test_gemini_2,limit=1]\n\nawait delay 4s\n\nscoreboard objectives add gm4_test dummy\nexecute store result score $babies gm4_test if entity @e[type=pig,distance=..4,predicate=gm4_gemini_shamir:test_is_baby]\nassert score $babies gm4_test matches 2\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_hypexperia_shamir/function/active.mcfunction",
    "content": "# @s = player with the hypexperia shamir in their hands\n# run from metallurgy:shamir_in_hand\n\ntag @s add gm4_has_hypexperia\nscoreboard players set $hypexperia_active gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_hypexperia_shamir/function/check_item_validity.mcfunction",
    "content": "# @s = band is trying to apply to\n# run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'hypexperia'}}] if items entity @s contents #gm4_hypexperia_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_hypexperia_shamir/function/double_xp.mcfunction",
    "content": "# run from hypexperia:find_orbs\n# @s = experience orb that hasn't been doubled yet\n\nexecute store result score xp_value gm4_ml_data run data get entity @s Value 1\nexecute if score xp_value gm4_ml_data matches 1..12 store result entity @s Value short 2 run scoreboard players get xp_value gm4_ml_data\nexecute if score xp_value gm4_ml_data matches 1..12 run particle totem_of_undying ~ ~0.2 ~ 0 0 0 0.2 10\nexecute if score xp_value gm4_ml_data matches 1..12 run playsound block.note_block.xylophone player @a ~ ~ ~ 0.1 0.3\ntag @s add gm4_doubled_xp\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_hypexperia_shamir/function/find_orbs.mcfunction",
    "content": "# run from metallurgy:tick\n# @s = none\n\nexecute as @a[tag=gm4_has_hypexperia] at @s as @e[type=experience_orb,distance=..5,tag=!gm4_doubled_xp,limit=1,sort=nearest] at @s run function gm4_hypexperia_shamir:double_xp\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_hypexperia_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n# run from metallurgy:casting/summon_band/bismuth via #gm4_metallurgy:summon_band/bismuth\n\nloot spawn ~ ~ ~ loot gm4_hypexperia_shamir:band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_hypexperia_shamir/guidebook/hypexperia_shamir.json",
    "content": "{\n  \"id\": \"hypexperia_shamir\",\n  \"name\": \"Hypexperia Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"metallurgy\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Hypexperia_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_hypexperia_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'hypexperia'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_hypexperia_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'hypexperia'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.hypexperia_shamir.description\",\n            \"fallback\": \"Hypexperia causes extra experience to drop from all sources of experience orbs.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_hypexperia_shamir\",\n          \"obtain_hypexperia_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.hypexperia_shamir.usage\",\n            \"fallback\": \"The Hypexperia Shamir is found on Bismuth Bands. It can be placed onto tools, swords, and fishing rods.\\n\\nNearby experience orbs will double in value when the item is held.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_hypexperia_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:bismuth_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:shamir/hypexperia\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'hypexperia'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.hypexperia\",\n                                    \"fallback\": \"Hypexperia Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_hypexperia_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:axes\",\n    \"#minecraft:pickaxes\",\n    \"#minecraft:shovels\",\n    \"#minecraft:swords\",\n    \"minecraft:fishing_rod\",\n    \"minecraft:mace\",\n    \"minecraft:trident\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/advancement/bucket_inventory_change.json",
    "content": "{\n  \"criteria\": {\n    \"bucket\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:bucket\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"infinitas\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"lava_bucket\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:lava_bucket\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"infinitas\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"milk_bucket\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:milk_bucket\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"infinitas\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"powder_snow_bucket\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:powder_snow_bucket\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"infinitas\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"water_bucket\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:water_bucket\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"infinitas\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"bucket\",\n      \"lava_bucket\",\n      \"milk_bucket\",\n      \"powder_snow_bucket\",\n      \"water_bucket\"\n    ]\n  ],\n  \"rewards\": {\n    \"function\": \"gm4_infinitas_shamir:add_tags\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/advancement/empty/pickup_mainhand.json",
    "content": "{\n  \"criteria\": {\n    \"cauldron\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_mainhand_empty\\\"]}\",\n              \"equipment\": {\n                \"mainhand\": {\n                  \"items\": [\n                    \"minecraft:lava_bucket\",\n                    \"minecraft:powder_snow_bucket\",\n                    \"minecraft:water_bucket\"\n                  ]\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:cauldron\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"lava_bucket\": {\n      \"trigger\": \"minecraft:filled_bucket\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_mainhand_empty\\\"]}\"\n            }\n          }\n        ],\n        \"item\": {\n          \"items\": [\n            \"minecraft:lava_bucket\"\n          ]\n        }\n      }\n    },\n    \"milk_bucket\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_mainhand_empty\\\"]}\"\n            }\n          }\n        ],\n        \"item\": {\n          \"items\": [\n            \"minecraft:bucket\"\n          ]\n        }\n      }\n    },\n    \"powder_snow_bucket\": {\n      \"trigger\": \"minecraft:filled_bucket\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_mainhand_empty\\\"]}\"\n            }\n          }\n        ],\n        \"item\": {\n          \"items\": [\n            \"minecraft:powder_snow_bucket\"\n          ]\n        }\n      }\n    },\n    \"water_bucket\": {\n      \"trigger\": \"minecraft:filled_bucket\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_mainhand_empty\\\"]}\"\n            }\n          }\n        ],\n        \"item\": {\n          \"items\": [\n            \"minecraft:water_bucket\"\n          ]\n        }\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"cauldron\",\n      \"lava_bucket\",\n      \"milk_bucket\",\n      \"powder_snow_bucket\",\n      \"water_bucket\"\n    ]\n  ],\n  \"rewards\": {\n    \"function\": \"gm4_infinitas_shamir:empty/pickup\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/advancement/empty/pickup_offhand.json",
    "content": "{\n  \"criteria\": {\n    \"cauldron\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_offhand_empty\\\"]}\",\n              \"equipment\": {\n                \"offhand\": {\n                  \"items\": [\n                    \"minecraft:lava_bucket\",\n                    \"minecraft:powder_snow_bucket\",\n                    \"minecraft:water_bucket\"\n                  ]\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:cauldron\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"lava_bucket\": {\n      \"trigger\": \"minecraft:filled_bucket\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_offhand_empty\\\"]}\"\n            }\n          }\n        ],\n        \"item\": {\n          \"items\": [\n            \"minecraft:lava_bucket\"\n          ]\n        }\n      }\n    },\n    \"milk_bucket\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_offhand_empty\\\"]}\"\n            }\n          }\n        ],\n        \"item\": {\n          \"items\": [\n            \"minecraft:bucket\"\n          ]\n        }\n      }\n    },\n    \"powder_snow_bucket\": {\n      \"trigger\": \"minecraft:filled_bucket\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_offhand_empty\\\"]}\"\n            }\n          }\n        ],\n        \"item\": {\n          \"items\": [\n            \"minecraft:powder_snow_bucket\"\n          ]\n        }\n      }\n    },\n    \"water_bucket\": {\n      \"trigger\": \"minecraft:filled_bucket\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_offhand_empty\\\"]}\"\n            }\n          }\n        ],\n        \"item\": {\n          \"items\": [\n            \"minecraft:water_bucket\"\n          ]\n        }\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"cauldron\",\n      \"lava_bucket\",\n      \"milk_bucket\",\n      \"powder_snow_bucket\",\n      \"water_bucket\"\n    ]\n  ],\n  \"rewards\": {\n    \"function\": \"gm4_infinitas_shamir:empty/pickup\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/advancement/lava/place_mainhand.json",
    "content": "{\n  \"criteria\": {\n    \"place_lava\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"$lava_infinitas\"\n              },\n              \"score\": \"gm4_ml_data\"\n            },\n            \"range\": 1\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"equipment\": {\n                \"mainhand\": {\n                  \"items\": [\n                    \"minecraft:lava_bucket\"\n                  ],\n                  \"predicates\": {\n                    \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"infinitas\\\"}}\"\n                  }\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:lava\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"use_on_cauldron\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"$lava_infinitas\"\n              },\n              \"score\": \"gm4_ml_data\"\n            },\n            \"range\": 1\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_mainhand_lava\\\"]}\",\n              \"equipment\": {\n                \"mainhand\": {\n                  \"items\": [\n                    \"minecraft:bucket\"\n                  ]\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:lava_cauldron\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"place_lava\",\n      \"use_on_cauldron\"\n    ]\n  ],\n  \"rewards\": {\n    \"function\": \"gm4_infinitas_shamir:lava/place\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/advancement/lava/place_offhand.json",
    "content": "{\n  \"criteria\": {\n    \"place_lava\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"$lava_infinitas\"\n              },\n              \"score\": \"gm4_ml_data\"\n            },\n            \"range\": 1\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"equipment\": {\n                \"offhand\": {\n                  \"items\": [\n                    \"minecraft:lava_bucket\"\n                  ],\n                  \"predicates\": {\n                    \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"infinitas\\\"}}\"\n                  }\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:lava\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"use_on_cauldron\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"$lava_infinitas\"\n              },\n              \"score\": \"gm4_ml_data\"\n            },\n            \"range\": 1\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_offhand_lava\\\"]}\",\n              \"equipment\": {\n                \"offhand\": {\n                  \"items\": [\n                    \"minecraft:bucket\"\n                  ]\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:lava_cauldron\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"place_lava\",\n      \"use_on_cauldron\"\n    ]\n  ],\n  \"rewards\": {\n    \"function\": \"gm4_infinitas_shamir:lava/place\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/advancement/milk/drink_mainhand.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"equipment\": {\n                \"mainhand\": {\n                  \"items\": [\n                    \"minecraft:milk_bucket\"\n                  ],\n                  \"predicates\": {\n                    \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"infinitas\\\"}}\"\n                  }\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_infinitas_shamir:milk/drink\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/advancement/milk/drink_offhand.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"equipment\": {\n                \"offhand\": {\n                  \"items\": [\n                    \"minecraft:milk_bucket\"\n                  ],\n                  \"predicates\": {\n                    \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"infinitas\\\"}}\"\n                  }\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_infinitas_shamir:milk/drink\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/advancement/powder_snow/place_mainhand.json",
    "content": "{\n  \"criteria\": {\n    \"place_powder_snow\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"$powder_snow_infinitas\"\n              },\n              \"score\": \"gm4_ml_data\"\n            },\n            \"range\": 1\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"equipment\": {\n                \"mainhand\": {\n                  \"items\": [\n                    \"minecraft:powder_snow_bucket\"\n                  ],\n                  \"predicates\": {\n                    \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"infinitas\\\"}}\"\n                  }\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:powder_snow\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"use_on_cauldron\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"$powder_snow_infinitas\"\n              },\n              \"score\": \"gm4_ml_data\"\n            },\n            \"range\": 1\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_mainhand_powder_snow\\\"]}\",\n              \"equipment\": {\n                \"mainhand\": {\n                  \"items\": [\n                    \"minecraft:bucket\"\n                  ]\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:powder_snow_cauldron\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"place_powder_snow\",\n      \"use_on_cauldron\"\n    ]\n  ],\n  \"rewards\": {\n    \"function\": \"gm4_infinitas_shamir:powder_snow/place\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/advancement/powder_snow/place_offhand.json",
    "content": "{\n  \"criteria\": {\n    \"place_powder_snow\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"$powder_snow_infinitas\"\n              },\n              \"score\": \"gm4_ml_data\"\n            },\n            \"range\": 1\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"equipment\": {\n                \"offhand\": {\n                  \"items\": [\n                    \"minecraft:powder_snow_bucket\"\n                  ],\n                  \"predicates\": {\n                    \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"infinitas\\\"}}\"\n                  }\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:powder_snow\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"use_on_cauldron\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"$powder_snow_infinitas\"\n              },\n              \"score\": \"gm4_ml_data\"\n            },\n            \"range\": 1\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_offhand_powder_snow\\\"]}\",\n              \"equipment\": {\n                \"offhand\": {\n                  \"items\": [\n                    \"minecraft:bucket\"\n                  ]\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:powder_snow_cauldron\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"place_powder_snow\",\n      \"use_on_cauldron\"\n    ]\n  ],\n  \"rewards\": {\n    \"function\": \"gm4_infinitas_shamir:powder_snow/place\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/advancement/rejoin_bucket_check.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_scores\",\n            \"entity\": \"this\",\n            \"scores\": {\n              \"gm4_infinitas_leave\": {\n                \"min\": 1,\n                \"max\": 99999\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_infinitas_shamir:rejoin_check\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/advancement/water/pickup_fish.json",
    "content": "{\n  \"criteria\": {\n    \"pickup_fish_mainhand\": {\n      \"trigger\": \"minecraft:filled_bucket\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_mainhand_water\\\"]}\"\n            }\n          }\n        ],\n        \"item\": {\n          \"items\": [\n            \"minecraft:axolotl_bucket\",\n            \"minecraft:cod_bucket\",\n            \"minecraft:pufferfish_bucket\",\n            \"minecraft:salmon_bucket\",\n            \"minecraft:tadpole_bucket\",\n            \"minecraft:tropical_fish_bucket\"\n          ]\n        }\n      }\n    },\n    \"pickup_fish_offhand\": {\n      \"trigger\": \"minecraft:filled_bucket\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_offhand_water\\\"]}\"\n            }\n          }\n        ],\n        \"item\": {\n          \"items\": [\n            \"minecraft:axolotl_bucket\",\n            \"minecraft:cod_bucket\",\n            \"minecraft:pufferfish_bucket\",\n            \"minecraft:salmon_bucket\",\n            \"minecraft:tadpole_bucket\",\n            \"minecraft:tropical_fish_bucket\"\n          ]\n        }\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"pickup_fish_mainhand\",\n      \"pickup_fish_offhand\"\n    ]\n  ],\n  \"rewards\": {\n    \"function\": \"gm4_infinitas_shamir:water/pickup\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/advancement/water/place.json",
    "content": "{\n  \"criteria\": {\n    \"place_water_mainhand\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"equipment\": {\n                \"mainhand\": {\n                  \"items\": [\n                    \"minecraft:water_bucket\",\n                    \"minecraft:axolotl_bucket\",\n                    \"minecraft:cod_bucket\",\n                    \"minecraft:pufferfish_bucket\",\n                    \"minecraft:salmon_bucket\",\n                    \"minecraft:tadpole_bucket\",\n                    \"minecraft:tropical_fish_bucket\"\n                  ],\n                  \"predicates\": {\n                    \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"infinitas\\\"}}\"\n                  }\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:any_of\",\n            \"terms\": [\n              {\n                \"condition\": \"minecraft:location_check\",\n                \"predicate\": {\n                  \"block\": {\n                    \"blocks\": [\n                      \"minecraft:flower_pot\",\n                      \"minecraft:water\"\n                    ]\n                  }\n                }\n              },\n              {\n                \"condition\": \"minecraft:location_check\",\n                \"predicate\": {\n                  \"block\": {\n                    \"blocks\": \"#gm4:waterloggable\"\n                  }\n                }\n              },\n              {\n                \"condition\": \"minecraft:location_check\",\n                \"predicate\": {\n                  \"dimension\": \"minecraft:the_nether\"\n                }\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"use_on_cauldron_mainhand\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_mainhand_water\\\"]}\",\n              \"equipment\": {\n                \"mainhand\": {\n                  \"items\": [\n                    \"minecraft:bucket\"\n                  ]\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:water_cauldron\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"place_water_offhand\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"creative\"\n                  ]\n                }\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"equipment\": {\n                \"offhand\": {\n                  \"items\": [\n                    \"minecraft:water_bucket\",\n                    \"minecraft:axolotl_bucket\",\n                    \"minecraft:cod_bucket\",\n                    \"minecraft:pufferfish_bucket\",\n                    \"minecraft:salmon_bucket\",\n                    \"minecraft:tadpole_bucket\",\n                    \"minecraft:tropical_fish_bucket\"\n                  ],\n                  \"predicates\": {\n                    \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:\\\"infinitas\\\"}}\"\n                  }\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:any_of\",\n            \"terms\": [\n              {\n                \"condition\": \"minecraft:location_check\",\n                \"predicate\": {\n                  \"block\": {\n                    \"blocks\": [\n                      \"minecraft:flower_pot\",\n                      \"minecraft:water\"\n                    ]\n                  }\n                }\n              },\n              {\n                \"condition\": \"minecraft:location_check\",\n                \"predicate\": {\n                  \"block\": {\n                    \"blocks\": \"#gm4:waterloggable\"\n                  }\n                }\n              },\n              {\n                \"condition\": \"minecraft:location_check\",\n                \"predicate\": {\n                  \"dimension\": \"minecraft:the_nether\"\n                }\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"use_on_cauldron_offhand\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_infinitas_offhand_water\\\"]}\",\n              \"equipment\": {\n                \"offhand\": {\n                  \"items\": [\n                    \"minecraft:bucket\"\n                  ]\n                }\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:water_cauldron\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"place_water_mainhand\",\n      \"use_on_cauldron_mainhand\",\n      \"place_water_offhand\",\n      \"use_on_cauldron_offhand\"\n    ]\n  ],\n  \"rewards\": {\n    \"function\": \"gm4_infinitas_shamir:water/place\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/active.mcfunction",
    "content": "# @s = player holding an Infinitas bucket in one or the other hand\n# run from metallurgy:shamir_in_hand\n\nexecute as @e[tag=gm4_no_infinitas] at @s unless entity @a[predicate=gm4_metallurgy:infinitas_active,distance=..10] run tag @s remove gm4_no_infinitas\nexecute positioned ~-5 ~-1 ~-5 run tag @e[type=!player,tag=!smithed.strict,dx=10,dy=2,dz=10,nbt={DeathTime:0s}] add gm4_in_infinitas\nexecute positioned ~-5 ~-1 ~-5 run tag @e[type=item,dx=10,dy=2,dz=10] add gm4_in_infinitas\ntag @e[tag=gm4_in_infinitas,distance=..1.2] add gm4_no_infinitas\ntag @e[tag=gm4_no_infinitas] remove gm4_in_infinitas\n\n#sounds\nexecute if entity @e[tag=gm4_in_infinitas,distance=6..8] run playsound ui.toast.out player @a[distance=..10] ~ ~ ~ .5 .1\nexecute if entity @e[tag=gm4_in_infinitas,distance=3..5.99] run playsound ui.toast.out player @a[distance=..10] ~ ~ ~ .5 .3\nexecute if entity @e[tag=gm4_in_infinitas,distance=..2.99] run playsound ui.toast.out player @a[distance=..10] ~ ~ ~ .5 .7\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/add_tags.mcfunction",
    "content": "# Updates player tags when an Infinitas Bucket enters their inventory\n# @s = player, earned Infinitas bucket_inventory_change advancement\n# at @s\n# run from gm4_infinitas_shamir:rejoin_check, or advancement, gm4_infinitas_shamir:bucket_inventory_change\n\ntag @s add gm4_has_infinitas\n\ntag @s[advancements={gm4_infinitas_shamir:bucket_inventory_change={bucket=true}}] add gm4_has_empty_infinitas\ntag @s[advancements={gm4_infinitas_shamir:bucket_inventory_change={lava_bucket=true}}] add gm4_has_lava_infinitas\ntag @s[advancements={gm4_infinitas_shamir:bucket_inventory_change={powder_snow_bucket=true}}] add gm4_has_powder_snow_infinitas\ntag @s[advancements={gm4_infinitas_shamir:bucket_inventory_change={water_bucket=true}}] add gm4_has_water_infinitas\n\nadvancement revoke @s only gm4_infinitas_shamir:bucket_inventory_change\n\nfunction gm4_infinitas_shamir:clock/active\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/check_item_validity.mcfunction",
    "content": "# @s = band is trying to apply to\n# run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'infinitas'}}] if items entity @s contents #gm4_infinitas_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\nexecute if score $lava_infinitas gm4_ml_data matches 1 if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'infinitas'}}] if items entity @s contents minecraft:lava_bucket run scoreboard players set valid_item gm4_ml_data 1\nexecute if score $powder_snow_infinitas gm4_ml_data matches 1 if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'infinitas'}}] if items entity @s contents minecraft:powder_snow_bucket run scoreboard players set valid_item gm4_ml_data 1\n\n# updates Spiraculum shamirs to Infinitas\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'spiraculum'}}] if items entity @s contents #gm4_infinitas_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\nexecute if score $lava_infinitas gm4_ml_data matches 1 if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'spiraculum'}}] if items entity @s contents minecraft:lava_bucket run scoreboard players set valid_item gm4_ml_data 1\nexecute if score $powder_snow_infinitas gm4_ml_data matches 1 if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'spiraculum'}}] if items entity @s contents minecraft:powder_snow_bucket run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/clock/active.mcfunction",
    "content": "# Initially run as player who earned bucket_inventory_change advancement\n# run from gm4_infinitas_shamir:add_tags or scheduled from self\n\nexecute as @a[tag=gm4_has_infinitas] run function gm4_infinitas_shamir:clock/inventory_check\n\nexecute if entity @a[tag=gm4_has_infinitas,limit=1] run schedule function gm4_infinitas_shamir:clock/active 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/clock/inventory_check.mcfunction",
    "content": "# Checks if the player has an empty or Infinitas Water Bucket in their inventory\n# @s = player with tag, gm4_has_infinitas\n# run from gm4_infinitas_shamir:clock/active\n\nexecute if entity @s[tag=gm4_has_empty_infinitas] run function gm4_infinitas_shamir:empty/check_inventory\nexecute if score $lava_infinitas gm4_ml_data matches 1 if entity @s[tag=gm4_has_lava_infinitas] run function gm4_infinitas_shamir:lava/check_inventory\nexecute if score $powder_snow_infinitas gm4_ml_data matches 1 if entity @s[tag=gm4_has_powder_snow_infinitas] run function gm4_infinitas_shamir:powder_snow/check_inventory\nexecute if entity @s[tag=gm4_has_water_infinitas] run function gm4_infinitas_shamir:water/check_inventory\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/debug/clear.mcfunction",
    "content": "# for testing purposes, revoke everything and apply some tags to reset inventory\n# at @s\n# run manually\n\nadvancement revoke @s only gm4_infinitas_shamir:bucket_inventory_change\nadvancement revoke @s only gm4_infinitas_shamir:rejoin_bucket_check\n\nadvancement revoke @s only gm4_infinitas_shamir:empty/pickup_mainhand\nadvancement revoke @s only gm4_infinitas_shamir:empty/pickup_offhand\n\nadvancement revoke @s only gm4_infinitas_shamir:lava/place_mainhand\nadvancement revoke @s only gm4_infinitas_shamir:lava/place_offhand\n\nadvancement revoke @s only gm4_infinitas_shamir:milk/drink_mainhand\nadvancement revoke @s only gm4_infinitas_shamir:milk/drink_offhand\n\nadvancement revoke @s only gm4_infinitas_shamir:powder_snow/place_mainhand\nadvancement revoke @s only gm4_infinitas_shamir:powder_snow/place_offhand\n\nadvancement revoke @s only gm4_infinitas_shamir:water/pickup_fish\nadvancement revoke @s only gm4_infinitas_shamir:water/place\n\n\nscoreboard players reset @s gm4_infinitas_leave\nscoreboard players reset @s gm4_infinitas_success_check\n\ntag @s remove gm4_infinitas_delay_replace_empty\ntag @s remove gm4_infinitas_delay_replace_fish\ntag @s remove gm4_infinitas_delay_replace_milk\ntag @s remove gm4_infinitas_delay_replace_powder_snow\ntag @s remove gm4_infinitas_delay_replace_water\n\ntag @s add gm4_has_empty_infinitas\nexecute if score $lava_infinitas gm4_ml_data matches 1 run tag @s add gm4_has_lava_infinitas\nexecute if score $powder_snow_infinitas gm4_ml_data matches 1 run tag @s add gm4_has_powder_snow_infinitas\ntag @s add gm4_has_water_infinitas\n\n\nfunction gm4_infinitas_shamir:clock/inventory_check\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/call.mcfunction",
    "content": "# Checks player tags with Infinitas, to properly replace their item\n# scheduled 1t after using an Infinitas Bucket\n\nexecute as @a[tag=gm4_infinitas_delay_replace] at @s run function gm4_infinitas_shamir:delayed_replace/check_tag\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/check_tag.mcfunction",
    "content": "# Checks which delay replace tag the player has\n# @s = player\n# at @s\n# run from gm4_infinitas_shamir:delayed_replace/call\n\nexecute if entity @s[tag=gm4_infinitas_delay_replace_empty] run function gm4_infinitas_shamir:delayed_replace/empty\nexecute if entity @s[tag=gm4_infinitas_delay_replace_fish] run function gm4_infinitas_shamir:delayed_replace/fish\nexecute if score $lava_infinitas gm4_ml_data matches 1 if entity @s[tag=gm4_infinitas_delay_replace_lava] run function gm4_infinitas_shamir:delayed_replace/lava\nexecute if entity @s[tag=gm4_infinitas_delay_replace_milk] run function gm4_infinitas_shamir:delayed_replace/milk\nexecute if entity @s[tag=gm4_infinitas_delay_replace_powder_snow] run function gm4_infinitas_shamir:delayed_replace/powder_snow\nexecute if entity @s[tag=gm4_infinitas_delay_replace_water] run function gm4_infinitas_shamir:delayed_replace/water\n\nscoreboard players reset @s gm4_infinitas_success_check\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/empty.mcfunction",
    "content": "# Checks which hand slot player used to pickup liquid\n# @s = player now holding filled bucket, previously holding Infinitas Empty Bucket\n# at @s\n# run from gm4_infinitas_shamir:delayed_replace/check_tag\n\nexecute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:empty/pickup_mainhand=true},predicate=gm4_infinitas_shamir:mainhand/after/empty] weapon.mainhand with bucket\nexecute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.mainhand gm4_infinitas_shamir:restore_shamir\nexecute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:empty/pickup_offhand=true},predicate=gm4_infinitas_shamir:offhand/after/empty] weapon.offhand with bucket\nexecute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.offhand gm4_infinitas_shamir:restore_shamir\n\n# clean up\nadvancement revoke @s only gm4_infinitas_shamir:empty/pickup_mainhand\nadvancement revoke @s only gm4_infinitas_shamir:empty/pickup_offhand\ntag @s remove gm4_infinitas_delay_replace\ntag @s remove gm4_infinitas_delay_replace_empty\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/fish/mainhand_check.mcfunction",
    "content": "# Checks which fish was picked up\n# @s = player holding Water Infinitas in mainhand\n# at @s\n# run from gm4_infinitas_shamir:delayed_replace/fish\n\nexecute store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/pickup/axolotl] weapon.mainhand with axolotl_bucket\nexecute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/pickup/cod] weapon.mainhand with cod_bucket\nexecute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/pickup/pufferfish] weapon.mainhand with pufferfish_bucket\nexecute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/pickup/salmon] weapon.mainhand with salmon_bucket\nexecute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/pickup/tadpole] weapon.mainhand with tadpole_bucket\nexecute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/pickup/tropical_fish] weapon.mainhand with tropical_fish_bucket\n\nexecute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.mainhand gm4_infinitas_shamir:restore_shamir\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/fish/offhand_check.mcfunction",
    "content": "# Checks which fish was picked up\n# @s = player holding Water Infinitas in offhand\n# at @s\n# run from gm4_infinitas_shamir:delayed_replace/fish\n\nexecute store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/pickup/axolotl] weapon.offhand with axolotl_bucket\nexecute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/pickup/cod] weapon.offhand with cod_bucket\nexecute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/pickup/pufferfish] weapon.offhand with pufferfish_bucket\nexecute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/pickup/salmon] weapon.offhand with salmon_bucket\nexecute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/pickup/tadpole] weapon.offhand with tadpole_bucket\nexecute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/pickup/tropical_fish] weapon.offhand with tropical_fish_bucket\n\nexecute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.offhand gm4_infinitas_shamir:restore_shamir\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/fish.mcfunction",
    "content": "# Checks which hand slot player used to pickup a fish\n# @s = player holding fish bucket, previously holding Infinitas Water Bucket\n# at @s\n# run from gm4_infinitas_shamir:delayed_replace/check_tag\n\nscoreboard players reset @s gm4_infinitas_success_check\n\ndata modify storage gm4_infinitas_shamir:bucket fish_data set from entity @s SelectedItem.components\n# TODO 1.20.5: restore fish data\n\nexecute if entity @s[advancements={gm4_infinitas_shamir:water/pickup_fish={pickup_fish_mainhand=true}}] run function gm4_infinitas_shamir:delayed_replace/fish/mainhand_check\nexecute if entity @s[advancements={gm4_infinitas_shamir:water/pickup_fish={pickup_fish_offhand=true}}] run function gm4_infinitas_shamir:delayed_replace/fish/offhand_check\n\n# clean up\nadvancement revoke @s only gm4_infinitas_shamir:water/pickup_fish\ndata remove storage gm4_infinitas_shamir:bucket fish_data\ntag @s remove gm4_infinitas_delay_replace\ntag @s remove gm4_infinitas_delay_replace_fish\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/lava.mcfunction",
    "content": "# Checks which hand slot player used to place lava\n# @s = player holding lava bucket, previously holding Infinitas Lava Bucket\n# at @s\n# run from gm4_infinitas_shamir:delayed_replace/check_tag\n\nexecute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:lava/place_mainhand=true},predicate=gm4_infinitas_shamir:mainhand/after/use_bucket] weapon.mainhand with lava_bucket\nexecute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.mainhand gm4_infinitas_shamir:restore_shamir\nexecute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:lava/place_offhand=true},predicate=gm4_infinitas_shamir:offhand/after/use_bucket] weapon.offhand with lava_bucket\nexecute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.offhand gm4_infinitas_shamir:restore_shamir\n\n# clean up\nadvancement revoke @s only gm4_infinitas_shamir:lava/place_mainhand\nadvancement revoke @s only gm4_infinitas_shamir:lava/place_offhand\ntag @s remove gm4_infinitas_delay_replace\ntag @s remove gm4_infinitas_delay_replace_lava\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/milk.mcfunction",
    "content": "# Checks which hand slot player used to drink milk\n# @s = player holding milk bucket, previously holding Infinitas Milk Bucket\n# at @s\n# run from gm4_infinitas_shamir:delayed_replace/check_tag \n\nexecute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:milk/drink_mainhand=true},predicate=gm4_infinitas_shamir:mainhand/after/use_bucket] weapon.mainhand with milk_bucket\nexecute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.mainhand gm4_infinitas_shamir:restore_shamir\nexecute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:milk/drink_offhand=true},predicate=gm4_infinitas_shamir:offhand/after/use_bucket] weapon.offhand with milk_bucket\nexecute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.offhand gm4_infinitas_shamir:restore_shamir\n\n# clean up\nadvancement revoke @s only gm4_infinitas_shamir:milk/drink_mainhand\nadvancement revoke @s only gm4_infinitas_shamir:milk/drink_offhand\ntag @s remove gm4_infinitas_delay_replace\ntag @s remove gm4_infinitas_delay_replace_milk\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/powder_snow.mcfunction",
    "content": "# Checks which hand slot player used to place powder snow\n# @s = player holding powder snow bucket, previously holding Infinitas Powder Snow Bucket\n# at @s\n# run from gm4_infinitas_shamir:delayed_replace/check_tag\n\nexecute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:powder_snow/place_mainhand=true},predicate=gm4_infinitas_shamir:mainhand/after/use_bucket] weapon.mainhand with powder_snow_bucket\nexecute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.mainhand gm4_infinitas_shamir:restore_shamir\nexecute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:powder_snow/place_offhand=true},predicate=gm4_infinitas_shamir:offhand/after/use_bucket] weapon.offhand with powder_snow_bucket\nexecute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.offhand gm4_infinitas_shamir:restore_shamir\n\n# clean up\nadvancement revoke @s only gm4_infinitas_shamir:powder_snow/place_mainhand\nadvancement revoke @s only gm4_infinitas_shamir:powder_snow/place_offhand\ntag @s remove gm4_infinitas_delay_replace\ntag @s remove gm4_infinitas_delay_replace_powder_snow\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/water.mcfunction",
    "content": "# Checks which hand slot player used to place water\n# @s = player holding water bucket, previously holding Infinitas Water Bucket\n# at @s\n# run from gm4_infinitas_shamir:delayed_replace/check_tag\n\nexecute store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/water,predicate=gm4_infinitas_shamir:mainhand/after/water_advancement] weapon.mainhand with water_bucket\nexecute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.mainhand gm4_infinitas_shamir:restore_shamir\nexecute store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/water,predicate=gm4_infinitas_shamir:offhand/after/water_advancement] weapon.offhand with water_bucket\nexecute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.offhand gm4_infinitas_shamir:restore_shamir\n\n# clean up\nadvancement revoke @s only gm4_infinitas_shamir:water/place\ntag @s remove gm4_infinitas_delay_replace\ntag @s remove gm4_infinitas_delay_replace_water\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/empty/check_holding.mcfunction",
    "content": "# Checks which hand player is holding an Infinitas Empty Bucket\n# @s = player with Infinitas Empty Bucket in their inventory\n# run from gm4_infinitas_shamir:empty/check_inventory\n\ntag @s add gm4_has_empty_infinitas\ntag @s[predicate=gm4_infinitas_shamir:mainhand/holding/empty] add gm4_infinitas_mainhand_empty\ntag @s[predicate=gm4_infinitas_shamir:offhand/holding/empty] add gm4_infinitas_offhand_empty\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/empty/check_inventory.mcfunction",
    "content": "# Checks player's inventory for an Infinitas Empty Bucket\n# @s = player with tag, gm4_has_empty_infinitas\n# run from gm4_infinitas_shamir:clock/inventory_check\n\ntag @s remove gm4_has_empty_infinitas\ntag @s remove gm4_infinitas_mainhand_empty\ntag @s remove gm4_infinitas_offhand_empty\nscoreboard players reset @s gm4_infinitas_empty_held\n\nexecute store result score @s gm4_infinitas_empty_held run clear @s bucket[custom_data~{gm4_metallurgy:{active_shamir:\"infinitas\"}}] 0\nexecute if score @s gm4_infinitas_empty_held matches 1.. run function gm4_infinitas_shamir:empty/check_holding\nexecute unless score @s gm4_infinitas_empty_held matches 1.. run function gm4_infinitas_shamir:empty/remove_tag\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/empty/pickup.mcfunction",
    "content": "# Player picking up a liquid using Infinitas Empty Bucket\n# @s = player using an Infinitas Empty Bucket\n# at @s\n# run from advancement, gm4_infinitas_shamir:empty/pickup_(mainhand or offhand)\n\ntag @s add gm4_infinitas_delay_replace\ntag @s add gm4_infinitas_delay_replace_empty\nschedule function gm4_infinitas_shamir:delayed_replace/call 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/empty/remove_tag.mcfunction",
    "content": "# Player no longer possessing any Infinitas Empty Buckets\n# @s = player\n# at @s\n# run from gm4_infinitas_shamir:empty/check_inventory\n\ntag @s remove gm4_has_empty_infinitas\ntag @s[tag=!gm4_has_lava_infinitas,tag=!gm4_has_powder_snow_infinitas,tag=!gm4_has_water_infinitas] remove gm4_has_infinitas\nadvancement revoke @s only gm4_infinitas_shamir:bucket_inventory_change bucket\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/lava/check_holding.mcfunction",
    "content": "# Checks which hand player is holding an Infinitas Lava Bucket\n# @s = player with Infinitas Lava Bucket in their inventory\n# run from gm4_infinitas_shamir:lava/check_inventory\n\ntag @s add gm4_has_lava_infinitas\ntag @s[predicate=gm4_infinitas_shamir:mainhand/holding/lava] add gm4_infinitas_mainhand_lava\ntag @s[predicate=gm4_infinitas_shamir:offhand/holding/lava] add gm4_infinitas_offhand_lava\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/lava/check_inventory.mcfunction",
    "content": "# Checks player's inventory for an Infinitas Lava Bucket\n# @s = player with tag, gm4_has_lava_infinitas\n# run from gm4_infinitas_shamir:clock/inventory_check\n\ntag @s remove gm4_has_lava_infinitas\ntag @s remove gm4_infinitas_mainhand_lava\ntag @s remove gm4_infinitas_offhand_lava\nscoreboard players reset @s gm4_infinitas_lava_held\n\nexecute store result score @s gm4_infinitas_lava_held run clear @s lava_bucket[custom_data~{gm4_metallurgy:{active_shamir:\"infinitas\"}}] 0\nexecute if score @s gm4_infinitas_lava_held matches 1.. run function gm4_infinitas_shamir:lava/check_holding\nexecute unless score @s gm4_infinitas_lava_held matches 1.. run function gm4_infinitas_shamir:lava/remove_tag\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/lava/place.mcfunction",
    "content": "# Player placing lava using Infinitas Lava Bucket\n# @s = player using an Infinitas Lava Bucket\n# at @s\n# run from advancement, gm4_infinitas_shamir:lava/place_(mainhand or offhand)\n\ntag @s add gm4_infinitas_delay_replace\ntag @s add gm4_infinitas_delay_replace_lava\nschedule function gm4_infinitas_shamir:delayed_replace/call 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/lava/remove_tag.mcfunction",
    "content": "# Player no longer possessing any Infinitas Lava Buckets\n# @s = player\n# at @s\n# run from gm4_infinitas_shamir:lava/check_inventory\n\ntag @s remove gm4_has_lava_infinitas\ntag @s[tag=!gm4_has_empty_infinitas,tag=!gm4_has_powder_snow_infinitas,tag=!gm4_has_water_infinitas] remove gm4_has_infinitas\nadvancement revoke @s only gm4_infinitas_shamir:bucket_inventory_change lava_bucket\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/make_unstackable.mcfunction",
    "content": "# Makes the bucket unstackable\n# @s = item to receive the shamir\n# @e[tag=gm4_ml_source] = shamir item\n# called from #gm4_metallurgy:apply_band\n\nitem modify entity @s contents gm4_infinitas_shamir:make_unstackable\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/milk/drink.mcfunction",
    "content": "# Player drinking milk using Infinitas Milk Bucket\n# @s = player drinking an Infinitas Milk Bucket\n# at @s\n# run from advancement, gm4_infinitas_shamir:milk/drink_(mainhand or offhand)\n\ntag @s add gm4_infinitas_delay_replace\ntag @s add gm4_infinitas_delay_replace_milk\nschedule function gm4_infinitas_shamir:delayed_replace/call 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/powder_snow/check_holding.mcfunction",
    "content": "# Checks which hand player is holding an Infinitas Powder Snow Bucket\n# @s = player with Infinitas Powder Snow Bucket in their inventory\n# run from gm4_infinitas_shamir:powder_snow/check_inventory\n\ntag @s add gm4_has_powder_snow_infinitas\ntag @s[predicate=gm4_infinitas_shamir:mainhand/holding/powder_snow] add gm4_infinitas_mainhand_powder_snow\ntag @s[predicate=gm4_infinitas_shamir:offhand/holding/powder_snow] add gm4_infinitas_offhand_powder_snow\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/powder_snow/check_inventory.mcfunction",
    "content": "# Checks player's inventory for an Infinitas Powder snow Bucket\n# @s = player with tag, gm4_has_powder_snow_infinitas\n# run from gm4_infinitas_shamir:clock/inventory_check\n\ntag @s remove gm4_has_powder_snow_infinitas\ntag @s remove gm4_infinitas_mainhand_powder_snow\ntag @s remove gm4_infinitas_offhand_powder_snow\nscoreboard players reset @s gm4_infinitas_powder_snow_held\n\nexecute store result score @s gm4_infinitas_powder_snow_held run clear @s powder_snow_bucket[custom_data~{gm4_metallurgy:{active_shamir:\"infinitas\"}}] 0\nexecute if score @s gm4_infinitas_powder_snow_held matches 1.. run function gm4_infinitas_shamir:powder_snow/check_holding\nexecute unless score @s gm4_infinitas_powder_snow_held matches 1.. run function gm4_infinitas_shamir:powder_snow/remove_tag\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/powder_snow/place.mcfunction",
    "content": "# Player placing powder snow using Infinitas Powder Snow Bucket\n# @s = player using an Infinitas Powder Snow Bucket\n# at @s\n# run from advancement, gm4_infinitas_shamir:powder_snow/place_(mainhand or offhand)\n\ntag @s add gm4_infinitas_delay_replace\ntag @s add gm4_infinitas_delay_replace_powder_snow\nschedule function gm4_infinitas_shamir:delayed_replace/call 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/powder_snow/remove_tag.mcfunction",
    "content": "# Player no longer possessing any Infinitas Powder Snow Buckets\n# @s = player\n# at @s\n# run from gm4_infinitas_shamir:powder_snow/check_inventory\n\ntag @s remove gm4_has_powder_snow_infinitas\ntag @s[tag=!gm4_has_empty_infinitas,tag=!gm4_has_lava_infinitas,tag=!gm4_has_water_infinitas] remove gm4_has_infinitas\nadvancement revoke @s only gm4_infinitas_shamir:bucket_inventory_change powder_snow_bucket\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/rejoin_check.mcfunction",
    "content": "# Forces a player to do an Infinitas tag check\n# @s = player rejoining world\n# at @s\n# run from advancement, gm4_infinitas_shamir:rejoin_bucket_check\n\nadvancement revoke @s only gm4_infinitas_shamir:rejoin_bucket_check\nscoreboard players reset @s gm4_infinitas_leave\nfunction gm4_infinitas_shamir:add_tags\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/spiral.mcfunction",
    "content": "# run from metallurgy:tick\n# @s = players holding an Infinitas bucket\n\nexecute positioned ~ ~-1 ~1 as @e[tag=gm4_in_infinitas,dx=5,dy=2,dz=4] run data merge entity @s {Motion:[-0.9d,0.0d,-0.1d]}\nexecute positioned ~-1 ~-1 ~ as @e[tag=gm4_in_infinitas,dx=-4,dy=2,dz=5] run data merge entity @s {Motion:[0.1d,0.0d,-0.9d]}\nexecute positioned ~ ~-1 ~-1 as @e[tag=gm4_in_infinitas,dx=-5,dy=2,dz=-4] run data merge entity @s {Motion:[0.9d,0.0d,0.1d]}\nexecute positioned ~1 ~-1 ~ as @e[tag=gm4_in_infinitas,dx=4,dy=2,dz=-5] run data merge entity @s {Motion:[-0.1d,0.0d,0.9d]}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/curies_bismium via #gm4_metallurgy:summon_band/curies_bismium\n\nloot spawn ~ ~ ~ loot gm4_infinitas_shamir:band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/water/check_holding.mcfunction",
    "content": "# Checks which hand player is holding an Infinitas Water Bucket\n# @s = player with Infinitas Water Bucket in their inventory\n# run from gm4_infinitas_shamir:water/check_inventory\n\ntag @s add gm4_has_water_infinitas\ntag @s[predicate=gm4_infinitas_shamir:mainhand/holding/water] add gm4_infinitas_mainhand_water\ntag @s[predicate=gm4_infinitas_shamir:offhand/holding/water] add gm4_infinitas_offhand_water\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/water/check_inventory.mcfunction",
    "content": "# Checks player's inventory for an Infinitas Water Bucket\n# @s = player with tag, gm4_has_water_infinitas\n# run from gm4_infinitas_shamir:clock/inventory_check\n\ntag @s remove gm4_has_water_infinitas\ntag @s remove gm4_infinitas_mainhand_water\ntag @s remove gm4_infinitas_offhand_water\nscoreboard players reset @s gm4_infinitas_water_held\n\nexecute store result score @s gm4_infinitas_water_held run clear @s water_bucket[custom_data={gm4_metallurgy:{active_shamir:\"infinitas\"}}] 0\nexecute if score @s gm4_infinitas_water_held matches 1.. run function gm4_infinitas_shamir:water/check_holding\nexecute unless score @s gm4_infinitas_water_held matches 1.. run function gm4_infinitas_shamir:water/remove_tag\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/water/pickup.mcfunction",
    "content": "# Player picking up a fish using Infinitas Water Bucket\n# @s = player using an Infinitas Water Bucket\n# at @s\n# run from advancement, gm4_infinitas_shamir:water/pickup_(mainhand or offhand)\n\ntag @s add gm4_infinitas_delay_replace\ntag @s add gm4_infinitas_delay_replace_fish\n\nschedule function gm4_infinitas_shamir:delayed_replace/call 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/water/place.mcfunction",
    "content": "# Player placing water using Infinitas Water Bucket\n# @s = player using an Infinitas Water Bucket\n# at @s\n# run from advancement, gm4_infinitas_shamir:water/place\n\ntag @s add gm4_infinitas_delay_replace\ntag @s add gm4_infinitas_delay_replace_water\nschedule function gm4_infinitas_shamir:delayed_replace/call 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/function/water/remove_tag.mcfunction",
    "content": "# Player no longer possessing any Infinitas Water Buckets\n# @s = player\n# at @s\n# run from gm4_infinitas_shamir:water/check_inventory\n\ntag @s remove gm4_has_water_infinitas\ntag @s[tag=!gm4_has_empty_infinitas,tag=!gm4_has_lava_infinitas,tag=!gm4_has_powder_snow_infinitas] remove gm4_has_infinitas\nadvancement revoke @s only gm4_infinitas_shamir:bucket_inventory_change water_bucket\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/guidebook/infinitas_shamir.json",
    "content": "{\n  \"id\": \"infinitas_shamir\",\n  \"name\": \"Infinitas Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"metallurgy\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Infinitas_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_infinitas_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'infinitas'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_infinitas_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.infinitas_shamir.description\",\n            \"fallback\": \"Infinitas items are infinite liquid sources. It also pulls mobs and items towards the user.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_infinitas_shamir\",\n          \"obtain_infinitas_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.infinitas_shamir.usage\",\n            \"fallback\": \"The Infinitas Shamir is found on Curie's Bismium Bands. It can be placed onto empty or filled buckets.\\n\\nInfinitas buckets can be used infinitely and will never get filled (if empty) or drained (if full).\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.infinitas_shamir.vacuum\",\n            \"fallback\": \"Holding an empty infinitas bucket will attract mobs and items in an 11x11 area.\\n\\nMobs affected by infinitas will be on cooldown until the user moves away or deselects the bucket.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/item_modifier/make_unstackable.json",
    "content": "{\n  \"function\": \"minecraft:set_components\",\n  \"components\": {\n    \"minecraft:max_stack_size\": 1\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/item_modifier/restore_shamir.json",
    "content": "[\n  {\n    \"function\": \"minecraft:set_components\",\n    \"components\": {\n      \"minecraft:max_stack_size\": 1,\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:shamir/infinitas\"]}\n    }\n  },\n  {\n    \"function\": \"minecraft:set_custom_data\",\n    \"tag\": \"{gm4_metallurgy:{has_shamir:1b,custom_model_data:3420100,metal:{type:'curies_bismium'},active_shamir:'infinitas'}}\"\n  },\n  {\n    \"function\": \"minecraft:set_lore\",\n    \"mode\": \"replace_all\",\n    \"lore\": [\n      {\n        \"translate\": \"item.gm4.metallurgy.band\",\n        \"fallback\": \"%s Band\",\n        \"with\": [\n          {\n            \"translate\": \"item.gm4.metallurgy.curies_bismium\",\n            \"fallback\": \"Curie's Bismium\"\n          }\n        ],\n        \"italic\": false,\n        \"color\": \"#467A1B\"\n      },\n      {\n        \"translate\": \"item.gm4.shamir.infinitas\",\n        \"fallback\": \"Infinitas Shamir\",\n        \"italic\": false,\n        \"color\": \"gray\"\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:curies_bismium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:shamir/infinitas\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'infinitas'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.infinitas\",\n                                    \"fallback\": \"Infinitas Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/empty.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"items\": [\n              \"minecraft:lava_bucket\"\n            ]\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"items\": [\n              \"minecraft:milk_bucket\"\n            ]\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"items\": [\n              \"minecraft:powder_snow_bucket\"\n            ]\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"items\": [\n              \"minecraft:water_bucket\"\n            ]\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/pickup/axolotl.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:axolotl_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/pickup/cod.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:cod_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/pickup/pufferfish.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:pufferfish_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/pickup/salmon.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:salmon_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/pickup/tadpole.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:tadpole_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/pickup/tropical_fish.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:tropical_fish_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/use_bucket.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"items\": [\n              \"minecraft:bucket\"\n            ]\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/water.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"items\": [\n              \"minecraft:bucket\"\n            ]\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"items\": [\n              \"minecraft:water_bucket\"\n            ]\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/water_advancement.json",
    "content": "{\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:entity_properties\",\n        \"entity\": \"this\",\n        \"predicate\": {\n          \"type_specific\": {\n            \"type\": \"player\",\n            \"advancements\": {\n              \"gm4_infinitas_shamir:water/place\": {\n                \"place_water_mainhand\": true\n              }\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:entity_properties\",\n        \"entity\": \"this\",\n        \"predicate\": {\n          \"type_specific\": {\n            \"type\": \"player\",\n            \"advancements\": {\n              \"gm4_infinitas_shamir:water/place\": {\n                \"use_on_cauldron_mainhand\": true\n              }\n            }\n          }\n        }\n      }\n    ]\n  }\n  "
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/holding/empty.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:bucket\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/holding/lava.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:lava_bucket\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/holding/powder_snow.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:powder_snow_bucket\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/holding/water.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:water_bucket\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/empty.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"offhand\": {\n            \"items\": [\n              \"minecraft:lava_bucket\"\n            ]\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"offhand\": {\n            \"items\": [\n              \"minecraft:milk_bucket\"\n            ]\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"offhand\": {\n            \"items\": [\n              \"minecraft:powder_snow_bucket\"\n            ]\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"offhand\": {\n            \"items\": [\n              \"minecraft:water_bucket\"\n            ]\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/fish.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:water_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/pickup/axolotl.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:axolotl_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/pickup/cod.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:cod_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/pickup/pufferfish.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:pufferfish_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/pickup/salmon.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:salmon_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/pickup/tadpole.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:tadpole_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/pickup/tropical_fish.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:tropical_fish_bucket\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/use_bucket.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"offhand\": {\n            \"items\": [\n              \"minecraft:bucket\"\n            ]\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/water.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"offhand\": {\n            \"items\": [\n              \"minecraft:bucket\"\n            ]\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"offhand\": {\n            \"items\": [\n              \"minecraft:water_bucket\"\n            ]\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/water_advancement.json",
    "content": "{\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:entity_properties\",\n        \"entity\": \"this\",\n        \"predicate\": {\n          \"type_specific\": {\n            \"type\": \"player\",\n            \"advancements\": {\n              \"gm4_infinitas_shamir:water/place\": {\n                \"place_water_offhand\": true\n              }\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:entity_properties\",\n        \"entity\": \"this\",\n        \"predicate\": {\n          \"type_specific\": {\n            \"type\": \"player\",\n            \"advancements\": {\n              \"gm4_infinitas_shamir:water/place\": {\n                \"use_on_cauldron_offhand\": true\n              }\n            }\n          }\n        }\n      }\n    ]\n  }\n  "
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/holding/empty.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:bucket\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/holding/lava.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:lava_bucket\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/holding/powder_snow.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:powder_snow_bucket\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/holding/water.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:water_bucket\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"minecraft:axolotl_bucket\",\n    \"minecraft:bucket\",\n    \"minecraft:cod_bucket\",\n    \"minecraft:milk_bucket\",\n    \"minecraft:pufferfish_bucket\",\n    \"minecraft:salmon_bucket\",\n    \"minecraft:tadpole_bucket\",\n    \"minecraft:tropical_fish_bucket\",\n    \"minecraft:water_bucket\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/tags/item/valid_items_lava.json",
    "content": "{\n  \"values\": [\n    \"minecraft:lava_bucket\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/tags/item/valid_items_powder_snow.json",
    "content": "{\n  \"values\": [\n    \"minecraft:powder_snow_bucket\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/test/check_empty_pickup.mcfunction",
    "content": "# @template gm4_metallurgy:test_smooshing\n# @dummy ~0.5 ~4 ~1.5\n# @skyaccess\n\nexecute at @s run tp @s ~ ~ ~ 270 50\n\nsummon item ~1.5 ~2.5 ~1.5 {Item:{id:\"minecraft:bucket\"}}\nloot spawn ~1.5 ~2.5 ~1.5 loot gm4_infinitas_shamir:band\n\nawait delay 1s\n\nsetblock ~1 ~4 ~1 redstone_block\n\nawait items entity @e[type=item,distance=..6] contents minecraft:obsidian\n\n# equip smooshed infinitas bucket\nexecute as @e[type=item,distance=..6] if items entity @s contents minecraft:bucket run tag @s add gm4_test_infinitas_bucket\nitem replace entity @s weapon.mainhand from entity @e[type=item,tag=gm4_test_infinitas_bucket,distance=..6,limit=1] contents\n\nawait items entity @s weapon.mainhand *[custom_data~{gm4_metallurgy:{active_shamir:\"infinitas\"}}]\n\nsetblock ~1 ~4 ~1 water\n\ndummy @s use item\n\nawait delay 2t\n\nassert items entity @s weapon.mainhand *[custom_data~{gm4_metallurgy:{active_shamir:\"infinitas\"}}]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_infinitas_shamir/test/check_unsmoosh_after_use.mcfunction",
    "content": "# @template gm4_metallurgy:test_smooshing\n# @dummy ~0.5 ~4 ~1.5\n\n# repeat steps from check_empty_pickup\nexecute at @s run tp @s ~ ~ ~ 270 50\n\nsummon item ~1.5 ~2.5 ~1.5 {Item:{id:\"minecraft:bucket\"}}\nloot spawn ~1.5 ~2.5 ~1.5 loot gm4_infinitas_shamir:band\n\nawait delay 1s\n\nsetblock ~1 ~4 ~1 redstone_block\n\nawait items entity @e[type=item,distance=..6] contents minecraft:obsidian\n\nexecute as @e[type=item,distance=..6] if items entity @s contents minecraft:bucket run tag @s add gm4_test_infinitas_bucket\nitem replace entity @s weapon.mainhand from entity @e[type=item,tag=gm4_test_infinitas_bucket,distance=..6,limit=1] contents\n\nawait items entity @s weapon.mainhand *[custom_data~{gm4_metallurgy:{active_shamir:\"infinitas\"}}]\n\nsetblock ~1 ~4 ~1 water\n\ndummy @s use item\n\nawait delay 2t\n\n# below is unsmoosh\ndummy @s drop\nexecute as @e[type=item,distance=..6] if items entity @s contents minecraft:bucket run tp @s ~1.5 ~2.5 ~1.5\n\nawait delay 1s\nsetblock ~1 ~4 ~1 redstone_block\n\nawait items entity @e[type=item,distance=..6] contents minecraft:player_head[custom_data~{gm4_metallurgy:{stored_shamir:\"infinitas\"}}]\nexecute as @e[type=item,distance=..6] if items entity @s contents minecraft:player_head unless data entity @s Item.components.\"minecraft:custom_data\".gm4_metallurgy.stored_shamir run fail \"Unsmooshed shamir did not properly transfer shamir to cast\"\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_aluminium.mcfunction",
    "content": "# @s = sand ring that needs to accept a metal\n# run from initialize\n\n# add score to sand ring\ntag @s add gm4_contains_metal\nitem modify entity @s armor.head gm4_metallurgy:mould/hot_metal\nscoreboard players operation @s gm4_ml_ore_al += $metal_amount gm4_ml_data\nexecute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:\"minecraft:obsidian\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_metallurgy:item/slightly_damaged_obsidian\"]},\"minecraft:lore\":[{\"translate\":\"item.gm4.slightly_damaged_obsidian\",\"fallback\":\"Slightly Damaged Obsidian\",\"color\":\"dark_gray\"}]}}}\nexecute unless score $is_obsidian_cast gm4_ml_data matches 1.. run particle minecraft:block{block_state:\"minecraft:andesite\"} ~.45 ~0.1 ~.65 .1 .1 .1 0 9\nparticle minecraft:block{block_state:\"minecraft:pink_terracotta\"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2\nplaysound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5\nadvancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast\nkill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{\"minecraft:custom_data\":{gm4_metallurgy:{metal:{type:\"aluminium\"}}}}}}]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_barimium.mcfunction",
    "content": "# @s = sand ring that needs to accept a metal\n# run from initialize\n\n# add score to sand ring\ntag @s add gm4_contains_metal\nitem modify entity @s armor.head gm4_metallurgy:mould/hot_metal\n\n# add primary metal\nscoreboard players operation @s gm4_ml_ore_al += $metal_amount gm4_ml_data\n\n# add secondary metal\nexecute store result score $metal_amount gm4_ml_data run data get storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal.amount[1]\nscoreboard players operation @s gm4_ml_ore_ba += $metal_amount gm4_ml_data\nexecute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:\"minecraft:obsidian\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_metallurgy:item/slightly_damaged_obsidian\"]},\"minecraft:lore\":[{\"translate\":\"item.gm4.slightly_damaged_obsidian\",\"fallback\":\"Slightly Damaged Obsidian\",\"color\":\"dark_gray\"}]}}}\n\n# visuals\nparticle minecraft:block{block_state:\"minecraft:dead_fire_coral_block\"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2\nplaysound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5\nadvancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast\nkill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{\"minecraft:custom_data\":{gm4_metallurgy:{metal:{type:\"barimium\"}}}}}}]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_barium.mcfunction",
    "content": "# @s = sand ring that needs to accept a metal\n# run from initialize\n\n#add score to sand ring\ntag @s add gm4_contains_metal\nitem modify entity @s armor.head gm4_metallurgy:mould/hot_metal\nscoreboard players operation @s gm4_ml_ore_ba += $metal_amount gm4_ml_data\nexecute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:\"minecraft:obsidian\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_metallurgy:item/slightly_damaged_obsidian\"]},\"minecraft:lore\":[{\"translate\":\"item.gm4.slightly_damaged_obsidian\",\"fallback\":\"Slightly Damaged Obsidian\",\"color\":\"dark_gray\"}]}}}\nexecute unless score $is_obsidian_cast gm4_ml_data matches 1.. run particle minecraft:block{block_state:\"minecraft:granite\"} ~.45 ~0.1 ~.65 .1 .1 .1 0 9\nparticle minecraft:block{block_state:\"minecraft:white_concrete_powder\"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2\nplaysound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5\nadvancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast\nkill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{\"minecraft:custom_data\":{gm4_metallurgy:{metal:{type:\"barium\"}}}}}}]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_bismuth.mcfunction",
    "content": "# @s = sand ring that needs to accept a metal\n# run from initialize\n\n# add score to sand ring\ntag @s add gm4_contains_metal\nitem modify entity @s armor.head gm4_metallurgy:mould/hot_metal\nscoreboard players operation @s gm4_ml_ore_bi += $metal_amount gm4_ml_data\nexecute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:\"minecraft:obsidian\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_metallurgy:item/slightly_damaged_obsidian\"]},\"minecraft:lore\":[{\"translate\":\"item.gm4.slightly_damaged_obsidian\",\"fallback\":\"Slightly Damaged Obsidian\",\"color\":\"dark_gray\"}]}}}\nexecute unless score $is_obsidian_cast gm4_ml_data matches 1.. run particle minecraft:block{block_state:\"minecraft:stone\"} ~.45 ~0.1 ~.65 .1 .1 .1 0 9\nparticle minecraft:block{block_state:\"minecraft:melon\"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2\nplaysound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5\nadvancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast\nkill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{\"minecraft:custom_data\":{gm4_metallurgy:{metal:{type:\"bismuth\"}}}}}}]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_copper.mcfunction",
    "content": "# @s = sand ring that needs to accept a metal\n# run from initialize\n\n#add score to sand ring\ntag @s add gm4_contains_metal\nitem modify entity @s armor.head gm4_metallurgy:mould/hot_metal\nscoreboard players operation @s gm4_ml_ore_bi += $metal_amount gm4_ml_data\nexecute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:\"minecraft:obsidian\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_metallurgy:item/slightly_damaged_obsidian\"]},\"minecraft:lore\":[{\"translate\":\"item.gm4.slightly_damaged_obsidian\",\"fallback\":\"Slightly Damaged Obsidian\",\"color\":\"dark_gray\"}]}}}\nexecute unless score $is_obsidian_cast gm4_ml_data matches 1.. run particle minecraft:block{block_state:\"minecraft:stone\"} ~.45 ~0.1 ~.65 .1 .1 .1 0 9\nparticle minecraft:block{block_state:\"minecraft:weathered_copper\"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2\nplaysound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5\nadvancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast\nkill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{\"minecraft:custom_data\":{gm4_metallurgy:{metal:{type:\"copper\"}}}}}}]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_curies_bismium.mcfunction",
    "content": "# @s = sand ring that needs to accept a metal\n# run from initialize\n\n# add score to sand ring\ntag @s add gm4_contains_metal\nitem modify entity @s armor.head gm4_metallurgy:mould/hot_metal\n\n# add primary metal\nscoreboard players operation @s gm4_ml_ore_th += $metal_amount gm4_ml_data\n\n# add secondary metal\nexecute store result score $metal_amount gm4_ml_data run data get storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal.amount[1]\nscoreboard players operation @s gm4_ml_ore_bi += $metal_amount gm4_ml_data\nexecute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:\"minecraft:obsidian\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_metallurgy:item/slightly_damaged_obsidian\"]},\"minecraft:lore\":[{\"translate\":\"item.gm4.slightly_damaged_obsidian\",\"fallback\":\"Slightly Damaged Obsidian\",\"color\":\"dark_gray\"}]}}}\n\n# visuals\nparticle minecraft:block{block_state:\"minecraft:lime_concrete_powder\"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2\nplaysound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5\nadvancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast\nkill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{\"minecraft:custom_data\":{gm4_metallurgy:{metal:{type:\"curies_bismium\"}}}}}}]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_thorium.mcfunction",
    "content": "# @s = sand ring that needs to accept a metal\n# run from initialize\n\n# add score to sand ring\ntag @s add gm4_contains_metal\nitem modify entity @s armor.head gm4_metallurgy:mould/hot_metal\nscoreboard players operation @s gm4_ml_ore_th += $metal_amount gm4_ml_data\nexecute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:\"minecraft:obsidian\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_metallurgy:item/slightly_damaged_obsidian\"]},\"minecraft:lore\":[{\"translate\":\"item.gm4.slightly_damaged_obsidian\",\"fallback\":\"Slightly Damaged Obsidian\",\"color\":\"dark_gray\"}]}}}\nexecute unless score $is_obsidian_cast gm4_ml_data matches 1.. run particle minecraft:block{block_state:\"minecraft:diorite\"} ~.45 ~0.1 ~.65 .1 .1 .1 0 9\nparticle minecraft:block{block_state:\"minecraft:dead_fire_coral_block\"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2\nplaysound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5\nadvancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast\nkill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{\"minecraft:custom_data\":{gm4_metallurgy:{metal:{type:\"thorium\"}}}}}}]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_thorium_brass.mcfunction",
    "content": "# @s = sand ring that needs to accept a metal\n# run from initialize\n\n# add score to sand ring\ntag @s add gm4_contains_metal\nitem modify entity @s armor.head gm4_metallurgy:mould/hot_metal\n\n# add primary metal\nscoreboard players operation @s gm4_ml_ore_th += $metal_amount gm4_ml_data\n\n# add secondary metal\nexecute store result score $metal_amount gm4_ml_data run data get storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal.amount[1]\nscoreboard players operation @s gm4_ml_ore_bi += $metal_amount gm4_ml_data\nexecute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:\"minecraft:obsidian\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_metallurgy:item/slightly_damaged_obsidian\"]},\"minecraft:lore\":[{\"translate\":\"item.gm4.slightly_damaged_obsidian\",\"fallback\":\"Slightly Damaged Obsidian\",\"color\":\"dark_gray\"}]}}}\n\n# visuals\nparticle minecraft:block{block_state:\"minecraft:lime_concrete_powder\"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2\nplaysound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5\nadvancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast\nkill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{\"minecraft:custom_data\":{gm4_metallurgy:{metal:{type:\"thorium_brass\"}}}}}}]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/initialize.mcfunction",
    "content": "# @s = armor_stand mould entity\n# runs from sustain_mould\n\n# determine ore type and primary metal amount\ndata modify storage gm4_metallurgy:temp/item/ore gm4_metallurgy set from entity @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,predicate=gm4_metallurgy:is_castable,predicate=gm4_metallurgy:on_ground,limit=1] Item.components.\"minecraft:custom_data\".gm4_metallurgy\nexecute store result score $metal_amount gm4_ml_data run data get storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal.amount[0]\nexecute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy{item:\"obsidian_cast\"} run scoreboard players set $is_obsidian_cast gm4_ml_data 1\n\n# store recasted shamir id\nexecute if score $is_obsidian_cast gm4_ml_data matches 1 run data modify entity @s equipment.feet.components.\"minecraft:custom_data\".gm4_metallurgy set from storage gm4_metallurgy:temp/item/ore gm4_metallurgy\n\n# absorb ore item\nexecute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:\"aluminium\"} run function gm4_metallurgy:casting/add_metal/add_aluminium\nexecute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:\"barimium\"} run function gm4_metallurgy:casting/add_metal/add_barimium\nexecute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:\"barium\"} run function gm4_metallurgy:casting/add_metal/add_barium\nexecute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:\"bismuth\"} run function gm4_metallurgy:casting/add_metal/add_bismuth\nexecute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:\"copper\"} run function gm4_metallurgy:casting/add_metal/add_copper\nexecute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:\"thorium\"} run function gm4_metallurgy:casting/add_metal/add_thorium\nexecute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:\"curies_bismium\"} run function gm4_metallurgy:casting/add_metal/add_curies_bismium\nexecute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:\"thorium_brass\"} run function gm4_metallurgy:casting/add_metal/add_thorium_brass\n\n# reset storage and scoreboard values\nscoreboard players reset $metal_amount gm4_ml_data\nscoreboard players reset $is_obsidian_cast gm4_ml_data\ndata remove storage gm4_metallurgy:temp/item/ore gm4_metallurgy\n\n# make all ores on top jump\nexecute as @e[type=item,tag=!gm4_ml_in_animation,dx=0,dz=0,predicate=gm4_metallurgy:is_castable,predicate=gm4_metallurgy:on_ground,limit=1] run data merge entity @s {Motion:[0.0,0.35,0.0],PickupDelay:30,Tags:[\"gm4_ml_in_animation\"]}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/create_mould.mcfunction",
    "content": "# @s = obsidian block with count of 1 on top of sand next to a clay ball with a count of 1\n# run from main\n\nsummon armor_stand ~.45 ~-1.150 ~.65 {CustomName:\"gm4_sand_ring\",Tags:[\"gm4_sand_ring\",\"gm4_new_sand_ring\"],equipment:{feet:{id:\"minecraft:stick\",count:1},head:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_metallurgy:block/mould/cool_empty\"]},\"minecraft:profile\":\"$mould/cool_empty\"}}},Silent:1b,Invulnerable:1b,Marker:1b,Invisible:1b,NoGravity:1b,Small:1b,HasVisualFire:1b}\n\nscoreboard players add @e[type=armor_stand,tag=gm4_new_sand_ring] gm4_ml_ore_al 0\nscoreboard players add @e[type=armor_stand,tag=gm4_new_sand_ring] gm4_ml_ore_ba 0\nscoreboard players add @e[type=armor_stand,tag=gm4_new_sand_ring] gm4_ml_ore_bi 0\nscoreboard players add @e[type=armor_stand,tag=gm4_new_sand_ring] gm4_ml_ore_th 0\n\nscoreboard players set @e[type=armor_stand,tag=gm4_new_sand_ring] gm4_ml_heat 30\ntag @e[type=armor_stand,tag=gm4_new_sand_ring] remove gm4_new_sand_ring\n\nkill @e[type=item,limit=1,dx=0,dy=0,dz=0,predicate=gm4_metallurgy:is_clay_ball,predicate=gm4_metallurgy:on_ground]\nkill @e[type=item,limit=1,dx=0,dy=0,dz=0,predicate=gm4_metallurgy:is_obsidian,predicate=gm4_metallurgy:on_ground]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/destroy_mould.mcfunction",
    "content": "# decides in which way the mould should be destroyed depending on temperature and metal content\n# @s = moulds that need destroying\n# at @s positioned ~ ~1.23 ~ (at the x-z location of the mould, just above the surface of the sand)\n# run from sustain_mould\n\n# check for metal values in mold, drop corresponding items\n\n# mould contains no metal\nexecute if score @s gm4_ml_heat matches ..89 if entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=0,gm4_ml_ore_ba=0,gm4_ml_ore_th=0}] run summon item ~ ~ ~ {Item:{id:\"minecraft:obsidian\",count:1,components:{\"minecraft:lore\":[{\"translate\":\"item.gm4.slightly_damaged_obsidian\",\"fallback\":\"Slightly Damaged Obsidian\",\"color\":\"dark_gray\"}]}}}\n\n\n# set mould with metal in it\nexecute if score @s gm4_ml_heat matches ..49 unless entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=0,gm4_ml_ore_ba=0,gm4_ml_ore_th=0}] run function gm4_metallurgy:casting/set_mould\n\n\n# heated mould is broken with metal in it\nexecute if score @s gm4_ml_heat matches 50..89 unless entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=0,gm4_ml_ore_ba=0,gm4_ml_ore_th=0}] run function gm4_metallurgy:casting/overheat_mould\n\n\n# mould exceeds heat capacity\nexecute if score @s gm4_ml_heat matches 90.. run function gm4_metallurgy:casting/overheat_mould\n\n# kill mould\nplaysound item.hoe.till block @a ~ ~ ~ .25 .9\ntp ~ -2050 ~\nkill @s\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/finish_band.mcfunction",
    "content": "# @s = mould requesting a band\n# run from any function in casting/summon_band\n\ntag @e[type=item,distance=..0.1,predicate=gm4_metallurgy:has_shamir,nbt={Age:0s}] add gm4_ml_band\n\n# kill the band that matches the recasted band\nexecute store success score $has_recasted_band gm4_ml_data run data modify storage gm4_metallurgy:temp/item/cast stored_shamir set from entity @s equipment.feet.components.\"minecraft:custom_data\".gm4_metallurgy.stored_shamir\nexecute if score $has_recasted_band gm4_ml_data matches 1 as @e[type=item,tag=gm4_ml_band] run function gm4_metallurgy:casting/prevent_duplicate_recast\ndata remove storage gm4_metallurgy:temp/item/cast recasted_shamir\ndata remove storage gm4_metallurgy:temp/item/cast stored_shamir\n\n#select a random item and kill others\ntag @e[type=item,tag=gm4_ml_band,sort=random,limit=1] add gm4_ml_selected_band\nkill @e[type=item,tag=!gm4_ml_selected_band,tag=gm4_ml_band]\n\nscoreboard players set $band_applied gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/overheat_mould.mcfunction",
    "content": "# creates lava & fire in place of a destroyed mould when broken whilst still hot\n# @s = moulds that need to explode in fire and Death\n# at @s positioned ~ ~1.23 ~ (at the x-z location of the mould, just above the surface of the sand)\n# run from destroy_mould\n\nsetblock ~ ~-1 ~ lava[level=1]\nsummon item ~ ~ ~ {Item:{id:\"minecraft:magma_block\",count:1,components:{\"minecraft:lore\":[{\"translate\":\"item.gm4.slightly_overheated_obsidian\",\"fallback\":\"Slightly Overheated Obsidian\",\"italic\":false}]}},Motion:[0.0,0.2,0.0]}\nparticle large_smoke ~ ~ ~ 0.2 0.2 0.2 0.05 20\nplaysound block.fire.extinguish block @a ~ ~ ~ .25 .9\nfill ~1 ~1 ~1 ~-1 ~-1 ~-1 fire replace air\nadvancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_overheat_cast\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/prevent_duplicate_recast.mcfunction",
    "content": "# @s = new obsidian cast that was created by a recasted band\n# run from any function in casting/finish_band\n\ndata modify storage gm4_metallurgy:temp/item/cast recasted_shamir set from storage gm4_metallurgy:temp/item/cast stored_shamir\nexecute store result score $different_shamir gm4_ml_data run data modify storage gm4_metallurgy:temp/item/cast recasted_shamir set from entity @s Item.components.\"minecraft:custom_data\".gm4_metallurgy.stored_shamir\n\nexecute unless score $different_shamir gm4_ml_data matches 1 run kill @s\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/set_mould.mcfunction",
    "content": "# summons a shamir for a destroyed mould which contained a proper recipe\n# @s = moulds that needs a band\n# at @s positioned ~ ~1.23 ~ (at the x-z location of the mould, just above the surface of the sand)\n# run from destroy_mould\n\n# initialise fake players\nscoreboard players set $band_applied gm4_ml_data 0\n\n# check metal values\nexecute if entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=23,gm4_ml_ore_ba=0,gm4_ml_ore_th=0}] run function gm4_metallurgy:casting/summon_band/aluminium\nexecute if entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=0,gm4_ml_ore_ba=23,gm4_ml_ore_th=0}] run function gm4_metallurgy:casting/summon_band/barium\nexecute if entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=17,gm4_ml_ore_ba=6,gm4_ml_ore_th=0}] run function gm4_metallurgy:casting/summon_band/barimium\nexecute if entity @s[scores={gm4_ml_ore_bi=23,gm4_ml_ore_al=0,gm4_ml_ore_ba=0,gm4_ml_ore_th=0}] run function gm4_metallurgy:casting/summon_band/bismuth\nexecute if entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=0,gm4_ml_ore_ba=0,gm4_ml_ore_th=23}] run function gm4_metallurgy:casting/summon_band/thorium\nexecute if entity @s[scores={gm4_ml_ore_bi=6,gm4_ml_ore_al=0,gm4_ml_ore_ba=0,gm4_ml_ore_th=17}] run function gm4_metallurgy:casting/summon_band/curies_bismium\n\n\n\n# apply broken band if all other bands fail\nexecute if score $band_applied gm4_ml_data matches 0 run summon item ~ ~ ~ {Item:{id:\"minecraft:player_head\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_metallurgy:item/mundane_band\"]},\"minecraft:profile\":\"$band/mundane\",\"minecraft:item_name\":{\"translate\":\"item.gm4.metallurgy.obsidian_cast\",\"fallback\":\"Obsidian Cast\"},\"minecraft:lore\":[{\"italic\":false,\"color\":\"gray\",\"translate\":\"item.gm4.metallurgy.mundane_band\",\"fallback\":\"Mundane Band\"}]}}}\n\n# spawn xp if band was applied\nexecute if score $band_applied gm4_ml_data matches 1 if entity @p[distance=..4,gamemode=!spectator] run summon experience_orb ~ ~ ~ {Value:37s}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/summon_band/aluminium.mcfunction",
    "content": "# @s = mould requesting a aluminium band\n# run from set_mould\n\n#call expansions to summon their bands\nfunction #gm4_metallurgy:summon_band/aluminium\n\n#select a random shamir and finish the band creation\nfunction gm4_metallurgy:casting/finish_band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/summon_band/barimium.mcfunction",
    "content": "# @s = mould requesting a barimium band\n# run from set_mould\n\n#call expansions to summon their bands\nfunction #gm4_metallurgy:summon_band/barimium\n\n#select a random shamir and finish the band creation\nfunction gm4_metallurgy:casting/finish_band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/summon_band/barium.mcfunction",
    "content": "# @s = mould requesting a barium band\n# run from set_mould\n\n#call expansions to summon their bands\nfunction #gm4_metallurgy:summon_band/barium\n\n#select a random shamir and finish the band creation\nfunction gm4_metallurgy:casting/finish_band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/summon_band/bismuth.mcfunction",
    "content": "# @s = mould requesting a bismuth band\n# run from set_mould\n\n#call expansions to summon their bands\nfunction #gm4_metallurgy:summon_band/bismuth\n\n#select a random shamir and finish the band creation\nfunction gm4_metallurgy:casting/finish_band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/summon_band/curies_bismium.mcfunction",
    "content": "# @s = mould requesting a curies_bismium band\n# run from set_mould\n\n#call expansions to summon their bands\nfunction #gm4_metallurgy:summon_band/curies_bismium\n\n#select a random shamir and finish the band creation\nfunction gm4_metallurgy:casting/finish_band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/summon_band/thorium.mcfunction",
    "content": "# @s = mould requesting a thorium band\n# run from set_mould\n\n#call expansions to summon their bands\nfunction #gm4_metallurgy:summon_band/thorium\n\n#select a random shamir and finish the band creation\nfunction gm4_metallurgy:casting/finish_band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/casting/sustain_mould.mcfunction",
    "content": "# maintains active moulds\n# @s = armor_stand moulds\n# at @s positioned ~ ~1.23 ~ (at the x-z location of the mould, just above the surface of the sand)\n# run from main\n\n# manage heat\nscoreboard players remove @s gm4_ml_heat 1\nexecute if block ~ ~ ~ lava run scoreboard players add @s gm4_ml_heat 3\n\n# kill moulds that left their sand block\nexecute if score @s gm4_ml_heat matches 1..89 unless block ~ ~-1 ~ #minecraft:sand run function gm4_metallurgy:casting/destroy_mould\nexecute unless score @s gm4_ml_heat matches 1..89 run function gm4_metallurgy:casting/destroy_mould\n\n# add metals if player desires to do so\nexecute if score @s gm4_ml_heat matches 50..89 align xyz if entity @e[type=item,predicate=gm4_metallurgy:is_castable,predicate=gm4_metallurgy:on_ground,dx=0,dy=0,dz=0] run function gm4_metallurgy:casting/add_metal/initialize\n\n# hot ring without metal\nexecute if score @s[tag=!gm4_contains_metal] gm4_ml_heat matches 50..51 run item modify entity @s armor.head gm4_metallurgy:mould/hot_empty\n\n# hot ring with metal\nexecute if score @s[tag=gm4_contains_metal] gm4_ml_heat matches 50..51 run item modify entity @s armor.head gm4_metallurgy:mould/hot_metal\n\n# cool (I'm way too awesome!) ring without metals\nexecute if score @s[tag=!gm4_contains_metal] gm4_ml_heat matches 48..49 run item modify entity @s armor.head gm4_metallurgy:mould/cool_empty\n\n# cool ring with metal\nexecute if score @s[tag=gm4_contains_metal] gm4_ml_heat matches 48..49 run item modify entity @s armor.head gm4_metallurgy:mould/cool_metal\n\n\nexecute if score @s gm4_ml_heat matches 56.. run particle lava ~ ~ ~ 0 0 0 0.005 1\nexecute if score @s gm4_ml_heat matches 80.. run particle large_smoke ~ ~ ~ 0 0 0 0.05 6\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_ml_data dummy\nscoreboard objectives add gm4_ml_heat dummy\n\nscoreboard objectives add gm4_ml_ore_al dummy\nscoreboard objectives add gm4_ml_ore_ba dummy\nscoreboard objectives add gm4_ml_ore_bi dummy\nscoreboard objectives add gm4_ml_ore_th dummy\n\n#arborenda\nfunction gm4_arborenda_shamir:init_scoreboards\n#declare gm4_arborenda_shamir:temp\n\n#ender_bolt\nscoreboard objectives add gm4_bolt_time dummy\nscoreboard objectives add gm4_ender_bolt_own_id dummy\nscoreboard objectives add gm4_ender_bolt_foreign_id dummy\nexecute unless score $enable_pvp gm4_ender_bolt_foreign_id matches 0..1 run scoreboard players set $enable_pvp gm4_ender_bolt_foreign_id 1 \n\n#infinitas\nscoreboard objectives add gm4_infinitas_empty_held dummy\nscoreboard objectives add gm4_infinitas_lava_held dummy\nscoreboard objectives add gm4_infinitas_powder_snow_held dummy\nscoreboard objectives add gm4_infinitas_water_held dummy\nscoreboard objectives add gm4_infinitas_leave minecraft.custom:leave_game\nscoreboard objectives add gm4_infinitas_success_check dummy\nscoreboard players add $lava_infinitas gm4_ml_data 0\nscoreboard players add $powder_snow_infinitas gm4_ml_data 0\n\n#musical\nscoreboard objectives add gm4_note_collect totalKillCount\nscoreboard objectives add gm4_note_time dummy\n\n#sensus\nscoreboard players set $current_sensus_layer gm4_ml_data 0\n\n#vibro\nscoreboard objectives add gm4_vibro_fall minecraft.custom:minecraft.fall_one_cm\nscoreboard objectives add gm4_vibro_hurt minecraft.custom:minecraft.damage_taken\nscoreboard objectives add gm4_vibro_absorb minecraft.custom:minecraft.damage_absorbed\nscoreboard objectives add gm4_vibro_shock dummy\nscoreboard objectives add gm4_vibro_sneak dummy\nscoreboard players set #shock_multiplier gm4_vibro_shock 20\nscoreboard players set #100 gm4_vibro_shock 100\n\nexecute unless score metallurgy gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Metallurgy\"}\nexecute unless score metallurgy gm4_earliest_version < metallurgy gm4_modules run scoreboard players operation metallurgy gm4_earliest_version = metallurgy gm4_modules\nscoreboard players set metallurgy gm4_modules 1\n\nschedule function gm4_metallurgy:main 1t\nschedule function gm4_metallurgy:tick 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/main.mcfunction",
    "content": "schedule function gm4_metallurgy:main 16t\n\n# give radiation poisoning\neffect give @a[gamemode=!spectator,gamemode=!creative,predicate=gm4_metallurgy:carries_thorium] minecraft:mining_fatigue 2 1\n\n# manage moulds\nexecute as @e[type=armor_stand,tag=gm4_sand_ring] at @s positioned ~ ~1.23 ~ run function gm4_metallurgy:casting/sustain_mould\n\n# check for moulds waiting to be created\nexecute as @e[type=item,predicate=gm4_metallurgy:is_obsidian,predicate=gm4_metallurgy:on_ground] at @s if block ~ ~-0.1 ~ #minecraft:sand align xyz unless entity @e[type=armor_stand,tag=gm4_sand_ring,dx=0,dy=-1,dz=0,limit=1] if entity @e[type=item,dx=0,dy=0,dz=0,predicate=gm4_metallurgy:is_clay_ball,predicate=gm4_metallurgy:on_ground,limit=1] run function gm4_metallurgy:casting/create_mould\n\n# check for shamir on anvil\nscoreboard players reset found_item_on_anvil gm4_ml_data\nexecute as @e[type=item,tag=!gm4_ml_smooshed,predicate=gm4_metallurgy:on_ground,predicate=gm4_metallurgy:smooshing/has_shamir] at @s if block ~ ~-1 ~ #minecraft:anvil run function gm4_metallurgy:smooshing/item_on_anvil\n\n#============================== SHAMIR CLOCKING ================================\n#             (for shamirs that are included with the base module)\nscoreboard players set $arborenda_active gm4_ml_data 0\nscoreboard players set $hypexperia_active gm4_ml_data 0\nscoreboard players add $current_sensus_layer gm4_ml_data 1\nexecute if score $current_sensus_layer gm4_ml_data matches 6.. run scoreboard players set $current_sensus_layer gm4_ml_data 0\n\nscoreboard players reset $tool_max_damage gm4_ml_data\nscoreboard players reset $tool_current_damage gm4_ml_data\n\nexecute as @a run function gm4_metallurgy:player\n\nexecute as @e[scores={gm4_bolt_time=-40..}] at @s run function gm4_ender_bolt_shamir:infection/active\nexecute as @e[type=trident,predicate=gm4_metallurgy:is_ender_bolt_trident,nbt={inGround:1b}] at @s run function gm4_ender_bolt_shamir:infection/symptoms\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/player.mcfunction",
    "content": "# @s = a player not in spectator\n# run from main\n\ntag @s remove gm4_has_arborenda\ntag @s remove gm4_has_hypexperia\ntag @s remove gm4_has_musical\ntag @s remove gm4_has_sensus\ntag @s remove gm4_has_tinker\ntag @s remove gm4_has_vibro\n\nexecute if predicate gm4_metallurgy:shamir_in_hand at @s[gamemode=!spectator] run function gm4_metallurgy:shamir_in_hand\nexecute if predicate gm4_metallurgy:shamir_equipped at @s[gamemode=!spectator] run function gm4_metallurgy:shamir_equipped\n\nexecute if entity @s[tag=!gm4_has_musical] run function gm4_musical_shamir:songs/reset_player\n\nscoreboard players reset @s[tag=!gm4_has_vibro] gm4_vibro_sneak\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/shamir_equipped.mcfunction",
    "content": "# @s = player with an active shamir in their armor slots\n# run from player\n\nexecute if predicate gm4_metallurgy:defuse_active run function gm4_defuse_shamir:active\nexecute if predicate gm4_moneo_shamir:wear_chest_moneo run function gm4_moneo_shamir:active_armor_chest\nexecute if predicate gm4_metallurgy:vibro_active run function gm4_vibro_shamir:active\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/shamir_in_hand.mcfunction",
    "content": "# @s = player with an active shamir in their hands\n# run from player\n\nexecute if predicate gm4_metallurgy:arborenda_active run function gm4_arborenda_shamir:active\nexecute if predicate gm4_metallurgy:hypexperia_active run function gm4_hypexperia_shamir:active\nexecute if predicate gm4_metallurgy:moneo_active run function gm4_moneo_shamir:active_tool\nexecute if entity @s[scores={gm4_note_collect=1..},predicate=gm4_metallurgy:musical_active] run function gm4_musical_shamir:active\nexecute if predicate gm4_metallurgy:sensus_active run function gm4_sensus_shamir:active\nexecute if predicate gm4_metallurgy:infinitas_active run function gm4_infinitas_shamir:active\nexecute if predicate gm4_metallurgy:tinker_active run function gm4_tinker_shamir:active\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/add_band/check.mcfunction",
    "content": "# @s = obsidian cast with a shamir on it\n# called from smooshing/prepare_transfer\n\n# check whether the other item is valid\nscoreboard players set valid_item gm4_ml_data 0\nexecute as @e[type=item,dx=0,limit=1,predicate=gm4_metallurgy:smooshing/valid_item] run function gm4_metallurgy:smooshing/add_band/check_item\n\nexecute if score valid_item gm4_ml_data matches 1 run data merge entity @s {Item:{id:\"minecraft:obsidian\"},Tags:[\"gm4_ml_smooshed\"]}\nexecute if score valid_item gm4_ml_data matches 1 run item modify entity @s contents gm4_metallurgy:slightly_damaged_obsidian\nexecute if score valid_item gm4_ml_data matches 1 run data remove entity @s Item.components.\"minecraft:custom_data\".gm4_metallurgy\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/add_band/check_item.mcfunction",
    "content": "# @s = potential item to receive the shamir\n# called from smooshing/add_band/check\n\nfunction #gm4_metallurgy:check_item_validity\n\nexecute if score valid_item gm4_ml_data matches 1 run function gm4_metallurgy:smooshing/add_band/found_item\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/add_band/found_item.mcfunction",
    "content": "# @s = item to receive the shamir\n# @e[tag=gm4_ml_source] = shamir item\n# called from smooshing/add_band/check_item\n\n# apply the shamir to the item, copying its tags in the process\ntag @s add gm4_ml_smooshed\ndata modify entity @s Item.components.\"minecraft:custom_data\" merge value {gm4_metallurgy:{has_shamir:1b}}\ndata modify entity @s Item.components.\"minecraft:custom_data\".gm4_metallurgy.active_shamir set from entity @e[type=item,tag=gm4_ml_source,dx=0,limit=1] Item.components.\"minecraft:custom_data\".gm4_metallurgy.stored_shamir\ndata modify entity @s Item.components.\"minecraft:custom_data\".gm4_metallurgy.metal.type set from entity @e[type=item,tag=gm4_ml_source,dx=0,limit=1] Item.components.\"minecraft:custom_data\".gm4_metallurgy.metal.type\ndata modify entity @s Item.components.\"minecraft:lore\" prepend from entity @e[type=item,tag=gm4_ml_source,dx=0,limit=1] Item.components.\"minecraft:lore\"[]\nexecute as @e[type=item,tag=gm4_ml_source,dx=0,limit=1] if data entity @s Item.components.\"minecraft:custom_data\".gm4_metallurgy.custom_model_data run data modify entity @s Item.components.\"minecraft:custom_model_data\" set from entity @s Item.components.\"minecraft:custom_data\".gm4_metallurgy.custom_model_data\ndata modify entity @s Item.components.\"minecraft:custom_data\".gm4_metallurgy.custom_model_data set from entity @e[type=item,tag=gm4_ml_source,dx=0,limit=1] Item.components.\"minecraft:custom_model_data\"\nexecute unless data entity @s Item.components.\"minecraft:custom_model_data\" run data modify entity @s Item.components.\"minecraft:custom_model_data\" set from entity @e[type=item,tag=gm4_ml_source,dx=0,limit=1] Item.components.\"minecraft:custom_model_data\"\n\nfunction #gm4_metallurgy:apply_band\n\n# use anvil durability\nfunction gm4_metallurgy:smooshing/anvil/use\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/anvil/degrade/anvil.mcfunction",
    "content": "# checks the facing of the anvil and degrades it\n# @s = varies; an item used in the smooshing process\n# at align xyz in anvil\n# run from gm4_metallurgy:smooshing/anvil/degrade\n\nexecute if block ~ ~ ~ anvil[facing=north] run setblock ~ ~ ~ chipped_anvil[facing=north]\nexecute if block ~ ~ ~ anvil[facing=south] run setblock ~ ~ ~ chipped_anvil[facing=south]\nexecute if block ~ ~ ~ anvil[facing=east] run setblock ~ ~ ~ chipped_anvil[facing=east]\nexecute if block ~ ~ ~ anvil[facing=west] run setblock ~ ~ ~ chipped_anvil[facing=west]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/anvil/degrade/chipped_anvil.mcfunction",
    "content": "# checks the facing of the chipped_anvil and degrades it\n# @s = varies; an item used in the smooshing process\n# at align xyz in anvil\n# run from gm4_metallurgy:smooshing/anvil/degrade\n\nexecute if block ~ ~ ~ chipped_anvil[facing=north] run setblock ~ ~ ~ damaged_anvil[facing=north]\nexecute if block ~ ~ ~ chipped_anvil[facing=south] run setblock ~ ~ ~ damaged_anvil[facing=south]\nexecute if block ~ ~ ~ chipped_anvil[facing=east] run setblock ~ ~ ~ damaged_anvil[facing=east]\nexecute if block ~ ~ ~ chipped_anvil[facing=west] run setblock ~ ~ ~ damaged_anvil[facing=west]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/anvil/degrade/damaged_anvil.mcfunction",
    "content": "# checks the facing of the damaged_anvil and degrades it\n# @s = varies; an item used in the smooshing process\n# at align xyz in anvil\n# run from gm4_metallurgy:smooshing/anvil/degrade\n\nexecute if block ~ ~ ~ chipped_anvil[facing=north] run setblock ~ ~ ~ damaged_anvil[facing=north]\nexecute if block ~ ~ ~ chipped_anvil[facing=south] run setblock ~ ~ ~ damaged_anvil[facing=south]\nexecute if block ~ ~ ~ chipped_anvil[facing=east] run setblock ~ ~ ~ damaged_anvil[facing=east]\nexecute if block ~ ~ ~ chipped_anvil[facing=west] run setblock ~ ~ ~ damaged_anvil[facing=west]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/anvil/degrade.mcfunction",
    "content": "# decides which damage level to degrade to\n# @s = varies; an item used in the smooshing process\n# at align xyz in anvil\n# run from gm4_metallurgy:smooshing/anvil/use\n\n# degrade anvil block\nexecute if block ~ ~ ~ minecraft:damaged_anvil run setblock ~ ~ ~ air replace\nexecute if block ~ ~ ~ minecraft:chipped_anvil run function gm4_metallurgy:smooshing/anvil/degrade/chipped_anvil\nexecute if block ~ ~ ~ minecraft:anvil run function gm4_metallurgy:smooshing/anvil/degrade/anvil\n\n# particles\nparticle minecraft:block{block_state:\"minecraft:anvil\"} ~0.5 ~1 ~0.5 0.2 0 0.2 0 5\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/anvil/use.mcfunction",
    "content": "# Emulates vanilla anvil use. Anvils have a chance of losing 1 durability during smooshing.\n# @s = varies; an item used in the smooshing process\n# at align xyz in block over anvil\n# run from gm4_metallurgy:smooshing/add_band/found_item and gm4_metallurgy:smooshing/remove_band/found_obsidian\n\n# use anvil (12% chance)\nexecute if predicate gm4_metallurgy:smooshing/anvil_damage_chance positioned ~ ~-1 ~ run function gm4_metallurgy:smooshing/anvil/degrade\n\n# sound\nplaysound minecraft:entity.zombie.attack_iron_door block @a[distance=..16] ~ ~ ~ 0.6 0.7\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/item_on_anvil.mcfunction",
    "content": "# @s = item on avil with a shamir on it\n# run from main\nscoreboard players set found_item_on_anvil gm4_ml_data 1\ntag @s add gm4_ml_on_anvil\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/prepare_transfer.mcfunction",
    "content": "# @s = item being crushed by a piston that has a shamir\n# run from tick\n\ntag @s add gm4_ml_source\nexecute if data entity @s Item.components.\"minecraft:custom_data\".gm4_metallurgy.stored_shamir run function gm4_metallurgy:smooshing/add_band/check\nexecute if data entity @s Item.components.\"minecraft:custom_data\".gm4_metallurgy.active_shamir run function gm4_metallurgy:smooshing/remove_band/check\ntag @s remove gm4_ml_source\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/remove_band/check.mcfunction",
    "content": "# @s = item being crushed by a piston that has a shamir\n# run from smooshing/prepare_transfer\n\n#check whether the other item is an obsidian block\nscoreboard players set $valid_obsidian gm4_ml_data 0\nexecute if entity @e[type=item,dx=0,predicate=gm4_metallurgy:is_obsidian,limit=1] run function gm4_metallurgy:smooshing/remove_band/found_obsidian\n\n#if both custom model data tags are the same, then we can delete it\nexecute store success score custom_model_data gm4_ml_data run data modify entity @s Item.components.\"minecraft:custom_data\".gm4_metallurgy.custom_model_data set from entity @s Item.components.\"minecraft:custom_model_data\"\nexecute if score $valid_obsidian gm4_ml_data matches 1 run function gm4_metallurgy:smooshing/remove_band/clear_data\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/remove_band/clear_data.mcfunction",
    "content": "# @s = armor/tool with the band\n# run from smooshing/remove_band/check\n\nexecute if score custom_model_data gm4_ml_data matches 0 run data remove entity @s Item.components.\"minecraft:custom_model_data\"\n# Line 8 only clears custom data, while max stack size is its own component\nexecute if items entity @s contents *[custom_data~{gm4_metallurgy:{active_shamir:\"infinitas\"}}] run data remove entity @s Item.components.\"minecraft:max_stack_size\"\ndata remove entity @s Item.components.\"minecraft:custom_data\".gm4_metallurgy\nexecute if items entity @s contents *[custom_data={}] run data remove entity @s Item.components.\"minecraft:custom_data\"\n\n# use lib_lore to remove the correct lines of lore\ndata modify storage gm4_lore:temp Source set from entity @s Item.components.\"minecraft:lore\"\n# check legacy Metallurgy lore\ndata modify storage gm4_lore:temp Target set value '{\"color\":\"aqua\",\"fallback\":\"Shamir\",\"italic\":false,\"translate\":\"item.gm4.metallurgy.shamir\"}'\n\nscoreboard players set $start gm4_lore 0\nfunction #gm4_lore:search\nexecute unless score $index gm4_lore matches -1 run return run function gm4_metallurgy:smooshing/remove_band/clear_legacy_lore\n\n# use lib_lore to remove the correct lines of lore\ndata modify storage gm4_lore:temp Target set from entity @s Item.components.\"minecraft:lore\"[0]\nscoreboard players set $start gm4_lore 0\nscoreboard players set $extra gm4_lore 1\nfunction #gm4_lore:remove\ndata modify entity @s Item.components.\"minecraft:lore\" set from storage gm4_lore:temp Source\n\n## Metallurgy lore 1.21+\n# Name: Obsidian Cast\n# Lore: <Metal Type> Band\n#       <Shamir> Shamir\n\n## Old Metallurgy lore (pre 1.21)\n# Name: Obsidian Cast\n# Lore: <Metal Type> Band\n#       Shamir\n#       <Shamir>\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/remove_band/clear_legacy_lore.mcfunction",
    "content": "# @s = armor/tool with the band\n# run from smooshing/remove_band/clear_data\n\n# use lib_lore to remove the correct lines of lore\n## NOTE: gm4_lore:temp Target is still \"Shamir\" from clear_data search\nscoreboard players set $start gm4_lore -1\nscoreboard players set $extra gm4_lore 2\nfunction #gm4_lore:remove\ndata modify entity @s Item.components.\"minecraft:lore\" set from storage gm4_lore:temp Source\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/remove_band/found_obsidian.mcfunction",
    "content": "# @s = item being crushed by a piston that has a shamir\n# run from smooshing/remove_band/check\n\nfunction gm4_metallurgy:smooshing/remove_band/spawn_band with entity @s Item.components.\"minecraft:custom_data\".gm4_metallurgy\n\n# use anvil durability\nfunction gm4_metallurgy:smooshing/anvil/use\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/smooshing/remove_band/spawn_band.mcfunction",
    "content": "$execute store result score $valid_obsidian gm4_ml_data run loot spawn ~ ~ ~ loot gm4_$(active_shamir)_shamir:band\n\ntag @n[type=item,nbt={Age:0s}] add gm4_ml_smooshed\n\nkill @e[type=item,dx=0,predicate=gm4_metallurgy:is_obsidian,limit=1]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/function/tick.mcfunction",
    "content": "# prepare for item smooshing\nexecute if score found_item_on_anvil gm4_ml_data matches 1 as @e[type=item,tag=gm4_ml_on_anvil] at @s if block ~ ~ ~ minecraft:moving_piston align xyz if entity @e[type=item,dx=0,predicate=gm4_metallurgy:smooshing/valid_item] run function gm4_metallurgy:smooshing/prepare_transfer\n\n\n# TODO: Disabling this functionality until someone updates the code\n# infinitas\n# execute if entity @e[tag=gm4_in_infinitas] as @a[predicate=gm4_metallurgy:infinitas_active] at @s run function gm4_infinitas_shamir:spiral\n\n# arborenda\nexecute as @a run function gm4_arborenda_shamir:player/check_for_axe\n\n# hypexperia\nexecute if score $hypexperia_active gm4_ml_data matches 1 run function gm4_hypexperia_shamir:find_orbs\n\n# vibro\nexecute as @a[gamemode=!spectator,tag=gm4_has_vibro,predicate=gm4_vibro_shamir:sneak_on_ground] at @s run function gm4_vibro_shamir:jump\nexecute as @a[gamemode=!spectator,scores={gm4_vibro_sneak=1..},predicate=!gm4_vibro_shamir:sneak_on_ground] run function gm4_vibro_shamir:remove_jump\nscoreboard players reset @a gm4_vibro_fall\nscoreboard players reset @a gm4_vibro_hurt\nscoreboard players reset @a gm4_vibro_absorb\n\nschedule function gm4_metallurgy:tick 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/guidebook/metallurgy.json",
    "content": "{\n  \"id\": \"metallurgy\",\n  \"name\": \"Metallurgy\",\n  \"module_type\": \"base\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_tnt\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:tnt\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_obsidian\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:obsidian\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_lump\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{item:\\\"ore\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_obsidian_cast\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,item:\\\"obsidian_cast\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.description\",\n            \"fallback\": \"Custom abilities, called shamirs, can be added to tools and armour, like enchantments.\\n\\nShamirs are exclusive, meaning only one can be applied to an item at a time.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"lump_obtaining\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_tnt\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.section.lump_obtaining\",\n            \"fallback\": \"Obtaining Ore\",\n            \"bold\": true\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.lump_obtaining\",\n            \"fallback\": \"Blowing up stone-type blocks with tnt will drop metal ore lumps.\\n\\nEach of the four stone types (stone, granite, andesite, and diorite) drop a different metal lump.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"casting\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_obsidian\"\n        ],\n        [\n          \"obtain_lump\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.section.casting\",\n            \"fallback\": \"Casting\",\n            \"bold\": true\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.mould\",\n            \"fallback\": \"A mould can be created by dropping 1 obsidian and 1 clay ball on a sand block.\\n\\nMoulds must be heated by placing lava on top of them. Overheating a mould causes it to smoke and break.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.mould_1\",\n            \"fallback\": \"Without lava, the mould will cool over time and must be reheated to added metal.\\n\\nIf no metal is added to the cast before it completely cools down, the obsidian will drop, losing the clay ball.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.adding_metal\",\n            \"fallback\": \"Ore lumps can be dropped in one by one into a heated mould. 23 ore lumps must be added for a proper cast.\\n\\nAlloys can be made using a 17-6 ratio: Aluminium + Barium or Thorium + Bismuth.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.recycling\",\n            \"fallback\": \"If a cast is dropped into the mould, it will return the obsidian and about half of its metal will recycled.\\n\\nPure metal bands supply 12 ore of their metal, while alloy metal bands supply 9 primary ore and 3 secondary ore.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.cooling\",\n            \"fallback\": \"Once a mould completely cools down, a Shamir Band will form.\\n\\nIf the casting process was done incorrectly, a useless Mundane Band will be on the cast.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"lump_obtaining\"\n      ]\n    },\n    {\n      \"name\": \"shamirs\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_obsidian_cast\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.section.shamirs\",\n            \"fallback\": \"Shamirs\",\n            \"bold\": true\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.metal_properties\",\n            \"fallback\": \"Each band type has a specific attribute.\\n\\nBismuth is creation, Thorium is destruction, and Curie's Bismium is equivalence.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.metal_properties_1\",\n            \"fallback\": \"Alluminium is supression, Barium is amplification, and Barimium is modification.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.smooshing\",\n            \"fallback\": \"To attach a shamir to an item, drop the cast and item on an anvil.\\n\\n'Smoosh' them together by powering a downwards facing piston placed two blocks above the anvil.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.metallurgy.smooshing_1\",\n            \"fallback\": \"To detach a shamir, do the same 'smooshing' process after dropping the shamir-bearing item and one obsidian.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"casting\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/item_modifier/mould/cool_empty.json",
    "content": "{\n  \"function\": \"minecraft:set_components\",\n  \"components\": {\n    \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:block/mould/cool_empty\"]},\n    \"minecraft:profile\": \"$mould/cool_empty\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/item_modifier/mould/cool_metal.json",
    "content": "{\n  \"function\": \"minecraft:set_components\",\n  \"components\": {\n    \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:block/mould/cool_metal\"]},\n    \"minecraft:profile\": \"$mould/cool_metal\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/item_modifier/mould/hot_empty.json",
    "content": "{\n  \"function\": \"minecraft:set_components\",\n  \"components\": {\n    \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:block/mould/hot_empty\"]},\n    \"minecraft:profile\": \"$mould/hot_empty\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/item_modifier/mould/hot_metal.json",
    "content": "{\n  \"function\": \"minecraft:set_components\",\n  \"components\": {\n    \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:block/mould/hot_metal\"]},\n    \"minecraft:profile\": \"$mould/hot_metal\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/item_modifier/slightly_damaged_obsidian.json",
    "content": "[\n  {\n    \"function\": \"minecraft:set_components\",\n    \"components\": {\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:item/slightly_damaged_obsidian\"]},\n      \"!minecraft:item_name\": {},\n      \"!minecraft:custom_name\": {},\n      \"!minecraft:profile\": {}\n    }\n  },\n  {\n    \"function\": \"minecraft:set_lore\",\n    \"mode\": \"replace_all\",\n    \"lore\": [\n      {\n        \"translate\": \"item.gm4.slightly_damaged_obsidian\",\n        \"fallback\": \"Slightly Damaged Obsidian\",\n        \"color\": \"dark_gray\"\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/loot_table/aluminium_band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:player_head\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:profile\": \"$band/aluminium\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{has_shamir:1b,metal:{type:'aluminium',amount:[12s],castable:1b},item:'obsidian_cast'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.metallurgy.obsidian_cast\",\n                                \"fallback\": \"Obsidian Cast\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.metallurgy.band\",\n                                    \"fallback\": \"%s Band\",\n                                    \"with\": [\n                                        {\n                                            \"translate\": \"item.gm4.metallurgy.aluminium\",\n                                            \"fallback\": \"Aluminium\"\n                                        }\n                                    ],\n                                    \"italic\": false,\n                                    \"color\": \"#F47989\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/loot_table/barimium_band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:player_head\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:profile\": \"$band/barimium\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{has_shamir:1b,metal:{type:'barimium',amount:[9s,3s],castable:1b},item:'obsidian_cast'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.metallurgy.obsidian_cast\",\n                                \"fallback\": \"Obsidian Cast\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.metallurgy.band\",\n                                    \"fallback\": \"%s Band\",\n                                    \"with\": [\n                                        {\n                                            \"translate\": \"item.gm4.metallurgy.barimium\",\n                                            \"fallback\": \"Barimium\"\n                                        }\n                                    ],\n                                    \"italic\": false,\n                                    \"color\": \"#D18A8A\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/loot_table/barium_band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:player_head\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:profile\": \"$band/barium\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{has_shamir:1b,metal:{type:'barium',amount:[12s],castable:1b},item:'obsidian_cast'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.metallurgy.obsidian_cast\",\n                                \"fallback\": \"Obsidian Cast\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.metallurgy.band\",\n                                    \"fallback\": \"%s Band\",\n                                    \"with\": [\n                                        {\n                                            \"translate\": \"item.gm4.metallurgy.barium\",\n                                            \"fallback\": \"Barium\"\n                                        }\n                                    ],\n                                    \"italic\": false,\n                                    \"color\": \"#F0EAD6\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/loot_table/baryte_lump.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.metallurgy.baryte_lump\",\n                \"fallback\": \"Baryte Lump\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"entity\": \"this\",\n              \"lore\": [\n                [\n                  {\n                    \"translate\": \"text.gm4.metallurgy.contains\",\n                    \"fallback\": \"Contains \",\n                    \"italic\": false,\n                    \"color\": \"gray\"\n                  },\n                  {\n                    \"translate\": \"text.gm4.metallurgy.barium\",\n                    \"fallback\": \"Barium\",\n                    \"italic\": false,\n                    \"color\": \"#F0EAD6\"\n                  }\n                ]\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:item/lump/baryte\"]},\n                \"minecraft:profile\": \"$ore/barium\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_metallurgy:{metal:{type:'barium',amount:[1s],castable:1b},item:'ore'}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/loot_table/bauxite_lump.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.metallurgy.bauxite_lump\",\n                \"fallback\": \"Bauxite Lump\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"entity\": \"this\",\n              \"lore\": [\n                [\n                  {\n                    \"translate\": \"text.gm4.metallurgy.contains\",\n                    \"fallback\": \"Contains \",\n                    \"italic\": false,\n                    \"color\": \"gray\"\n                  },\n                  {\n                    \"translate\": \"text.gm4.metallurgy.aluminium\",\n                    \"fallback\": \"Aluminium\",\n                    \"italic\": false,\n                    \"color\": \"#F47989\"\n                  }\n                ]\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:item/lump/bauxite\"]},\n                \"minecraft:profile\": \"$ore/aluminium\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_metallurgy:{metal:{type:'aluminium',amount:[1s],castable:1b},item:'ore'}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/loot_table/bismuth_band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:player_head\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:profile\": \"$band/bismuth\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{has_shamir:1b,metal:{type:'bismuth',amount:[12s],castable:1b},item:'obsidian_cast'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.metallurgy.obsidian_cast\",\n                                \"fallback\": \"Obsidian Cast\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                [\n                                    {\n                                        \"translate\": \"item.gm4.metallurgy.bismuth_band.red\",\n                                        \"fallback\": \"Bi\",\n                                        \"italic\": false,\n                                        \"color\": \"#F47989\"\n                                    },\n                                    {\n                                        \"translate\": \"item.gm4.metallurgy.bismuth_band.orange\",\n                                        \"fallback\": \"sm\",\n                                        \"italic\": false,\n                                        \"color\": \"#F5B478\"\n                                    },\n                                    {\n                                        \"translate\": \"item.gm4.metallurgy.bismuth_band.yellow\",\n                                        \"fallback\": \"ut\",\n                                        \"italic\": false,\n                                        \"color\": \"#F5DD79\"\n                                    },\n                                    {\n                                        \"translate\": \"item.gm4.metallurgy.bismuth_band.green\",\n                                        \"fallback\": \"h \",\n                                        \"italic\": false,\n                                        \"color\": \"#78F4AE\"\n                                    },\n                                    {\n                                        \"translate\": \"item.gm4.metallurgy.bismuth_band.blue\",\n                                        \"fallback\": \"Ba\",\n                                        \"italic\": false,\n                                        \"color\": \"#79D6F5\"\n                                    },\n                                    {\n                                        \"translate\": \"item.gm4.metallurgy.bismuth_band.purple\",\n                                        \"fallback\": \"nd\",\n                                        \"italic\": false,\n                                        \"color\": \"#8378F5\"\n                                    },\n                                    {\n                                        \"translate\": \"item.gm4.metallurgy.bismuth_band.magenta\",\n                                        \"fallback\": \"\\u200c\",\n                                        \"italic\": false,\n                                        \"color\": \"#D579F5\"\n                                    }\n                                ]\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/loot_table/bismutite_lump.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.metallurgy.bismutite_lump\",\n                \"fallback\": \"Bismutite Lump\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"entity\": \"this\",\n              \"lore\": [\n                [\n                  {\n                    \"translate\": \"text.gm4.metallurgy.contains\",\n                    \"fallback\":\"Contains \",\n                    \"italic\": false,\n                    \"color\": \"gray\"\n                  },\n                  {\n                    \"translate\": \"item.gm4.metallurgy.bismuth.red\",\n                    \"fallback\": \"B\",\n                    \"italic\": false,\n                    \"color\": \"#F47989\"\n                  },\n                  {\n                    \"translate\": \"item.gm4.metallurgy.bismuth.orange\",\n                    \"fallback\": \"i\",\n                    \"italic\": false,\n                    \"color\": \"#F5B478\"\n                  },\n                  {\n                    \"translate\": \"item.gm4.metallurgy.bismuth.yellow\",\n                    \"fallback\": \"s\",\n                    \"italic\": false,\n                    \"color\": \"#F5DD79\"\n                  },\n                  {\n                    \"translate\": \"item.gm4.metallurgy.bismuth.green\",\n                    \"fallback\": \"m\",\n                    \"italic\": false,\n                    \"color\": \"#78F4AE\"\n                  },\n                  {\n                    \"translate\": \"item.gm4.metallurgy.bismuth.blue\",\n                    \"fallback\": \"u\",\n                    \"italic\": false,\n                    \"color\": \"#79D6F5\"\n                  },\n                  {\n                    \"translate\": \"item.gm4.metallurgy.bismuth.purple\",\n                    \"fallback\": \"t\",\n                    \"italic\": false,\n                    \"color\": \"#8378F5\"\n                  },\n                  {\n                    \"translate\": \"item.gm4.metallurgy.bismuth.magenta\",\n                    \"fallback\": \"h\",\n                    \"italic\": false,\n                    \"color\": \"#D579F5\"\n                  }\n                ]\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:item/lump/bismutite\"]},\n                \"minecraft:profile\": \"$ore/bismuth\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_metallurgy:{metal:{type:'bismuth',amount:[1s],castable:1b},item:'ore'}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/loot_table/copper_band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:player_head\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:profile\": \"$band/copper_RETIRED\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{has_shamir:1b,metal:{type:'copper',amount:[12s],castable:1b},item:'obsidian_cast'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.metallurgy.obsidian_cast\",\n                                \"fallback\": \"Obsidian Cast\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.metallurgy.band\",\n                                    \"fallback\": \"%s Band\",\n                                    \"with\": [\n                                        {\n                                            \"translate\": \"item.gm4.metallurgy.copper\",\n                                            \"fallback\": \"Copper\"\n                                        }\n                                    ],\n                                    \"italic\": false,\n                                    \"color\": \"gold\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/loot_table/curies_bismium_band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:player_head\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:profile\": \"$band/curies_bismium\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{has_shamir:1b,metal:{type:'curies_bismium',amount:[9s,3s],castable:1b},item:'obsidian_cast'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.metallurgy.obsidian_cast\",\n                                \"fallback\": \"Obsidian Cast\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.metallurgy.band\",\n                                    \"fallback\": \"%s Band\",\n                                    \"with\": [\n                                        {\n                                            \"translate\": \"item.gm4.metallurgy.curies_bismium\",\n                                            \"fallback\": \"Curie's Bismium\"\n                                        }\n                                    ],\n                                    \"italic\": false,\n                                    \"color\": \"#467A1B\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/loot_table/malachite_lump.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.metallurgy.malachite_lump\",\n                \"fallback\": \"Malachite Lump\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"entity\": \"this\",\n              \"lore\": [\n                [\n                  {\n                    \"translate\": \"text.gm4.metallurgy.contains\",\n                    \"fallback\": \"Contains \",\n                    \"italic\": false,\n                    \"color\": \"gray\"\n                  },\n                  {\n                    \"translate\": \"text.gm4.metallurgy.copper\",\n                    \"fallback\": \"Copper\",\n                    \"italic\": false,\n                    \"color\": \"gold\"\n                  }\n                ]\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\n                  \"floats\": [\n                    3420018\n                  ]\n                },\n                \"minecraft:profile\": \"$ore/copper_RETIRED\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_metallurgy:{metal:{type:'copper',amount:[1s],castable:1b},item:'ore'}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/loot_table/thorianite_lump.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.metallurgy.thorianite_lump\",\n                \"fallback\": \"Thorianite Lump\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"entity\": \"this\",\n              \"lore\": [\n                [\n                  {\n                    \"translate\": \"text.gm4.metallurgy.contains\",\n                    \"fallback\": \"Contains \",\n                    \"italic\": false,\n                    \"color\": \"gray\"\n                  },\n                  {\n                    \"translate\": \"text.gm4.metallurgy.thorium\",\n                    \"fallback\": \"Thorium\",\n                    \"italic\": false,\n                    \"color\": \"#767676\"\n                  }\n                ]\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:item/lump/thorianite\"]},\n                \"minecraft:profile\": \"$ore/thorium\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_metallurgy:{metal:{type:'thorium',amount:[1s],castable:1b},item:'ore'}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/loot_table/thorium_band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:player_head\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:profile\": \"$band/thorium\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{has_shamir:1b,metal:{type:'thorium',amount:[12s],castable:1b},item:'obsidian_cast'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.metallurgy.obsidian_cast\",\n                                \"fallback\": \"Obsidian Cast\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.metallurgy.band\",\n                                    \"fallback\": \"%s Band\",\n                                    \"with\": [\n                                        {\n                                            \"translate\": \"item.gm4.metallurgy.thorium\",\n                                            \"fallback\": \"Thorium\"\n                                        }\n                                    ],\n                                    \"italic\": false,\n                                    \"color\": \"#767676\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/loot_table/thorium_brass_band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:player_head\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:profile\": \"$band/thorium_brass_RETIRED\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{has_shamir:1b,metal:{type:'thorium_brass',amount:[9s,3s],castable:1b},item:'obsidian_cast'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.metallurgy.obsidian_cast\",\n                                \"fallback\": \"Obsidian Cast\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.metallurgy.band\",\n                                    \"fallback\": \"%s Band\",\n                                    \"with\": [\n                                        {\n                                            \"translate\": \"item.gm4.metallurgy.thorium_brass\",\n                                            \"fallback\": \"Thorium Brass\"\n                                        }\n                                    ],\n                                    \"italic\": false,\n                                    \"color\": \"dark_green\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/arborenda_active.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"flags\": {\n      \"is_sneaking\": false\n    },\n    \"equipment\": {\n      \"mainhand\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'arborenda'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/carries_thorium.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:player_head\",\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{metal:{type:'thorium'},item:'ore'}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:player_head\",\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{metal:{type:'thorium'},item:'ore'}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"player.cursor\": {\n            \"items\": \"minecraft:player_head\",\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{metal:{type:'thorium'},item:'ore'}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"player.crafting.*\": {\n            \"items\": \"minecraft:player_head\",\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{metal:{type:'thorium'},item:'ore'}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.*\": {\n            \"items\": \"minecraft:player_head\",\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{metal:{type:'thorium'},item:'ore'}}\"\n            }\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/defuse_active.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"feet\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'defuse'}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"legs\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'defuse'}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"chest\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'defuse'}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"head\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'defuse'}}\"\n            }\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/forterra_active.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'forterra'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/has_shamir.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/hypexperia_active.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'hypexperia'}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"offhand\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'hypexperia'}}\"\n            }\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/infinitas_active.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"nbt\": \"{Tags:[\\\"gm4_infinitas_mainhand_empty\\\"]}\",\n        \"flags\": {\n          \"is_sneaking\": true\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"nbt\": \"{Tags:[\\\"gm4_infinitas_offhand_empty\\\"]}\",\n        \"flags\": {\n          \"is_sneaking\": true\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/is_castable.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"count\": 1,\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{metal:{castable:1b}}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/is_clay_ball.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"items\": \"minecraft:clay_ball\",\n        \"count\": 1\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/is_ender_bolt_trident.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:'ender_bolt'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/is_obsidian.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"items\": \"minecraft:obsidian\",\n        \"count\": 1\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/levity_active.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"feet\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'levity'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/moneo_active.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'moneo'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/musical_active.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'musical'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/on_ground.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"flags\": {\n      \"is_on_ground\": true\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/sensus_active.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'sensus'}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"offhand\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'sensus'}}\"\n            }\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/shamir_equipped.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"feet\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"legs\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"chest\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"head\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b}}\"\n            }\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/shamir_in_hand.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b}}\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"offhand\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b}}\"\n            }\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/smooshing/anvil_damage_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.12\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/smooshing/has_shamir.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n      \"slots\": {\n        \"contents\": {\n          \"count\": 1\n        }\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n      \"slots\": {\n        \"contents\": {\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b}}\"\n          }\n        }\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/smooshing/valid_item.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n      \"slots\": {\n        \"contents\": {\n          \"count\": 1\n        }\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:inverted\",\n    \"term\": {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"contents\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b}}\"\n            }\n          }\n        }\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/tinker_active.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'tinker'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/predicate/vibro_active.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"feet\": {\n        \"items\": \"#minecraft:foot_armor\",\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'vibro'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/tags/function/apply_band.json",
    "content": "{\n  \"values\": [\n    \"gm4_infinitas_shamir:make_unstackable\",\n    \"gm4_moneo_shamir:store_maximum\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/tags/function/check_item_validity.json",
    "content": "{\n  \"values\": [\n    \"gm4_arborenda_shamir:check_item_validity\",\n    \"gm4_defuse_shamir:check_item_validity\",\n    \"gm4_ender_bolt_shamir:check_item_validity\",\n    \"gm4_forterra_shamir:check_item_validity\",\n    \"gm4_gemini_shamir:check_item_validity\",\n    \"gm4_hypexperia_shamir:check_item_validity\",\n    \"gm4_moneo_shamir:check_item_validity\",\n    \"gm4_musical_shamir:check_item_validity\",\n    \"gm4_sensus_shamir:check_item_validity\",\n    \"gm4_infinitas_shamir:check_item_validity\",\n    \"gm4_tinker_shamir:check_item_validity\",\n    \"gm4_vibro_shamir:check_item_validity\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/tags/function/summon_band/aluminium.json",
    "content": "{\n  \"values\":[\n    \"gm4_defuse_shamir:summon_band\",\n    \"gm4_moneo_shamir:summon_band\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/tags/function/summon_band/barimium.json",
    "content": "{\n  \"values\":[\n    \"gm4_musical_shamir:summon_band\",\n    \"gm4_gemini_shamir:summon_band\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/tags/function/summon_band/barium.json",
    "content": "{\n  \"values\":[\n    \"gm4_sensus_shamir:summon_band\",\n    \"gm4_arborenda_shamir:summon_band\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/tags/function/summon_band/bismuth.json",
    "content": "{\n  \"values\":[\n    \"gm4_forterra_shamir:summon_band\",\n    \"gm4_hypexperia_shamir:summon_band\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/tags/function/summon_band/curies_bismium.json",
    "content": "{\n  \"values\":[\n    \"gm4_infinitas_shamir:summon_band\",\n    \"gm4_tinker_shamir:summon_band\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/tags/function/summon_band/thorium.json",
    "content": "{\n  \"values\":[\n    \"gm4_ender_bolt_shamir:summon_band\",\n    \"gm4_vibro_shamir:summon_band\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/test/cast_add_lumps.mcfunction",
    "content": "# @template gm4_metallurgy:test_casting\n# @timeout 300\n\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:obsidian\"}}\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:clay_ball\"}}\n\nawait entity @e[tag=gm4_sand_ring] inside\n\nsetblock ~1 ~2 ~1 lava\n\nawait delay 10s\n\nsetblock ~1 ~2 ~1 air\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:player_head\",components:{\"minecraft:custom_data\":{gm4_metallurgy:{item:\"ore\",metal:{castable:1b,type:\"barium\",amount:[1s]}}}}}}\n\nawait delay 2s\n\nsetblock ~1 ~1 ~1 air\n\nawait items entity @e[type=item,distance=..4] contents minecraft:magma_block\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/test/cast_create_and_destroy.mcfunction",
    "content": "# @template gm4_metallurgy:test_casting\n\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:obsidian\"}}\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:clay_ball\"}}\n\nawait entity @e[tag=gm4_sand_ring] inside\n\nsetblock ~1 ~1 ~1 air\n\nawait items entity @e[type=item,distance=..4] contents minecraft:obsidian\nassert not items entity @e[type=item,distance=..4] contents minecraft:clay_ball\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/test/cast_mundane.mcfunction",
    "content": "# @template gm4_metallurgy:test_casting\n# @timeout 400\n\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:obsidian\"}}\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:clay_ball\"}}\n\nawait entity @e[tag=gm4_sand_ring] inside\n\nsetblock ~1 ~2 ~1 lava\n\nawait delay 10s\n\nsetblock ~1 ~2 ~1 air\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:player_head\",components:{\"minecraft:custom_data\":{gm4_metallurgy:{item:\"ore\",metal:{castable:1b,type:\"barium\",amount:[1s]}}}}}}\n\nawait delay 5s\n\nsetblock ~1 ~1 ~1 air\n\n# no good way to detect mundane band\nawait items entity @e[type=item,distance=..4] contents minecraft:player_head\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/test/cast_overheat.mcfunction",
    "content": "# @template gm4_metallurgy:test_casting\n# @timeout 600\n\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:obsidian\"}}\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:clay_ball\"}}\n\nawait entity @e[tag=gm4_sand_ring] inside\n\nsetblock ~1 ~2 ~1 lava\n\nawait delay 22s\n\nassert entity @e[tag=gm4_sand_ring] inside\n\nawait delay 2s\n\nassert not entity @e[tag=gm4_sand_ring] inside\nassert block ~1 ~2 ~1 lava[level=0]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/test/cast_successful.mcfunction",
    "content": "# @template gm4_metallurgy:test_casting\n# @timeout 400\n\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:obsidian\"}}\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:clay_ball\"}}\n\nawait entity @e[tag=gm4_sand_ring] inside\n\nsetblock ~1 ~2 ~1 lava\n\nawait delay 10s\n\nsetblock ~1 ~2 ~1 air\nsummon item ~1.5 ~3 ~1.5 {Item:{id:\"minecraft:player_head\",components:{\"minecraft:custom_data\":{gm4_metallurgy:{item:\"ore\",metal:{castable:1b,type:\"barium\",amount:[1s]}}}}}}\n\nawait delay 2s\n\nscoreboard players set @e[tag=gm4_sand_ring,distance=..4] gm4_ml_ore_ba 23\n\nawait delay 3s\n\nsetblock ~1 ~1 ~1 air\n\nawait items entity @e[type=item,distance=..4] contents minecraft:player_head[custom_data~{gm4_metallurgy:{item:\"obsidian_cast\",has_shamir:1b,metal:{castable:1b,type:\"barium\",amount:[12s]}}}]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_metallurgy/test/smoosh.mcfunction",
    "content": "# @template gm4_metallurgy:test_smooshing\n\nloot spawn ~1.5 ~2.5 ~1.8 loot gm4_hypexperia_shamir:band\nsummon item ~1.5 ~2.5 ~1.8 {Item:{id:\"minecraft:diamond_sword\"}}\n\nawait delay 1s\n\nsetblock ~1 ~4 ~1 redstone_block\n\nawait items entity @e[type=item,distance=..4] contents minecraft:diamond_sword[custom_data~{gm4_metallurgy:{active_shamir:\"hypexperia\"}}]\nassert items entity @e[type=item,distance=..4] contents minecraft:obsidian\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/active_armor_chest.mcfunction",
    "content": "# @s = players wearing armor with moneo\n# run from shamir_equipped\n\nscoreboard players set $tool_current_damage gm4_ml_data 0\nscoreboard players set $tool_max_damage gm4_ml_data 0\n\nexecute store result score $tool_current_damage gm4_ml_data run data get entity @s equipment.chest.components.\"minecraft:damage\"\nexecute store result score $tool_max_damage gm4_ml_data run data get entity @s equipment.chest.components.\"minecraft:custom_data\".MaxDurability\n\nexecute if score $tool_max_damage gm4_ml_data matches 432 run function gm4_moneo_shamir:armor/elytra\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/active_tool.mcfunction",
    "content": "# @s = players holding a moneo tool\n# run from shamir_in_hand\n\nscoreboard players set $tool_current_damage gm4_ml_data 0\nscoreboard players set $tool_max_damage gm4_ml_data 0\n\nexecute store result score $tool_current_damage gm4_ml_data run data get entity @s SelectedItem.components.\"minecraft:damage\"\nexecute store result score $tool_max_damage gm4_ml_data run data get entity @s SelectedItem.components.\"minecraft:custom_data\".MaxDurability\n\n# update newly upgraded netherite gear\nexecute if score $tool_max_damage gm4_ml_data matches 1561 if predicate gm4_moneo_shamir:holding_netherite run function gm4_moneo_shamir:update_netherite\n\n# activate moneo\nexecute if score $tool_max_damage gm4_ml_data matches 59 run function gm4_moneo_shamir:tools/materials/wood\nexecute if score $tool_max_damage gm4_ml_data matches 131 run function gm4_moneo_shamir:tools/materials/stone\nexecute if score $tool_max_damage gm4_ml_data matches 190 run function gm4_moneo_shamir:tools/materials/copper\nexecute if score $tool_max_damage gm4_ml_data matches 250 run function gm4_moneo_shamir:tools/materials/iron\nexecute if score $tool_max_damage gm4_ml_data matches 1561 run function gm4_moneo_shamir:tools/materials/diamond\nexecute if score $tool_max_damage gm4_ml_data matches 2031 run function gm4_moneo_shamir:tools/materials/netherite\n# | gold used to be listed as 33 max damage, this is kept for compatibility with old items\nexecute if score $tool_max_damage gm4_ml_data matches 32..33 run function gm4_moneo_shamir:tools/materials/gold\nexecute if score $tool_max_damage gm4_ml_data matches 237 run function gm4_moneo_shamir:tools/shears\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/armor/elytra.mcfunction",
    "content": "# run from active_armor_chest\n# @s = player wearing the moneo elytra\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\ntag @s[nbt={FallFlying:1b}] add gm4_moneo_ff\n\nexecute if score $tool_max_damage gm4_ml_data matches 10..20 run effect give @s[tag=gm4_moneo_ff] minecraft:slowness 2 1\nexecute if score $tool_max_damage gm4_ml_data matches 10..20 at @s[tag=gm4_moneo_ff] run playsound minecraft:entity.bat.takeoff master @s ~ ~ ~ 5 1.65\nexecute if score $tool_max_damage gm4_ml_data matches 2..20 at @s[tag=!gm4_moneo_ff] run playsound minecraft:entity.bat.takeoff master @s ~ ~ ~ 5 1.65\nexecute if score $tool_max_damage gm4_ml_data matches 2..9 run effect give @s[tag=gm4_moneo_ff] minecraft:slowness 2 2\nexecute if score $tool_max_damage gm4_ml_data matches 2..9 at @s[tag=gm4_moneo_ff] run playsound minecraft:block.bell.use master @s ~ ~ ~ 5 0\n\ntag @s remove gm4_moneo_ff\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/check_item_validity.mcfunction",
    "content": "# @s = band is trying to apply to\n#run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'moneo'}}] if items entity @s contents #gm4_moneo_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/store_maximum.mcfunction",
    "content": "# run from #gm4_metallurgy:apply_band\n# @s = moneo tool item\n\n# used by Audere Shamir as well\nexecute if items entity @s contents minecraft:wooden_shovel run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 59\nexecute if items entity @s contents minecraft:wooden_pickaxe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 59\nexecute if items entity @s contents minecraft:wooden_hoe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 59\nexecute if items entity @s contents minecraft:wooden_axe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 59\n\nexecute if items entity @s contents minecraft:stone_shovel run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 131\nexecute if items entity @s contents minecraft:stone_pickaxe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 131\nexecute if items entity @s contents minecraft:stone_hoe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 131\nexecute if items entity @s contents minecraft:stone_axe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 131\n\nexecute if items entity @s contents minecraft:copper_shovel run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 190\nexecute if items entity @s contents minecraft:copper_pickaxe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 190\nexecute if items entity @s contents minecraft:copper_hoe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 190\nexecute if items entity @s contents minecraft:copper_axe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 190\n\nexecute if items entity @s contents minecraft:iron_shovel run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 250\nexecute if items entity @s contents minecraft:iron_pickaxe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 250\nexecute if items entity @s contents minecraft:iron_hoe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 250\nexecute if items entity @s contents minecraft:iron_axe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 250\n\nexecute if items entity @s contents minecraft:diamond_shovel run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 1561\nexecute if items entity @s contents minecraft:diamond_pickaxe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 1561\nexecute if items entity @s contents minecraft:diamond_hoe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 1561\nexecute if items entity @s contents minecraft:diamond_axe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 1561\n\nexecute if items entity @s contents minecraft:netherite_shovel run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 2031\nexecute if items entity @s contents minecraft:netherite_pickaxe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 2031\nexecute if items entity @s contents minecraft:netherite_hoe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 2031\nexecute if items entity @s contents minecraft:netherite_axe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 2031\n\nexecute if items entity @s contents minecraft:golden_shovel run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 32\nexecute if items entity @s contents minecraft:golden_pickaxe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 32\nexecute if items entity @s contents minecraft:golden_hoe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 32\nexecute if items entity @s contents minecraft:golden_axe run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 32\n\nexecute if items entity @s contents minecraft:shears run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 237\n\nexecute if items entity @s contents minecraft:elytra run data modify entity @s Item.components.\"minecraft:custom_data\".MaxDurability set value 432\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/aluminium via #gm4_metallurgy:summon_band/aluminium\n\nloot spawn ~ ~ ~ loot gm4_moneo_shamir:band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/copper.mcfunction",
    "content": "# run from active_tool\n# @s = player holding the moneo tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 16..30 run effect give @s minecraft:mining_fatigue 2 0\nexecute if score $tool_max_damage gm4_ml_data matches ..30 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 1\nexecute if score $tool_max_damage gm4_ml_data matches ..15 run effect give @s minecraft:mining_fatigue 2 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/diamond.mcfunction",
    "content": "# run from active_tool\n# @s = player holding the moneo tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 21..50 run effect give @s minecraft:mining_fatigue 2 0\nexecute if score $tool_max_damage gm4_ml_data matches ..50 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 2\nexecute if score $tool_max_damage gm4_ml_data matches ..20 run effect give @s minecraft:mining_fatigue 2 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/gold.mcfunction",
    "content": "# run from active_tool\n# @s = player holding the moneo tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 6..10 run effect give @s minecraft:mining_fatigue 2 0\nexecute if score $tool_max_damage gm4_ml_data matches ..10 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 1.4\nexecute if score $tool_max_damage gm4_ml_data matches ..5 run effect give @s minecraft:mining_fatigue 2 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/iron.mcfunction",
    "content": "# run from active_tool\n# @s = player holding the moneo tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 21..40 run effect give @s minecraft:mining_fatigue 2 0\nexecute if score $tool_max_damage gm4_ml_data matches ..40 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 1\nexecute if score $tool_max_damage gm4_ml_data matches ..20 run effect give @s minecraft:mining_fatigue 2 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/netherite.mcfunction",
    "content": "# run from active_tool\n# @s = player holding the moneo tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 21..50 run effect give @s minecraft:mining_fatigue 2 0\nexecute if score $tool_max_damage gm4_ml_data matches ..50 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 2\nexecute if score $tool_max_damage gm4_ml_data matches ..20 run effect give @s minecraft:mining_fatigue 2 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/stone.mcfunction",
    "content": "# run from active_tool\n# @s = player holding the moneo tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 21..30 run effect give @s minecraft:mining_fatigue 2 0\nexecute if score $tool_max_damage gm4_ml_data matches ..30 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 0.7\nexecute if score $tool_max_damage gm4_ml_data matches ..20 run effect give @s minecraft:mining_fatigue 2 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/wood.mcfunction",
    "content": "# run from active_tool\n# @s = player holding the moneo tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 11..20 run effect give @s minecraft:mining_fatigue 2 0\nexecute if score $tool_max_damage gm4_ml_data matches ..20 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 0\nexecute if score $tool_max_damage gm4_ml_data matches ..10 run effect give @s minecraft:mining_fatigue 2 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/tools/shears.mcfunction",
    "content": "# run from active_tool\n# @s = player holding the moneo tool\n\nscoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data\n\nexecute if score $tool_max_damage gm4_ml_data matches 21..35 run effect give @s minecraft:mining_fatigue 2 0\nexecute if score $tool_max_damage gm4_ml_data matches ..35 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 1\nexecute if score $tool_max_damage gm4_ml_data matches ..20 run effect give @s minecraft:mining_fatigue 2 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/function/update_netherite.mcfunction",
    "content": "# @s = player holding a netherite moneo tool that has the wrong MaxDurability\n# run from active_tool\n\n# item modifier\nitem modify entity @s weapon.mainhand gm4_moneo_shamir:netherite_update\n\n# correctly set the max damage\nscoreboard players set $tool_max_damage gm4_ml_data 2031\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/guidebook/moneo_shamir.json",
    "content": "{\n  \"id\": \"moneo_shamir\",\n  \"name\": \"Moneo Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"metallurgy\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Moneo_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_moneo_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'moneo'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_moneo_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'moneo'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.moneo_shamir.description\",\n            \"fallback\": \"Moneo slows mining and flying when durability is low.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_moneo_shamir\",\n          \"obtain_moneo_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.moneo_shamir.usage\",\n            \"fallback\": \"The Moneo Shamir is found on Aluminium Bands. It can be placed onto tools, shears, and elytra.\\n\\nLow durability tools will cause mining fatigue, and low durability elytra will cause slowness and blindness.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/item_modifier/netherite_update.json",
    "content": "{\n  \"function\": \"minecraft:set_custom_data\",\n  \"tag\": \"{MaxDurability:2031}\"\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:aluminium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:shamir/moneo\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'moneo'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.moneo\",\n                                    \"fallback\": \"Moneo Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/predicate/holding_moneo.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": \"#gm4_moneo_shamir:valid_tools\",\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'moneo'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/predicate/holding_netherite.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": \"#gm4_moneo_shamir:netherite_tools\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/predicate/wear_chest_moneo.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"chest\": {\n                \"predicates\": {\n                  \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'moneo'}}\"\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/tags/item/netherite_tools.json",
    "content": "{\n    \"values\": [\n        \"minecraft:netherite_shovel\",\n        \"minecraft:netherite_pickaxe\",\n        \"minecraft:netherite_hoe\",\n        \"minecraft:netherite_axe\"\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/tags/item/valid_items.json",
    "content": "{\n    \"values\": [\n        \"#gm4_moneo_shamir:valid_tools\",\n        \"minecraft:elytra\"\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_moneo_shamir/tags/item/valid_tools.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:axes\",\n        \"#minecraft:hoes\",\n        \"#minecraft:pickaxes\",\n        \"#minecraft:shovels\",\n        \"minecraft:shears\"\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_musical_shamir/function/active.mcfunction",
    "content": "#@s = players holding musical with gm4_note_collect=1..\n#at @s\n#run from metallurgy:shamir_in_hand\n\ntag @s add gm4_has_musical\n#particle indicators\nexecute if score @s gm4_note_collect matches 1 run particle note ~ ~1 ~ .992 .992 .992 .5 1 normal @a[distance=..8]\nexecute if score @s gm4_note_collect matches 2 run particle note ~ ~1 ~ 1 1 1 .5 4 normal @a[distance=..8]\nexecute if score @s gm4_note_collect matches 3 run particle note ~ ~1 ~ 1.2 1.2 1.2 .5 8 normal @a[distance=..8]\n\n#activate song effects\nexecute if score @s gm4_note_collect matches 4.. run function gm4_musical_shamir:songs/mellohi\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_musical_shamir/function/check_item_validity.mcfunction",
    "content": "#@s = band is trying to apply to\n#run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'musical'}}] if items entity @s contents #gm4_musical_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_musical_shamir/function/songs/chirp.mcfunction",
    "content": "#@s = players holding musical with gm4_note_time=54.. and gm4_note_collect=10..\n#at @s\n#run from musical_shamir:songs/mellohi_end\n\n#start song\nexecute if score @s gm4_note_time matches 60 run playsound minecraft:music_disc.chirp player @s ~ 10000 ~ 300000000 2\n\n#effects\nexecute if score @s gm4_note_time matches 60 run effect give @s speed 91 2\nexecute if score @s gm4_note_time matches 60 run effect give @s strength 91 2\n\n#particle\nparticle note ~ ~1 ~ 1.4 1.4 1.4 .5 6 normal @a[distance=..8]\n\n#end song\nexecute if score @s gm4_note_time matches 174.. run function gm4_musical_shamir:songs/reset_player\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_musical_shamir/function/songs/mellohi.mcfunction",
    "content": "#@s = players holding musical with gm4_note_collect=4..\n#at @s\n#run from musical_shamir:main\n\n#start song timer\nscoreboard players add @s gm4_note_time 1\n\n#start song\nexecute if score @s gm4_note_time matches 1 run playsound minecraft:music_disc.mellohi player @s ~ 10000 ~ 300000000 2\n\n#effects\nexecute if score @s gm4_note_time matches 1 run effect give @s slowness 48 0\nexecute if score @s gm4_note_time matches 1 run effect give @s strength 48 0\n\n#particles\nparticle note ~ ~1 ~ 1.4 1.4 1.4 .5 12 normal @a[distance=..8]\n\n#song end\nexecute if score @s gm4_note_time matches 60.. run function gm4_musical_shamir:songs/mellohi_end\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_musical_shamir/function/songs/mellohi_end.mcfunction",
    "content": "#@s = players holding musical with gm4_note_time=54..\n#at @s\n#run from musical_shamir:songs/mellohi\n\n#reset players with not enough mob kills\nexecute if score @s gm4_note_collect matches ..7 run function gm4_musical_shamir:songs/reset_player\n\n#queue 'chirp' for player with enough mob kills\nexecute if score @s gm4_note_collect matches 8.. run function gm4_musical_shamir:songs/chirp\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_musical_shamir/function/songs/reset_player.mcfunction",
    "content": "#@s = players holding musical with gm4_note_time=54.. but gm4_note_collect=..9\n#at @s\n#run from musical_shamir:songs/mellohi_end and  musical_shamir:songs/chirp and metallurgy:main\n\n#clear effect\nexecute if score @s gm4_note_time matches 1..60 run effect clear @s minecraft:slowness\nexecute if score @s gm4_note_time matches 1..174 run effect clear @s minecraft:strength\nexecute if score @s gm4_note_time matches 60..174 run effect clear @s minecraft:speed\n\n#stop sounds if neccessary\nexecute if score @s gm4_note_time matches 1..60 run stopsound @s player minecraft:music_disc.mellohi\nexecute if score @s gm4_note_time matches 60..174 run stopsound @s player minecraft:music_disc.chirp\n\n#reset player\nscoreboard players reset @s gm4_note_time\nscoreboard players reset @s gm4_note_collect\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_musical_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/barimium via #gm4_metallurgy:summon_band/barimium\n\nloot spawn ~ ~ ~ loot gm4_musical_shamir:band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_musical_shamir/guidebook/musical_shamir.json",
    "content": "{\n  \"id\": \"musical_shamir\",\n  \"name\": \"Musical Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"metallurgy\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Musical_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_musical_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'musical'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_musical_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'musical'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.musical_shamir.description\",\n            \"fallback\": \"Musical modifies strength and speed based on consecutive mob kills.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_musical_shamir\",\n          \"obtain_musical_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.musical_shamir.usage\",\n            \"fallback\": \"The Musical Shamir is found on Barimium Bands. It can be placed onto swords.\\n\\nWhen killing mobs, music is played and Slowness and Strength I are granted.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.musical_shamir.usage_1\",\n            \"fallback\": \"After many kills, the music will become darker, and Speed and Strength III are granted instead.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_musical_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:barimium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:shamir/musical\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'musical'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.musical\",\n                                    \"fallback\": \"Musical Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_musical_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:swords\",\n    \"minecraft:mace\",\n    \"minecraft:trident\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_musical_shamir/test/gain_buff.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1.5 ~1 ~0.5\n# @timeout 150\n\nitem replace entity @s weapon.mainhand with diamond_sword[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:\"musical\"}}]\n\nawait delay 1s\n\nsummon pig ~0.5 ~1 ~1.5 {Health:1f,Tags:[gm4_test_musical_1]}\ndummy @s attack @e[type=pig,distance=..4,tag=gm4_test_musical_1,limit=1]\nawait delay 1s\n\nsummon pig ~0.5 ~1 ~2.5 {Health:1f,Tags:[gm4_test_musical_2]}\ndummy @s attack @e[type=pig,distance=..4,tag=gm4_test_musical_2,limit=1]\nawait delay 1s\n\nsummon pig ~2.5 ~1 ~1.5 {Health:1f,Tags:[gm4_test_musical_3]}\ndummy @s attack @e[type=pig,distance=..4,tag=gm4_test_musical_3,limit=1]\nawait delay 1s\n\nassert not entity @s[nbt={active_effects:[{id:\"minecraft:strength\"}]}]\n\nsummon pig ~2.5 ~1 ~2.5 {Health:1f,Tags:[gm4_test_musical_4]}\ndummy @s attack @e[type=pig,distance=..4,tag=gm4_test_musical_4,limit=1]\n\nawait entity @s[nbt={active_effects:[{id:\"minecraft:strength\"},{id:\"minecraft:slowness\"}]}]\n\ndummy @s selectslot 2\n\nawait not entity @s[nbt={active_effects:[{id:\"minecraft:strength\"}]}]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/active.mcfunction",
    "content": "# @s player holding sensus\n#run from metallurgy:shamir_in_hand\ntag @s add gm4_has_sensus\nexecute if score $current_sensus_layer gm4_ml_data matches 0 positioned ~-3 ~-2 ~-3 run function gm4_sensus_shamir:block_search/search\nexecute if score $current_sensus_layer gm4_ml_data matches 1 positioned ~-3 ~-1 ~-3 run function gm4_sensus_shamir:block_search/search\nexecute if score $current_sensus_layer gm4_ml_data matches 2 positioned ~-3 ~0 ~-3 run function gm4_sensus_shamir:block_search/search\nexecute if score $current_sensus_layer gm4_ml_data matches 3 positioned ~-3 ~1 ~-3 run function gm4_sensus_shamir:block_search/search\nexecute if score $current_sensus_layer gm4_ml_data matches 4 positioned ~-3 ~2 ~-3 run function gm4_sensus_shamir:block_search/search\nexecute if score $current_sensus_layer gm4_ml_data matches 5 positioned ~-3 ~3 ~-3 run function gm4_sensus_shamir:block_search/search\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_coal_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on coal_ore\n#at command_block location\n\n#locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.4\nsetblock ~ ~ ~ coal_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_copper_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on copper_ore\n#at command_block location\n\n#locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6\nsetblock ~ ~ ~ copper_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_diamond_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on diamond_ore\n#at command_block location\n\n#locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3\nsetblock ~ ~ ~ diamond_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_emerald_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on emerald_ore\n#at command_block location\n\n#locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3\nsetblock ~ ~ ~ emerald_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_gold_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on gold_ore\n#at command_block location\n\n#locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6\nsetblock ~ ~ ~ gold_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_iron_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on iron_ore\n#at command_block location\n\n#locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6\nsetblock ~ ~ ~ iron_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_lapis_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on emerald_ore\n#at command_block location\n\n#locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3\nsetblock ~ ~ ~ lapis_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_nether/ancient_debris.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on ancient_debris\n# at command_block location\n\n#locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6\nsetblock ~ ~ ~ ancient_debris\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_nether/nether_gold_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on nether_gold_ore\n# at command_block location\n\n#locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6\nsetblock ~ ~ ~ nether_gold_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_nether/nether_quartz_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on nether_quartz_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.9\nsetblock ~ ~ ~ nether_quartz_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_nether_quartz_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on nether_quartz_ore\n#at command_block location\n\n#locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3\nsetblock ~ ~ ~ nether_quartz_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/coal_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on coal_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.4\nsetblock ~ ~ ~ coal_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/copper_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on copper_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6\nsetblock ~ ~ ~ copper_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_coal_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on coal_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.4\nsetblock ~ ~ ~ deepslate_coal_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_copper_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on copper_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6\nsetblock ~ ~ ~ deepslate_copper_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_diamond_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on diamond_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3\nsetblock ~ ~ ~ deepslate_diamond_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_emerald_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on emerald_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3\nsetblock ~ ~ ~ deepslate_emerald_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_gold_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on gold_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6\nsetblock ~ ~ ~ deepslate_gold_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_iron_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on iron_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6\nsetblock ~ ~ ~ deepslate_iron_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_lapis_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on emerald_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3\nsetblock ~ ~ ~ deepslate_lapis_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_redstone_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on redstone_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.9\nsetblock ~ ~ ~ deepslate_redstone_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/diamond_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on diamond_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3\nsetblock ~ ~ ~ diamond_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/emerald_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on emerald_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3\nsetblock ~ ~ ~ emerald_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/gold_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on gold_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6\nsetblock ~ ~ ~ gold_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/iron_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on iron_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6\nsetblock ~ ~ ~ iron_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/lapis_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on emerald_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3\nsetblock ~ ~ ~ lapis_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/redstone_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on redstone_ore\n# at command_block location\n\n# locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.9\nsetblock ~ ~ ~ redstone_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_redstone_ore.mcfunction",
    "content": "# @s = none, run by command blocks placed during block_search/search.mcfunction on redstone_ore\n#at command_block location\n\n#locate ores and play sound\nplaysound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.9\nsetblock ~ ~ ~ redstone_ore\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/search.mcfunction",
    "content": "# @s = player with sensus at location of layer to scan\n# run from sensus_shamir:active\n\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/coal_ore\"} replace coal_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/copper_ore\"} replace copper_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/iron_ore\"} replace iron_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/gold_ore\"} replace gold_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/lapis_ore\"} replace lapis_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/redstone_ore\"} replace redstone_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/emerald_ore\"} replace emerald_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/diamond_ore\"} replace diamond_ore\n\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_coal_ore\"} replace deepslate_coal_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_copper_ore\"} replace deepslate_copper_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_iron_ore\"} replace deepslate_iron_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_gold_ore\"} replace deepslate_gold_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_lapis_ore\"} replace deepslate_lapis_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_redstone_ore\"} replace deepslate_redstone_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_emerald_ore\"} replace deepslate_emerald_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_diamond_ore\"} replace deepslate_diamond_ore\n\n# nether\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_nether/nether_quartz_ore\"} replace nether_quartz_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_nether/nether_gold_ore\"} replace nether_gold_ore\nfill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:\"function gm4_sensus_shamir:block_search/mark_nether/ancient_debris\"} replace ancient_debris\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/check_item_validity.mcfunction",
    "content": "# @s = band is trying to apply to\n#run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'sensus'}}] if items entity @s contents #gm4_sensus_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/barium via #gm4_metallurgy:summon_band/barium\n\nloot spawn ~ ~ ~ loot gm4_sensus_shamir:band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/guidebook/sensus_shamir.json",
    "content": "{\n  \"id\": \"sensus_shamir\",\n  \"name\": \"Sensus Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"metallurgy\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Sensus_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_sensus_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'sensus'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_sensus_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'sensus'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.sensus_shamir.description\",\n            \"fallback\": \"Sensus enhances mining, by playing sounds from neaby ores.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_sensus_shamir\",\n          \"obtain_sensus_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.sensus_shamir.usage\",\n            \"fallback\": \"The Sensus Shamir is found on Barium Bands. It can be placed onto compasses.\\n\\nHolding the compass will play sounds from nearby ores in a 7x7x5 area centered at the user.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:barium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:shamir/sensus\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'sensus'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.sensus\",\n                                    \"fallback\": \"Sensus Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_sensus_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"minecraft:compass\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/active.mcfunction",
    "content": "# @s = players holding a tinker tool\n# at @s\n# run from gm4_metallurgy:shamir_in_hand\n\nscoreboard players set $success gm4_ml_data 0\n\nexecute if score $success gm4_ml_data matches 0 if items entity @s weapon.mainhand #minecraft:shovels run function gm4_tinker_shamir:tool/shovel\nexecute if score $success gm4_ml_data matches 0 if items entity @s weapon.mainhand #minecraft:pickaxes run function gm4_tinker_shamir:tool/pickaxe\nexecute if score $success gm4_ml_data matches 0 if items entity @s weapon.mainhand #minecraft:swords run function gm4_tinker_shamir:tool/sword\nexecute if score $success gm4_ml_data matches 0 if items entity @s weapon.mainhand #minecraft:hoes run function gm4_tinker_shamir:tool/hoe\n\nscoreboard players reset $success gm4_ml_data\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/check_item_validity.mcfunction",
    "content": "# @s = band is trying to apply to\n# run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'tinker'}}] if items entity @s contents #gm4_tinker_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/clay_ball.mcfunction",
    "content": "# @s = player holding tinker shovel\n# at @s\n# run from tool/shovel\n\nclear @s clay_ball 64\ngive @s clay 16\nplaysound block.gravel.fall ambient @a ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/coal.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s coal 63\ngive @s coal_block 7\nplaysound block.stone.fall player @s ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/copper_ingot.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s copper_ingot 63\ngive @s copper_block 7\nplaysound block.metal.fall ambient @a ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/diamond.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s diamond 63\ngive @s diamond_block 7\nplaysound block.glass.fall ambient @a ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/emerald.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s emerald 63\ngive @s emerald_block 7\nplaysound block.glass.fall ambient @a ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/gold_ingot.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s gold_ingot 63\ngive @s gold_block 7\nplaysound block.metal.fall ambient @a ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/gold_nugget.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s gold_nugget 63\ngive @s gold_ingot 7\nplaysound block.metal.fall ambient @a ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/iron_ingot.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s iron_ingot 63\ngive @s iron_block 7\nplaysound block.metal.fall ambient @a ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/iron_nugget.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s iron_nugget 63\ngive @s iron_ingot 7\nplaysound block.metal.fall ambient @a ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/lapis_lazuli.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s lapis_lazuli 63\ngive @s lapis_block 7\nplaysound block.stone.fall player @s ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/melon_slice.mcfunction",
    "content": "# @s = player holding tinker hoe\n# at @s\n# run from tool/hoe\n\nclear @s melon_slice 63\ngive @s melon 7\nplaysound minecraft:block.pumpkin.carve ambient @a ~ ~ ~ 0.2 0.2\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/netherite_ingot.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s netherite_ingot 63\ngive @s netherite_block 7\nplaysound block.metal.fall ambient @a ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/raw_copper.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s raw_copper 63\ngive @s raw_copper_block 7\nplaysound block.stone.fall ambient @a ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/raw_gold.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s raw_gold 63\ngive @s raw_gold_block 7\nplaysound block.stone.fall ambient @a ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/raw_iron.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s raw_iron 63\ngive @s raw_iron_block 7\nplaysound block.stone.fall ambient @a ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/redstone.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from tool/pickaxe\n\nclear @s redstone 63\ngive @s redstone_block 7\nplaysound block.stone.fall player @s ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/slime_ball.mcfunction",
    "content": "# @s = player holding tinker sword\n# at @s\n# run from tool/sword\n\nclear @s slime_ball 63\ngive @s slime_block 7\nplaysound minecraft:block.slime_block.fall player @s ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/snowball.mcfunction",
    "content": "# @s = player holding tinker shovel\n# at @s\n# run from tool/shovel\n\nclear @s snowball 16\ngive @s snow_block 4\nplaysound block.snow.fall player @s ~ ~ ~ 0.2 0.8\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/compact/wheat.mcfunction",
    "content": "# @s = player holding tinker hoe\n# at @s\n# run from tool/hoe\n\nclear @s wheat 63\ngive @s hay_block 7\nplaysound minecraft:block.pumpkin.carve ambient @a ~ ~ ~ 0.2 0.2\nscoreboard players set $success gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/curies_bismium via #gm4_metallurgy:summon_band/curies_bismium\n\nloot spawn ~ ~ ~ loot gm4_tinker_shamir:band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/tool/hoe.mcfunction",
    "content": "# @s = player holding tinker shovel\n# at @s\n# run from gm4_tinker_shamir:active\n\n# check for compacting operations\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/melon_slice run function gm4_tinker_shamir:compact/melon_slice\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/wheat run function gm4_tinker_shamir:compact/wheat\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/tool/pickaxe.mcfunction",
    "content": "# @s = player holding tinker pickaxe\n# at @s\n# run from gm4_tinker_shamir:active\n\n# check for compacting operations\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/netherite_ingot run function gm4_tinker_shamir:compact/netherite_ingot\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/emerald run function gm4_tinker_shamir:compact/emerald\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/diamond run function gm4_tinker_shamir:compact/diamond\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/redstone run function gm4_tinker_shamir:compact/redstone\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/coal run function gm4_tinker_shamir:compact/coal\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/lapis_lazuli run function gm4_tinker_shamir:compact/lapis_lazuli\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/iron_ingot run function gm4_tinker_shamir:compact/iron_ingot\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/gold_ingot run function gm4_tinker_shamir:compact/gold_ingot\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/iron_nugget run function gm4_tinker_shamir:compact/iron_nugget\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/gold_nugget run function gm4_tinker_shamir:compact/gold_nugget\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/copper_ingot run function gm4_tinker_shamir:compact/copper_ingot\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/raw_iron run function gm4_tinker_shamir:compact/raw_iron\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/raw_gold run function gm4_tinker_shamir:compact/raw_gold\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/raw_copper run function gm4_tinker_shamir:compact/raw_copper\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/tool/shovel.mcfunction",
    "content": "# @s = player holding tinker shovel\n# at @s\n# run from gm4_tinker_shamir:active\n\n# check for compacting operations\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/snowball run function gm4_tinker_shamir:compact/snowball\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/clay_ball run function gm4_tinker_shamir:compact/clay_ball\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/function/tool/sword.mcfunction",
    "content": "# @s = player holding tinker sword\n# at @s\n# run from gm4_tinker_shamir:active\n\n# check for compacting operations\nexecute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/slime_ball run function gm4_tinker_shamir:compact/slime_ball\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/guidebook/tinker_shamir.json",
    "content": "{\n  \"id\": \"tinker_shamir\",\n  \"name\": \"Tinker Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"metallurgy\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Tinker_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_tinker_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'tinker'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_tinker_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'tinker'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.tinker_shamir.description\",\n            \"fallback\": \"Tinker causes items to be converted to their equivalent storage block form.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_tinker_shamir\",\n          \"obtain_tinker_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.tinker_shamir.usage\",\n            \"fallback\": \"The Tinker Shamir is found on Curie's Bismium Bands. It can be placed onto pickaxes, shovels, hoes, and swords.\\n\\nHolding the tool will convert items into their block form, such as iron ingots to iron blocks.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.tinker_shamir.usage_pickaxes\",\n            \"fallback\": \"Each tool tinkers a set of items, matching the tool.\\n\\nPickaxes will tinker emeralds, diamonds, redstone, coal, lapis, gold ingots, iron ingots, gold nuggets, and iron nuggets.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.tinker_shamir.usage_other_tools\",\n            \"fallback\": \"Shovels will tinker snow balls and clay balls.\\n\\nHoes will tinker melon slices and wheat.\\n\\nSwords will tinker slime balls.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:curies_bismium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:shamir/tinker\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'tinker'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.tinker\",\n                                    \"fallback\": \"Tinker Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/clay_ball.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:clay_ball\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:clay_ball\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:clay_ball\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/coal.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:coal\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:coal\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:coal\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/copper_ingot.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:copper_ingot\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:copper_ingot\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:copper_ingot\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/diamond.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:diamond\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:diamond\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:diamond\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/emerald.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:emerald\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:emerald\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:emerald\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/gold_ingot.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:gold_ingot\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:gold_ingot\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:gold_ingot\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/gold_nugget.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:gold_nugget\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:gold_nugget\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:gold_nugget\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/iron_ingot.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:iron_ingot\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:iron_ingot\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:iron_ingot\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/iron_nugget.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:iron_nugget\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:iron_nugget\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:iron_nugget\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/lapis_lazuli.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:lapis_lazuli\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:lapis_lazuli\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:lapis_lazuli\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/melon_slice.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:melon_slice\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:melon_slice\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:melon_slice\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/netherite_ingot.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:netherite_ingot\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:netherite_ingot\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:netherite_ingot\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/raw_copper.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:raw_copper\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:raw_copper\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:raw_copper\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/raw_gold.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:raw_gold\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:raw_gold\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:raw_gold\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/raw_iron.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:raw_iron\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:raw_iron\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:raw_iron\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/redstone.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:redstone\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:redstone\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:redstone\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/slime_ball.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:slime_ball\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:slime_ball\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:slime_ball\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/snowball.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:snowball\",\n            \"count\": 16\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:snowball\",\n            \"count\": 16\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:snowball\",\n            \"count\": 16\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/wheat.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"container.*\": {\n            \"items\": \"minecraft:wheat\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"armor.*\": {\n            \"items\": \"minecraft:wheat\",\n            \"count\": 64\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"slots\": {\n          \"weapon.offhand\": {\n            \"items\": \"minecraft:wheat\",\n            \"count\": 64\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_tinker_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:hoes\",\n    \"#minecraft:pickaxes\",\n    \"#minecraft:shovels\",\n    \"#minecraft:swords\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/advancement/vibro_fall_damage.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": \"this\",\n              \"score\": \"gm4_vibro_fall\"\n            },\n            \"range\": {\n              \"min\": 300\n            }\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"flags\": {\n                \"is_sneaking\": true\n              },\n              \"equipment\": {\n                \"feet\": {\n                  \"items\": \"#minecraft:foot_armor\",\n                  \"predicates\": {\n                    \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:'vibro'}}\"\n                  }\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_vibro_shamir:shockwave\"\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/active.mcfunction",
    "content": "# @s = players wearing vibro boots\n# run from metallurgy:shamir_equipped\n\ntag @s add gm4_has_vibro\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/check_item_validity.mcfunction",
    "content": "# @s = band is trying to apply to\n# run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'vibro'}}] if items entity @s contents #gm4_vibro_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/desire_lines.mcfunction",
    "content": "# @s = player who used vibro\n# run from shockwave\n\n# center block is guaranteed\nfunction gm4_desire_lines:path\n\n# 3x3 area has a 50% chance to convert\nexecute positioned ~-1 ~ ~-1 if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path\nexecute positioned ~ ~ ~-1 if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path\nexecute positioned ~1 ~ ~-1 if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path\nexecute positioned ~-1 ~ ~ if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path\nexecute positioned ~1 ~ ~ if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path\nexecute positioned ~-1 ~ ~1 if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path\nexecute positioned ~ ~ ~1 if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path\nexecute positioned ~1 ~ ~1 if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path\n\n# 5x5 border has 25% chance to convert\nexecute positioned ~-2 ~ ~-2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~-1 ~ ~-2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~ ~ ~-2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~1 ~ ~-2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~2 ~ ~-2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~-2 ~ ~-1 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~2 ~ ~-1 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~-2 ~ ~ if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~2 ~ ~ if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~-2 ~ ~1 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~2 ~ ~1 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~-2 ~ ~2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~-1 ~ ~2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~ ~ ~2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~1 ~ ~2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\nexecute positioned ~2 ~ ~2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/jump.mcfunction",
    "content": "# @s = vibro player sneaking on the ground\n# run from gm4_metallurgy:tick\n\n# add sneak number\nscoreboard players add @s gm4_vibro_sneak 1\n\n# apply jump boost based on sneak number\nattribute @s[scores={gm4_vibro_sneak=1}] jump_strength modifier add gm4_vibro_shamir:jump_boost 0.4 add_value\n\nattribute @s[scores={gm4_vibro_sneak=6}] jump_strength modifier remove gm4_vibro_shamir:jump_boost\nattribute @s[scores={gm4_vibro_sneak=6}] jump_strength modifier add gm4_vibro_shamir:jump_boost 0.6 add_value\n\nattribute @s[scores={gm4_vibro_sneak=11}] jump_strength modifier remove gm4_vibro_shamir:jump_boost\nattribute @s[scores={gm4_vibro_sneak=11}] jump_strength modifier add gm4_vibro_shamir:jump_boost 0.7 add_value\n\nattribute @s[scores={gm4_vibro_sneak=16}] jump_strength modifier remove gm4_vibro_shamir:jump_boost\nattribute @s[scores={gm4_vibro_sneak=16}] jump_strength modifier add gm4_vibro_shamir:jump_boost 1.0 add_value\n\n# playsound (A Major Scale)\nexecute if score @s gm4_vibro_sneak matches 1 run playsound minecraft:block.stone.step block @a[distance=..8] ~ ~ ~ 0.6 1.189207\nexecute if score @s gm4_vibro_sneak matches 6 run playsound minecraft:block.stone.step block @a[distance=..8] ~ ~ ~ 0.6 1.259921\nexecute if score @s gm4_vibro_sneak matches 11 run playsound minecraft:block.stone.step block @a[distance=..8] ~ ~ ~ 0.6 1.334840\nexecute if score @s gm4_vibro_sneak matches 16 run playsound minecraft:block.stone.step block @a[distance=..8] ~ ~ ~ 0.6 1.498307\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/remove_jump.mcfunction",
    "content": "# @s = vibro player no longer sneaking on the ground\n# run from gm4_metallurgy:tick\n\nscoreboard players reset @s gm4_vibro_sneak\nattribute @s jump_strength modifier remove gm4_vibro_shamir:jump_boost\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/shock/activate.mcfunction",
    "content": "# @s = none\n# located at world spawn\n# run from shockwave\n\nexecute as @a[scores={gm4_vibro_shock=1..}] at @s run function gm4_vibro_shamir:shock/user\nscoreboard players reset @a gm4_vibro_shock\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/shock/apply_mob.mcfunction",
    "content": "# @s = mob that will take damage from a vibro shockwave\n# run from shock/calculate\n\n# apply new health\nexecute store result score $health gm4_vibro_shock run data get entity @s Health 100\nscoreboard players operation $health gm4_vibro_shock -= $shockwave gm4_vibro_shock\nexecute if score $health gm4_vibro_shock matches 1.. run execute store result entity @s Health float .01 run scoreboard players get $health gm4_vibro_shock\nexecute if score $health gm4_vibro_shock matches ..0 run kill @s\n\n# knockback mob\n## get player pos\ndata modify storage gm4_vibro_shamir:temp Pos set from entity @a[tag=gm4_vibro_user,limit=1] Pos\nexecute store result score $target_x gm4_vibro_shock run data get storage gm4_vibro_shamir:temp Pos[0]\nexecute store result score $target_z gm4_vibro_shock run data get storage gm4_vibro_shamir:temp Pos[2]\n\n## get vector\ndata modify storage gm4_vibro_shamir:temp Pos set from entity @s Pos\nexecute store result score $motion_x gm4_vibro_shock run data get storage gm4_vibro_shamir:temp Pos[0]\nexecute store result score $motion_z gm4_vibro_shock run data get storage gm4_vibro_shamir:temp Pos[2]\n\nscoreboard players operation $motion_x gm4_vibro_shock -= $target_x gm4_vibro_shock\nscoreboard players operation $motion_z gm4_vibro_shock -= $target_z gm4_vibro_shock\n\n## set motion\nexecute store result entity @s[tag=!smithed.strict] Motion[0] double 0.2 run scoreboard players get $motion_x gm4_vibro_shock\nexecute store result entity @s[tag=!smithed.strict] Motion[2] double 0.2 run scoreboard players get $motion_z gm4_vibro_shock\ndata modify entity @s[tag=!smithed.strict] Motion[1] set value 0.35d\n\n## clean up\ndata remove storage gm4_vibro_shamir:temp Pos\n\n# visuals\neffect give @s resistance 1 4 true\neffect give @s[type=#minecraft:undead] instant_health\neffect give @s[type=!#minecraft:undead] instant_damage\n\nplaysound minecraft:entity.player.attack.crit player @a[distance=..8] ~ ~ ~ 1 1.4\nparticle minecraft:crit ~ ~.5 ~ 0 0 0 .5 20\nparticle minecraft:damage_indicator ~ ~.5 ~ 0 0 0 .5 5\n\ntag @a[tag=gm4_vibro_user,limit=1] add gm4_vibro_shock\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/shock/apply_player.mcfunction",
    "content": "# @s = player that will take damage from a vibro shockwave\n# run from shock/calculate\n\ntag @s add gm4_vibro_attacked\n\n# calculate new health\nexecute store result score $health gm4_vibro_shock run data get entity @s Health 100\nscoreboard players operation $health gm4_vibro_shock -= $shockwave gm4_vibro_shock\nscoreboard players operation $health gm4_vibro_shock /= #100 gm4_vibro_shock\n\n# calculate amount of max_health to remove to get to new health\nexecute store result score $remove_health gm4_vibro_shock run attribute @s minecraft:max_health get\nscoreboard players operation $remove_health gm4_vibro_shock -= $health gm4_vibro_shock\n\n# lower player's max health to their new health\nexecute if score $remove_health gm4_vibro_shock matches 512.. run attribute @s minecraft:max_health modifier add minecraft:ff6db900-dbd6-47bd-9219-66c7282a84af -512 add_value\nexecute if score $remove_health gm4_vibro_shock matches 512.. run scoreboard players remove $remove_health gm4_vibro_shock 512\nexecute if score $remove_health gm4_vibro_shock matches 256.. run attribute @s minecraft:max_health modifier add minecraft:c45a7b6f-ac1c-44b4-8d5f-bc4aaa743f80 -256 add_value\nexecute if score $remove_health gm4_vibro_shock matches 256.. run scoreboard players remove $remove_health gm4_vibro_shock 256\nexecute if score $remove_health gm4_vibro_shock matches 128.. run attribute @s minecraft:max_health modifier add minecraft:fb369a6d-7026-4274-9888-d2e1c66a5959 -128 add_value\nexecute if score $remove_health gm4_vibro_shock matches 128.. run scoreboard players remove $remove_health gm4_vibro_shock 128\nexecute if score $remove_health gm4_vibro_shock matches 64.. run attribute @s minecraft:max_health modifier add minecraft:9dd58507-2a53-4ab6-8688-b0fa0be103ab -64 add_value\nexecute if score $remove_health gm4_vibro_shock matches 64.. run scoreboard players remove $remove_health gm4_vibro_shock 64\nexecute if score $remove_health gm4_vibro_shock matches 32.. run attribute @s minecraft:max_health modifier add minecraft:54197d85-31a1-4862-b63a-39d7e6249656 -32 add_value\nexecute if score $remove_health gm4_vibro_shock matches 32.. run scoreboard players remove $remove_health gm4_vibro_shock 32\nexecute if score $remove_health gm4_vibro_shock matches 16.. run attribute @s minecraft:max_health modifier add minecraft:8e3c149e-0e7c-452e-b0c1-729289c27838 -16 add_value\nexecute if score $remove_health gm4_vibro_shock matches 16.. run scoreboard players remove $remove_health gm4_vibro_shock 16\nexecute if score $remove_health gm4_vibro_shock matches 8.. run attribute @s minecraft:max_health modifier add minecraft:30aabc20-f152-4399-ae1f-25c5d2bc4ab6 -8 add_value\nexecute if score $remove_health gm4_vibro_shock matches 8.. run scoreboard players remove $remove_health gm4_vibro_shock 8\nexecute if score $remove_health gm4_vibro_shock matches 4.. run attribute @s minecraft:max_health modifier add minecraft:552ce249-02c9-44ff-a7c7-1c85b84d56aa -4 add_value\nexecute if score $remove_health gm4_vibro_shock matches 4.. run scoreboard players remove $remove_health gm4_vibro_shock 4\nexecute if score $remove_health gm4_vibro_shock matches 2.. run attribute @s minecraft:max_health modifier add minecraft:4da9ec81-1250-437d-bd99-57be649410e3 -2 add_value\nexecute if score $remove_health gm4_vibro_shock matches 2.. run scoreboard players remove $remove_health gm4_vibro_shock 2\nexecute if score $remove_health gm4_vibro_shock matches 1.. run attribute @s minecraft:max_health modifier add minecraft:66ff51d4-70ad-4213-84ce-21b7b48fa316 -1 add_value\nexecute if score $remove_health gm4_vibro_shock matches 1.. run scoreboard players remove $remove_health gm4_vibro_shock 1\n\n# update the player's health\neffect give @s minecraft:instant_health 1 0 true\neffect give @s instant_damage 1 3 true\nexecute if score $health gm4_vibro_shock matches 1.. run effect give @s resistance 1 4 true\nexecute if score $health gm4_vibro_shock matches ..0 run function gm4_vibro_shamir:shock/revert_health\n\n# visuals\nplaysound minecraft:entity.player.attack.crit player @a[distance=..8] ~ ~ ~ 1 1.4\nparticle minecraft:crit ~ ~.5 ~ 0 0 0 .5 20\nparticle minecraft:damage_indicator ~ ~.5 ~ 0 0 0 .5 5\n\ntag @a[tag=gm4_vibro_user,limit=1] add gm4_vibro_shock\n\n# revert max health attribute\nschedule function gm4_vibro_shamir:shock/check_shock 1t\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/shock/calculate.mcfunction",
    "content": "# @s = mob within 6 blocks of a vibro shockwave\n# run from shock/activate\n\n# raycast to the vibro player\nsummon marker ~ ~ ~ {CustomName:\"gm4_vibro_ray\",Tags:[\"gm4_vibro_ray\"]}\nexecute as @e[type=marker,tag=gm4_vibro_ray,limit=1] at @s run function gm4_vibro_shamir:shock/ray_execute\n\n# damage dealt to the vibro player is multiplied by 2 and divided by the distance+dampening\nscoreboard players operation $shockwave gm4_vibro_shock = $damage gm4_vibro_shock\nscoreboard players operation $shockwave gm4_vibro_shock *= #shock_multiplier gm4_vibro_shock\nscoreboard players operation $shockwave gm4_vibro_shock /= $ray gm4_vibro_shock\n\n# if damage was more than .5 health (.25 hearts), damage the mob\nexecute if score $shockwave gm4_vibro_shock matches 50.. unless entity @s[type=player] run function gm4_vibro_shamir:shock/apply_mob\nexecute if score $shockwave gm4_vibro_shock matches 50.. if entity @s[type=player,gamemode=!spectator,gamemode=!creative] run function gm4_vibro_shamir:shock/apply_player\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/shock/check_shock.mcfunction",
    "content": "# @s = none\n# located at world spawn\n# run from shock/apply_player\n\nexecute as @a[tag=gm4_vibro_attacked] run function gm4_vibro_shamir:shock/revert_health\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/shock/ray.mcfunction",
    "content": "# @s = ray casting marker\n# run from shock/ray_execute\n\nscoreboard players add $ray gm4_vibro_shock 1\nexecute if block ~ ~ ~ #gm4:full_collision run scoreboard players add $ray gm4_vibro_shock 2\nexecute unless block ~ ~ ~ #gm4:full_collision unless block ~ ~ ~ #gm4:no_collision run scoreboard players add $ray gm4_vibro_shock 1\nexecute if score $ray gm4_vibro_shock matches 0..12 unless entity @a[tag=gm4_vibro_user,distance=..0.6,limit=1] positioned ^ ^ ^0.5 run function gm4_vibro_shamir:shock/ray\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/shock/ray_execute.mcfunction",
    "content": "# @s = vibro ray marker\n# run from shock/calculate\n\nexecute facing entity @a[tag=gm4_vibro_user,limit=1] feet run tp @s ~ ~ ~ ~ ~\nscoreboard players reset $ray gm4_vibro_shock\nexecute at @s run function gm4_vibro_shamir:shock/ray\nkill @s\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/shock/revert_health.mcfunction",
    "content": "# @s = player that was attacked by vibro\n# run from shock/check_shock\n\n# revert max health\nattribute @s minecraft:max_health modifier remove minecraft:ff6db900-dbd6-47bd-9219-66c7282a84af\nattribute @s minecraft:max_health modifier remove minecraft:c45a7b6f-ac1c-44b4-8d5f-bc4aaa743f80\nattribute @s minecraft:max_health modifier remove minecraft:fb369a6d-7026-4274-9888-d2e1c66a5959\nattribute @s minecraft:max_health modifier remove minecraft:9dd58507-2a53-4ab6-8688-b0fa0be103ab\nattribute @s minecraft:max_health modifier remove minecraft:54197d85-31a1-4862-b63a-39d7e6249656\nattribute @s minecraft:max_health modifier remove minecraft:8e3c149e-0e7c-452e-b0c1-729289c27838\nattribute @s minecraft:max_health modifier remove minecraft:30aabc20-f152-4399-ae1f-25c5d2bc4ab6\nattribute @s minecraft:max_health modifier remove minecraft:552ce249-02c9-44ff-a7c7-1c85b84d56aa\nattribute @s minecraft:max_health modifier remove minecraft:4da9ec81-1250-437d-bd99-57be649410e3\nattribute @s minecraft:max_health modifier remove minecraft:66ff51d4-70ad-4213-84ce-21b7b48fa316\n\ntag @s remove gm4_vibro_attacked\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/shock/user.mcfunction",
    "content": "# @s = player who used vibro\n# run from shock/activate\n\n# set up player\ntag @s add gm4_vibro_user\nscoreboard players operation $damage gm4_vibro_shock = @s gm4_vibro_shock\n\n# calculate damage dealt to mobs\nexecute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!gm4_vibro_user,distance=..6] at @s run function gm4_vibro_shamir:shock/calculate\n\n# visuals\nparticle minecraft:cloud ~ ~.3 ~ 0.2 0.2 0.2 0.1 20\nparticle minecraft:smoke ~ ~.3 ~ 0.3 0.3 0.3 0.02 40\nparticle minecraft:mycelium ~ ~ ~ 1 1 1 5 50\nparticle minecraft:dust_color_transition{from_color:[0.239,0.251,0.247],to_color:[1.000,0.996,0.961],scale:1} ~ ~.2 ~ 2 0 2 0 200\n\nplaysound minecraft:item.shovel.flatten block @a[distance=..8] ~ ~ ~ 1 0.1\nexecute if entity @s[tag=gm4_vibro_shock] run playsound minecraft:item.totem.use player @a[distance=..8] ~ ~ ~ 0.1 2\n\n# clean up\ntag @s remove gm4_vibro_shock\ntag @s remove gm4_vibro_user\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/shockwave.mcfunction",
    "content": "# @s = player wearing vibro boots that just took fall damage while sneaking\n# run from advancement vibro_fall_damage\n\nadvancement revoke @s only gm4_vibro_shamir:vibro_fall_damage\n\n# jump boost cooldown\nscoreboard players set @s gm4_vibro_sneak -10\n\n# hurt mobs\nscoreboard players operation @s gm4_vibro_shock = @s gm4_vibro_hurt\nscoreboard players operation @s gm4_vibro_shock += @s gm4_vibro_absorb\nschedule function gm4_vibro_shamir:shock/activate 1t\n\n# terminate if desire lines is not installed\nexecute unless score gm4_desire_lines load.status matches 1.. run return 1\n\n# desire lines is installed, apply guarenteed effect (unless the player has some strong desire lines inhibiting item) in a 5x5\n# | the inverse sneak penalty is not enough to cicumvent desire lines in this case\nscoreboard players set $probability gm4_desire_lines 100\nscoreboard players operation $probability gm4_desire_lines -= #sneak_penality gm4_desire_lines\nfunction #gm4_desire_lines:expansion\nexecute if predicate {\"condition\":\"minecraft:random_chance\",\"chance\":{\"type\":\"minecraft:score\",\"target\":{\"type\":\"minecraft:fixed\",\"name\":\"$probability\"},\"score\":\"gm4_desire_lines\",\"scale\":0.01}} run function gm4_vibro_shamir:desire_lines\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n# run from metallurgy:casting/summon_band/thorium via #gm4_metallurgy:summon_band/thorium\n\nloot spawn ~ ~ ~ loot gm4_vibro_shamir:band\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/guidebook/vibro_shamir.json",
    "content": "{\n  \"id\": \"vibro_shamir\",\n  \"name\": \"Vibro Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"metallurgy\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Vibro_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_vibro_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'vibro'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_vibro_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'vibro'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.vibro_shamir.description\",\n            \"fallback\": \"Vibro grants high jumps and creates deadly shockwaves.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_vibro_shamir\",\n          \"obtain_vibro_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.vibro_shamir.usage\",\n            \"fallback\": \"The Vibro Shamir is found on Thorium Bands. It can be placed onto boots.\\n\\nWhen sneaking, users who take fall damage will hurt mobs within a 6 block radius. Damage is based on distance from the user and the blocks between.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.vibro_shamir.jump_boost\",\n            \"fallback\": \"Sneaking on the ground will allow the user to gain temporary jump boost. The level of jump boost is dependent on the sneak time.\\n\\nWhen using the Vibro Jump, the user will take damage when landing.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:thorium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_metallurgy:shamir/vibro\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'vibro'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.vibro\",\n                                    \"fallback\": \"Vibro Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/predicate/desire_lines_chance_high.json",
    "content": "{\n    \"condition\": \"random_chance\",\n    \"chance\": 0.5\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/predicate/desire_lines_chance_low.json",
    "content": "{\n    \"condition\": \"random_chance\",\n    \"chance\": 0.25\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/predicate/sneak_on_ground.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:inverted\",\n    \"term\": {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"stepping_on\": {\n          \"block\": {\n            \"blocks\": \"#gm4:no_collision\"\n          }\n        }\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n      \"flags\": {\n        \"is_sneaking\": true\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_metallurgy/data/gm4_vibro_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:foot_armor\"\n  ]\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/minecraft/loot_table/blocks/andesite.json",
    "content": "{\n  \"type\": \"minecraft:block\",\n  \"pools\": [\n    {\n      \"rolls\": 1.0,\n      \"bonus_rolls\": 0.0,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:andesite\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:survives_explosion\"\n        },\n        {\n          \"condition\": \"minecraft:inverted\",\n          \"term\": {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:tnt\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"rolls\": 1.0,\n      \"bonus_rolls\": 0.0,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"value\": \"gm4_metallurgy:bauxite_lump\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.1\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"minecraft:andesite\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:survives_explosion\"\n                }\n              ]\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type\": \"minecraft:tnt\"\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"random_sequence\": \"minecraft:blocks/andesite\",\n  \"__smithed__\": {\n    \"rules\": [\n      {\n        \"type\": \"smithed:append\",\n        \"target\": \"pools[0].conditions\",\n        \"source\": {\n          \"type\": \"smithed:reference\",\n          \"path\": \"pools[0].conditions[1]\"\n        }\n      },\n      {\n        \"type\": \"smithed:append\",\n        \"target\": \"pools\",\n        \"source\": {\n          \"type\": \"smithed:reference\",\n          \"path\": \"pools[1]\"\n        }\n      }\n    ],\n    \"priority\": {\n      \"default\": 0\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/minecraft/loot_table/blocks/deepslate.json",
    "content": "{\n  \"type\": \"minecraft:block\",\n  \"pools\": [\n    {\n      \"rolls\": 1.0,\n      \"bonus_rolls\": 0.0,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:item\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:match_tool\",\n                  \"predicate\": {\n                    \"predicates\": {\n                      \"minecraft:enchantments\": [\n                        {\n                          \"enchantments\": \"minecraft:silk_touch\",\n                          \"levels\": {\n                            \"min\": 1\n                          }\n                        }\n                      ]\n                    }\n                  }\n                }\n              ],\n              \"name\": \"minecraft:deepslate\"\n            },\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"value\": \"gm4_forterra_shamir:deepslate\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:match_tool\",\n                  \"predicate\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'forterra'}}\"\n                    }\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:item\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:survives_explosion\"\n                }\n              ],\n              \"name\": \"minecraft:cobbled_deepslate\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"random_sequence\": \"minecraft:blocks/deepslate\",\n  \"__smithed__\": {\n    \"rules\": [\n      {\n        \"type\": \"smithed:insert\",\n        \"index\": 1,\n        \"target\": \"pools[0].entries[0].children\",\n        \"source\": {\n          \"type\": \"smithed:reference\",\n          \"path\": \"pools[0].entries[0].children[1]\"\n        }\n      }\n    ],\n    \"priority\": {\n      \"default\": 0\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/minecraft/loot_table/blocks/diorite.json",
    "content": "{\n  \"type\": \"minecraft:block\",\n  \"pools\": [\n    {\n      \"rolls\": 1.0,\n      \"bonus_rolls\": 0.0,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:diorite\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:survives_explosion\"\n        },\n        {\n          \"condition\": \"minecraft:inverted\",\n          \"term\": {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:tnt\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"rolls\": 1.0,\n      \"bonus_rolls\": 0.0,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"value\": \"gm4_metallurgy:thorianite_lump\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.1\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"minecraft:diorite\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:survives_explosion\"\n                }\n              ]\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type\": \"minecraft:tnt\"\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"random_sequence\": \"minecraft:blocks/diorite\",\n  \"__smithed__\": {\n    \"rules\": [\n      {\n        \"type\": \"smithed:append\",\n        \"target\": \"pools[0].conditions\",\n        \"source\": {\n          \"type\": \"smithed:reference\",\n          \"path\": \"pools[0].conditions[1]\"\n        }\n      },\n      {\n        \"type\": \"smithed:append\",\n        \"target\": \"pools\",\n        \"source\": {\n          \"type\": \"smithed:reference\",\n          \"path\": \"pools[1]\"\n        }\n      }\n    ],\n    \"priority\": {\n      \"default\": 0\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/minecraft/loot_table/blocks/granite.json",
    "content": "{\n  \"type\": \"minecraft:block\",\n  \"pools\": [\n    {\n      \"rolls\": 1.0,\n      \"bonus_rolls\": 0.0,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:granite\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:survives_explosion\"\n        },\n        {\n          \"condition\": \"minecraft:inverted\",\n          \"term\": {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:tnt\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"rolls\": 1.0,\n      \"bonus_rolls\": 0.0,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"value\": \"gm4_metallurgy:baryte_lump\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.1\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"minecraft:granite\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:survives_explosion\"\n                }\n              ]\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type\": \"minecraft:tnt\"\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"random_sequence\": \"minecraft:blocks/granite\",\n  \"__smithed__\": {\n    \"rules\": [\n      {\n        \"type\": \"smithed:append\",\n        \"target\": \"pools[0].conditions\",\n        \"source\": {\n          \"type\": \"smithed:reference\",\n          \"path\": \"pools[0].conditions[1]\"\n        }\n      },\n      {\n        \"type\": \"smithed:append\",\n        \"target\": \"pools\",\n        \"source\": {\n          \"type\": \"smithed:reference\",\n          \"path\": \"pools[1]\"\n        }\n      }\n    ],\n    \"priority\": {\n      \"default\": 0\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/data/minecraft/loot_table/blocks/stone.json",
    "content": "{\n  \"type\": \"minecraft:block\",\n  \"pools\": [\n    {\n      \"rolls\": 1.0,\n      \"bonus_rolls\": 0.0,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:item\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:match_tool\",\n                  \"predicate\": {\n                    \"predicates\": {\n                      \"minecraft:enchantments\": [\n                        {\n                          \"enchantments\": \"minecraft:silk_touch\",\n                          \"levels\": {\n                            \"min\": 1\n                          }\n                        }\n                      ]\n                    }\n                  }\n                }\n              ],\n              \"name\": \"minecraft:stone\"\n            },\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"value\": \"gm4_metallurgy:bismutite_lump\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:entity_properties\",\n                  \"entity\": \"this\",\n                  \"predicate\": {\n                    \"type\": [\n                      \"minecraft:tnt\",\n                      \"minecraft:creeper\",\n                      \"minecraft:wither\",\n                      \"minecraft:wither_skull\"\n                    ]\n                  }\n                },\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.1\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"value\": \"gm4_forterra_shamir:stone\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:match_tool\",\n                  \"predicate\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'forterra'}}\"\n                    }\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:item\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:survives_explosion\"\n                }\n              ],\n              \"name\": \"minecraft:cobblestone\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"random_sequence\": \"minecraft:blocks/stone\",\n  \"__smithed__\": {\n    \"rules\": [\n      {\n        \"type\": \"smithed:insert\",\n        \"index\": 1,\n        \"target\": \"pools[0].entries[0].children\",\n        \"source\": {\n          \"type\": \"smithed:reference\",\n          \"path\": \"pools[0].entries[0].children[2]\"\n        }\n      },\n      {\n        \"type\": \"smithed:insert\",\n        \"index\": 1,\n        \"target\": \"pools[0].entries[0].children\",\n        \"source\": {\n          \"type\": \"smithed:reference\",\n          \"path\": \"pools[0].entries[0].children[1]\"\n        }\n      }\n    ],\n    \"priority\": {\n      \"default\": 0\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_metallurgy/mod.mcdoc",
    "content": "use ::java::world::item::ItemStack\nuse ::java::world::component::DataComponentPatch\n\ndispatch minecraft:storage[gm4_arborenda_shamir:temp] to struct {\n  tool?: ItemStack,\n  damage?: int,\n}\n\ndispatch minecraft:storage[gm4_infinitas_shamir:bucket] to struct {\n  fish_data?: DataComponentPatch,\n}\n\ndispatch minecraft:storage[gm4_metallurgy:temp/item/cast] to struct {\n  stored_shamir?: string,\n  recasted_shamir?: string,\n}\n\ndispatch minecraft:storage[gm4_metallurgy:temp/item/ore] to struct {\n  gm4_metallurgy?: CustomData,\n}\n\ndispatch minecraft:storage[gm4_vibro_shamir:temp] to struct {\n  Pos?: [double] @ 3,\n}\n\ndispatch mcdoc:custom_data[gm4_metallurgy] to struct CustomData {\n  has_shamir?: 1b,\n  active_shamir?: string,\n  stored_shamir?: string,\n  ore_type?: MetalType,\n  custom_model_data?: int,\n  item?: ItemType,\n  metal?: struct {\n    type: MetalType,\n    amount?: [short],\n    castable?: 1b,\n  },\n}\n\ntype ItemType = (\"ore\" | \"obsidian_cast\")\n\ntype MetalType = (\"aluminium\" | \"barimium\" | \"barium\" | \"bismuth\" | \"copper\" | \"curies_bismium\" | \"thorium_brass\" | \"thorium\")\n"
  },
  {
    "path": "gm4_metallurgy/shamir_model_template.py",
    "content": "from beet import Context, Model, NamespaceProxy, ListOption, ResourcePack\nfrom beet.contrib.vanilla import Vanilla, ClientJar\nfrom beet.contrib.optifine import OptifineProperties\nfrom typing import Any, ClassVar, Literal\nfrom itertools import product, chain, count\nimport re\nimport logging\nfrom copy import deepcopy\n\nfrom gm4.plugins.resource_pack import ModelData, TemplateOptions, JsonType\nfrom gm4.utils import add_namespace, MapOption\n\nparent_logger = logging.getLogger(\"gm4.\"+__name__)\n\nTOOL_MATERIALS = [\"wooden\", \"stone\", \"copper\", \"iron\", \"golden\", \"diamond\", \"netherite\"]\nARMOR_MATERIALS = [\"leather\", \"copper\", \"chainmail\", \"iron\", \"golden\", \"diamond\", \"netherite\"]\nTOOLS = [\"axe\", \"hoe\", \"pickaxe\", \"shovel\"]\nARMOR = [\"boots\", \"chestplate\", \"helmet\", \"leggings\"]\nBUCKETABLE = [\"water\", \"lava\", \"milk\", \"powder_snow\", \"cod\", \"salmon\", \"pufferfish\", \"tropical_fish\", \"tadpole\", \"axolotl\"]\n\nTEXTURELESS = [\"shield\"] # item model is unable to receive layer in vanilla\n\nSPECIAL_MODEL_IGNORES = [\"shield\"] # models with special case handling, that cannot be customized with resource packs the way we want.\n\n# define item group lookups\nGROUP_LOOKUP = {\n    \"armor\": [f\"{material}_{armor}\" for material, armor in product(ARMOR_MATERIALS, ARMOR)] + [\"turtle_helmet\"],\n    \"tools\": [f\"{material}_{tool}\" for material, tool in product(TOOL_MATERIALS, TOOLS)],\n    \"weapons\": [f\"{material}_{weapon}\" for  material, weapon in product(TOOL_MATERIALS, [\"sword\", \"axe\"])] + [\"trident\"],\n\n    \"pickaxes\": [f\"{material}_pickaxe\" for material in TOOL_MATERIALS],\n    \"shovels\": [f\"{material}_shovel\" for material in TOOL_MATERIALS],\n    \"axes\": [f\"{material}_axe\" for material in TOOL_MATERIALS],\n    \"hoes\": [f\"{material}_hoe\" for material in TOOL_MATERIALS],\n    \"swords\": [f\"{material}_sword\" for material in TOOL_MATERIALS],\n\n    \"boots\": [f\"{material}_boots\" for material in ARMOR_MATERIALS],\n    \"leggings\": [f\"{material}_leggings\" for material in ARMOR_MATERIALS],\n    \"chestplates\": [f\"{material}_chestplate\" for material in ARMOR_MATERIALS],\n    \"helmets\": [f\"{material}_helmet\" for material in ARMOR_MATERIALS] + [\"turtle_helmet\"],\n\n    \"buckets\": [f\"{substance}_bucket\" for substance in BUCKETABLE] + [\"bucket\"]\n}\n\nTEXTURE_LOOKUP = { # what texture to use if the exact item name is not present\n    item: \"boots\" for item in GROUP_LOOKUP[\"boots\"]} | {\n    item: \"leggings\" for item in GROUP_LOOKUP[\"leggings\"]} | {\n    item: \"chestplate\" for item in GROUP_LOOKUP[\"chestplates\"]} | {\n    item: \"helmet\" for item in GROUP_LOOKUP[\"helmets\"]} | {\n    item: \"pickaxe\" for item in GROUP_LOOKUP[\"pickaxes\"]} | {\n    item: \"shovel\" for item in GROUP_LOOKUP[\"shovels\"]} | {\n    item: \"axe\" for item in GROUP_LOOKUP[\"axes\"]} | {\n    item: \"hoe\" for item in GROUP_LOOKUP[\"hoes\"]} | {\n    item: \"sword\" for item in GROUP_LOOKUP[\"swords\"]} | {\n    item: \"bucket\" for item in GROUP_LOOKUP[\"buckets\"]} | {\n    \"recovery_compass\": \"compass\",\n    \"carrot_on_a_stick\": \"fishing_rod\",\n    \"warped_fungus_on_a_stick\": \"fishing_rod\"\n}\n\nclass ShamirTemplate(TemplateOptions):\n    \"\"\"Model Template for generating models for shamirs on tools/armor\"\"\"\n    name: Literal[\"shamir\"] = \"shamir\"\n    texture_map = [\"\", \"band\"]\n    textures_path: str = \"\" # directory of texture files to use for shamirs, falling back to the default metallurgy textures\n    metal: Literal[\"aluminium\", \"barimium\", \"barium\", \"bismuth\", \"curies_bismium\", \"thorium\"] # the metallurgy metal this shamir is made of\n\n    _item_def_map: dict[str, JsonType] = {}\n\n    bound_ctx: ClassVar[Context]\n    metallurgy_assets: ClassVar[ResourcePack] = ResourcePack(path=\"gm4_metallurgy\") # load metallurgy textures so expansion shamirs can fall back on their\n    vanilla_models_jar: ClassVar[ClientJar]\n\n    def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]:\n        logger = parent_logger.getChild(self.bound_ctx.project_id)\n        models_loc = f\"{config.reference}\"\n        models: dict[str, str] = {} # the value of config.models to be applied after going through special cases\n        ret_list: list[Model] = []\n\n        for item in config.item.entries():\n            if item == \"player_head\":\n                # create the band item-model, which shares the same CMD as all the tools/armor\n                m = Model({\n                    \"parent\": \"item/generated\",\n                    \"textures\": {\n                        \"layer0\": config.textures[\"band\"]\n                    }\n                })\n                models_container[f\"{models_loc}/band\"] = m\n                ret_list.append(m)\n                models.update({\"player_head\": f\"{models_loc}/band\"})\n                continue\n\n\n            # find the texture to use; first in this module at the path directed\n            if (t:=add_namespace(f\"{self.textures_path}/{item}\" , self.bound_ctx.project_id)) in self.bound_ctx.assets.textures: # check for the item exactly\n                texture = t\n            elif (t:=add_namespace(f\"{self.textures_path}/{TEXTURE_LOOKUP.get(item)}\" , self.bound_ctx.project_id)) in self.bound_ctx.assets.textures: # check for a generic \"axe\" texture\n                texture = t\n            # then in the base gm4_metallurgy textures\n            elif (t:=add_namespace(f\"item/shamir/{self.metal}/{item}\" , \"gm4_metallurgy\")) in self.metallurgy_assets.textures: # check for the item exactly\n                texture = t\n                logger.debug(f\"An appropiate texture for '{item}' could not be found in {self.textures_path}, falling back to the texture {t}\")\n            elif (t:=add_namespace(f\"item/shamir/{self.metal}/{TEXTURE_LOOKUP.get(item)}\" , \"gm4_metallurgy\")) in self.metallurgy_assets.textures: # check for a generic \"axe\" texture\n                texture = t\n                logger.debug(f\"An appropiate texture for '{item}' could not be found in {self.textures_path}, falling back to the texture {t}\")\n            else:\n                if item not in TEXTURELESS:\n                    logger.warning(f\"No shamir texture for '{item}' could be found!\")\n                texture = \"gm4:item/empty\"\n\n            # generate the models, using the vanilla models as a base\n            total_layers = 0 # number of texture layers in vanilla\n            base_layers = 0 # number of texture layers on the simplest item ie trim-less armor\n            if item in GROUP_LOOKUP[\"armor\"]:\n                total_layers = 1 # put the texture above the trims\n                base_layers = 0 # untrimmed armor has no layer1\n                if item.startswith(\"leather\"):\n                    total_layers = 2 # and the dyed portion\n                    base_layers = 1\n\n            m = Model({\n                \"parent\": f\"minecraft:item/{item}\",\n                \"textures\": {\n                    f\"layer{base_layers+1}\": texture\n                }\n            })\n            models_container[f\"{models_loc}/{item}\"] = m\n            ret_list.append(m)\n\n            # define recursive search function for looking at vanilla item definitions to copy/modify\n            def recursive_extract_variants(json: dict[str, Any]) -> tuple[list[str], list[Any]]:\n                ret_variants: list[str] = []\n                ret_pointers: list[Any] = []\n                for val in json.values():\n                    match val:\n                        case {\"type\": \"minecraft:model\", \"model\": str(m)}:\n                            ret_variants.append(m.split('/')[-1]) # ie, iron_chestplate_quartz_trim, fishing_rod_cast, compass_00, elytra_broken ect...\n                            ret_pointers.append(val)\n                        case list()|dict(): # val is dict, or list of dicts\n                            for elem in val if isinstance(val, list) else [val]: # type: ignore ; this is json\n                                if isinstance(elem, dict):\n                                    rec_varis, rec_pts = recursive_extract_variants(elem) # type: ignore ; this is json\n                                    ret_variants.extend(rec_varis)\n                                    ret_pointers.extend(rec_pts)\n                        case _:\n                            pass\n\n                return ret_variants, ret_pointers\n\n            # create texture variants, using the vanilla item definition as a template\n            mutatable_itemdef_copy = deepcopy(self.vanilla_models_jar.assets.item_models[f\"minecraft:{item}\"].data[\"model\"])\n            item_variants, itemdef_compounds = recursive_extract_variants(mutatable_itemdef_copy)\n            for item_variant, itemdef_compound in zip(item_variants, itemdef_compounds):\n                texture_variant = ('/'.join(texture.split('/')[0:-1] + [item_variant])) # is there an explicit texture for this variant. ie broken_elytra.png?\n                variant_tex_exists = texture_variant in self.bound_ctx.assets.textures or texture_variant in self.metallurgy_assets.textures\n\n                if (variant_path:=f\"{models_loc}/{item_variant}\") not in models_container: # create a new model file if one does not exist\n                    m = Model({\n                        \"parent\": f\"minecraft:item/{item_variant}\",\n                        \"textures\": {\n                            f\"layer{total_layers+1}\": texture_variant if variant_tex_exists else texture\n                        }\n                    })\n                    models_container[f\"{models_loc}/{item_variant}\"] = m\n                    ret_list.append(m)\n\n                itemdef_compound[\"model\"] = variant_path # update our copy to point to the new model\n\n            if item_variants:\n                self._item_def_map[item] = mutatable_itemdef_copy\n                models.update({item: \"NULL\"}) # actual model paths contained within itemdef compound\n            elif item in SPECIAL_MODEL_IGNORES:\n                # use the vanilla item-def anyway\n                self._item_def_map[item] = mutatable_itemdef_copy\n                models.update({item: \"NULL\"}) # actual model paths contained within itemdef compound\n            else:\n                models.update({item: f\"{models_loc}/{item}\"})\n\n        config.model = MapOption(models)\n        return ret_list\n\n    def get_item_def_entry(self, config: ModelData, item: str) -> None|JsonType:\n        # TODO fill me out, replacing ComplexBypass\n        return self._item_def_map.get(item)\n\n    def mutate_config(self, config: ModelData):\n        expanded_items = set(chain.from_iterable([GROUP_LOOKUP.get(group, [group]) for group in config.item.entries()])) | {\"player_head\"}\n        config.item = ListOption(list(expanded_items))\n        config.model = MapOption({item: config.reference for item in expanded_items})\n        if isinstance(config.textures.root, list):\n            config.textures = MapOption({\"band\": f\"gm4_metallurgy:item/band/{self.metal}_band\"})\n        else: # isinstance(.., dict):\n            config.textures = MapOption({\"band\": f\"gm4_metallurgy:item/band/{self.metal}_band\"}|config.textures.root)\n\ndef optifine_armor_properties_merging(pack: ResourcePack, path: str, current: OptifineProperties, conflict: OptifineProperties) -> bool:\n    if not path.startswith(\"gm4_metallurgy:cit\"): # only apply this rule to metallurgy files\n        return False\n\n    merged = current.text.splitlines()\n    pattern = re.compile(r\"^nbt.CustomModelData=regex:\\((.+)\\)$\", flags=re.MULTILINE)\n    for i, current_line, conflict_line in zip(count(), current.text.splitlines(), conflict.text.splitlines()):\n        current_match = pattern.match(current_line)\n        conflict_match = pattern.match(conflict_line)\n\n        if not current_match or not conflict_match: # this line is not the nbt.CustomModelData config\n            if current_line != conflict_line:\n                return False # the files are not the same, abort the merge\n            continue # process the next line pair\n\n        current_cmd = set(current_match.group(1).split(\"|\"))\n        conflict_cmd = set(conflict_match.group(1).split(\"|\"))\n\n        merged[i] = f\"nbt.CustomModelData=regex:({'|'.join(sorted(current_cmd|conflict_cmd))})\"\n\n\n    current.text = \"\\n\".join(merged)\n    return True\n\ndef beet_default(ctx: Context):\n    # bind context object to a ClassVar so it can be accessed later during template processing\n    ShamirTemplate.bound_ctx = ctx\n    vanilla = ctx.inject(Vanilla)\n    vanilla.minecraft_version = '26.1'\n    ShamirTemplate.vanilla_models_jar = vanilla.mount(\"assets/minecraft/items\")\n    merge_policy(ctx)\n\ndef merge_policy(ctx: Context):\n    ctx.assets.merge_policy.extend_namespace(OptifineProperties, optifine_armor_properties_merging)\n    # a separate plugin to register the merge policy - used for the pyproject.toml custom policy workaround when using broadcast pipelines\n"
  },
  {
    "path": "gm4_midnight_menaces/README.md",
    "content": "# Mysterious Midnights<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nFull moons gain a element of surprise with random events.<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Every full moon, there is a chance of a random event bing triggered.\r\n- When triggered, all players will hear a wolf howl sound.\r\n- This adds 6 more events to the base data pack called [Mysterious Midnights]($dynamicLink:gm4_mysterious_midnights)\r\n\r\nRead more about all the options on the [Wiki](https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces).\r\n"
  },
  {
    "path": "gm4_midnight_menaces/beet.yaml",
    "content": "id: gm4_midnight_menaces\nname: Midnight Menaces\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_mysterious_midnights: 1.8.0\n      schedule_loops: [main]\n    website:\n      description: Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on!\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: 9aTlLrlw\n    wiki: https://wiki.gm4.co/wiki/Mysterious_Midnights/Midnight_Menaces\n    credits:\n      Creator:\n        - BPR\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/dawn_active_check.mcfunction",
    "content": "# @s = none\n# at world spawn\n# called by mysterious midnights base upon the break of dawn. Only runs once. Techincal function to prevent inactive expansions from running their dawn event.\n\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_enlarging_phantoms,tag=gm4_mysterious_midnights_active] run scoreboard players reset enlarging_phantoms gm4_menace_data\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/event.mcfunction",
    "content": "# @s = none\n# at world spawn\n# called by midnight menaces base if this expansion was selected. pulsed every 0.8 seconds throughout the night.\n\nexecute unless score enlarging_phantoms gm4_menace_data matches 1 run function gm4_enlarging_phantoms:initialise\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/initialise.mcfunction",
    "content": "# @s = none\n# at world spawn\n# called by event. Only runs once per enlarging phantom night.\n\n# start slow clock\nschedule function gm4_enlarging_phantoms:slow_clock 1t\n\n# initialise is done\nscoreboard players set enlarging_phantoms gm4_menace_data 1\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/set_pos.mcfunction",
    "content": "# @s = none\n# at world spawn\n# called by slow_clock\n\n# spread spawn point around a random player, in a 24 block radius\nexecute at @r[x=0,gamemode=!spectator] run spreadplayers ~ ~ 0 24 false @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point]\n\n# set Y position relative to player (20-40 blocks above the nearest player)\nexecute at @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point] store result score phantom_altitude_base gm4_menace_data run data get entity @p Pos[1]\n\nexecute store result score phantom_altitude gm4_menace_data run data get entity @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point,limit=1] UUID[0]\nscoreboard players operation phantom_altitude gm4_menace_data %= 21 gm4_menace_data\nscoreboard players add phantom_altitude gm4_menace_data 20\n\nscoreboard players operation phantom_altitude gm4_menace_data += phantom_altitude_base gm4_menace_data\n\nexecute store result entity @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point,limit=1] Pos[1] double 1 run scoreboard players get phantom_altitude gm4_menace_data\n\n# summon new phantom\nexecute as @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point] at @s run summon phantom ~ ~ ~ {Tags:[\"gm4_enlarged_phantom\"]}\n\n# set size of new phantom\nexecute as @e[tag=gm4_enlarged_phantom] run function gm4_enlarging_phantoms:set_size\n\n# reset scores\nscoreboard players reset phantom_altitude gm4_menace_data\nscoreboard players reset phantom_altitude_base gm4_menace_data\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/set_size.mcfunction",
    "content": "# @s = enlarged phantom\n# called by set_pos\n\nexecute store result score @s gm4_menace_data run data get entity @s UUID[0]\nscoreboard players operation @s gm4_menace_data %= 100 gm4_menace_data\n\n# 35% size 3, 40% size 5, 25% size 7\ndata merge entity @s[scores={gm4_menace_data=..34}] {size:3,Health:24.0f,attributes:[{id:\"minecraft:max_health\",base:24.0d},{id:\"minecraft:attack_damage\",base:5.0d}]}\ndata merge entity @s[scores={gm4_menace_data=35..74}] {size:5,Health:30.0f,attributes:[{id:\"minecraft:max_health\",base:30.0d},{id:\"minecraft:attack_damage\",base:7.0d}]}\ndata merge entity @s[scores={gm4_menace_data=75..}] {size:7,Health:40.0f,attributes:[{id:\"minecraft:max_health\",base:40.0d},{id:\"minecraft:attack_damage\",base:9.0d}]}\n\nscoreboard players reset @s gm4_menace_data\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/setup.mcfunction",
    "content": "# called upon start of a rare mysterious midnight. Used to select this expansion by chance.\n\nsummon minecraft:area_effect_cloud ~ ~ ~ {CustomName:\"gm4_enlarging_phantoms\",Tags:[\"gm4_mysterious_midnights_expansion\",\"gm4_enlarging_phantoms\"],Duration:18000,Radius:0f,custom_particle:{type:\"minecraft:block\",block_state:\"air\"}}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/slow_clock.mcfunction",
    "content": "# @s = none\n# at world spawn\n# called by event\n\n# summon potential spawn points\nsummon minecraft:area_effect_cloud 29999998 1 7134 {CustomName:\"gm4_phantom_spawn_point\",Tags:[\"gm4_phantom_spawn_point\"],Duration:1,Radius:0f,custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\n\n# randomizer (average spawn rate: 1 every 40 seconds)\nexecute store result score phantom_random_value gm4_menace_data run data get entity @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point,limit=1] UUID[0]\nscoreboard players operation phantom_random_value gm4_menace_data %= 100 gm4_menace_data\nexecute if score phantom_random_value gm4_menace_data matches 50.. if entity @a[x=0,limit=1] run function gm4_enlarging_phantoms:set_pos\n\n# kill spawn points\nkill @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point]\n\n# reset scores\nscoreboard players reset phantom_random_value gm4_menace_data\n\n# loop every 20 seconds\nexecute if score enlarging_phantoms gm4_menace_data matches 1 run schedule function gm4_enlarging_phantoms:slow_clock 20s\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_enlarging_phantoms/guidebook/enlarging_phantoms.json",
    "content": "{\n  \"id\": \"enlarging_phantoms\",\n  \"name\": \"Enlarging Phantoms\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"midnight_menaces\",\n  \"base_module\": \"mysterious_midnights\",\n  \"wiki_link\": \"https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces/Enlarging_Phantoms\",\n  \"icon\": {\n    \"id\": \"minecraft:phantom_membrane\"\n  },\n  \"criteria\": {\n    \"fight_enlarged_phantom\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:phantom\",\n              \"nbt\": \"{Tags:['gm4_enlarged_phantom']}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"fight_enlarged_phantom\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.enlarging_phantoms.description\",\n            \"fallback\": \"During an Enlarging Phantoms event, larger phantoms will spawn in the sky, regardless of insomniacs.\\n\\nLarger phantoms have more health and greater attack strength.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_icy_strays/function/event.mcfunction",
    "content": "# @s = none\n# at world spawn\n# called by midnight menaces base if this expansion was selected. pulsed every 0.8 seconds throughout the night.\n\nexecute as @e[type=minecraft:skeleton,tag=!smithed.entity,tag=!gm4_icy_stray_checked,x=0,predicate=gm4_icy_strays:stray_convert_chance,nbt={PersistenceRequired:0b}] unless data entity @s DeathLootTable at @s run function gm4_icy_strays:stray_transform\ntag @e[type=skeleton] add gm4_icy_stray_checked\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_icy_strays/function/setup.mcfunction",
    "content": "#called upon start of a rare mysterious midnight. Used to select this expansion by chance.\n\nsummon minecraft:area_effect_cloud ~ ~ ~ {CustomName:\"gm4_icy_strays\",Tags:[\"gm4_mysterious_midnights_expansion\",\"gm4_icy_strays\"],Duration:18000,Radius:0f,custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_icy_strays/function/stray_transform.mcfunction",
    "content": "# @s = skeleton to be converted into a stray\n# called by event\n\nsummon stray ~ ~ ~ {equipment:{mainhand:{id:\"minecraft:bow\",count:1}},DeathLootTable:\"gm4_icy_strays:entities/icy_stray\"}\ntp @e[type=stray,limit=1,distance=0] @s\ndata merge entity @s {DeathTime:19s,Health:0f,DeathLootTable:\"gm4:empty\"}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_icy_strays/guidebook/icy_strays.json",
    "content": "{\n  \"id\": \"icy_strays\",\n  \"name\": \"Icy Strays\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"midnight_menaces\",\n  \"base_module\": \"mysterious_midnights\",\n  \"wiki_link\": \"https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces/Icy_Strays\",\n  \"icon\": {\n    \"id\": \"minecraft:ice\"\n  },\n  \"criteria\": {\n    \"fight_icy_stray\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:stray\",\n              \"nbt\": \"{DeathLootTable:\\\"gm4_icy_strays:entities/icy_stray\\\"}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"fight_icy_stray\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.icy_strays.description\",\n            \"fallback\": \"During an Icy Strays event, half of the skeletons will spawn as strays.\\n\\nThese strays will drop ice when killed with looting.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_icy_strays/loot_table/entities/icy_stray.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"minecraft:entities/stray\"\n                }\n            ]\n        },\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:ice\",\n                    \"weight\": 1,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": 0\n                        },\n                        {\n                            \"function\": \"minecraft:enchanted_count_increase\",\n                            \"enchantment\": \"minecraft:looting\",\n                            \"count\": {\n                                \"min\": 2,\n                                \"max\": 4\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:packed_ice\",\n                    \"weight\": 1,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": -1\n                        },\n                        {\n                            \"function\": \"minecraft:enchanted_count_increase\",\n                            \"enchantment\": \"minecraft:looting\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:blue_ice\",\n                    \"weight\": 1,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": -1\n                        },\n                        {\n                            \"function\": \"minecraft:enchanted_count_increase\",\n                            \"enchantment\": \"minecraft:looting\",\n                            \"count\": {\n                                \"min\": 0,\n                                \"max\": 2\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_icy_strays/predicate/stray_convert_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.5\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_illusioner_nights/function/event.mcfunction",
    "content": "# @s = none\n# at world spawn\n# called by midnight menaces base if this expansion was selected. pulsed every 0.8 seconds throughout the night.\n\nexecute as @e[type=#gm4_illusioner_nights:illusioner_convertable,tag=!smithed.entity,tag=!gm4_mm_illusioner_checked,x=0,predicate=gm4_illusioner_nights:illusioner_convert_chance,nbt={PersistenceRequired:0b}] unless data entity @s DeathLootTable at @s run function gm4_illusioner_nights:illusioner_transform\ntag @e[type=#gm4_illusioner_nights:illusioner_convertable] add gm4_mm_illusioner_checked\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_illusioner_nights/function/illusioner_transform.mcfunction",
    "content": "# @s = skeleton, zombie, or creeper to be converted into an illusioner\n# called by event\n\nsummon illusioner ~ ~ ~ {DeathLootTable:\"gm4_illusioner_nights:entities/illusioner\",equipment:{mainhand:{id:\"minecraft:bow\",count:1}}}\ntp @e[type=illusioner,limit=1,distance=0] @s\ndata merge entity @s {DeathTime:19s,Health:0f,DeathLootTable:\"gm4:empty\"}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_illusioner_nights/function/setup.mcfunction",
    "content": "# called upon start of a rare mysterious midnight. Used to select this expansion by chance.\n\nsummon minecraft:area_effect_cloud ~ ~ ~ {CustomName:\"gm4_illusioner_nights\",Tags:[\"gm4_mysterious_midnights_expansion\",\"gm4_illusioner_nights\"],Duration:18000,Radius:0f,custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_illusioner_nights/guidebook/illusioner_nights.json",
    "content": "{\n  \"id\": \"illusioner_nights\",\n  \"name\": \"Illusioner Nights\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"midnight_menaces\",\n  \"base_module\": \"mysterious_midnights\",\n  \"wiki_link\": \"https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces/Illusioner_Nights\",\n  \"icon\": {\n    \"id\": \"minecraft:lingering_potion\",\n    \"components\": {\n      \"minecraft:potion_contents\": \"minecraft:long_invisibility\"\n    }\n  },\n  \"criteria\": {\n    \"fight_illusioner\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:illusioner\",\n              \"nbt\": \"{DeathLootTable:\\\"gm4_illusioner_nights:entities/illusioner\\\"}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"fight_illusioner\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.illusioner_nights.description\",\n            \"fallback\": \"During an Illusioner Nights event, illusioners will spawn.\\n\\nThese illusioners will drop golden carrots, and some potions when killed.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_illusioner_nights/loot_table/entities/illusioner.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:golden_carrot\",\n                    \"weight\": 1,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 0,\n                                \"max\": 3\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:enchanted_count_increase\",\n                            \"enchantment\": \"minecraft:looting\",\n                            \"count\": {\n                                \"min\": 0,\n                                \"max\": 1\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"conditions\": [\n                {\n                    \"condition\": \"random_chance_with_enchanted_bonus\",\n                    \"enchantment\": \"minecraft:looting\",\n                    \"unenchanted_chance\": 0.1,\n                    \"enchanted_chance\": {\n                      \"type\": \"minecraft:linear\",\n                      \"base\": 0.15,\n                      \"per_level_above_first\": 0.05\n                    }\n                }\n            ],\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:potion\",\n                    \"weight\": 2,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_components\",\n                            \"components\": {\n                                \"minecraft:potion_contents\": \"minecraft:long_invisibility\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:potion\",\n                    \"weight\": 3,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_components\",\n                            \"components\": {\n                                \"minecraft:potion_contents\": \"minecraft:long_night_vision\"\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:lingering_potion\",\n                    \"weight\": 1,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_components\",\n                            \"components\": {\n                                \"minecraft:custom_name\": {\"text\":\"Lingering Potion of Blindness\",\"italic\":false},\n                                \"minecraft:potion_contents\": {\n                                    \"potion\": \"minecraft:mundane\",\n                                    \"custom_effects\": [\n                                        {\n                                            \"duration\": 1200,\n                                            \"id\": \"minecraft:blindness\",\n                                            \"amplifier\": 0\n                                        }\n                                    ]\n                                }\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_illusioner_nights/predicate/illusioner_convert_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.02\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_illusioner_nights/tags/entity_type/illusioner_convertable.json",
    "content": "{\n    \"values\": [\n        \"minecraft:creeper\",\n        \"minecraft:skeleton\",\n        \"minecraft:zombie\"\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/function/event.mcfunction",
    "content": "# @s = none\n# at world spawn\n# called by midnight menaces base if this expansion was selected. pulsed every 0.8 seconds throughout the night.\n\nexecute as @e[type=#gm4_menacing_goblins:goblin_convertable,tag=!smithed.entity,tag=!gm4_goblin_checked,x=0,predicate=gm4_menacing_goblins:goblin_convert_chance,nbt={PersistenceRequired:0b}] unless data entity @s DeathLootTable at @s run function gm4_menacing_goblins:goblin_transform\ntag @e[type=#gm4_menacing_goblins:goblin_convertable] add gm4_goblin_checked\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/function/goblin_steal/check_player.mcfunction",
    "content": "# checks if nearby players have any valuables\n# @s = goblin if there are nearby players\n# located at @s\n# run from main\n\ntag @r[gamemode=!creative,gamemode=!spectator,distance=..3] add gm4_goblin_target\nexecute store result score diamond gm4_menace_data run clear @a[tag=gm4_goblin_target,limit=1,distance=..3] diamond 0\nexecute store result score iron_ingot gm4_menace_data run clear @a[tag=gm4_goblin_target,limit=1,distance=..3] iron_ingot 0\nexecute store result score gold_ingot gm4_menace_data run clear @a[tag=gm4_goblin_target,limit=1,distance=..3] gold_ingot 0\n\n# randomizer, (50% diamond, 25% iron, 20% gold attempts will fail)\nexecute if score diamond gm4_menace_data matches 1.. unless entity @s[tag=gm4_goblin_diamond_full] if predicate gm4_menacing_goblins:diamond_steal_chance run function gm4_menacing_goblins:goblin_steal/diamond\nexecute if score iron_ingot gm4_menace_data matches 1.. unless entity @s[tag=gm4_goblin_iron_full] if predicate gm4_menacing_goblins:iron_steal_chance run function gm4_menacing_goblins:goblin_steal/iron_ingot\nexecute if score gold_ingot gm4_menace_data matches 1.. unless entity @s[tag=gm4_goblin_gold_full] if predicate gm4_menacing_goblins:gold_steal_chance run function gm4_menacing_goblins:goblin_steal/gold_ingot\n\nscoreboard players reset diamond gm4_menace_data\nscoreboard players reset iron_ingot gm4_menace_data\nscoreboard players reset gold_ingot gm4_menace_data\n\ntag @a remove gm4_goblin_target\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/function/goblin_steal/diamond.mcfunction",
    "content": "# steals a diamond from the player\n# @s = goblin if there are nearby players with diamonds\n# located at @s\n# run from goblin_steal/check_player\n\n# get current diamond count\nexecute store result score count gm4_menace_data run data get entity @s equipment.feet.count\n\n# take 1 diamond from player\nclear @a[tag=gm4_goblin_target,limit=1,distance=..3] diamond 1\n\n# store diamonds at feet slot\nexecute if score count gm4_menace_data matches 0 run data modify entity @s equipment.feet set value {id:\"minecraft:diamond\",count:1}\nexecute if score count gm4_menace_data matches 1..63 if predicate gm4_menacing_goblins:store_chance store result entity @s equipment.feet.count byte 1 run scoreboard players add count gm4_menace_data 1\n\n# show that it got stolen\ndata modify entity @s equipment.offhand set value {id:\"minecraft:diamond\",count:1}\nplaysound minecraft:entity.zombie.ambient hostile @a[distance=..5] ~ ~ ~ 0.2 2\nplaysound minecraft:entity.witch.celebrate hostile @a[distance=..5] ~ ~ ~ 1 2\nplaysound minecraft:block.chain.break hostile @a[distance=..5] ~ ~ ~ 2 2\nparticle minecraft:block{block_state:\"minecraft:diamond_block\"} ~ ~ ~ 0 0 0 1 15 force\n\n# mark full inventory with tag (to prevent continuous data checks)\nexecute if score count gm4_menace_data matches 64.. run tag @s add gm4_goblin_diamond_full\n\n# clear scores\nscoreboard players reset count gm4_menace_data\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/function/goblin_steal/gold_ingot.mcfunction",
    "content": "# steals a gold ingot from the player\n# @s = goblin if there are nearby players with gold ingots\n# located at @s\n# run from goblin_steal/check_player\n\n# get current gold ingot count\nexecute store result score count gm4_menace_data run data get entity @s equipment.chest.count\n\n# take 1 gold ingot from player\nclear @a[tag=gm4_goblin_target,limit=1,distance=..3] gold_ingot 1\n\n# store gold ingots at chest slot\nexecute if score count gm4_menace_data matches 0 run data modify entity @s equipment.chest set value {id:\"minecraft:gold_ingot\",count:1}\nexecute if score count gm4_menace_data matches 1..63 if predicate gm4_menacing_goblins:store_chance store result entity @s equipment.chest.count byte 1 run scoreboard players add count gm4_menace_data 1\n\n# show that it got stolen\ndata modify entity @s equipment.offhand set value {id:\"minecraft:gold_ingot\",count:1}\nplaysound minecraft:entity.zombie.ambient hostile @a[distance=..5] ~ ~ ~ 0.2 2\nplaysound minecraft:entity.witch.celebrate hostile @a[distance=..5] ~ ~ ~ 1 2\nplaysound minecraft:block.chain.break hostile @a[distance=..5] ~ ~ ~ 2 2\nparticle minecraft:block{block_state:\"minecraft:gold_block\"} ~ ~ ~ 0 0 0 1 15 force\n\n# mark full inventory with tag (to prevent continuous data checks)\nexecute if score count gm4_menace_data matches 64.. run tag @s add gm4_goblin_gold_full\n\n# clear scores\nscoreboard players reset count gm4_menace_data\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/function/goblin_steal/iron_ingot.mcfunction",
    "content": "# steals an iron ingot from the player\n# @s = goblin if there are nearby players with iron ingots\n# located at @s\n# run from goblin_steal/check_player\n\n# get current iron ingot count\nexecute store result score count gm4_menace_data run data get entity @s equipment.feet.count\n\n# take 1 iron ingot from player\nclear @a[tag=gm4_goblin_target,limit=1,distance=..3] iron_ingot 1\n\n# store iron ingots at feet slot\nexecute if score count gm4_menace_data matches 0 run data modify entity @s equipment.feet set value {id:\"minecraft:iron_ingot\",count:1}\nexecute if score count gm4_menace_data matches 1..63 if predicate gm4_menacing_goblins:store_chance store result entity @s equipment.feet.count byte 1 run scoreboard players add count gm4_menace_data 1\n\n# show that it got stolen\ndata modify entity @s equipment.offhand set value {id:\"minecraft:iron_ingot\",count:1}\nplaysound minecraft:entity.zombie.ambient hostile @a[distance=..5] ~ ~ ~ 0.2 2\nplaysound minecraft:entity.witch.celebrate hostile @a[distance=..5] ~ ~ ~ 1 2\nplaysound minecraft:block.chain.break hostile @a[distance=..5] ~ ~ ~ 2 2\nparticle minecraft:block{block_state:\"minecraft:iron_block\"} ~ ~ ~ 0 0 0 1 15 force\n\n# mark full inventory with tag (to prevent continuous data checks)\nexecute if score count gm4_menace_data matches 64.. run tag @s add gm4_goblin_iron_full\n\n# clear scores\nscoreboard players reset count gm4_menace_data\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/function/goblin_transform.mcfunction",
    "content": "# @s = skeleton, zombie, or creeper to be converted into a goblin\n# called by event\n\nsummon zombie ~ ~ ~ {CustomName:{\"translate\":\"entity.gm4.goblin\",\"fallback\":\"Goblin§\"},CustomNameVisible:0b,Team:\"gm4_hide_name\",DeathLootTable:\"gm4_menacing_goblins:entities/goblin\",LeftHanded:1b,CanPickUpLoot:0b,Health:24f,IsBaby:1b,CanBreakDoors:0b,Tags:[\"gm4_goblin\",\"smithed.entity\"],equipment:{mainhand:{id:\"minecraft:golden_sword\",count:1},head:{id:\"minecraft:carved_pumpkin\",count:1,components:{\"minecraft:enchantments\":{\"minecraft:thorns\":3}}}},drop_chances:{mainhand:0.3F,head:0F},active_effects:[{id:'minecraft:resistance',amplifier:4b,duration:20,show_particles:1b}],attributes:[{id:\"minecraft:max_health\",base:24.0d},{id:\"minecraft:follow_range\",base:48.0d}]}\nscoreboard players set @e[type=zombie,tag=gm4_goblin,distance=0] gm4_entity_version 1\n\ntp @e[type=zombie,limit=1,distance=0] @s\ndata merge entity @s {DeathTime:19s,Health:0f,DeathLootTable:\"gm4:empty\"}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/function/main.mcfunction",
    "content": "execute as @e[type=zombie,tag=gm4_goblin] unless entity @s[tag=gm4_goblin_diamond_full,tag=gm4_goblin_iron_full,tag=gm4_goblin_gold_full] at @s if entity @a[limit=1,distance=..3] run function gm4_menacing_goblins:goblin_steal/check_player\n\nschedule function gm4_menacing_goblins:main 16t\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/function/setup.mcfunction",
    "content": "#called upon start of a rare mysterious midnight. Used to select this expansion by chance.\n\nsummon minecraft:area_effect_cloud ~ ~ ~ {CustomName:\"gm4_menacing_goblins\",Tags:[\"gm4_mysterious_midnights_expansion\",\"gm4_menacing_goblins\"],Duration:18000,Radius:0f,custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/guidebook/menacing_goblins.json",
    "content": "{\n  \"id\": \"menacing_goblins\",\n  \"name\": \"Menacing Goblins\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"midnight_menaces\",\n  \"base_module\": \"mysterious_midnights\",\n  \"wiki_link\": \"https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces/Menacing_Goblins\",\n  \"icon\": {\n    \"id\": \"minecraft:carved_pumpkin\"\n  },\n  \"criteria\": {\n    \"fight_goblin\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:zombie\",\n              \"nbt\": \"{Tags:['gm4_goblin']}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"fight_goblin\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.menacing_goblins.description\",\n            \"fallback\": \"During a Menacing Goblins event, golden sword wielding goblins will spawn.\\n\\nThese goblins have more health than normal zombies and can track enemies from a far distance.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.menacing_goblins.behavior\",\n            \"fallback\": \"Goblins wear a pumpkin with Thorns III.\\n\\nGoblins will steal diamonds, iron ingots, and gold ingots when nearby.\\n\\nWhen killed, they will drop most of the items they stole, along with some rotten flesh, iron nuggets, and golden nuggets.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/loot_table/entities/goblin.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:rotten_flesh\",\n                    \"weight\": 1,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 0,\n                                \"max\": 2\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:enchanted_count_increase\",\n                            \"enchantment\": \"minecraft:looting\",\n                            \"count\": {\n                                \"min\": 0,\n                                \"max\": 1\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"rolls\": {\n                \"min\": 1,\n                \"max\": 2\n            },\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:iron_nugget\",\n                    \"weight\": 2,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 0,\n                                \"max\": 2\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:enchanted_count_increase\",\n                            \"enchantment\": \"minecraft:looting\",\n                            \"count\": {\n                                \"min\": 0,\n                                \"max\": 1\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:gold_nugget\",\n                    \"weight\": 3,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 0,\n                                \"max\": 1\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:enchanted_count_increase\",\n                            \"enchantment\": \"minecraft:looting\",\n                            \"count\": {\n                                \"min\": 0,\n                                \"max\": 1\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/predicate/diamond_steal_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.50\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/predicate/goblin_convert_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.02\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/predicate/gold_steal_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.80\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/predicate/iron_steal_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.75\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/predicate/store_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.85\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_menacing_goblins/tags/entity_type/goblin_convertable.json",
    "content": "{\n    \"values\": [\n        \"minecraft:creeper\",\n        \"minecraft:skeleton\",\n        \"minecraft:zombie\"\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_midnight_menaces/function/active_night.mcfunction",
    "content": "# @s = none\n# at world spawn\n# run from #gm4_mysterious_midnights:active_night\n\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_slime_fests,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_slime_fests:event\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_sandy_husks,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_sandy_husks:event\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_icy_strays,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_icy_strays:event\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_enlarging_phantoms,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_enlarging_phantoms:event\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_menacing_goblins,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_menacing_goblins:event\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_illusioner_nights,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_illusioner_nights:event\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_midnight_menaces/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_reslimify dummy\nscoreboard objectives add gm4_menace_data dummy\nscoreboard players set 100 gm4_menace_data 100\nscoreboard players set 17 gm4_menace_data 17\nscoreboard players set 21 gm4_menace_data 21\nscoreboard players set 2 gm4_menace_data 2\nscoreboard objectives add gm4_entity_version dummy\nteam add gm4_hide_name\nteam modify gm4_hide_name nametagVisibility never\n\nexecute unless score midnight_menaces gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Midnight Menaces\"}\nexecute unless score midnight_menaces gm4_earliest_version < midnight_menaces gm4_modules run scoreboard players operation midnight_menaces gm4_earliest_version = midnight_menaces gm4_modules\nscoreboard players set midnight_menaces gm4_modules 1\n\nschedule function gm4_menacing_goblins:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_mysterious_midnights/tags/function/active_night.json",
    "content": "{\n    \"values\":[\n      \"gm4_midnight_menaces:active_night\"\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_mysterious_midnights/tags/function/end_pulse.json",
    "content": "{\n    \"values\":[\n      \"gm4_enlarging_phantoms:dawn_active_check\"\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_mysterious_midnights/tags/function/setup_common_expansion.json",
    "content": "{\n    \"values\":[\n      \"gm4_sandy_husks:setup\",\n      \"gm4_icy_strays:setup\"\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_mysterious_midnights/tags/function/setup_rare_expansion.json",
    "content": "{\n    \"values\":[\n      \"gm4_menacing_goblins:setup\",\n      \"gm4_illusioner_nights:setup\"\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_mysterious_midnights/tags/function/setup_uncommon_expansion.json",
    "content": "{\n    \"values\":[\n      \"gm4_enlarging_phantoms:setup\",\n      \"gm4_slime_fests:setup\"\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_nightmare_nights/tags/function/nightmare_night_expansion.json",
    "content": "{\n    \"values\":[\n      \"gm4_enlarging_phantoms:setup\",\n      \"gm4_menacing_goblins:setup\",\n      \"gm4_illusioner_nights:setup\"\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_sandy_husks/function/event.mcfunction",
    "content": "# @s = none\n# at world spawn\n# called by midnight menaces base if this expansion was selected. pulsed every 0.8 seconds throughout the night.\n\nexecute as @e[type=minecraft:zombie,tag=!smithed.entity,tag=!gm4_sandy_husk_checked,x=0,predicate=gm4_sandy_husks:husk_convert_chance,nbt={PersistenceRequired:0b}] unless data entity @s DeathLootTable at @s run function gm4_sandy_husks:husk_transform\ntag @e[type=zombie] add gm4_sandy_husk_checked\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_sandy_husks/function/husk_transform.mcfunction",
    "content": "# @s = zombie to be converted into a husk\n# called by event\n\nsummon husk ~ ~ ~ {DeathLootTable:\"gm4_sandy_husks:entities/sandy_husk\"}\ntp @e[type=husk,limit=1,distance=0] @s\ndata merge entity @s {DeathTime:19s,Health:0f,DeathLootTable:\"gm4:empty\"}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_sandy_husks/function/setup.mcfunction",
    "content": "#called upon start of a rare mysterious midnight. Used to select this expansion by chance.\n\nsummon minecraft:area_effect_cloud ~ ~ ~ {CustomName:\"gm4_sandy_husks\",Tags:[\"gm4_mysterious_midnights_expansion\",\"gm4_sandy_husks\"],Duration:18000,Radius:0f,custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_sandy_husks/guidebook/sandy_husks.json",
    "content": "{\n  \"id\": \"sandy_husks\",\n  \"name\": \"Sandy Husks\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"midnight_menaces\",\n  \"base_module\": \"mysterious_midnights\",\n  \"wiki_link\": \"https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces/Sandy_Husks\",\n  \"icon\": {\n    \"id\": \"minecraft:sand\"\n  },\n  \"criteria\": {\n    \"fight_sandy_husk\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:husk\",\n              \"nbt\": \"{DeathLootTable:\\\"gm4_sandy_husks:entities/sandy_husk\\\"}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"fight_sandy_husk\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.sandy_husks.description\",\n            \"fallback\": \"During a Sandy Husks event, half of zombies will spawn as husks.\\n\\nThese husks will drop sand when killed with looting.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_sandy_husks/loot_table/entities/sandy_husk.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"minecraft:entities/husk\"\n                }\n            ]\n        },\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:sand\",\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": 0\n                        },\n                        {\n                            \"function\": \"minecraft:enchanted_count_increase\",\n                            \"enchantment\": \"minecraft:looting\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_sandy_husks/predicate/husk_convert_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.5\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_slime_fests/function/absorb_slime_ball.mcfunction",
    "content": "# @s = slimeball item on the ground\n# at @s\n# called by spawn_slime\n\n# remove 1 from count of slimeball stack\nexecute store result score count gm4_reslimify run data get entity @s Item.count 0.99\nexecute store result entity @s Item.count byte 1 run scoreboard players get count gm4_reslimify\n# Spigot fix\nexecute if score count gm4_reslimify matches 0 run kill @s\n\n# reset timer to 0\nscoreboard players set @s gm4_reslimify 0\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_slime_fests/function/complete_merge.mcfunction",
    "content": "# @s = slime to be merged with another\n# at @s\n# called by merge_slimes\n\ndata merge entity @s {Size:0,DeathTime:19s,Health:0f,DeathLootTable:\"gm4:empty\"}\nplaysound minecraft:entity.slime.squish hostile @a[distance=..15] ~ ~ ~ .5 .8\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_slime_fests/function/event.mcfunction",
    "content": "# @s = none\n# at world spawn\n# called by midnight menaces base if this expansion was selected. pulsed every 0.8 seconds throughout the night.\n\n# resurrecting slimes\nexecute as @e[type=minecraft:item,x=0,nbt={OnGround:1b}] if items entity @s contents minecraft:slime_ball run function gm4_slime_fests:mark_slime_ball\nexecute as @e[type=minecraft:item,scores={gm4_reslimify=8..}] at @s run function gm4_slime_fests:spawn_slime\n\n# slime takeover\nexecute as @e[type=#gm4_slime_fests:slime_convertable,x=0,tag=!smithed.entity,nbt={PersistenceRequired:0b}] at @s run function gm4_slime_fests:slime_transform\n\n# merging slimes\nscoreboard players reset @e[type=minecraft:slime] gm4_menace_data\nexecute at @e[type=minecraft:slime,x=0,tag=!smithed.entity] run scoreboard players add @e[type=minecraft:slime,tag=!smithed.entity,distance=0.1..5] gm4_menace_data 1\nexecute as @e[type=minecraft:slime,tag=!gm4_merged_slime,tag=!gm4_giant_slime,scores={gm4_menace_data=1..7},limit=1] at @s if entity @e[type=minecraft:slime,distance=0.1..3,limit=1] run function gm4_slime_fests:merge_slimes\nexecute as @e[type=minecraft:slime,tag=!gm4_merged_slime,tag=!gm4_giant_slime,scores={gm4_menace_data=1..7},limit=1] at @s if entity @e[type=minecraft:slime,distance=0.1..3,limit=1] run function gm4_slime_fests:merge_slimes\nexecute as @e[type=minecraft:slime,tag=!gm4_merged_slime,tag=!gm4_giant_slime,scores={gm4_menace_data=1..7},limit=1] at @s if entity @e[type=minecraft:slime,distance=0.1..3,limit=1] run function gm4_slime_fests:merge_slimes\ntag @e[type=minecraft:slime] remove gm4_merged_slime\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_slime_fests/function/mark_slime_ball.mcfunction",
    "content": "# @s = slime_ball item on the ground\n# at world spawn\n# called by event\n\nscoreboard players add @s gm4_reslimify 1\nexecute at @s run particle minecraft:entity_effect{color:[0.0,1.0,0.1,1.0]} ~ ~ ~ 0 0 0 1 0\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_slime_fests/function/merge_slimes.mcfunction",
    "content": "# @s = slime if there are any nearby slimes\n# called by event\n\n# store size of all nearby slimes\nexecute as @e[type=minecraft:slime,tag=!smithed.entity,distance=..3] store result score @s gm4_menace_data run data get entity @s Size\n\n# choose one random slime with the same size\nexecute as @e[type=minecraft:slime,tag=!smithed.entity,distance=0.01..3] if score @s gm4_menace_data = @e[type=minecraft:slime,distance=0,limit=1] gm4_menace_data run tag @s add gm4_slime_size_match\ntag @e[type=minecraft:slime,tag=gm4_slime_size_match,limit=1,sort=random] add gm4_merged_slime\ntag @e[type=minecraft:slime,distance=..3] remove gm4_slime_size_match\n\n# kill original slime\nexecute if entity @e[type=minecraft:slime,tag=gm4_merged_slime,limit=1] run function gm4_slime_fests:complete_merge\n\n# calculations for size and health\n## size = (current_size * 2) + 1\nscoreboard players operation size gm4_menace_data = @s gm4_menace_data\nscoreboard players operation size gm4_menace_data *= 2 gm4_menace_data\nscoreboard players add size gm4_menace_data 1\n## health = (new_size + 1)^2 \nscoreboard players operation health gm4_menace_data = size gm4_menace_data\nscoreboard players add health gm4_menace_data 1\nscoreboard players operation health gm4_menace_data *= health gm4_menace_data\n\n# apply size to new merged slime\nexecute store result entity @e[type=minecraft:slime,tag=gm4_merged_slime,limit=1] Size int 1 run scoreboard players get size gm4_menace_data\nexecute if score size gm4_menace_data matches 7.. run tag @e[type=minecraft:slime,tag=gm4_merged_slime,limit=1] add gm4_giant_slime\ndata merge entity @e[type=minecraft:slime,tag=gm4_merged_slime,tag=gm4_giant_slime,limit=1] {DeathLootTable:\"gm4_slime_fests:entities/giant_slime\"}\n\n# apply health and attack damage to new merged slime\nexecute store result entity @e[type=minecraft:slime,tag=gm4_merged_slime,limit=1] attributes[{id:\"minecraft:max_health\"}].base double 1 run scoreboard players get health gm4_menace_data\nexecute store result entity @e[type=minecraft:slime,tag=gm4_merged_slime,limit=1] Health float 1 run scoreboard players get health gm4_menace_data\nexecute store result entity @e[type=minecraft:slime,tag=gm4_merged_slime,limit=1] attributes[{id:\"minecraft:attack_damage\"}].base double 1 run scoreboard players get health gm4_menace_data\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_slime_fests/function/setup.mcfunction",
    "content": "# called upon start of an uncommon mysterious midnight. Used to select this expansion by chance.\n\nsummon minecraft:area_effect_cloud ~ ~ ~ {CustomName:\"gm4_slime_fests\",Tags:[\"gm4_mysterious_midnights_expansion\",\"gm4_slime_fests\"],Duration:18000,Radius:0f,custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_slime_fests/function/slime_transform.mcfunction",
    "content": "# @s = creeper/spider to be converted into a slime\n# called by event\n\nsummon slime ~ ~ ~ {Size:0}\ntp @e[type=slime,limit=1,distance=0] @s\ndata merge entity @s {DeathTime:19s,Health:0f,DeathLootTable:\"gm4:empty\"}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_slime_fests/function/spawn_slime.mcfunction",
    "content": "# @s = slimeball item on the ground\n# at @s\n# called by event\n\nsummon slime ~ ~ ~ {Size:0,DeathLootTable:\"gm4:empty\",active_effects:[{id:'minecraft:nausea',amplifier:1,duration:30}]}\n\nplaysound block.slime_block.hit hostile @a[distance=..16] ~ ~ ~ .6 .8\nfunction gm4_slime_fests:absorb_slime_ball\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_slime_fests/guidebook/slime_fests.json",
    "content": "{\n  \"id\": \"slime_fests\",\n  \"name\": \"Slime Fests\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"midnight_menaces\",\n  \"base_module\": \"mysterious_midnights\",\n  \"wiki_link\": \"https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces/Slime_Fests\",\n  \"icon\": {\n    \"id\": \"minecraft:slime_ball\"\n  },\n  \"criteria\": {\n    \"fight_slime\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:any_of\",\n            \"terms\": [\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"type\": \"minecraft:slime\",\n                  \"type_specific\": {\n                    \"type\": \"slime\",\n                    \"size\": 0\n                  },\n                  \"nbt\": \"{DeathLootTable:\\\"minecraft:empty\\\"}\"\n                }\n              },\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"type\": \"minecraft:slime\",\n                  \"nbt\": \"{DeathLootTable:\\\"gm4_slime_fests:entities/giant_slime\\\"}\"\n                }\n              }\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"fight_slime\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.slime_fests.description\",\n            \"fallback\": \"During a Slime Fests event, Slimes will merge, naturally spawn, and reanimate from slimeballs.\\n\\nSmall slimes will spawn in dark spaces and slimeballs on the floor will turn into slimes.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.slime_fests.merging\",\n            \"fallback\": \"Two slimes of the same size will merge together to form a larger slime.\\n\\nHuge slimes can be created this way, which will drop a special loot table when killed.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_slime_fests/loot_table/entities/giant_slime.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": {\n                \"min\": 0,\n                \"max\": 1\n            },\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:diamond\",\n                    \"weight\": 1,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 0,\n                                \"max\": 1\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:emerald\",\n                    \"weight\": 9,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 0,\n                                \"max\": 2\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"rolls\": {\n                \"min\": 2,\n                \"max\": 4\n            },\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:oak_leaves\",\n                    \"weight\": 5,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 2\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:spruce_leaves\",\n                    \"weight\": 2,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 2\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:birch_leaves\",\n                    \"weight\": 4,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 2\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:jungle_leaves\",\n                    \"weight\": 2,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 2\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:acacia_leaves\",\n                    \"weight\": 2,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 2\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:dark_oak_leaves\",\n                    \"weight\": 2,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 2\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:stick\",\n                    \"weight\": 2,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:clay_ball\",\n                    \"weight\": 1,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 2\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:dirt\",\n                    \"weight\": 4,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 2\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:sugar_cane\",\n                    \"weight\": 3,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"rolls\": {\n                \"min\": 1,\n                \"max\": 4\n            },\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:iron_nugget\",\n                    \"weight\": 10,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 2\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:gold_nugget\",\n                    \"weight\": 5,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 2\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:redstone\",\n                    \"weight\": 3,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 2\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:coal\",\n                    \"weight\": 20,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:lapis_lazuli\",\n                    \"weight\": 3,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 4\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"rolls\": {\n                \"min\": 0,\n                \"max\": 2\n            },\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:cocoa_beans\",\n                    \"weight\": 1,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:wheat_seeds\",\n                    \"weight\": 5,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:melon_seeds\",\n                    \"weight\": 3,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:pumpkin_seeds\",\n                    \"weight\": 3,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:beetroot_seeds\",\n                    \"weight\": 4,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"rolls\": {\n                \"min\": 2,\n                \"max\": 4\n            },\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:bone\",\n                    \"weight\": 15,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:gunpowder\",\n                    \"weight\": 10,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:rotten_flesh\",\n                    \"weight\": 15,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:string\",\n                    \"weight\": 10,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"item\",\n                    \"name\": \"minecraft:feather\",\n                    \"weight\": 15,\n                    \"functions\": [\n                        {\n                            \"function\": \"set_count\",\n                            \"count\": {\n                                \"min\": 1,\n                                \"max\": 3\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/data/gm4_slime_fests/tags/entity_type/slime_convertable.json",
    "content": "{\n    \"values\": [\n        \"minecraft:creeper\",\n        \"minecraft:spider\"\n    ]\n}\n"
  },
  {
    "path": "gm4_midnight_menaces/translations.csv",
    "content": "key,en_us\nentity.gm4.goblin,Goblin§\ntext.gm4.guidebook.module_desc.enlarging_phantoms,Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on!\ntext.gm4.guidebook.enlarging_phantoms.description,\"During an Enlarging Phantoms event, larger phantoms will spawn in the sky, regardless of insomniacs.\\n\\nLarger phantoms have more health and greater attack strength.\"\ntext.gm4.guidebook.module_desc.icy_strays,Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on!\ntext.gm4.guidebook.icy_strays.description,\"During an Icy Strays event, half of the skeletons will spawn as strays.\\n\\nThese strays will drop ice when killed with looting.\"\ntext.gm4.guidebook.module_desc.illusioner_nights,Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on!\ntext.gm4.guidebook.illusioner_nights.description,\"During an Illusioner Nights event, illusioners will spawn.\\n\\nThese illusioners will drop golden carrots, and some potions when killed.\"\ntext.gm4.guidebook.module_desc.menacing_goblins,Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on!\ntext.gm4.guidebook.menacing_goblins.description,\"During a Menacing Goblins event, golden sword wielding goblins will spawn.\\n\\nThese goblins have more health than normal zombies and can track enemies from a far distance.\"\ntext.gm4.guidebook.menacing_goblins.behavior,\"Goblins wear a pumpkin with Thorns III.\\n\\nGoblins will steal diamonds, iron ingots, and gold ingots when nearby.\\n\\nWhen killed, they will drop most of the items they stole, along with some rotten flesh, iron nuggets, and golden nuggets.\"\ntext.gm4.guidebook.module_desc.sandy_husks,Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on!\ntext.gm4.guidebook.sandy_husks.description,\"During a Sandy Husks event, half of zombies will spawn as husks.\\n\\nThese husks will drop sand when killed with looting.\"\ntext.gm4.guidebook.module_desc.slime_fests,Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on!\ntext.gm4.guidebook.slime_fests.description,\"During a Slime Fests event, Slimes will merge, naturally spawn, and reanimate from slimeballs.\\n\\nSmall slimes will spawn in dark spaces and slimeballs on the floor will turn into slimes.\"\ntext.gm4.guidebook.slime_fests.merging,\"Two slimes of the same size will merge together to form a larger slime.\\n\\nHuge slimes can be created this way, which will drop a special loot table when killed.\"\n"
  },
  {
    "path": "gm4_monsters_unbound/README.md",
    "content": "# Monsters Unbound<!--$headerTitle--><!--$pmc:delete-->\n\nUse special weapon and armour modifiers to defend against mobs that grow ever stronger!<!--$pmc:headerSize-->\n\n<img src=\"images/monsters_unbound.png\" alt=\"Spore Zombies in Lush Caves\" height=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- The longer you stay alive the stronger mobs will become.\n- Different biomes grant special buffs to mobs that spawn in them, creating bigger Slimes or Spore Zombies that keep regrowing!\n- Weaker Phantoms that take damage if they try to fly into water, as they deserve.\n- Mobs will drop new Modified armour and weapons. These come with special attributes that allow you to customize your gear!\n- Modifiers range from a ramping speed boost to a loyal immortal dog to fight by your side. Or a piece of armour that teleports you randomly, if that's what you like.\n\nA full list of all modifiers to mobs, weapons and armor can be found at the [Wiki](https://wiki.gm4.co/Monsters_Unbound).\n"
  },
  {
    "path": "gm4_monsters_unbound/assets/gm4_monsters_unbound/models/item/elite_headwear/glacial.json",
    "content": "{\n\t\"textures\": {\n\t\t\"0\": \"gm4_monsters_unbound:item/elite_headwear/glacial\",\n\t\t\"particle\": \"gm4_monsters_unbound:item/elite_headwear/glacial\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [3, 1, 8],\n\t\t\t\"to\": [8, 15, 8],\n\t\t\t\"rotation\": {\"angle\": 45, \"axis\": \"z\", \"origin\": [5.5, 4, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 5, 14], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 5, 14], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [8.5, 1.5, 7],\n\t\t\t\"to\": [8.5, 6.5, 21],\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"x\", \"origin\": [8.5, 4, 10]},\n\t\t\t\"faces\": {\n\t\t\t\t\"east\": {\"uv\": [0, 0, 5, 14], \"rotation\": 270, \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 5, 14], \"rotation\": 90, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [6, 4, 7],\n\t\t\t\"to\": [11, 4, 21],\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"x\", \"origin\": [8.5, 4, 10]},\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [0, 0, 5, 14], \"rotation\": 180, \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 5, 14], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [9.5, 4, 2.5],\n\t\t\t\"to\": [9.5, 18, 7.5],\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"z\", \"origin\": [9.5, 7, 5]},\n\t\t\t\"faces\": {\n\t\t\t\t\"east\": {\"uv\": [0, 0, 5, 14], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 5, 14], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [7, 4, 5],\n\t\t\t\"to\": [12, 18, 5],\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"z\", \"origin\": [9.5, 7, 5]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 5, 14], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 5, 14], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [7, 2, -3.675],\n\t\t\t\"to\": [12, 2, 10.325],\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"y\", \"origin\": [9.5, 2, 7.325]},\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [0, 0, 5, 14], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 5, 14], \"rotation\": 180, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [9.5, -0.5, -3.675],\n\t\t\t\"to\": [9.5, 4.5, 10.325],\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"y\", \"origin\": [9.5, 2, 7.325]},\n\t\t\t\"faces\": {\n\t\t\t\t\"east\": {\"uv\": [0, 0, 5, 14], \"rotation\": 90, \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 5, 14], \"rotation\": 270, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [5.5, 1, 5.5],\n\t\t\t\"to\": [5.5, 15, 10.5],\n\t\t\t\"rotation\": {\"angle\": 45, \"axis\": \"z\", \"origin\": [5.5, 4, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"east\": {\"uv\": [0, 0, 5, 14], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 5, 14], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [8.75, 5, -2.75],\n\t\t\t\"to\": [11.75, 5, 6.25],\n\t\t\t\"rotation\": {\"angle\": 22.5, \"axis\": \"x\", \"origin\": [10.25, 5, 4.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [5, 0, 8, 9], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [5, 0, 8, 9], \"rotation\": 180, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [-2.75, 1.5, 7.25],\n\t\t\t\"to\": [6.25, 4.5, 7.25],\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"y\", \"origin\": [4.25, 3, 7.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [5, 0, 8, 9], \"rotation\": 90, \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [5, 0, 8, 9], \"rotation\": 270, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [-2.75, 3, 5.75],\n\t\t\t\"to\": [6.25, 3, 8.75],\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"y\", \"origin\": [4.25, 3, 7.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [5, 0, 8, 9], \"rotation\": 270, \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [5, 0, 8, 9], \"rotation\": 270, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [9.25, 3, 5.75],\n\t\t\t\"to\": [18.25, 3, 8.75],\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"z\", \"origin\": [11.25, 3, 7.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [5, 0, 8, 9], \"rotation\": 90, \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [5, 0, 8, 9], \"rotation\": 90, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [9.25, 0.5, 7.25],\n\t\t\t\"to\": [18.25, 3.5, 7.25],\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"z\", \"origin\": [11.25, 2, 7.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [5, 0, 8, 9], \"rotation\": 270, \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [5, 0, 8, 9], \"rotation\": 90, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [3.75, 2, 10.25],\n\t\t\t\"to\": [6.75, 2, 19.25],\n\t\t\t\"rotation\": {\"angle\": -45, \"axis\": \"y\", \"origin\": [5.25, 2, 12.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [5, 0, 8, 9], \"rotation\": 180, \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [5, 0, 8, 9], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [5.25, 0.5, 10.25],\n\t\t\t\"to\": [5.25, 3.5, 19.25],\n\t\t\t\"rotation\": {\"angle\": -45, \"axis\": \"y\", \"origin\": [5.25, 2, 12.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"east\": {\"uv\": [5, 0, 8, 9], \"rotation\": 270, \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [5, 0, 8, 9], \"rotation\": 90, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [10.75, 2, 7.25],\n\t\t\t\"to\": [13.75, 2, 16.25],\n\t\t\t\"rotation\": {\"angle\": 45, \"axis\": \"y\", \"origin\": [12.25, 2, 9.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [5, 0, 8, 9], \"rotation\": 180, \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [5, 0, 8, 9], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [12.25, 0.5, 7.25],\n\t\t\t\"to\": [12.25, 3.5, 16.25],\n\t\t\t\"rotation\": {\"angle\": 45, \"axis\": \"y\", \"origin\": [12.25, 2, 9.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"east\": {\"uv\": [5, 0, 8, 9], \"rotation\": 270, \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [5, 0, 8, 9], \"rotation\": 90, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [10.25, 3.5, -2.75],\n\t\t\t\"to\": [10.25, 6.5, 6.25],\n\t\t\t\"rotation\": {\"angle\": 22.5, \"axis\": \"x\", \"origin\": [10.25, 5, 4.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"east\": {\"uv\": [5, 0, 8, 9], \"rotation\": 90, \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [5, 0, 8, 9], \"rotation\": 270, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [8.25, 4, 8.75],\n\t\t\t\"to\": [23.25, 4, 11.75],\n\t\t\t\"rotation\": {\"angle\": 22.5, \"axis\": \"z\", \"origin\": [12.25, 4, 10.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [9, 0, 12, 15], \"rotation\": 90, \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [9, 0, 12, 15], \"rotation\": 90, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [4.75, 5, 9.25],\n\t\t\t\"to\": [7.75, 20, 9.25],\n\t\t\t\"rotation\": {\"angle\": 22.5, \"axis\": \"z\", \"origin\": [6.25, 9, 9.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [9, 0, 12, 15], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [5, 0, 8, 9], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [6.25, 5, 7.75],\n\t\t\t\"to\": [6.25, 20, 10.75],\n\t\t\t\"rotation\": {\"angle\": 22.5, \"axis\": \"z\", \"origin\": [6.25, 9, 9.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"east\": {\"uv\": [9, 0, 12, 15], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [9, 0, 12, 15], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [8.75, 3, 10.25],\n\t\t\t\"to\": [11.75, 18, 10.25],\n\t\t\t\"rotation\": {\"angle\": -45, \"axis\": \"z\", \"origin\": [10.25, 7, 10.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [9, 0, 12, 15], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [5, 0, 8, 9], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [10.25, 3, 8.75],\n\t\t\t\"to\": [10.25, 18, 11.75],\n\t\t\t\"rotation\": {\"angle\": -45, \"axis\": \"z\", \"origin\": [10.25, 7, 10.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"east\": {\"uv\": [9, 0, 12, 15], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [9, 0, 12, 15], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [8.25, 2.5, 10.25],\n\t\t\t\"to\": [23.25, 5.5, 10.25],\n\t\t\t\"rotation\": {\"angle\": 22.5, \"axis\": \"z\", \"origin\": [12.25, 4, 10.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [9, 0, 12, 15], \"rotation\": 270, \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [5, 0, 8, 9], \"rotation\": 90, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [8.75, 2, 6.25],\n\t\t\t\"to\": [11.75, 2, 21.25],\n\t\t\t\"rotation\": {\"angle\": 22.5, \"axis\": \"x\", \"origin\": [10.25, 2, 10.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [9, 0, 12, 15], \"rotation\": 180, \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [9, 0, 12, 15], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [10.25, 0.5, 6.25],\n\t\t\t\"to\": [10.25, 3.5, 21.25],\n\t\t\t\"rotation\": {\"angle\": 22.5, \"axis\": \"x\", \"origin\": [10.25, 2, 10.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"east\": {\"uv\": [9, 0, 12, 15], \"rotation\": 270, \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [5, 0, 8, 9], \"rotation\": 90, \"texture\": \"#0\"}\n\t\t\t}\n\t\t}\n\t],\n\t\"display\": {\n\t\t\"thirdperson_righthand\": {\n\t\t\t\"rotation\": [75, 45, 0],\n\t\t\t\"translation\": [0, 2.5, 0],\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\n\t\t},\n\t\t\"thirdperson_lefthand\": {\n\t\t\t\"rotation\": [75, 45, 0],\n\t\t\t\"translation\": [0, 2.5, 0],\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\n\t\t},\n\t\t\"firstperson_righthand\": {\n\t\t\t\"rotation\": [0, 45, 0],\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\n\t\t},\n\t\t\"firstperson_lefthand\": {\n\t\t\t\"rotation\": [0, 225, 0],\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\n\t\t},\n\t\t\"ground\": {\n\t\t\t\"translation\": [0, 3, 0],\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\n\t\t},\n\t\t\"gui\": {\n\t\t\t\"rotation\": [30, 225, 0],\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\n\t\t},\n\t\t\"head\": {\n\t\t\t\"rotation\": [0, -22.5, 0],\n\t\t\t\"translation\": [0, 6.45, 0],\n\t\t\t\"scale\": [1.61, 1.61, 1.61]\n\t\t},\n\t\t\"fixed\": {\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/assets/gm4_monsters_unbound/models/item/elite_headwear/mending.json",
    "content": "{\n\t\"textures\": {\n\t\t\"0\": \"gm4_monsters_unbound:item/elite_headwear/mending\",\n\t\t\"particle\": \"gm4_monsters_unbound:item/elite_headwear/mending\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [4, 0, 3.5],\n\t\t\t\"to\": [12, 8, 3.5],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [4, 0, 3.5]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 4, 4], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 0, 4], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 4, 4], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 0, 4], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [4, 0, 0, 0], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [4, 0, 0, 0], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [4, 7, 7],\n\t\t\t\"to\": [6, 12, 8],\n\t\t\t\"rotation\": {\"angle\": 22.5, \"axis\": \"z\", \"origin\": [4, 8, 7]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [1, 5.5, 2, 8], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [1, 5.5, 1.5, 8], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [1, 5.5, 2, 8], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [1, 5.5, 1.5, 8], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [4, 4.5, 3, 4], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [6, 2.5, 5, 3], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [11.60685, 14.31283, 7],\n\t\t\t\"to\": [12.60685, 16.31283, 8],\n\t\t\t\"rotation\": {\"angle\": 22.5, \"axis\": \"z\", \"origin\": [11.60685, 14.31283, 7]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0.5, 4, 1, 5], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [0.5, 4, 1, 5], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [0.5, 4, 1, 5], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0.5, 4, 1, 5], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [3.5, 5, 3, 4.5], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [4.5, 2.5, 4, 3], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [11.53073, 11.69552, 7],\n\t\t\t\"to\": [12.53073, 14.69552, 8],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [11.53073, 11.69552, 7]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0.5, 4.5, 1, 6], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [0.5, 4.5, 1, 6], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [0.5, 4.5, 1, 6], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0.5, 4.5, 1, 6], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [3, 5.5, 2.5, 5], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [5.5, 3, 5, 3.5], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [10, 7, 7],\n\t\t\t\"to\": [12, 12, 8],\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"z\", \"origin\": [12, 8, 7]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 5.5, 1, 8], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [0.5, 5.5, 1, 8], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [0, 5.5, 1, 8], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0.5, 5.5, 1, 8], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [3, 4.5, 2, 4], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [5, 3, 4, 3.5], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [3.46927, 11.69552, 7],\n\t\t\t\"to\": [4.46927, 14.69552, 8],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"z\", \"origin\": [4.46927, 11.69552, 7]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [1, 4.5, 1.5, 6], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [1, 4.5, 1.5, 6], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [1, 4.5, 1.5, 6], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [1, 4.5, 1.5, 6], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [3.5, 5.5, 3, 5], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [6, 3, 5.5, 3.5], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [3.39315, 14.31283, 7],\n\t\t\t\"to\": [4.39315, 16.31283, 8],\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"z\", \"origin\": [4.39315, 14.31283, 7]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [1, 4, 1.5, 5], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [1, 4, 1.5, 5], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [1, 4, 1.5, 5], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [1, 4, 1.5, 5], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [3, 5, 2.5, 4.5], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [5, 2.5, 4.5, 3], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [6.5, 8, 6.5],\n\t\t\t\"to\": [9.5, 13, 7.5],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [7.5, 8, 6.5]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [4, 0, 5.5, 2.5], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [4, 0, 4.5, 2.5], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [4, 0, 5.5, 2.5], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [5, 0, 5.5, 2.5], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [5.5, 0.5, 4, 0], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [5.5, 2, 4, 2.5], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [4, 10.5, 7.25],\n\t\t\t\"to\": [5, 14.5, 7.25],\n\t\t\t\"rotation\": {\"angle\": 45, \"axis\": \"z\", \"origin\": [4, 14.5, 7.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [4.5, 3.5, 5, 5.5], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 0, 2], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [4.5, 3.5, 5, 5.5], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 0, 2], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 0.5, 0], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 0.5, 0], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [11, 10.5, 7.25],\n\t\t\t\"to\": [12, 14.5, 7.25],\n\t\t\t\"rotation\": {\"angle\": -45, \"axis\": \"z\", \"origin\": [12, 14.5, 7.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [5.5, 3.5, 5, 5.5], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 0, 2], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [5.5, 3.5, 5, 5.5], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 0, 2], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [0.5, 0, 0, 0], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [0.5, 0, 0, 0], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [8, 10.5, 7.25],\n\t\t\t\"to\": [12, 11.5, 7.25],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"z\", \"origin\": [12, 10.5, 7.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [3, 5.5, 3.5, 7.5], \"rotation\": 270, \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [0.5, 0, 1, 0], \"rotation\": 90, \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [3, 5.5, 3.5, 7.5], \"rotation\": 90, \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0.5, 0, 1, 0], \"rotation\": 90, \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 0, 2], \"rotation\": 90, \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 0, 2], \"rotation\": 90, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [4, 10.5, 7.25],\n\t\t\t\"to\": [8, 11.5, 7.25],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [4, 10.5, 7.25]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2.5, 7.5, 3, 5.5], \"rotation\": 270, \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [0.5, 0, 1, 0], \"rotation\": 90, \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [2.5, 7.5, 3, 5.5], \"rotation\": 90, \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0.5, 0, 1, 0], \"rotation\": 90, \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [0, 2, 0, 0], \"rotation\": 90, \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [0, 2, 0, 0], \"rotation\": 90, \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [3.15224, 1, 4.26537],\n\t\t\t\"to\": [4.15224, 2, 4.26537],\n\t\t\t\"rotation\": {\"angle\": 22.5, \"axis\": \"y\", \"origin\": [2.15224, 1, 4.26537]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [3, 2.5, 3.5, 3], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 0, 1], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [2.5, 2.5, 3, 3], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 0, 1], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 1, 0], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 1, 0], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [11.84776, 4, 4.26537],\n\t\t\t\"to\": [12.84776, 5, 4.26537],\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"y\", \"origin\": [13.84776, 4, 4.26537]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [3.5, 2.5, 3, 3], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 0, 1], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [3, 2.5, 2.5, 3], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 0, 1], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [1, 0, 0, 0], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [1, 0, 0, 0], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [1.66191, 1, 5.2969],\n\t\t\t\"to\": [3.66191, 3, 5.2969],\n\t\t\t\"rotation\": {\"angle\": 45, \"axis\": \"y\", \"origin\": [1.66191, 1, 5.2969]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [3.5, 5.5, 4.5, 6.5], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 0, 2], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [4.5, 5.5, 5.5, 6.5], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 0, 2], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 2, 0], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 2, 0], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [12.33809, 4, 5.2969],\n\t\t\t\"to\": [14.33809, 6, 5.2969],\n\t\t\t\"rotation\": {\"angle\": -45, \"axis\": \"y\", \"origin\": [14.33809, 4, 5.2969]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [4.5, 5.5, 3.5, 6.5], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 0, 2], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [5.5, 5.5, 4.5, 6.5], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 0, 2], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [2, 0, 0, 0], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [2, 0, 0, 0], \"texture\": \"#0\"}\n\t\t\t}\n\t\t}\n\t],\n\t\"display\": {\n\t\t\"thirdperson_righthand\": {\n\t\t\t\"rotation\": [75, 45, 0],\n\t\t\t\"translation\": [0, 2.5, 0],\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\n\t\t},\n\t\t\"thirdperson_lefthand\": {\n\t\t\t\"rotation\": [75, 45, 0],\n\t\t\t\"translation\": [0, 2.5, 0],\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\n\t\t},\n\t\t\"firstperson_righthand\": {\n\t\t\t\"rotation\": [0, 45, 0],\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\n\t\t},\n\t\t\"firstperson_lefthand\": {\n\t\t\t\"rotation\": [0, 225, 0],\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\n\t\t},\n\t\t\"ground\": {\n\t\t\t\"translation\": [0, 3, 0],\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\n\t\t},\n\t\t\"gui\": {\n\t\t\t\"rotation\": [30, 225, 0],\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\n\t\t},\n\t\t\"head\": {\n\t\t\t\"translation\": [0, 6.45, 0],\n\t\t\t\"scale\": [1.61, 1.61, 1.61]\n\t\t},\n\t\t\"fixed\": {\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/assets/gm4_monsters_unbound/models/item/elite_headwear/pearlescent.json",
    "content": "{\n\t\"textures\": {\n\t\t\"0\": \"gm4_monsters_unbound:item/elite_headwear/pearlescent\",\n\t\t\"particle\": \"gm4_monsters_unbound:item/elite_headwear/pearlescent\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [8.5, 2, 3],\n\t\t\t\"to\": [11.5, 5, 4],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [3.5, -3, -4]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2, 2, 5, 5], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [0, 2, 2, 5], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [12, 2, 15, 5], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [5, 2, 7, 5], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [5, 2, 2, 0], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [5, 7, 2, 5], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [8.25, 1.75, 2.475],\n\t\t\t\"to\": [11.75, 5.25, 3.475],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [3.5, -3, -4.525]},\n\t\t\t\"faces\": {\n\t\t\t\t\"east\": {\"uv\": [7, 2, 8, 5], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [11, 2, 8, 5], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [11, 2, 12, 5], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [11, 1, 8, 2], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [11, 5, 8, 6], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [11.75, 5.25, 3.475],\n\t\t\t\"to\": [8.25, 1.75, 2.475],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [7, 0.5, -3.025]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [11, 5, 8, 2], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [11, 5, 12, 2], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [7, 5, 8, 2], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [8, 5, 11, 6], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [8, 1, 11, 2], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [3.5, 2.5, 3.5],\n\t\t\t\"to\": [12.5, 4.5, 12.5],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [4, 3, 4]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 7, 8, 9], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [8, 9, 0, 11], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [0, 11, 8, 13], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [0, 9, 8, 11], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [12.5, 4.5, 12.5],\n\t\t\t\"to\": [3.5, 2.5, 3.5],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [12, 4, 12]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [8, 13, 0, 11], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [8, 11, 0, 9], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [8, 9, 0, 7], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [8, 11, 0, 9], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [4.5, 2, 3],\n\t\t\t\"to\": [7.5, 5, 4],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [12.5, -3, -4]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [5, 2, 2, 5], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [7, 2, 5, 5], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [15, 2, 12, 5], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [2, 2, 0, 5], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [2, 2, 5, 0], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [2, 7, 5, 5], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [7.75, 5.25, 3.475],\n\t\t\t\"to\": [4.25, 1.75, 2.475],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [9, 0.5, -3.025]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [8, 5, 11, 2], \"texture\": \"#0\"},\n\t\t\t\t\"east\": {\"uv\": [8, 5, 7, 2], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [12, 5, 11, 2], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [11, 5, 8, 6], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [11, 1, 8, 2], \"texture\": \"#0\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [4.25, 1.75, 2.475],\n\t\t\t\"to\": [7.75, 5.25, 3.475],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [12.5, -3, -4.525]},\n\t\t\t\"faces\": {\n\t\t\t\t\"east\": {\"uv\": [12, 2, 11, 5], \"texture\": \"#0\"},\n\t\t\t\t\"south\": {\"uv\": [8, 2, 11, 5], \"texture\": \"#0\"},\n\t\t\t\t\"west\": {\"uv\": [8, 2, 7, 5], \"texture\": \"#0\"},\n\t\t\t\t\"up\": {\"uv\": [8, 1, 11, 2], \"texture\": \"#0\"},\n\t\t\t\t\"down\": {\"uv\": [8, 5, 11, 6], \"texture\": \"#0\"}\n\t\t\t}\n\t\t}\n\t],\n\t\"display\": {\n\t\t\"thirdperson_righthand\": {\n\t\t\t\"rotation\": [75, 45, 0],\n\t\t\t\"translation\": [0, 2.5, 0],\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\n\t\t},\n\t\t\"thirdperson_lefthand\": {\n\t\t\t\"rotation\": [75, 45, 0],\n\t\t\t\"translation\": [0, 2.5, 0],\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\n\t\t},\n\t\t\"firstperson_righthand\": {\n\t\t\t\"rotation\": [0, 45, 0],\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\n\t\t},\n\t\t\"firstperson_lefthand\": {\n\t\t\t\"rotation\": [0, 225, 0],\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\n\t\t},\n\t\t\"ground\": {\n\t\t\t\"translation\": [0, 3, 0],\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\n\t\t},\n\t\t\"gui\": {\n\t\t\t\"rotation\": [30, 225, 0],\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\n\t\t},\n\t\t\"head\": {\n\t\t\t\"translation\": [0, 6.45, 0],\n\t\t\t\"scale\": [1.61, 1.61, 1.61]\n\t\t},\n\t\t\"fixed\": {\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/assets/gm4_monsters_unbound/models/item/spore/cherry.json",
    "content": "{\n\t\"textures\": {\n\t\t\"1\": \"gm4_monsters_unbound:item/spore/cherry\",\n\t\t\"particle\": \"gm4_monsters_unbound:item/spore/cherry\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [3.5, -0.5, 3.5],\n\t\t\t\"to\": [12.5, 8.5, 12.5],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [5, 6, 5]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [4, 4, 8, 8], \"texture\": \"#1\"},\n\t\t\t\t\"east\": {\"uv\": [0, 4, 4, 8], \"texture\": \"#1\"},\n\t\t\t\t\"south\": {\"uv\": [12, 4, 16, 8], \"texture\": \"#1\"},\n\t\t\t\t\"west\": {\"uv\": [8, 4, 12, 8], \"texture\": \"#1\"},\n\t\t\t\t\"up\": {\"uv\": [4, 0, 8, 4], \"texture\": \"#1\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [12.5, 8.5, 12.5],\n\t\t\t\"to\": [3.5, -0.5, 3.5],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [13, 14, 13]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [12, 8, 16, 4], \"texture\": \"#1\"},\n\t\t\t\t\"east\": {\"uv\": [8, 8, 12, 4], \"texture\": \"#1\"},\n\t\t\t\t\"south\": {\"uv\": [4, 8, 8, 4], \"texture\": \"#1\"},\n\t\t\t\t\"west\": {\"uv\": [0, 8, 4, 4], \"texture\": \"#1\"},\n\t\t\t\t\"down\": {\"uv\": [8, 4, 4, 0], \"texture\": \"#1\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [3, -1, 3],\n\t\t\t\"to\": [13, 9, 13],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [5, 6, 5]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [4, 12, 8, 16], \"texture\": \"#1\"},\n\t\t\t\t\"east\": {\"uv\": [0, 12, 4, 16], \"texture\": \"#1\"},\n\t\t\t\t\"south\": {\"uv\": [12, 12, 16, 16], \"texture\": \"#1\"},\n\t\t\t\t\"west\": {\"uv\": [8, 12, 12, 16], \"texture\": \"#1\"},\n\t\t\t\t\"up\": {\"uv\": [4, 8, 8, 12], \"texture\": \"#1\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [13, 9, 13],\n\t\t\t\"to\": [3, -1, 3],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [13, 14, 13]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [12, 16, 16, 12], \"texture\": \"#1\"},\n\t\t\t\t\"east\": {\"uv\": [8, 16, 12, 12], \"texture\": \"#1\"},\n\t\t\t\t\"south\": {\"uv\": [4, 16, 8, 12], \"texture\": \"#1\"},\n\t\t\t\t\"west\": {\"uv\": [0, 16, 4, 12], \"texture\": \"#1\"},\n\t\t\t\t\"down\": {\"uv\": [8, 12, 4, 8], \"texture\": \"#1\"}\n\t\t\t}\n\t\t}\n\t],\n\t\"display\": {\n\t\t\"thirdperson_righthand\": {\n\t\t\t\"rotation\": [75, 45, 0],\n\t\t\t\"translation\": [0, 2.5, 0],\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\n\t\t},\n\t\t\"thirdperson_lefthand\": {\n\t\t\t\"rotation\": [75, 45, 0],\n\t\t\t\"translation\": [0, 2.5, 0],\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\n\t\t},\n\t\t\"firstperson_righthand\": {\n\t\t\t\"rotation\": [0, 45, 0],\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\n\t\t},\n\t\t\"firstperson_lefthand\": {\n\t\t\t\"rotation\": [0, 225, 0],\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\n\t\t},\n\t\t\"ground\": {\n\t\t\t\"translation\": [0, 3, 0],\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\n\t\t},\n\t\t\"gui\": {\n\t\t\t\"rotation\": [30, 225, 0],\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\n\t\t},\n\t\t\"head\": {\n\t\t\t\"translation\": [0, 6.45, 0],\n\t\t\t\"scale\": [1.61, 1.61, 1.61]\n\t\t},\n\t\t\"fixed\": {\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/assets/gm4_monsters_unbound/models/item/spore/default.json",
    "content": "{\n\t\"textures\": {\n\t\t\"1\": \"gm4_monsters_unbound:item/spore/default\",\n\t\t\"particle\": \"gm4_monsters_unbound:item/spore/default\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [3.5, -0.5, 3.5],\n\t\t\t\"to\": [12.5, 8.5, 12.5],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [5, 6, 5]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [4, 4, 8, 8], \"texture\": \"#1\"},\n\t\t\t\t\"east\": {\"uv\": [0, 4, 4, 8], \"texture\": \"#1\"},\n\t\t\t\t\"south\": {\"uv\": [12, 4, 16, 8], \"texture\": \"#1\"},\n\t\t\t\t\"west\": {\"uv\": [8, 4, 12, 8], \"texture\": \"#1\"},\n\t\t\t\t\"up\": {\"uv\": [4, 0, 8, 4], \"texture\": \"#1\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [12.5, 8.5, 12.5],\n\t\t\t\"to\": [3.5, -0.5, 3.5],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [13, 14, 13]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [12, 8, 16, 4], \"texture\": \"#1\"},\n\t\t\t\t\"east\": {\"uv\": [8, 8, 12, 4], \"texture\": \"#1\"},\n\t\t\t\t\"south\": {\"uv\": [4, 8, 8, 4], \"texture\": \"#1\"},\n\t\t\t\t\"west\": {\"uv\": [0, 8, 4, 4], \"texture\": \"#1\"},\n\t\t\t\t\"down\": {\"uv\": [8, 4, 4, 0], \"texture\": \"#1\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [3, -1, 3],\n\t\t\t\"to\": [13, 9, 13],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [5, 6, 5]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [4, 12, 8, 16], \"texture\": \"#1\"},\n\t\t\t\t\"east\": {\"uv\": [0, 12, 4, 16], \"texture\": \"#1\"},\n\t\t\t\t\"south\": {\"uv\": [12, 12, 16, 16], \"texture\": \"#1\"},\n\t\t\t\t\"west\": {\"uv\": [8, 12, 12, 16], \"texture\": \"#1\"},\n\t\t\t\t\"up\": {\"uv\": [4, 8, 8, 12], \"texture\": \"#1\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [13, 9, 13],\n\t\t\t\"to\": [3, -1, 3],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [13, 14, 13]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [12, 16, 16, 12], \"texture\": \"#1\"},\n\t\t\t\t\"east\": {\"uv\": [8, 16, 12, 12], \"texture\": \"#1\"},\n\t\t\t\t\"south\": {\"uv\": [4, 16, 8, 12], \"texture\": \"#1\"},\n\t\t\t\t\"west\": {\"uv\": [0, 16, 4, 12], \"texture\": \"#1\"},\n\t\t\t\t\"down\": {\"uv\": [8, 12, 4, 8], \"texture\": \"#1\"}\n\t\t\t}\n\t\t}\n\t],\n\t\"display\": {\n\t\t\"thirdperson_righthand\": {\n\t\t\t\"rotation\": [75, 45, 0],\n\t\t\t\"translation\": [0, 2.5, 0],\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\n\t\t},\n\t\t\"thirdperson_lefthand\": {\n\t\t\t\"rotation\": [75, 45, 0],\n\t\t\t\"translation\": [0, 2.5, 0],\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\n\t\t},\n\t\t\"firstperson_righthand\": {\n\t\t\t\"rotation\": [0, 45, 0],\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\n\t\t},\n\t\t\"firstperson_lefthand\": {\n\t\t\t\"rotation\": [0, 225, 0],\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\n\t\t},\n\t\t\"ground\": {\n\t\t\t\"translation\": [0, 3, 0],\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\n\t\t},\n\t\t\"gui\": {\n\t\t\t\"rotation\": [30, 225, 0],\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\n\t\t},\n\t\t\"head\": {\n\t\t\t\"translation\": [0, 6.45, 0],\n\t\t\t\"scale\": [1.61, 1.61, 1.61]\n\t\t},\n\t\t\"fixed\": {\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/assets/gm4_monsters_unbound/models/item/spore/flowering.json",
    "content": "{\n\t\"textures\": {\n\t\t\"1\": \"gm4_monsters_unbound:item/spore/flowering\",\n\t\t\"particle\": \"gm4_monsters_unbound:item/spore/flowering\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [3.5, -0.5, 3.5],\n\t\t\t\"to\": [12.5, 8.5, 12.5],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [5, 6, 5]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [4, 4, 8, 8], \"texture\": \"#1\"},\n\t\t\t\t\"east\": {\"uv\": [0, 4, 4, 8], \"texture\": \"#1\"},\n\t\t\t\t\"south\": {\"uv\": [12, 4, 16, 8], \"texture\": \"#1\"},\n\t\t\t\t\"west\": {\"uv\": [8, 4, 12, 8], \"texture\": \"#1\"},\n\t\t\t\t\"up\": {\"uv\": [4, 0, 8, 4], \"texture\": \"#1\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [12.5, 8.5, 12.5],\n\t\t\t\"to\": [3.5, -0.5, 3.5],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [13, 14, 13]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [12, 8, 16, 4], \"texture\": \"#1\"},\n\t\t\t\t\"east\": {\"uv\": [8, 8, 12, 4], \"texture\": \"#1\"},\n\t\t\t\t\"south\": {\"uv\": [4, 8, 8, 4], \"texture\": \"#1\"},\n\t\t\t\t\"west\": {\"uv\": [0, 8, 4, 4], \"texture\": \"#1\"},\n\t\t\t\t\"down\": {\"uv\": [8, 4, 4, 0], \"texture\": \"#1\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [3, -1, 3],\n\t\t\t\"to\": [13, 9, 13],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [5, 6, 5]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [4, 12, 8, 16], \"texture\": \"#1\"},\n\t\t\t\t\"east\": {\"uv\": [0, 12, 4, 16], \"texture\": \"#1\"},\n\t\t\t\t\"south\": {\"uv\": [12, 12, 16, 16], \"texture\": \"#1\"},\n\t\t\t\t\"west\": {\"uv\": [8, 12, 12, 16], \"texture\": \"#1\"},\n\t\t\t\t\"up\": {\"uv\": [4, 8, 8, 12], \"texture\": \"#1\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [13, 9, 13],\n\t\t\t\"to\": [3, -1, 3],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [13, 14, 13]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [12, 16, 16, 12], \"texture\": \"#1\"},\n\t\t\t\t\"east\": {\"uv\": [8, 16, 12, 12], \"texture\": \"#1\"},\n\t\t\t\t\"south\": {\"uv\": [4, 16, 8, 12], \"texture\": \"#1\"},\n\t\t\t\t\"west\": {\"uv\": [0, 16, 4, 12], \"texture\": \"#1\"},\n\t\t\t\t\"down\": {\"uv\": [8, 12, 4, 8], \"texture\": \"#1\"}\n\t\t\t}\n\t\t}\n\t],\n\t\"display\": {\n\t\t\"thirdperson_righthand\": {\n\t\t\t\"rotation\": [75, 45, 0],\n\t\t\t\"translation\": [0, 2.5, 0],\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\n\t\t},\n\t\t\"thirdperson_lefthand\": {\n\t\t\t\"rotation\": [75, 45, 0],\n\t\t\t\"translation\": [0, 2.5, 0],\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\n\t\t},\n\t\t\"firstperson_righthand\": {\n\t\t\t\"rotation\": [0, 45, 0],\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\n\t\t},\n\t\t\"firstperson_lefthand\": {\n\t\t\t\"rotation\": [0, 225, 0],\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\n\t\t},\n\t\t\"ground\": {\n\t\t\t\"translation\": [0, 3, 0],\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\n\t\t},\n\t\t\"gui\": {\n\t\t\t\"rotation\": [30, 225, 0],\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\n\t\t},\n\t\t\"head\": {\n\t\t\t\"translation\": [0, 6.45, 0],\n\t\t\t\"scale\": [1.61, 1.61, 1.61]\n\t\t},\n\t\t\"fixed\": {\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/assets/model_data.yaml",
    "content": "model_data:\n  - item: pearlescent_froglight\n    reference: item/elite_headwear/pearlescent\n  - item: lime_glazed_terracotta\n    reference: item/elite_headwear/mending\n  - item: packed_ice\n    reference: item/elite_headwear/glacial\n  - item: azalea_leaves\n    reference: item/spore/default\n  - item: flowering_azalea_leaves\n    reference: item/spore/flowering\n  - item: cherry_leaves\n    reference: item/spore/cherry\n"
  },
  {
    "path": "gm4_monsters_unbound/beet.yaml",
    "content": "id: gm4_monsters_unbound\nname: Monsters Unbound\nversion: 1.2.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_forceload\n  - gm4.plugins.include.lib_lore\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_forceload: 1.6.0\n        lib_lore: 1.4.0\n      schedule_loops: \n        - tick\n        - main\n        - slow_clock\n    website:\n      description: Mobs gain special effects based on their biome.\n      recommended:\n        - gm4_survival_refightalized\n    wiki: https://wiki.gm4.co/wiki/Monsters_Unbound\n    credits:\n      Creator:\n        - Djones\n      Icon Design:\n        - Hozz\n      Textures:\n        - Kyrius\n        - rednls\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4/advancement/monsters_unbound_elite_kill.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:iron_axe\"\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.monsters_unbound.elite_kill.title\",\n      \"fallback\": \"Elite Hunter\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.monsters_unbound.elite_kill.description\",\n      \"fallback\": \"Kill any Elite monster\",\n      \"color\": \"gray\"\n    },\n    \"frame\": \"task\"\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"kill_elite\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4/advancement/monsters_unbound_elite_kill_all.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:diamond_axe\"\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.monsters_unbound.elite_kill_all.title\",\n      \"fallback\": \"Elites Hunted\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.monsters_unbound.elite_kill_all.description\",\n      \"fallback\": \"Kill one of every Elite monster\",\n      \"color\": \"gray\"\n    },\n    \"frame\": \"challenge\"\n  },\n  \"parent\": \"gm4:monsters_unbound_elite_kill\",\n  \"criteria\": {\n    \"blazing\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.blazing\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"gargantuan\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.gargantuan\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"glacial\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.glacial\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"mending\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.mending\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"pearlescent\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.pearlescent\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"splitting\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.splitting\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"volatile\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.volatile\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"vorpal\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.vorpal\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"zephyr\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.zephyr\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"blazing\"\n    ],\n    [\n      \"gargantuan\"\n    ],\n    [\n      \"glacial\"\n    ],\n    [\n      \"mending\"\n    ],\n    [\n      \"pearlescent\"\n    ],\n    [\n      \"splitting\"\n    ],\n    [\n      \"volatile\"\n    ],\n    [\n      \"vorpal\"\n    ],\n    [\n      \"zephyr\"\n    ]\n  ],\n  \"rewards\": {\n    \"experience\": 100\n  }\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/advancement/damaged/attack_effect/charging.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"source_entity\": {\n            \"nbt\": \"{Tags:[\\\"gm4_mu_charging_attack\\\"]}\"\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_monsters_unbound:mob/process/attack_effect/charging_attack\"\n  }\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/advancement/damaged/attack_effect/slowing.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"nbt\": \"{Tags:[\\\"gm4_mu_frozen\\\"]}\"\n              }\n            }\n          }\n        ],\n        \"damage\": {\n          \"blocked\": false,\n          \"source_entity\": {\n            \"nbt\": \"{Tags:[\\\"gm4_mu_slowing_attack\\\"]}\"\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_monsters_unbound:mob/process/attack_effect/slowing_attack\"\n  }\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/advancement/damaged/attack_effect/toxic.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"blocked\": false,\n          \"source_entity\": {\n            \"nbt\": \"{Tags:[\\\"gm4_mu_toxic_attack\\\"]}\"\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_monsters_unbound:mob/process/attack_effect/toxic_attack\"\n  }\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/advancement/damaged/attack_effect/weakness.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"blocked\": false,\n          \"source_entity\": {\n            \"nbt\": \"{Tags:[\\\"gm4_mu_weakness_attack\\\"]}\"\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_monsters_unbound:mob/process/attack_effect/weakness_attack\"\n  }\n}\n  "
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/advancement/elite/on_hit.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:player_hurt_entity\",\n            \"conditions\": {\n                \"entity\": [\n                    {\n                        \"condition\": \"minecraft:entity_properties\",\n                        \"entity\": \"this\",\n                        \"predicate\": {\n                            \"nbt\": \"{Tags:[\\\"gm4_mu_elite.on_hit\\\"]}\"\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_monsters_unbound:mob/process/elite/on_hit/run\"\n    }\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/check_item.mcfunction",
    "content": "# check items on ground for Survival Refightalized items\n# @s = item\n# at unspecified\n# run from tick\n\n# tag item as checked and try to process\ntag @s add gm4_mu_item_checked\nscoreboard players set $item_processed gm4_mu_data 0\n\n# check for spores\nexecute if items entity @s contents *[custom_data~{gm4_mu_spore:{}}] run function gm4_monsters_unbound:mob/process/spore/initialise\n\n# check for elite death markers\nexecute if items entity @s contents *[custom_data~{gm4_mu_elite_on_death:{}}] at @s run function gm4_monsters_unbound:mob/process/elite/on_death/run\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/effect/fear.mcfunction",
    "content": "# temporary clock for fear effect\n# @s = unspecified\n# at unspecified\n# schedule from here\n# schedule from effect/fear/apply\n\nscoreboard players set $keep_tick.feared_entity gm4_mu_keep_tick 0\nexecute as @a[tag=gm4_mu_feared] at @s run function gm4_monsters_unbound:effect/fear/tick\n\nexecute if score $keep_tick.feared_entity gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/effect/fear 5t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/effect/freeze.mcfunction",
    "content": "# temporary clock for freeze effect\n# @s = unspecified\n# at unspecified\n# schedule from here\n# schedule from effect/freeze/apply\n\nscoreboard players set $keep_tick.frozen_entity gm4_mu_keep_tick 0\nexecute as @e[tag=gm4_mu_frozen] at @s run function gm4_monsters_unbound:effect/freeze/tick\n\nexecute if score $keep_tick.frozen_entity gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/effect/freeze 5t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/elite/blazing_flare.mcfunction",
    "content": "# temporary clock for blazing elite flare\n# @s = unspecified\n# at unspecified\n# schedule from here\n# schedule from mob/process/elite/blazing/init_flare\n\nscoreboard players set $keep_tick.elite_process_flare gm4_mu_keep_tick 0\nexecute as @e[type=block_display,tag=gm4_mu_elite_flare] at @s run function gm4_monsters_unbound:mob/process/elite/blazing/process_flare\n\nexecute if score $keep_tick.elite_process_flare gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/blazing_flare 1t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/elite/glacial_death.mcfunction",
    "content": "# temporary clock for glacial elite death\n# @s = unspecified\n# at unspecified\n# schedule from here\n# schedule from mob/process/elite/glacial/death\n\nscoreboard players set $keep_tick.elite_glacial_death gm4_mu_keep_tick 0\nexecute as @e[type=marker,tag=gm4_mu_elite.glacial_processing] at @s run function gm4_monsters_unbound:mob/process/elite/glacial/process_explosion\n\nexecute if score $keep_tick.elite_glacial_death gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/glacial_death 2t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/elite/volatile_pillar.mcfunction",
    "content": "# temporary clock for volatile elite pillars\n# @s = unspecified\n# at unspecified\n# schedule from here\n# schedule from mob/process/elite/volatile/pillar_location\n\nscoreboard players set $keep_tick.elite_pillar_volatile gm4_mu_keep_tick 0\nexecute as @e[type=marker,tag=gm4_mu_elite.volatile_pillar] at @s run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_process\n\nexecute if score $keep_tick.elite_pillar_volatile gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/volatile_pillar 1t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/elite/vorpal_death.mcfunction",
    "content": "# temporary clock for vorpal elite death skull\n# @s = unspecified\n# at unspecified\n# schedule from here\n# schedule from mob/process/elite/vorpal/init_fear_cloud\n\nscoreboard players set $keep_tick.elite_death_vorpal gm4_mu_keep_tick 0\nexecute as @e[type=item_display,tag=gm4_mu_elite.fear_cloud] at @s run function gm4_monsters_unbound:mob/process/elite/vorpal/process_fear_cloud\n\nexecute if score $keep_tick.elite_death_vorpal gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/vorpal_death 1t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/elite/zephyr_process.mcfunction",
    "content": "# temporary clock for skeleton zephyr elite charging\n# @s = unspecified\n# at unspecified\n# schedule from here\n# schedule from mob/process/elite/zephyr/skeleton/start\n\nscoreboard players set $keep_tick.elite_process_zephyr gm4_mu_keep_tick 0\nexecute as @e[type=#gm4_monsters_unbound:skeleton_types,tag=gm4_mu_elite.zephyr_skeleton_burst] at @s run function gm4_monsters_unbound:mob/process/elite/zephyr/skeleton/arrow_burst\n\nexecute if score $keep_tick.elite_process_zephyr gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/zephyr_process 3t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/blazing/skeleton.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 46\nsummon skeleton ~ ~ ~ {Tags:[\"gm4_mu_elite\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/blazing/zombie.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 46\nsummon zombie ~ ~ ~ {Tags:[\"gm4_sr_was_baby\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/gargantuan/skeleton.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 96\nsummon skeleton ~ ~ ~ {Tags:[\"gm4_mu_elite\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/gargantuan/zombie.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 96\nsummon zombie ~ ~ ~ {Tags:[\"gm4_sr_was_baby\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/glacial/skeleton.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 1\nsummon skeleton ~ ~ ~ {Tags:[\"gm4_mu_elite\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/glacial/zombie.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 1\nsummon zombie ~ ~ ~ {Tags:[\"gm4_sr_was_baby\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/mending/skeleton.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 16\nsummon skeleton ~ ~ ~ {Tags:[\"gm4_mu_elite\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/mending/zombie.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 16\nsummon zombie ~ ~ ~ {Tags:[\"gm4_sr_was_baby\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/pearlescent/skeleton.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 86\nsummon skeleton ~ ~ ~ {Tags:[\"gm4_mu_elite\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/pearlescent/zombie.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 86\nsummon zombie ~ ~ ~ {Tags:[\"gm4_sr_was_baby\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/splitting/skeleton.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 66\nsummon skeleton ~ ~ ~ {Tags:[\"gm4_mu_elite\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/splitting/zombie.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 66\nsummon zombie ~ ~ ~ {Tags:[\"gm4_sr_was_baby\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/volatile/skeleton.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 76\nsummon skeleton ~ ~ ~ {Tags:[\"gm4_mu_elite\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/volatile/zombie.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 76\nsummon zombie ~ ~ ~ {Tags:[\"gm4_sr_was_baby\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/vorpal/skeleton.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 56\nsummon skeleton ~ ~ ~ {Tags:[\"gm4_mu_elite\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/vorpal/zombie.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 56\nsummon zombie ~ ~ ~ {Tags:[\"gm4_sr_was_baby\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/zephyr/skeleton.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 31\nsummon skeleton ~ ~ ~ {Tags:[\"gm4_mu_elite\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/zephyr/zombie.mcfunction",
    "content": "\nscoreboard players set $prepicked_elite gm4_mu_data 31\nsummon zombie ~ ~ ~ {Tags:[\"gm4_sr_was_baby\",\"gm4_mu_debug_mob\"]}\nexecute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/fear/apply.mcfunction",
    "content": "# apply fear to this player\n# @s = player to hit with fear\n# at @s\n# run from mob/process/elite/vorpal/fear_hit\n\n# failsafe - don't fear spectators\nexecute if entity @s[gamemode=spectator] run return 0\n\n# particles and sound\nparticle dust{color:[0.000,0.000,0.000],scale:1} ~ ~ ~ 0.0666 0.0666 0.0666 2 6 normal\nplaysound minecraft:entity.witch.celebrate hostile @s ~ ~ ~ 1 2\nplaysound minecraft:entity.witch.death hostile @s ~ ~ ~ 1 0.666\n\n# set timer\nscoreboard players operation $add_fear_time gm4_mu_data = $fear_seconds gm4_mu_data\nscoreboard players operation $add_fear_time gm4_mu_data *= #4 gm4_mu_data\n\n# effects\neffect give @s blindness 3 0 true\neffect give @s darkness 3 0 true\neffect give @s nausea 3 0 true\neffect give @s wither 1 0 true\n\n# apply attributes\nattribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:feared -0.5 add_multiplied_total\nattribute @s minecraft:attack_speed modifier add gm4_monsters_unbound:feared -0.5 add_multiplied_total\nattribute @s minecraft:block_break_speed modifier add gm4_monsters_unbound:feared -0.5 add_multiplied_total\n\n# apply fear\nscoreboard players operation @s gm4_mu_feared_time += $add_fear_time gm4_mu_data\ntag @s add gm4_mu_feared\nexecute unless score $keep_tick.feared_entity gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/effect/fear 5t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/fear/playsound.mcfunction",
    "content": "# play fear sounds\n# @s = player with fear effect\n# at @s\n# run from effect/fear/tick\n\nexecute store result score $picksound gm4_mu_data run random value 1..11\n\nexecute if score $picksound gm4_mu_data matches 1..2 run playsound entity.creeper.primed hostile @s ^1 ^ ^-1 1 1\nexecute if score $picksound gm4_mu_data matches 3..4 run playsound entity.creeper.primed hostile @s ^-1 ^ ^-1 1 1\nexecute if score $picksound gm4_mu_data matches 5 run playsound entity.zombie.ambient hostile @s ^2 ^ ^-3 1 1\nexecute if score $picksound gm4_mu_data matches 6 run playsound entity.zombie.ambient hostile @s ^-2 ^ ^-3 1 1\nexecute if score $picksound gm4_mu_data matches 7 run playsound entity.skeleton.ambient hostile @s ^2 ^ ^-3 1 1\nexecute if score $picksound gm4_mu_data matches 8 run playsound entity.skeleton.ambient hostile @s ^-2 ^ ^-3 1 1\nexecute if score $picksound gm4_mu_data matches 9 run playsound entity.spider.ambient hostile @s ^2 ^ ^-3 1 1\nexecute if score $picksound gm4_mu_data matches 10 run playsound entity.spider.ambient hostile @s ^-2 ^ ^-3 1 1\nexecute if score $picksound gm4_mu_data matches 11 run playsound entity.witch.ambient hostile @s ^2 ^ ^-3 1 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/fear/remove.mcfunction",
    "content": "# remove fear from this player\n# @s = player with fear effect\n# at @s\n# run from effect/fear/tick\n\nattribute @s minecraft:attack_damage modifier remove gm4_monsters_unbound:feared\nattribute @s minecraft:attack_speed modifier remove gm4_monsters_unbound:feared\nattribute @s minecraft:block_break_speed modifier remove gm4_monsters_unbound:feared\n\ntag @s remove gm4_mu_feared\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/fear/tick.mcfunction",
    "content": "# tick fear effect for this player\n# @s = player with fear effect\n# at @s\n# run from clocks/effect/fear\n\n# tick down effect, remove if it reaches 0\nscoreboard players remove @s gm4_mu_feared_time 1\nexecute if score @s gm4_mu_feared_time matches ..0 run return run function gm4_monsters_unbound:effect/fear/remove\n\n# re-apply effects\neffect give @s[scores={gm4_mu_feared_time=9..}] blindness 3 0 true\neffect give @s[scores={gm4_mu_feared_time=9..}] darkness 3 0 true\neffect give @s[scores={gm4_mu_feared_time=9..}] nausea 3 0 true\neffect give @s wither 1 0 true\n\n# sounds\nscoreboard players operation $playsound gm4_mu_data = @s gm4_mu_feared_time\nscoreboard players operation $playsound gm4_mu_data %= #4 gm4_mu_data\nexecute if score $playsound gm4_mu_data matches 0 if predicate {condition:\"random_chance\",chance:0.666} run function gm4_monsters_unbound:effect/fear/playsound\n\n# particles\nexecute anchored eyes run particle dust{color:[0.000,0.000,0.000],scale:4} ^ ^ ^0.15 0.2 0.2 0.2 2 6 force @s\nexecute anchored eyes run particle dust{color:[0.000,0.000,0.000],scale:4} ^ ^ ^0.75 0.4 0.4 0.4 2 18 force @s\n\n# keep clock running\nscoreboard players set $keep_tick.feared_entity gm4_mu_keep_tick 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/apply.mcfunction",
    "content": "# apply freeze to this entity\n# @s = entity to freeze\n# at @s\n# run from effect/freeze/apply_from_slow\n# run from mob/process/elite/glacial/explode\n\n# don't freeze spectators\nexecute if entity @s[gamemode=spectator] run return 0\n\n# take tiny fraction of damage for show\ndamage @s 0.01 freeze\n\n# set timer\nscoreboard players operation $add_freeze_time gm4_mu_data = $freeze_seconds gm4_mu_data\nscoreboard players operation $add_freeze_time gm4_mu_data *= #4 gm4_mu_data\nscoreboard players reset $freeze_seconds gm4_mu_data\n\n# set attributes based on entity type\nexecute if entity @s[type=player] run function gm4_monsters_unbound:effect/freeze/apply_player\nexecute if entity @s[type=!player] run function gm4_monsters_unbound:effect/freeze/apply_entity\n\n# apply freeze\nscoreboard players operation @s gm4_mu_frozen_time += $add_freeze_time gm4_mu_data\ntag @s add gm4_mu_frozen\nexecute unless score $keep_tick.frozen_entity gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/effect/freeze 5t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/apply_chill.mcfunction",
    "content": "# apply a stack of chill\n# @s = player that was hit\n# at unspecified\n# run from mob/process/attack_effect/slowing_attack\n\nexecute if entity @s[tag=gm4_mu_immune_slowness] run return 0\n\nscoreboard players set $slowness_level gm4_mu_data -1\nexecute if data entity @s active_effects[{id:\"minecraft:slowness\"}] store result score $slowness_level gm4_mu_data run data get entity @s active_effects[{id:\"minecraft:slowness\"}].amplifier\nexecute store result storage gm4_monsters_unbound:temp slowness.level int 1 run scoreboard players add $slowness_level gm4_mu_data 1\n\nexecute unless score $slowness_level gm4_mu_data matches 6.. run function gm4_monsters_unbound:effect/freeze/stack_slow with storage gm4_monsters_unbound:temp slowness\nexecute if score $slowness_level gm4_mu_data matches 6.. run function gm4_monsters_unbound:effect/freeze/apply_from_slow\n\ndata remove storage gm4_monsters_unbound:temp slowness\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/apply_entity.mcfunction",
    "content": "# apply freeze to this non-player entity\n# @s = non-player entity to freeze\n# at @s\n# run from effect/freeze/apply\n\n# apply attributes\nattribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total\nattribute @s minecraft:follow_range modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total\nattribute @s minecraft:jump_strength modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total\nattribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total\nattribute @s minecraft:knockback_resistance modifier add gm4_monsters_unbound:frozen 1 add_value\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/apply_from_slow.mcfunction",
    "content": "# apply freeze from Chill slow\n# @s = entity with 7 stacks of Chill\n# at @s\n# run from effect/freeze/apply_chill\n\neffect clear @s slowness\nexecute unless score $freeze_seconds gm4_mu_data matches 1.. run scoreboard players set $freeze_seconds gm4_mu_data 3\nfunction gm4_monsters_unbound:effect/freeze/apply\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/apply_player.mcfunction",
    "content": "# apply freeze to this player\n# @s = player to freeze\n# at @s\n# run from effect/freeze/apply\n\n# apply attributes\nattribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total\nattribute @s minecraft:attack_speed modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total\nattribute @s minecraft:jump_strength modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total\nattribute @s minecraft:knockback_resistance modifier add gm4_monsters_unbound:frozen 1 add_multiplied_total\nattribute @s minecraft:entity_interaction_range modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total\nattribute @s minecraft:block_interaction_range modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/stack_slow.mcfunction",
    "content": "# stack slowness level on multiple Chill hits\n# @s = entity with slowness effect\n# at @s\n# run from effect/freeze/apply_chill\n\n$effect give @s slowness 15 $(level)\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/thaw_entity.mcfunction",
    "content": "# thaw entity\n# @s = entity with freeze effect\n# at @s\n# run from effect/freeze/tick\n\nattribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:frozen\nattribute @s minecraft:follow_range modifier remove gm4_monsters_unbound:frozen\nattribute @s minecraft:jump_strength modifier remove gm4_monsters_unbound:frozen\nattribute @s minecraft:attack_damage modifier remove gm4_monsters_unbound:frozen\nattribute @s minecraft:knockback_resistance modifier remove gm4_monsters_unbound:frozen\n\nplaysound minecraft:block.snow.break player @a ~ ~ ~ 1.5 1.25\n\ntag @s remove gm4_mu_frozen\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/thaw_player.mcfunction",
    "content": "# thaw player\n# @s = player with freeze effect\n# at @s\n# run from effect/freeze/tick\n\nattribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:frozen\nattribute @s minecraft:attack_speed modifier remove gm4_monsters_unbound:frozen\nattribute @s minecraft:jump_strength modifier remove gm4_monsters_unbound:frozen\nattribute @s minecraft:knockback_resistance modifier remove gm4_monsters_unbound:frozen\nattribute @s minecraft:entity_interaction_range modifier remove gm4_monsters_unbound:frozen\nattribute @s minecraft:block_interaction_range modifier remove gm4_monsters_unbound:frozen\n\nplaysound minecraft:block.snow.break player @a ~ ~ ~ 1.5 1.25\n\ntag @s remove gm4_mu_frozen\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/tick.mcfunction",
    "content": "# tick freeze effect for this entity\n# @s = entity with freeze effect\n# at @s\n# run from clocks/effect/freeze\n\nscoreboard players remove @s gm4_mu_frozen_time 1\nexecute if score @s[type=player] gm4_mu_frozen_time matches ..0 run return run function gm4_monsters_unbound:effect/freeze/thaw_player\nexecute if score @s[type=!player] gm4_mu_frozen_time matches ..0 run return run function gm4_monsters_unbound:effect/freeze/thaw_entity\n\nparticle dust{color:[0.725,0.910,0.918],scale:2} ~ ~0.9 ~ 0.3 0.65 0.3 0 1 normal\nparticle snowflake ~ ~0.9 ~ 0.3 0.65 0.3 0 6 normal\n\nscoreboard players set $keep_tick.frozen_entity gm4_mu_keep_tick 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/init.mcfunction",
    "content": "execute unless score monsters_unbound gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Monsters Unbound\"}\nexecute unless score monsters_unbound gm4_earliest_version < monsters_unbound gm4_modules run scoreboard players operation monsters_unbound gm4_earliest_version = monsters_unbound gm4_modules\nscoreboard players set monsters_unbound gm4_modules 1\n\n# scoreboards\nscoreboard objectives add gm4_mu_data dummy\nscoreboard objectives add gm4_mu_timer dummy\nscoreboard objectives add gm4_mu_generation dummy\nscoreboard objectives add gm4_mu_frozen_time dummy\nscoreboard objectives add gm4_mu_feared_time dummy\nscoreboard objectives add gm4_mu_keep_tick dummy\nscoreboard objectives add gm4_mu_config dummy\n# add Survival Refightalized objectives for compatibility\nscoreboard objectives add gm4_sr_data dummy\nscoreboard objectives add gm4_sr_arrow.damage_change dummy\nscoreboard objectives add gm4_sr_arrow.fire_delay dummy\n\n# configs\nexecute unless score $spawn_phantoms gm4_mu_config matches -2147483648..2147483647 run scoreboard players set $spawn_phantoms gm4_mu_config 1\n\n# disable natural phantom spawning\nexecute unless score $phantoms_disabled gm4_mu_data matches 1 run gamerule spawn_phantoms false\nexecute unless score $phantoms_disabled gm4_mu_data matches 1 run data modify storage gm4:log queue append value {type:\"text\",message:{\"text\":\"[INFO] Monsters Unbound changed gamerule spawn_phantoms to false\"}}\nscoreboard players set $phantoms_disabled gm4_mu_data 1\nexecute store result score $doinsomnia gm4_mu_data run gamerule spawn_phantoms\nexecute if score $spawn_phantoms gm4_mu_config matches 1 if score $doinsomnia gm4_mu_data matches 1 run data modify storage gm4:log queue append value {type:\"text\",message:[{\"text\":\"[WARN]\",\"color\":\"red\"},{\"text\":\" Monsters Unbound requires minecraft:spawn_phantoms to be false, but it is true. \",\"color\":\"white\"},{\"text\":\"click here to fix\",\"color\":\"red\",\"click_event\":{\"action\":\"suggest_command\",\"command\":\"/gamerule spawn_phantoms false\"}}]}\n\n# mob caps\nexecute unless score $mob_limit.husk_army gm4_mu_config matches -2147483648..2147483647 run scoreboard players set $mob_limit.husk_army gm4_mu_config 128\nexecute unless score $mob_limit.spore_zombie gm4_mu_config matches -2147483648..2147483647 run scoreboard players set $mob_limit.spore_zombie gm4_mu_config 128\nexecute unless score $mob_limit.phantom gm4_mu_config matches -2147483648..2147483647 run scoreboard players set $mob_limit.phantom gm4_mu_config 48\n\n# elite teams\nteam add gm4_mu_elite.glacial\nteam modify gm4_mu_elite.glacial prefix {\"translate\":\"text.gm4.monsters_unbound.elite_name.glacial\",\"fallback\":\"Glacial \"}\nteam add gm4_mu_elite.mending\nteam modify gm4_mu_elite.mending prefix {\"translate\":\"text.gm4.monsters_unbound.elite_name.slate\",\"fallback\":\"Slate \"}\nteam add gm4_mu_elite.blazing\nteam modify gm4_mu_elite.blazing prefix {\"translate\":\"text.gm4.monsters_unbound.elite_name.blazing\",\"fallback\":\"Blazing \"}\nteam add gm4_mu_elite.zephyr\nteam modify gm4_mu_elite.zephyr prefix {\"translate\":\"text.gm4.monsters_unbound.elite_name.zephyr\",\"fallback\":\"Zephyr \"}\nteam add gm4_mu_elite.gargantuan\nteam modify gm4_mu_elite.gargantuan prefix {\"translate\":\"text.gm4.monsters_unbound.elite_name.gargantuan\",\"fallback\":\"Gargantuan \"}\nteam add gm4_mu_elite.vorpal\nteam modify gm4_mu_elite.vorpal prefix {\"translate\":\"text.gm4.monsters_unbound.elite_name.vorpal\",\"fallback\":\"Vorpal \"}\nteam add gm4_mu_elite.splitting\nteam modify gm4_mu_elite.splitting prefix {\"translate\":\"text.gm4.monsters_unbound.elite_name.splitting\",\"fallback\":\"Splitting \"}\nteam add gm4_mu_elite.split\nteam modify gm4_mu_elite.split prefix {\"translate\":\"text.gm4.monsters_unbound.elite_name.split\",\"fallback\":\"Split \"}\nteam add gm4_mu_elite.volatile\nteam modify gm4_mu_elite.volatile prefix {\"translate\":\"text.gm4.monsters_unbound.elite_name.volatile\",\"fallback\":\"Volatile \"}\nteam add gm4_mu_elite.pearlescent\nteam modify gm4_mu_elite.pearlescent prefix {\"translate\":\"text.gm4.monsters_unbound.elite_name.pearlescent\",\"fallback\":\"Pearlescent \"}\n\n# constants\nscoreboard players set #2 gm4_mu_data 2\nscoreboard players set #4 gm4_mu_data 4\n\n# start clocks\nschedule function gm4_monsters_unbound:tick 1t\nschedule function gm4_monsters_unbound:main 1t\nschedule function gm4_monsters_unbound:slow_clock 1t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/main.mcfunction",
    "content": "schedule function gm4_monsters_unbound:main 16t\n\n# modify mobs\n# if survival_refightalized is installed the modification is instead started from there\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @e[type=#gm4_monsters_unbound:modify,tag=!smithed.entity,tag=!gm4_mu_processed,nbt=!{PersistenceRequired:1b}] at @s run function gm4_monsters_unbound:mob/init/check_mob\n\n# phantoms drown under water\n# if survival_refightalized is installed this happens from there instead\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @e[type=phantom,tag=!smithed.entity] at @s if block ~ ~ ~ #gm4:water run damage @s 2 drown\n\n# process cloaked creepers\nexecute as @e[type=creeper,tag=gm4_mu_cloaked_creeper] at @s if entity @a[gamemode=!spectator,gamemode=!creative,distance=..3.1] run function gm4_monsters_unbound:mob/process/cloaked_creeper\n\n# zombie spores\nexecute as @e[type=item,tag=gm4_mu_spore] at @s run function gm4_monsters_unbound:mob/process/spore/advance\nexecute as @e[type=#gm4_monsters_unbound:zombie_types,tag=gm4_mu_spore_zombie,predicate=gm4_monsters_unbound:technical/on_fire] run function gm4_monsters_unbound:mob/process/spore/burn_on_head\n\n# traps\nexecute as @e[type=marker,tag=gm4_mu_snowy_trap] at @s if entity @a[gamemode=!spectator,gamemode=!creative,distance=..7] run function gm4_monsters_unbound:mob/process/reveal_snowy_trap\nexecute as @e[type=marker,tag=gm4_mu_dripstone_trap] at @s positioned ~-3.5 ~-34 ~-3.5 if entity @a[gamemode=!spectator,gamemode=!creative,dx=6,dy=28,dz=6] at @s run function gm4_monsters_unbound:mob/process/reveal_dripstone_trap\n\n# elites\nexecute as @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_elite.process] at @s run function gm4_monsters_unbound:mob/process/elite/check_type\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/check_mob.mcfunction",
    "content": "# initiate newly spawned mobs (mobs without any tags)\n# @s = mobs that can be buffed\n# at @s\n# run from main\n\n# /!\\ This function only runs if Survival Refightalized is not installed\n\n# pre-mark mob as processed if it spawned in the air (from a spawner), these do not get modified\n# mobs in the modify_in_air list are ignored here\nexecute if block ~ ~-0.01 ~ #gm4:no_collision run tag @s[type=!#gm4_monsters_unbound:modify_in_air] add gm4_sr_from_spawner\n\n# if the mob is riding another mob *do* modify them\nscoreboard players set $mounted gm4_mu_data 0\nexecute if entity @s[tag=gm4_sr_from_spawner] on vehicle run scoreboard players set $mounted gm4_mu_data 1\nexecute if score $mounted gm4_mu_data matches 1 run tag @s remove gm4_sr_from_spawner\n\nfunction gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/pick.mcfunction",
    "content": "# pick elite type to spawn\n# @s = zombie / skeleton types\n# at @s\n# run from mob/init/mob_type/skeleton/base\n# run from mob/init/mob_type/zombie/base\n\ntag @s add gm4_mu_elite\n\n# zombie villagers are not replaced\nexecute if entity @s[type=zombie_villager] run return 0\n\n# don't allow elites to be jockeys\nride @s dismount\n\n# don't allow entities from splits to be elites\nexecute if entity @s[tag=gm4_mu_split_entity] run return 0\n\n# pick a random elite, or use prepicked if set\nexecute store result score $elite_pick gm4_mu_data run random value 1..100\nexecute if score $prepicked_elite gm4_mu_data matches 1..100 run scoreboard players operation $elite_pick gm4_mu_data = $prepicked_elite gm4_mu_data\nscoreboard players reset $prepicked_elite gm4_mu_data\n\n# do not allow Gargantuan Elite if there is no space\nexecute if score $elite_pick gm4_mu_data matches 96.. unless block ~ ~1 ~ #gm4:no_collision store result score $elite_pick gm4_mu_data run random value 1..95\n\n# GLACIAL 15% \n# 3.5x health, 45% KB resist\n# attacks apply chill (15 sec stacking slowness, applies freeze at 7 stacks)\n# explode in a ball of frost on death, exploding after a delay to freeze entities inside for 3 seconds\n# frozen entities cannot act\nexecute if score $elite_pick gm4_mu_data matches ..15 run return run function gm4_monsters_unbound:mob/init/elite/type/glacial\n\n# MENDING 15%\n# 2.5x health, -25% speed\n# heals undead in LoS, restoring 24 health and granting them resistance II for 1 second\n# explode in a healing orb on death, heals nearby mobs, can be destroyed to grant everything in radius regeneration\nexecute if score $elite_pick gm4_mu_data matches 16..30 run return run function gm4_monsters_unbound:mob/init/elite/type/mending\n\n# ZEPHYR 15%\n# 3x health, +15% speed, +0.5 attack knockback, immune to fall damage\n# after spotting a player stand still to charge for ~4 seconds, then activate:\n# zombie: charge at the player, dealing 25% increased damage\n# skeleton: fire up to 16 arrows in rapid succession that deal 0.5 arrow damage, then gain a speed boost\nexecute if score $elite_pick gm4_mu_data matches 31..45 run return run function gm4_monsters_unbound:mob/init/elite/type/zephyr\n\n# BLAZING 10%\n# 3.5x health, -45% speed, -99% damage, can't burn\n# fire aspect II / flame II\n# occasionally stops to shoot homing fireballs at the closest player, exploding when they hit terrain / a player to deal 5 explosion damage\nexecute if score $elite_pick gm4_mu_data matches 46..55 run return run function gm4_monsters_unbound:mob/init/elite/type/blazing\n\n# VORPAL 10%\n# 3.5x health\n# can teleports up to 8 blocks away when hit, 65% chance\n# On Death shoot a black cloud tracking the closest player, causing them to go blind, obscuring their vision and removing sounds\nexecute if score $elite_pick gm4_mu_data matches 56..65 run return run function gm4_monsters_unbound:mob/init/elite/type/vorpal\n\n# SPLITTING 10%\n# 3.5x health\n# on death splits into 5 miniature versions of the entity, with -50% in scale and reduced stats\nexecute if score $elite_pick gm4_mu_data matches 66..75 run return run function gm4_monsters_unbound:mob/init/elite/type/splitting\n\n# VOLATILE 10%\n# 3.5x health, +20% movement speed, +25% attack damage, arrow delay set to 0\n# calls down pillars of energy that explode after 4 seconds, leaving a dragon_fireball\nexecute if score $elite_pick gm4_mu_data matches 76..85 run return run function gm4_monsters_unbound:mob/init/elite/type/volatile\n\n# PEARLESCENT 10%\n# 3.5x health\n# occasionally slow to shoot a beam of light at a player, damaging them over time\nexecute if score $elite_pick gm4_mu_data matches 86..95 run return run function gm4_monsters_unbound:mob/init/elite/type/pearlescent\n\n# GARGANTUAN 5%\n# 6.5x health (4.5x for skeleton), +50% size, +35% attack damage, 1.75 attack knockback, 85% movement efficiency, -35% speed\n# projectile protection 4, skeletons have punch II and power I on bow\n# based on missing health gain up to 150% speed, 50% attack damage and from 85-100% knockback resistance\n# Occasionally charges up a stomp attack that slows and deals 75% damage to players within 7 blocks\nexecute if score $elite_pick gm4_mu_data matches 96.. run return run function gm4_monsters_unbound:mob/init/elite/type/gargantuan\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/blazing.mcfunction",
    "content": "# pick this elite type to spawn\n# @s = zombie / skeleton types\n# at @s\n# run from mob/init/elite/pick\n\ntag @s add gm4_mu_elite.process\ntag @s add gm4_mu_elite.blazing\n\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.fire 2.5 add_multiplied_total\nattribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:elite_buff.fire -0.99 add_multiplied_total\nattribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.fire -0.45 add_multiplied_total\nattribute @s minecraft:burning_time modifier add gm4_monsters_unbound:elite_buff.fire -1 add_multiplied_total\n\nenchant @s[type=#gm4_monsters_unbound:skeleton_types] flame\nscoreboard players set @s[type=#gm4_monsters_unbound:skeleton_types] gm4_sr_arrow.damage_change -18\nscoreboard players add @s[type=#gm4_monsters_unbound:skeleton_types] gm4_sr_arrow.fire_delay 2\nitem replace entity @s[type=!#gm4_monsters_unbound:skeleton_types] weapon.mainhand with blaze_rod[enchantments={fire_aspect:2}]\ndata modify entity @s drop_chances.mainhand set value 0\n\nitem replace entity @s armor.head with magma_block[enchantments={binding_curse:1},enchantment_glint_override=false]\ndata modify entity @s drop_chances.head set value 0\n\nteam join gm4_mu_elite.blazing\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/gargantuan.mcfunction",
    "content": "# pick this elite type to spawn\n# @s = zombie / skeleton types\n# at @s\n# run from mob/init/elite/pick\n\ntag @s add gm4_mu_elite.gargantuan\ntag @s add gm4_mu_elite.process\n\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.giant 5.5 add_multiplied_total\nattribute @s minecraft:gravity modifier add gm4_monsters_unbound:elite_buff.giant 0.5 add_multiplied_total\nattribute @s minecraft:jump_strength modifier add gm4_monsters_unbound:elite_buff.giant 0.5 add_multiplied_total\nattribute @s minecraft:attack_knockback modifier add gm4_monsters_unbound:elite_buff.giant 1.75 add_value\nattribute @s minecraft:water_movement_efficiency modifier add gm4_monsters_unbound:elite_buff.giant 0.85 add_value\nattribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.giant -0.35 add_multiplied_total\n\nattribute @s[type=#gm4_monsters_unbound:skeleton_types] minecraft:scale modifier add gm4_monsters_unbound:elite_buff.giant_size 0.507537 add_multiplied_total\nattribute @s[type=!#gm4_monsters_unbound:skeleton_types] minecraft:scale modifier add gm4_monsters_unbound:elite_buff.giant_size 0.538461 add_multiplied_total\n\nenchant @s[type=#gm4_monsters_unbound:skeleton_types] punch 2\nenchant @s[type=#gm4_monsters_unbound:skeleton_types] power 1\n\nscoreboard players set @s[type=#gm4_monsters_unbound:skeleton_types] gm4_sr_arrow.fire_delay 7\n\nitem replace entity @s armor.head with cobblestone[enchantment_glint_override=false,minecraft:enchantments={projectile_protection:5,binding_curse:1}] 1 \ndata modify entity @s drop_chances.head set value 0\n\nteam join gm4_mu_elite.gargantuan\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/glacial.mcfunction",
    "content": "# pick this elite type to spawn\n# @s = zombie / skeleton types\n# at @s\n# run from mob/init/elite/pick\n\ntag @s add gm4_mu_slowing_attack\ntag @s add gm4_mu_elite.glacial\n\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.frost 2.5 add_multiplied_total\nattribute @s minecraft:knockback_resistance modifier add gm4_monsters_unbound:elite_buff.frost 0.45 add_value\n\nloot replace entity @s armor.head loot gm4_monsters_unbound:elite/glacial\ndata modify entity @s drop_chances.head set value 1\n\nteam join gm4_mu_elite.glacial\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/mending.mcfunction",
    "content": "# pick this elite type to spawn\n# @s = zombie / skeleton types\n# at @s\n# run from mob/init/elite/pick\n\ntag @s add gm4_mu_elite.process\ntag @s add gm4_mu_elite.mending\n\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.heal 1.5 add_multiplied_total\nattribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.heal -0.25 add_multiplied_total\n\nloot replace entity @s armor.head loot gm4_monsters_unbound:elite/mending\ndata modify entity @s drop_chances.head set value 0\n\nteam join gm4_mu_elite.mending\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/pearlescent.mcfunction",
    "content": "# pick this elite type to spawn\n# @s = zombie / skeleton types\n# at @s\n# run from mob/init/elite/pick\n\ntag @s add gm4_mu_elite.process\ntag @s add gm4_mu_elite.pearlescent\n\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.pearlescent 2.5 add_multiplied_total\nattribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.pearlescent 0.2 add_multiplied_total\n\nitem replace entity @s weapon.mainhand with air\nloot replace entity @s armor.head loot gm4_monsters_unbound:elite/pearlescent\ndata modify entity @s drop_chances.head set value 0\n\nteam join gm4_mu_elite.pearlescent\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/splitting.mcfunction",
    "content": "# pick this elite type to spawn\n# @s = zombie / skeleton types\n# at @s\n# run from mob/init/elite/pick\n\ntag @s add gm4_mu_elite.process\ntag @s add gm4_mu_elite.splitting\n\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.vorpal 2.5 add_multiplied_total\n\nloot replace entity @s[type=!#gm4_monsters_unbound:skeleton_types] armor.head loot gm4_monsters_unbound:elite/splitting_zombie\nloot replace entity @s[type=#gm4_monsters_unbound:skeleton_types] armor.head loot gm4_monsters_unbound:elite/splitting_skeleton\ndata modify entity @s drop_chances.head set value 1\n\nteam join gm4_mu_elite.splitting\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/volatile.mcfunction",
    "content": "# pick this elite type to spawn\n# @s = zombie / skeleton types\n# at @s\n# run from mob/init/elite/pick\n\ntag @s add gm4_mu_elite.process\ntag @s add gm4_mu_elite.volatile\n\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.volatile 2.5 add_multiplied_total\n\nloot replace entity @s armor.head loot gm4_monsters_unbound:elite/volatile\ndata modify entity @s drop_chances.head set value 1\n\nteam join gm4_mu_elite.volatile\n\nscoreboard players set @s gm4_sr_arrow.fire_delay 0\nscoreboard players set @s gm4_sr_arrow.damage_change -10\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/vorpal.mcfunction",
    "content": "# pick this elite type to spawn\n# @s = zombie / skeleton types\n# at @s\n# run from mob/init/elite/pick\n\ntag @s add gm4_mu_elite.vorpal\ntag @s add gm4_mu_elite.on_hit\n\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.vorpal 2.5 add_multiplied_total\nattribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:elite_buff.vorpal 0.25 add_multiplied_total\n\nloot replace entity @s armor.head loot gm4_monsters_unbound:elite/vorpal\ndata modify entity @s drop_chances.head set value 1\n\nscoreboard players add @s gm4_sr_arrow.damage_change 5\n\nteam join gm4_mu_elite.vorpal\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/zephyr.mcfunction",
    "content": "# pick this elite type to spawn\n# @s = zombie / skeleton types\n# at @s\n# run from mob/init/elite/pick\n\ntag @s add gm4_mu_elite.process\ntag @s add gm4_mu_elite.zephyr\n\neffect give @s wind_charged infinite 0 true\n\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.speed 2.5 add_multiplied_total\nattribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.speed 0.15 add_multiplied_total\nattribute @s minecraft:attack_knockback modifier add gm4_monsters_unbound:elite_buff.speed 0.5 add_value\nattribute @s minecraft:fall_damage_multiplier modifier add gm4_monsters_unbound:elite_buff.speed -1 add_multiplied_total\n\nitem replace entity @s armor.head with white_wool[enchantments={binding_curse:1},enchantment_glint_override=false]\ndata modify entity @s drop_chances.head set value 0\n\nteam join gm4_mu_elite.zephyr\n\nscoreboard players set @s gm4_sr_arrow.fire_delay 0\nscoreboard players set @s gm4_sr_arrow.damage_change -15\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/initialize.mcfunction",
    "content": "# initiate newly spawned mobs (mobs without any tags)\n# @s = mobs that can be buffed\n# at @s\n# run from mob/init/check_mob\n\n# /!\\ This function only runs if Survival Refightalized is not installed\n\nscoreboard players reset $mob_extras gm4_sr_data\ntag @s add gm4_mu_processed\n\n# remove baby zombies except chicken jockeys (will be turned into Elites)\nscoreboard players set $was_baby gm4_mu_data 0\nexecute if entity @s[type=zombie] if predicate {condition:\"all_of\",terms:[{condition:\"entity_properties\",entity:\"this\",predicate:{flags:{is_baby:1b}}},{condition:\"inverted\",term:{condition:\"entity_properties\",entity:\"this\",predicate:{vehicle:{}}}}]} store success score $was_baby gm4_mu_data run data modify entity @s IsBaby set value 0b\nexecute if score $was_baby gm4_mu_data matches 1 run tag @s add gm4_sr_was_baby\n\nfunction gm4_monsters_unbound:mob/init/mob_type\n\n\n# heal to max health\neffect give @s[type=#minecraft:undead] instant_damage 1 20 true\neffect give @s[type=!#minecraft:undead] instant_health 1 20 true\n\n# process any spawned mobs (uses sr instead of mu to be compatible with survival_refightalized)\nexecute if score $mob_extras gm4_sr_data matches 1.. unless entity @s[tag=gm4_sr_extra_mob] as @e[type=#gm4_monsters_unbound:modify,tag=gm4_sr_extra_mob] at @s run function gm4_monsters_unbound:mob/init/initialize\ntag @s remove gm4_sr_extra_mob\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/creeper/base.mcfunction",
    "content": "# calculate modifiers for newly spawned creeper\n# @s = creeper\n# at @s\n# run from mob/init/mob_type\n\n# | Biome Modifiers\n# snowy\nexecute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/snowy] run function gm4_monsters_unbound:mob/init/mob_type/creeper/snowy\n# mountainous\nexecute if predicate {condition:\"minecraft:all_of\",terms:[{condition:\"minecraft:random_chance\",chance:0.30},{condition:\"minecraft:reference\",name:\"gm4_monsters_unbound:biome/mountainous\"}]} run function gm4_monsters_unbound:mob/init/mob_type/creeper/mountainous\n# burned\nexecute if predicate gm4_monsters_unbound:biome/burned store result entity @s Fuse int 0.75 run data get entity @s Fuse\n# flowering \nexecute if predicate gm4_monsters_unbound:biome/flowering run function gm4_monsters_unbound:mob/init/mob_type/creeper/flowering\n# toxic\ntag @s[predicate=gm4_monsters_unbound:biome/toxic] add gm4_mu_toxic_creeper\nexecute if entity @s[tag=gm4_mu_toxic_creeper] run function gm4_monsters_unbound:mob/process/toxic_creeper\n# growth\nattribute @s[predicate=gm4_monsters_unbound:biome/growth] minecraft:movement_speed modifier add gm4_monsters_unbound:stat_change.growth 0.2 add_multiplied_base\n# underground\ndata modify entity @s[predicate=gm4_monsters_unbound:mob/underground] ExplosionRadius set value 4s\n# dripstone caves\nexecute if biome ~ ~ ~ dripstone_caves if block ~.875 ~ ~.875 #gm4:no_collision if block ~.875 ~ ~-.875 #gm4:no_collision if block ~-.875 ~ ~.875 #gm4:no_collision if block ~-.875 ~ ~-.875 #gm4:no_collision run function gm4_monsters_unbound:mob/init/mob_type/creeper/dripstone_caves\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/creeper/dripstone_caves.mcfunction",
    "content": "# replace with spider\n# @s = creeper\n# at @s\n# run from mob/init/mob_type/creeper/base\n\nsummon spider ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $mob_extras gm4_sr_data 1\nscoreboard players set $removed_mob gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/creeper/flowering.mcfunction",
    "content": "# apply invisibility to creeper\n# @s = creeper\n# at @s\n# run from mob/init/mob_type/creeper/base\n\ntag @s add gm4_mu_cloaked_creeper\neffect give @s invisibility 35 0\ndata modify entity @s ExplosionRadius set value 2s\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/creeper/mountainous.mcfunction",
    "content": "# make this creeper stronger\n# @s = creeper\n# at @s\n# run from mob/init/mob_type/creeper/base\n\nattribute @s minecraft:knockback_resistance modifier add gm4_monsters_unbound:stat_change.gargantuan 0.4 add_value\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.gargantuan 0.25 add_multiplied_total\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/creeper/snowy.mcfunction",
    "content": "# replace creeper with a snowy trap or zombie/stray\n# @s = creeper\n# at @s\n# run from mob/init/mob_type/creeper/base\n\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $removed_mob gm4_sr_data 1\n\nexecute if block ~ ~ ~ snow run return run summon marker ~ ~ ~ {Tags:[\"gm4_mu_trap\",\"gm4_mu_snowy_trap\"],CustomName:'{\"text\":\"GM4 Monsters Unbound - Snow Trap\"}'}\n\nexecute store result score $pick_entity gm4_mu_data run random value 1..2\nscoreboard players set $mob_extras gm4_sr_data 1\nexecute if score $pick_entity gm4_mu_data matches 1 run summon zombie ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if score $pick_entity gm4_mu_data matches 2 run summon stray ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/base.mcfunction",
    "content": "# calculate modifiers for newly spawned enderman\n# @s = enderman\n# at @s\n# run from mob/init/mob_type\n\n# | Biome Modifiers\n# flowering \nexecute if predicate gm4_monsters_unbound:biome/flowering if predicate {condition:\"minecraft:random_chance\",chance:0.50} run function gm4_monsters_unbound:mob/init/mob_type/enderman/flowering\n# toxic \nexecute if predicate gm4_monsters_unbound:biome/toxic if predicate {condition:\"minecraft:random_chance\",chance:0.50} run function gm4_monsters_unbound:mob/init/mob_type/enderman/toxic\n# burned\nexecute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/burned] store success score $mob_extras gm4_sr_data run summon enderman ~.05 ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/burned] store success score $mob_extras gm4_sr_data run summon enderman ~-.05 ~ ~.05 {Tags:[\"gm4_sr_extra_mob\"]}\n# growth\nexecute if predicate gm4_monsters_unbound:biome/growth run function gm4_monsters_unbound:mob/init/mob_type/enderman/growth\n# underground\nexecute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:technical/underground] if predicate {condition:\"minecraft:random_chance\",chance:0.15} run function gm4_monsters_unbound:mob/init/mob_type/enderman/underground\n# dripstone caves\nexecute if biome ~ ~ ~ dripstone_caves if block ~.875 ~ ~.875 #gm4:no_collision if block ~.875 ~ ~-.875 #gm4:no_collision if block ~-.875 ~ ~.875 #gm4:no_collision if block ~-.875 ~ ~-.875 #gm4:no_collision run function gm4_monsters_unbound:mob/init/mob_type/enderman/dripstone_caves\n\n# the end\nexecute if dimension the_end run attribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:stat_change.the_end 0.2 add_multiplied_base\nexecute if dimension the_end run attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:stat_change.the_end 0.15 add_multiplied_base\n# nether wastes\nexecute if biome ~ ~ ~ nether_wastes if predicate {condition:\"minecraft:random_chance\",chance:0.95} run function gm4_monsters_unbound:mob/init/mob_type/enderman/nether_wastes\n# soul sand valley\nexecute if biome ~ ~ ~ soul_sand_valley if predicate {condition:\"minecraft:random_chance\",chance:0.95} run function gm4_monsters_unbound:mob/init/mob_type/enderman/soul_sand_valley\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/dripstone_caves.mcfunction",
    "content": "# replace with spider\n# @s = enderman\n# at @s\n# run from mob/init/mob_type/enderman/base\n\nsummon spider ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $mob_extras gm4_sr_data 1\nscoreboard players set $removed_mob gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/flowering.mcfunction",
    "content": "# replace enderman with a slime\n# @s = enderman\n# at @s\n# run from mob/init/mob_type/enderman/base\n\nsummon slime ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"],Size:2}\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $mob_extras gm4_sr_data 1\nscoreboard players set $removed_mob gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/growth.mcfunction",
    "content": "# replace enderman with a 3 skeletons\n# @s = enderman\n# at @s\n# run from mob/init/mob_type/enderman/base\n\nexecute if biome ~ ~ ~ mangrove_swamp run summon bogged ~.05 ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if biome ~ ~ ~ snowy_taiga run summon stray ~.05 ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nexecute unless biome ~ ~ ~ mangrove_swamp unless biome ~ ~ ~ snowy_taiga run summon skeleton ~.05 ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nsummon skeleton ~0.15 ~ ~-0.15 {Tags:[\"gm4_sr_extra_mob\"]}\nsummon skeleton ~-0.15 ~ ~0.15 {Tags:[\"gm4_sr_extra_mob\"]}\nscoreboard players set $mob_extras gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/nether_wastes.mcfunction",
    "content": "# replace enderman with blaze\n# @s = enderman\n# at @s\n# run from mob/init/mob_type/enderman/base\n\nsummon blaze ~ ~0.3 ~ {Tags:[\"gm4_sr_extra_mob\"]}\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $mob_extras gm4_sr_data 1\nscoreboard players set $removed_mob gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/soul_sand_valley.mcfunction",
    "content": "# replace enderman with wither skeleton\n# @s = enderman\n# at @s\n# run from mob/init/mob_type/enderman/base\n\nsummon wither_skeleton ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $mob_extras gm4_sr_data 1\nscoreboard players set $removed_mob gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/toxic.mcfunction",
    "content": "# replace enderman with a witch\n# @s = enderman\n# at @s\n# run from mob/init/mob_type/enderman/base\n\nsummon witch ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $mob_extras gm4_sr_data 1\nscoreboard players set $removed_mob gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/underground.mcfunction",
    "content": "# spawn 5 more enderman\n# @s = enderman\n# at @s\n# run from mob/init/mob_type/enderman/base\n\nsummon enderman ~0.15 ~ ~0.15 {Tags:[\"gm4_sr_extra_mob\"]}\nsummon enderman ~0.15 ~ ~-0.15 {Tags:[\"gm4_sr_extra_mob\"]}\nsummon enderman ~-0.15 ~ ~0.15 {Tags:[\"gm4_sr_extra_mob\"]}\nsummon enderman ~0.15 ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nsummon enderman ~ ~ ~0.15 {Tags:[\"gm4_sr_extra_mob\"]}\nscoreboard players set $mob_extras gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/skeleton/base.mcfunction",
    "content": "# calculate modifiers for newly spawned skeleton / stray\n# @s = skeleton types\n# at @s\n# run from mob/init/mob_type\n\n# elites - don't get other modifiers - 5% of spawns\nexecute store result score $nearby_elites gm4_mu_data if entity @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_elite,distance=..64]\nexecute if score $nearby_elites gm4_mu_data matches ..3 if predicate {condition:\"minecraft:random_chance\",chance:0.05} run tag @s[tag=!gm4_sr_extra_mob] add gm4_mu_elite\nexecute if entity @s[tag=gm4_mu_elite,tag=!gm4_sr_from_spawner] run return run function gm4_monsters_unbound:mob/init/elite/pick\n\n# | Biome Modifiers\n# snowy\nexecute if entity @s[type=stray,predicate=gm4_monsters_unbound:biome/snowy,predicate=!gm4_monsters_unbound:biome/growth] run loot replace entity @s weapon.offhand loot gm4_monsters_unbound:mob/equip_arrow/stray_snowy\n# mountainous\nexecute if predicate gm4_monsters_unbound:biome/mountainous positioned ~ ~35 ~ store result score $phantom_count gm4_mu_data if entity @e[type=phantom,distance=..32]\nexecute if score $spawn_phantoms gm4_mu_config matches 1 if score $phantom_count gm4_mu_data < $mob_limit.phantom gm4_mu_config if predicate gm4_monsters_unbound:chance/spawn_phantom run function gm4_monsters_unbound:mob/init/mob_type/zombie/spawn_phantoms\n# flowering\nexecute if predicate {condition:\"minecraft:all_of\",terms:[{condition:\"minecraft:random_chance\",chance:0.85},{condition:\"minecraft:reference\",name:\"gm4_monsters_unbound:biome/flowering\"}]} run function gm4_monsters_unbound:mob/init/mob_type/skeleton/flowering\n# toxic\ntag @s add gm4_mu_self\nexecute if entity @s[type=bogged,predicate=gm4_monsters_unbound:biome/toxic] if predicate {condition:\"minecraft:random_chance\",chance:0.15} summon spider run function gm4_monsters_unbound:mob/init/mob_type/skeleton/toxic\ntag @s remove gm4_mu_self\n# burning\nexecute if predicate {condition:\"minecraft:all_of\",terms:[{condition:\"minecraft:random_chance\",chance:0.15},{condition:\"minecraft:reference\",name:\"gm4_monsters_unbound:biome/burned\"}]} run enchant @s flame 1\n# growth\nexecute if entity @s[type=!bogged,predicate=gm4_monsters_unbound:biome/growth] run function gm4_monsters_unbound:mob/init/mob_type/skeleton/growth\n# dripstone caves\nexecute if predicate {condition:\"minecraft:all_of\",terms:[{condition:\"location_check\",predicate:{biomes:\"dripstone_caves\"}},{condition:\"random_chance\",chance:0.6}]} run item replace entity @s weapon.mainhand with stone_pickaxe\n# underground\nexecute if predicate gm4_monsters_unbound:technical/underground if predicate {condition:\"minecraft:random_chance\",chance:0.4} run function gm4_monsters_unbound:mob/init/mob_type/skeleton/underground\n\n# soul sand valley\nexecute if biome ~ ~ ~ soul_sand_valley run effect give @s fire_resistance infinite 0 true\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/skeleton/flowering.mcfunction",
    "content": "# replace skeleton with zombie\n# @s = skeleton\n# at @s\n# run from mob/init/mob_type/skeleton/base\n\nsummon zombie ~.1 ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nscoreboard players set $mob_extras gm4_sr_data 1\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $removed_mob gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/skeleton/growth.mcfunction",
    "content": "# apply growth effects to skeleton\n# @s = skeleton\n# at @s\n# run from mob/init/mob_type/skeleton/base\n\nitem replace entity @s weapon.mainhand with air\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.growth 4 add_value\nattribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:stat_change.growth 0.25 add_multiplied_base\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/skeleton/toxic.mcfunction",
    "content": "# make the bogged ride a spider\n# @s = bogged\n# at @s\n# run from mob/init/mob_type/skeleton/base\n\ntag @s add gm4_sr_extra_mob\nride @e[tag=gm4_mu_self,distance=..0.1,limit=1] mount @s\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/skeleton/underground.mcfunction",
    "content": "# apply an underground buff\n# @s = skeleton\n# at @s\n# run from mob/init/mob_type/skeleton/base\n\nexecute store result score $buff_picked gm4_mu_data run random value 1..4\n\nexecute if score $buff_picked gm4_mu_data matches 1 run effect give @s regeneration infinite 0\nexecute if score $buff_picked gm4_mu_data matches 2 run scoreboard players add @s[tag=!gm4_mu_elite.split_entity] gm4_sr_arrow.damage_change 4\nexecute if score $buff_picked gm4_mu_data matches 3 run scoreboard players remove @s gm4_sr_arrow.fire_delay 1\nexecute if score $buff_picked gm4_mu_data matches 4 run item replace entity @s weapon.mainhand with stone_sword\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/cave_spider.mcfunction",
    "content": "# calculate modifiers for newly spawned cave spider\n# @s = cave spider\n# at @s\n# run from mob/init/mob_type\n\n# | Biome Modifiers\n# mountainous\nexecute if predicate {condition:\"minecraft:all_of\",terms:[{condition:\"minecraft:random_chance\",chance:0.40},{condition:\"minecraft:reference\",name:\"gm4_monsters_unbound:biome/mountainous\"}]} run effect give @s speed infinite 0\n# burned\nexecute if predicate {condition:\"minecraft:all_of\",terms:[{condition:\"minecraft:random_chance\",chance:0.50},{condition:\"minecraft:reference\",name:\"gm4_monsters_unbound:biome/burned\"}]} run effect give @s fire_resistance infinite 0\n# toxic\ntag @s[predicate=gm4_monsters_unbound:biome/toxic] add gm4_mu_toxic_attack\n# growth\nexecute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/growth] store success score $mob_extras gm4_sr_data run summon cave_spider ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/growth] if predicate {condition:\"minecraft:random_chance\",chance:0.60} store success score $mob_extras gm4_sr_data run summon cave_spider ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\n# dripstone caves\nexecute if biome ~ ~ ~ dripstone_caves run attribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.dripstone_caves 1 add_multiplied_total\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/gargantuan.mcfunction",
    "content": "# make spider gargantuan\n# @s = spider\n# at @s\n# run from mob/init/mob_type/spider/spider\n# run from mob/init/mob_type/spider/underground/pick\n\nattribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:stat_change.gargantuan 0.25 add_multiplied_total\nattribute @s minecraft:scale modifier add gm4_monsters_unbound:stat_change.gargantuan 0.25 add_multiplied_total\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.gargantuan 0.75 add_multiplied_total\neffect give @s weaving infinite 0\nteam join gm4_mu_elite.gargantuan\ntag @s add gm4_mu_elite\ntag @s add gm4_mu_elite.gargantuan\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/lush_caves.mcfunction",
    "content": "# replace spider with 4 silverfish\n# @s = spider\n# at @s\n# run from mob/init/mob_type/spider/spider\n\nsummon silverfish ~0.15 ~ ~0.15 {Tags:[\"gm4_sr_extra_mob\"]}\nsummon silverfish ~0.15 ~ ~-0.15 {Tags:[\"gm4_sr_extra_mob\"]}\nsummon silverfish ~-0.15 ~ ~0.15 {Tags:[\"gm4_sr_extra_mob\"]}\nsummon silverfish ~-0.15 ~ ~-0.15 {Tags:[\"gm4_sr_extra_mob\"]}\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $mob_extras gm4_sr_data 1\nscoreboard players set $removed_mob gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/spider.mcfunction",
    "content": "# calculate modifiers for newly spawned spider\n# @s = spider\n# at @s\n# run from mob/init/mob_type\n\n# | Biome Modifiers\n# snowy\nexecute if predicate {condition:\"minecraft:all_of\",terms:[{condition:\"minecraft:random_chance\",chance:0.15},{condition:\"minecraft:reference\",name:\"gm4_monsters_unbound:biome/snowy\"}]} run function gm4_monsters_unbound:mob/init/mob_type/spider/gargantuan\n# mountainous\nexecute if predicate {condition:\"minecraft:all_of\",terms:[{condition:\"minecraft:random_chance\",chance:0.40},{condition:\"minecraft:reference\",name:\"gm4_monsters_unbound:biome/mountainous\"}]} run effect give @s speed infinite 0\n# burned\nexecute if predicate {condition:\"minecraft:all_of\",terms:[{condition:\"minecraft:random_chance\",chance:0.50},{condition:\"minecraft:reference\",name:\"gm4_monsters_unbound:biome/burned\"}]} run effect give @s fire_resistance infinite 0\n# flowering \nexecute if biome ~ ~ ~ lush_caves if predicate {condition:\"minecraft:random_chance\",chance:0.50} run function gm4_monsters_unbound:mob/init/mob_type/spider/lush_caves\n# toxic\nexecute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/toxic] run function gm4_monsters_unbound:mob/init/mob_type/spider/toxic\n# growth\nexecute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/growth] store success score $mob_extras gm4_sr_data run summon spider ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/growth] if predicate {condition:\"minecraft:random_chance\",chance:0.60} store success score $mob_extras gm4_sr_data run summon spider ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\n# dripstone caves\nexecute if predicate {condition:\"minecraft:all_of\",terms:[{condition:\"minecraft:random_chance\",chance:0.1},{condition:\"minecraft:location_check\",predicate:{biomes:\"dripstone_caves\"}}]} run function gm4_monsters_unbound:mob/init/mob_type/spider/gargantuan\n# underground\nexecute if predicate {condition:\"minecraft:all_of\",terms:[{condition:\"minecraft:random_chance\",chance:0.25},{condition:\"minecraft:reference\",name:\"gm4_monsters_unbound:technical/underground\"}]} run function gm4_monsters_unbound:mob/init/mob_type/spider/underground/pick\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/toxic.mcfunction",
    "content": "# summon 3 cave spiders\n# @s = spider\n# at @s\n# run from mob/init/mob_type/spider/spider\n\nsummon cave_spider ~ ~ ~0.15 {Tags:[\"gm4_sr_extra_mob\"],attributes:[{id:\"minecraft:max_health\",base:9}]}\nsummon cave_spider ~0.15 ~ ~-0.15 {Tags:[\"gm4_sr_extra_mob\"],attributes:[{id:\"minecraft:max_health\",base:9}]}\nsummon cave_spider ~-0.15 ~ ~-0.15 {Tags:[\"gm4_sr_extra_mob\"],attributes:[{id:\"minecraft:max_health\",base:9}]}\nscoreboard players set $mob_extras gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/underground/pick.mcfunction",
    "content": "# pick underground buff\n# @s = spider\n# at @s\n# run from mob/init/mob_type/spider/spider\n\nexecute store result score $buff_picked gm4_mu_data run random value 1..3\n\nexecute if score $buff_picked gm4_mu_data matches 1 run effect give @s invisibility infinite 0\nexecute if score $buff_picked gm4_mu_data matches 2 run function gm4_monsters_unbound:mob/init/mob_type/spider/gargantuan\nexecute if score $buff_picked gm4_mu_data matches 3 run function gm4_monsters_unbound:mob/init/mob_type/spider/underground/replace_with_cave_spider\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/underground/replace_with_cave_spider.mcfunction",
    "content": "# replace with cave spider\n# @s = spider\n# at @s\n# run from mob/init/mob_type/spider/underground/pick\n\nsummon cave_spider ~.1 ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nscoreboard players set $mob_extras gm4_sr_data 1\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $removed_mob gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/base.mcfunction",
    "content": "# calculate modifiers for newly spawned zombie / zombie villager\n# @s = zombie types\n# at @s\n# run from mob/init/mob_type\n\n# elites - don't get other modifiers - 5% of spawns (replaces baby zombies)\nexecute if entity @s[tag=gm4_sr_was_baby,tag=!gm4_sr_from_spawner] store result score $nearby_elites gm4_mu_data if entity @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_elite,distance=..64]\nexecute if entity @s[tag=gm4_sr_was_baby,tag=!gm4_sr_from_spawner] if score $nearby_elites gm4_mu_data matches ..3 run return run function gm4_monsters_unbound:mob/init/elite/pick\n\n# | Biome Modifiers\n# snowy\nexecute if predicate gm4_monsters_unbound:biome/snowy run function gm4_monsters_unbound:mob/init/mob_type/zombie/snowy\ntag @s[predicate=gm4_monsters_unbound:biome/snowy] add gm4_mu_slowing_attack\n# mountainous\nexecute if predicate gm4_monsters_unbound:biome/mountainous run function gm4_monsters_unbound:mob/init/mob_type/zombie/mountainous\n# burned\nexecute if entity @s[type=husk,predicate=gm4_monsters_unbound:biome/burned] run function gm4_monsters_unbound:mob/init/mob_type/zombie/burned_husk\n# flowering\nexecute if predicate gm4_monsters_unbound:biome/flowering run tag @s add gm4_mu_spore_zombie\nexecute if entity @s[tag=gm4_mu_spore_zombie] run function gm4_monsters_unbound:mob/init/mob_type/zombie/flowering\n# toxic\ntag @s[predicate=gm4_monsters_unbound:biome/toxic] add gm4_mu_weakness_attack\neffect give @s[predicate=gm4_monsters_unbound:biome/toxic] infested infinite 0\n# reef\nexecute if entity @s[type=drowned,predicate=gm4_monsters_unbound:biome/reef] run function gm4_monsters_unbound:mob/init/mob_type/zombie/reef_drowned\n# growth\nexecute if entity @s[type=!zombie_villager,tag=!gm4_mu_spore_zombie,predicate=gm4_monsters_unbound:biome/growth] run function gm4_monsters_unbound:mob/init/mob_type/zombie/growth\n# dripstone caves\nexecute if entity @s[tag=!gm4_sr_extra_mob] if biome ~ ~ ~ dripstone_caves run function gm4_monsters_unbound:mob/init/mob_type/zombie/dripstone_caves/try\n# underground (not dripstone caves)\nexecute if predicate {condition:\"all_of\",terms:[{condition:\"reference\",name:\"gm4_monsters_unbound:technical/underground\"},{condition:\"inverted\",term:{condition:\"location_check\",predicate:{\"biomes\":\"dripstone_caves\"}}},{condition:\"random_chance\",chance:0.5}]} run function gm4_monsters_unbound:mob/init/mob_type/zombie/underground/pick\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/burned_husk.mcfunction",
    "content": "# apply burned husk effects\n# @s = husk\n# at @s\n# run from mob/init/mob_type/zombie/base\n\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.burned_husk -0.65 add_multiplied_total\nattribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:stat_change.burned_husk -0.25 add_multiplied_total\nexecute at @p[gamemode=!spectator] store result score $husk_count gm4_mu_data if entity @e[type=husk,distance=..128]\nexecute if entity @s[tag=!gm4_sr_extra_mob] unless score $husk_count gm4_mu_data > $mob_limit.husk_army gm4_mu_config run function gm4_monsters_unbound:mob/init/mob_type/zombie/burned_husk_army\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/burned_husk_army.mcfunction",
    "content": "# spawn up to 11 extra husks\n# @s = husk\n# at @s\n# run from mob/init/mob_type/zombie/burned_husk\n\nexecute if block ~1 ~ ~ #gm4:no_collision if block ~1 ~1 ~ #gm4:no_collision run summon husk ~1 ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if block ~-1 ~ ~ #gm4:no_collision if block ~-1 ~1 ~ #gm4:no_collision run summon husk ~-1 ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if block ~ ~ ~1 #gm4:no_collision if block ~ ~1 ~1 #gm4:no_collision run summon husk ~ ~ ~1 {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if block ~ ~ ~-1 #gm4:no_collision if block ~ ~1 ~-1 #gm4:no_collision run summon husk ~ ~ ~-1 {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.5} if block ~1 ~ ~1 #gm4:no_collision if block ~1 ~1 ~1 #gm4:no_collision run summon husk ~1 ~ ~1 {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.5} if block ~-1 ~ ~-1 #gm4:no_collision if block ~-1 ~1 ~-1 #gm4:no_collision run summon husk ~-1 ~ ~-1 {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.5} if block ~1 ~ ~-1 #gm4:no_collision if block ~1 ~1 ~-1 #gm4:no_collision run summon husk ~1 ~ ~-1 {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.25} if block ~-1 ~ ~1 #gm4:no_collision if block ~-1 ~1 ~1 #gm4:no_collision run summon husk ~-1 ~ ~1 {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.25} if block ~2 ~ ~-1 #gm4:no_collision if block ~2 ~1 ~-1 #gm4:no_collision run summon husk ~2 ~ ~-1 {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.25} if block ~-1 ~ ~2 #gm4:no_collision if block ~-1 ~1 ~2 #gm4:no_collision run summon husk ~-1 ~ ~2 {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.25} if block ~2 ~ ~2 #gm4:no_collision if block ~2 ~1 ~2 #gm4:no_collision run summon husk ~2 ~ ~2 {Tags:[\"gm4_sr_extra_mob\"]}\n\nscoreboard players set $mob_extras gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/dripstone_caves/place.mcfunction",
    "content": "# place dripstone trap\n# @s = zombie\n# at @s positioned ~ ~x ~\n# run from mob/init/mob_type/zombie/dripstone_caves/raycast\n\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $removed_mob gm4_sr_data 1\n\nscoreboard players set $raycast_limit gm4_mu_data -1\n\nexecute align y run summon marker ~ ~ ~ {Tags:[\"gm4_mu_trap\",\"gm4_mu_dripstone_trap\"],CustomName:'{\"text\":\"GM4 Monsters Unbound - Dripstone Trap\"}'}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/dripstone_caves/raycast.mcfunction",
    "content": "# zombie dripstone try to find place for a trap\n# @s = zombie\n# at @s positioned ~ ~x ~\n# run from mob/init/mob_type/zombie/dripstone_caves/try\n# run from here\n\nexecute if block ~ ~1 ~ #gm4_monsters_unbound:dripstone run return run function gm4_monsters_unbound:mob/init/mob_type/zombie/dripstone_caves/place\n\nscoreboard players remove $raycast_limit gm4_mu_data 1\nexecute if score $raycast_limit gm4_mu_data matches 1.. positioned ~ ~1 ~ if block ~ ~ ~ #gm4:no_collision run function gm4_monsters_unbound:mob/init/mob_type/zombie/dripstone_caves/raycast\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/dripstone_caves/try.mcfunction",
    "content": "# zombie dripstone try to place a trap\n# @s = zombie\n# at @s\n# run from mob/init/mob_type/zombie/base\n\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $removed_mob gm4_sr_data 1\n\nscoreboard players set $raycast_limit gm4_mu_data 32\nexecute positioned ~ ~1 ~ run function gm4_monsters_unbound:mob/init/mob_type/zombie/dripstone_caves/raycast\n\n# stop if the raycast was succesful\nexecute if score $raycast_limit gm4_mu_data matches -1 run return 0\n\nscoreboard players set $spawned_mob gm4_mu_data 0\nexecute if block ~.875 ~ ~.875 #gm4:no_collision if block ~.875 ~ ~-.875 #gm4:no_collision if block ~-.875 ~ ~.875 #gm4:no_collision if block ~-.875 ~ ~-.875 #gm4:no_collision store success score $spawned_mob gm4_mu_data run summon spider ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if score $spawned_mob gm4_mu_data matches 0 run summon skeleton ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nscoreboard players set $mob_extras gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/equip_shield.mcfunction",
    "content": "# give the zombie a shield and bonus stats\n# @s = zombie\n# at @s\n# run from mob/init/mob_type/zombie/underground/pick\n# run from mob/init/mob_type/zombie/mountainous\n# run from mob/init/mob_type/zombie/snowy\n\ntag @s add gm4_mu_shielded_zombie\nitem replace entity @s weapon.offhand with shield\nattribute @s minecraft:knockback_resistance modifier add gm4_monsters_unbound:stat_change.shield 0.9 add_value\nattribute @s minecraft:armor modifier add gm4_monsters_unbound:stat_change.shield 20 add_value\nattribute @s minecraft:armor_toughness modifier add gm4_monsters_unbound:stat_change.shield 10 add_value\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/flowering.mcfunction",
    "content": "# set flowering zombie stats\n# @s = zombie\n# at @s\n# run from mob/init/mob_type/zombie/base\n\n# in cherry grove use cherry leaves\nexecute if biome ~ ~ ~ cherry_grove run tag @s add gm4_mu_spore_zombie.cherry\n\n# lower max health\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.spore_zombie -0.2 add_multiplied_total\n\n# put spore on head and store generation\nloot replace entity @s armor.head loot gm4_monsters_unbound:mob/equip_armor/spore\nexecute store result entity @s equipment.head.components.\"minecraft:custom_data\".gm4_mu_spore.generation int 1 run scoreboard players add @s gm4_mu_generation 1\n\n# let generation determine dropchance of spore\nscoreboard players set $spore_dropchange gm4_mu_data 11\nexecute store result entity @s drop_chances.head float 0.1 run scoreboard players operation $spore_dropchange gm4_mu_data -= @s gm4_mu_generation\n\n# remove any possible elite triggers\ndata remove entity @s attributes[{id:\"minecraft:max_health\"}].modifiers[{id:\"minecraft:leader_zombie_bonus\"}]\ndata modify entity @s IsBaby set value 0b\ntag @s remove gm4_sr_was_baby\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/growth.mcfunction",
    "content": "# apply growth effects to zombie\n# @s = zombie\n# at @s\n# run from mob/init/mob_type/zombie/base\n\n\nexecute if biome ~ ~ ~ mangrove_swamp run summon bogged ~.05 ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if biome ~ ~ ~ snowy_taiga run summon stray ~.05 ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nexecute unless biome ~ ~ ~ mangrove_swamp unless biome ~ ~ ~ snowy_taiga run summon skeleton ~.05 ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nsummon skeleton ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nsummon skeleton ~-.05 ~ ~.05 {Tags:[\"gm4_sr_extra_mob\"]}\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $mob_extras gm4_sr_data 1\nscoreboard players set $removed_mob gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/mountainous.mcfunction",
    "content": "# set mountain zombie stats\n# @s = zombie\n# at @s\n# run from mob/init/mob_type/zombie/base\n\nexecute positioned ~ ~35 ~ store result score $phantom_count gm4_mu_data if entity @e[type=phantom,distance=..32]\nexecute if score $spawn_phantoms gm4_mu_config matches 1 if score $phantom_count gm4_mu_data < $mob_limit.phantom gm4_mu_config if predicate gm4_monsters_unbound:chance/spawn_phantom run function gm4_monsters_unbound:mob/init/mob_type/zombie/spawn_phantoms\nattribute @s minecraft:attack_knockback modifier add gm4_monsters_unbound:stat_change.mountainous 1 add_value\nattribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:stat_change.mountainous 1 add_value\n\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.15} run function gm4_monsters_unbound:mob/init/mob_type/zombie/equip_shield\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/reef_drowned.mcfunction",
    "content": "# apply reef effects to drowned\n# @s = drowned\n# at @s\n# run from mob/init/mob_type/zombie/base\n\nattribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:stat_change.reef 1 add_multiplied_base\nattribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:stat_change.reef 2 add_value\n\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.6} if entity @s[tag=!gm4_sr_extra_mob] store success score $mob_extras gm4_sr_data run summon drowned ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.6} if entity @s[tag=!gm4_sr_extra_mob] store success score $mob_extras gm4_sr_data run summon drowned ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"]}\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.45} if entity @s[tag=!gm4_sr_extra_mob] store success score $mob_extras gm4_sr_data run summon guardian ~ ~ ~\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.45} if entity @s[tag=!gm4_sr_extra_mob] store success score $mob_extras gm4_sr_data run summon guardian ~ ~ ~\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.45} if entity @s[tag=!gm4_sr_extra_mob] store success score $mob_extras gm4_sr_data run summon guardian ~ ~ ~\n\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.33} run item replace entity @s[tag=!gm4_sr_extra_mob] weapon.mainhand with trident\n\nscoreboard players set @s gm4_sr_arrow.fire_delay 0\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/snowy.mcfunction",
    "content": "# set snowy zombie stats\n# @s = zombie\n# at @s\n# run from mob/init/mob_type/zombie/base\n\nattribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:stat_change.snowy -0.15 add_multiplied_total\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.snowy 0.2 add_multiplied_total\n\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.05} run function gm4_monsters_unbound:mob/init/mob_type/zombie/equip_shield\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/spawn_phantoms.mcfunction",
    "content": "# spawn phantoms\n# @s = zombie / skeleton\n# at @s\n# run from mob/init/mob_type/zombie/base\n# run from mob/init/mob_type/skeleton/base\n\nexecute if block ~ ~35 ~ #gm4:no_collision store success score $mob_extras gm4_sr_data run summon phantom ~ ~35 ~ {Tags:[\"gm4_sr_extra_mob\",\"gm4_mu_phantom\"]}\nexecute if block ~2 ~35 ~ #gm4:no_collision store success score $mob_extras gm4_sr_data run summon phantom ~2 ~35 ~ {Tags:[\"gm4_sr_extra_mob\",\"gm4_mu_phantom\"]}\nexecute if block ~-1 ~35 ~2 #gm4:no_collision store success score $mob_extras gm4_sr_data run summon phantom ~-1 ~35 ~2 {Tags:[\"gm4_sr_extra_mob\",\"gm4_mu_phantom\"]}\nexecute if predicate {condition:\"random_chance\",chance:0.5} if block ~-2 ~35 ~-1 #gm4:no_collision store success score $mob_extras gm4_sr_data run summon phantom ~-2 ~35 ~-1 {Tags:[\"gm4_sr_extra_mob\",\"gm4_mu_phantom\"]}\nexecute if predicate {condition:\"random_chance\",chance:0.5} if block ~2 ~35 ~-2 #gm4:no_collision store success score $mob_extras gm4_sr_data run summon phantom ~2 ~35 ~-2 {Tags:[\"gm4_sr_extra_mob\",\"gm4_mu_phantom\"]}\nexecute if predicate {condition:\"random_chance\",chance:0.5} if block ~-2 ~35 ~2 #gm4:no_collision store success score $mob_extras gm4_sr_data run summon phantom ~-2 ~35 ~2 {Tags:[\"gm4_sr_extra_mob\",\"gm4_mu_phantom\"]}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/underground/offhand_weapon.mcfunction",
    "content": "# give the zombie an offhand weapon and bonus stats\n# @s = zombie\n# at @s\n# run from mob/init/mob_type/zombie/underground/pick\n\ntag @s add gm4_mu_offhanding_zombie\nitem replace entity @s weapon.offhand with stone_sword\nattribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:stat_change.offhand_weapon 1.5 add_value\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/underground/pick.mcfunction",
    "content": "# pick underground buff\n# @s = zombie\n# at @s\n# run from mob/init/mob_type/zombie/base\n\nexecute store result score $buff_picked gm4_mu_data run random value 1..6\n\nexecute if score $buff_picked gm4_mu_data matches 1 run effect give @s resistance infinite 0\nexecute if score $buff_picked gm4_mu_data matches 2 run effect give @s speed infinite 0\nexecute if score $buff_picked gm4_mu_data matches 3 run effect give @s regeneration infinite 0\nexecute if score $buff_picked gm4_mu_data matches 4 run function gm4_monsters_unbound:mob/init/mob_type/zombie/underground/offhand_weapon\nexecute if score $buff_picked gm4_mu_data matches 5 run function gm4_monsters_unbound:mob/init/mob_type/zombie/equip_shield\nexecute if score $buff_picked gm4_mu_data matches 6 run function gm4_monsters_unbound:mob/init/mob_type/zombie/underground/replace_with_skeleton\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/underground/replace_with_skeleton.mcfunction",
    "content": "# replace with 2 melee skeletons\n# @s = zombie\n# at @s\n# run from mob/init/mob_type/zombie/underground/pick\n\n# gm4_sr_melee_skeleton tag is to avoid survival_refightalized treating this skeleton as holding a bow\nsummon skeleton ~.05 ~ ~ {Tags:[\"gm4_sr_extra_mob\",\"gm4_sr_melee_skeleton\"],equipment:{}}\nsummon skeleton ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\",\"gm4_sr_melee_skeleton\"],equipment:{}}\ntp @s ~ ~-2050 ~\nkill @s\nscoreboard players set $mob_extras gm4_sr_data 1\nscoreboard players set $removed_mob gm4_sr_data 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type.mcfunction",
    "content": "# check what mob is being processed\n# @s = mobs that can be buffed\n# at @s\n# run from mob/init/initialize\n# run from function call gm4_survival_refightalized:init_mob, from gm4_survival_refightalized:mob/init/initiate\n\n# zombie, zombie_villager, husk, drowned\nexecute if entity @s[type=#gm4_monsters_unbound:zombie_types] run return run function gm4_monsters_unbound:mob/init/mob_type/zombie/base\n# skeleton, bogged, stray\nexecute if entity @s[type=#gm4_monsters_unbound:skeleton_types,type=!wither_skeleton] run return run function gm4_monsters_unbound:mob/init/mob_type/skeleton/base\nexecute if entity @s[type=spider] run return run function gm4_monsters_unbound:mob/init/mob_type/spider/spider\nexecute if entity @s[type=creeper] run return run function gm4_monsters_unbound:mob/init/mob_type/creeper/base\nexecute if entity @s[type=cave_spider] run return run function gm4_monsters_unbound:mob/init/mob_type/spider/cave_spider\nexecute if entity @s[type=enderman] run return run function gm4_monsters_unbound:mob/init/mob_type/enderman/base\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/attack_effect/charging_attack.mcfunction",
    "content": "# damage players hit by charging attacks\n# @s = player that was hit\n# at unspecified\nadvancement revoke @s only gm4_monsters_unbound:damaged/attack_effect/charging\n\nexecute as @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_charging_attack,limit=1,sort=nearest] run function gm4_monsters_unbound:mob/process/elite/zephyr/charge_complete\n\neffect give @s slowness 1 3 true\neffect give @s nausea 4 0 false\nsummon breeze_wind_charge ~ ~ ~ {Motion:[0.0d,-1.0d,0.0d]}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/attack_effect/slowing_attack.mcfunction",
    "content": "# slow players hit with slowing attack\n# @s = player that was hit\n# at unspecified\nadvancement revoke @s only gm4_monsters_unbound:damaged/attack_effect/slowing\n\nscoreboard players set $freeze_seconds gm4_mu_data 3\nfunction gm4_monsters_unbound:effect/freeze/apply_chill\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/attack_effect/toxic_attack.mcfunction",
    "content": "# weakness and hunger players hit with a toxic attack\n# @s = player that was hit\n# at unspecified\nadvancement revoke @s only gm4_monsters_unbound:damaged/attack_effect/toxic\n\n# scale effect with world difficulty (on easy no effect is applied)\nexecute store result score $worlddiff gm4_mu_data run difficulty\n\nexecute if score $worlddiff gm4_mu_data matches 2 run effect give @s[tag=!gm4_mu_immune_weakness] weakness 2 0\nexecute if score $worlddiff gm4_mu_data matches 3 run effect give @s[tag=!gm4_mu_immune_weakness] weakness 4 0\n\nexecute if score $worlddiff gm4_mu_data matches 2 run effect give @s[tag=!gm4_mu_immune_hunger] hunger 2 2\nexecute if score $worlddiff gm4_mu_data matches 3 run effect give @s[tag=!gm4_mu_immune_hunger] hunger 4 2\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/attack_effect/weakness_attack.mcfunction",
    "content": "# weaken players hit with weakness attack\n# @s = player that was hit\n# at unspecified\nadvancement revoke @s only gm4_monsters_unbound:damaged/attack_effect/weakness\n\neffect give @s[tag=!gm4_mu_immune_weakness] weakness 15 0\neffect give @s[tag=!gm4_mu_immune_hunger] hunger 15 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/cloaked_creeper.mcfunction",
    "content": "# uncloak creeper if a player is nearby\n# @s = cloaked creeper\n# at @s\n# run from main\n\neffect clear @s invisibility\ntag @s remove gm4_mu_cloaked_creeper\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/blazing/flare_damage.mcfunction",
    "content": "# damage player hit by flare\n# @s = player\n# at near @s\n# run from mob/process/elite/blazing/flare_explode\n\nexecute store result score $showDeathMessages gm4_mu_data run gamerule show_death_messages\ngamerule show_death_messages false\ndamage @s 5 explosion\ntag @s add gm4_mu_self\nexecute if score $showDeathMessages gm4_mu_data matches 1 at @s unless entity @e[type=player,tag=gm4_mu_self,distance=..0.1,limit=1] run tellraw @a [\"\",{\"translate\":\"text.gm4.monsters_unbound.death.blazing_elite_flare\",\"fallback\":\"%s was blown up by a Blazing Flare\",with:[{\"selector\":\"@s\"}]}]\ntag @s remove gm4_mu_self\nexecute if score $showDeathMessages gm4_mu_data matches 1 run gamerule show_death_messages true\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/blazing/flare_explode.mcfunction",
    "content": "# explode the flare\n# @s = flare block_display\n# at @s\n# run from mob/process/elite/blazing/process_flare\n\nparticle flame ~ ~ ~ 0.01 0.01 0.01 0.1 32\nparticle explosion ~ ~ ~ 0 0 0 40 0\n\nplaysound entity.generic.explode hostile @a ~ ~ ~ 1 1.4\nplaysound item.firecharge.use hostile @a ~ ~ ~ 1 0.7\n\n# hit players\ntag @s add gm4_mu_self\nexecute positioned ~-.22 ~-.22 ~-.22 as @a[dx=0,dy=0,dz=0] positioned ~-0.34 ~-0.34 ~-0.34 as @s[dx=0,dy=0,dz=0] run function gm4_monsters_unbound:mob/process/elite/blazing/flare_damage\ntag @s remove gm4_mu_self\n\nkill @s\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/blazing/init_flare.mcfunction",
    "content": "# init flare block_display\n# @s = flare block_display\n# at @s\n# run from mob/process/elite/blazing/process\n\ndata merge entity @s {Tags:[\"gm4_mu_elite_flare\"],teleport_duration:1,brightness:{sky:15,block:15},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[-0.125f,-0.125f,-0.125f],scale:[0.25f,0.25f,0.25f]},block_state:{Name:\"minecraft:magma_block\"}}\n\nplaysound minecraft:entity.blaze.shoot hostile @a ~ ~ ~ 1 1.2\n\ntp @s ~ ~ ~ ~ ~\nscoreboard players set @s gm4_mu_data 0\n\nexecute unless score $keep_tick.elite_process_flare gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/blazing_flare 1t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/blazing/process.mcfunction",
    "content": "# process blazing elite\n# @s = blazing elite\n# at @s\n# run from mob/process/elite/check_type\n\nscoreboard players set $has_target gm4_mu_data 0\nexecute on target if entity @s[type=player] run scoreboard players set $has_target gm4_mu_data 1\nexecute if score $has_target gm4_mu_data matches 1 run scoreboard players add @s gm4_mu_timer 1\nexecute if score $has_target gm4_mu_data matches 0 run scoreboard players set @s[scores={gm4_mu_timer=3..5}] gm4_mu_timer 6\nscoreboard players set @s[scores={gm4_mu_timer=10..}] gm4_mu_timer 0\n\nexecute if score @s gm4_mu_timer matches 3 anchored eyes positioned ^ ^-0.25 ^ on target facing entity @s eyes rotated ~ -75 summon block_display run function gm4_monsters_unbound:mob/process/elite/blazing/init_flare\nexecute if score @s[type=#gm4_monsters_unbound:zombie_types] gm4_mu_timer matches 4 anchored eyes positioned ^ ^-0.25 ^ on target facing entity @s eyes rotated ~90 -75 summon block_display run function gm4_monsters_unbound:mob/process/elite/blazing/init_flare\nexecute if score @s[type=#gm4_monsters_unbound:zombie_types] gm4_mu_timer matches 5 anchored eyes positioned ^ ^-0.25 ^ on target facing entity @s eyes rotated ~-90 -75 summon block_display run function gm4_monsters_unbound:mob/process/elite/blazing/init_flare\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/blazing/process_flare.mcfunction",
    "content": "# process the flare\n# @s = flare block_display\n# at @s\n# run from clocks/elite/blazing_flare\n\n# particles\nparticle flame ^ ^ ^0.0125 0.12 0.12 0.12 0.015 2\n\n# track towards closest player until nearby, then fly off\nexecute if score @s gm4_mu_data matches 0 positioned ^ ^ ^0.7 if entity @p[gamemode=!spectator,gamemode=!creative,distance=..2] run scoreboard players set @s gm4_mu_data 1\nexecute if score @s[scores={gm4_mu_data=0}] gm4_mu_timer matches ..60 facing entity @p[gamemode=!spectator,gamemode=!creative] eyes positioned ^ ^ ^50 rotated as @s positioned ^ ^ ^500 facing entity @s eyes facing ^ ^ ^-1 positioned as @s run tp @s ~ ~ ~ ~ ~ \ntp @s[scores={gm4_mu_timer=..10}] ^ ^ ^0.35\ntp @s[scores={gm4_mu_timer=11..60}] ^ ^ ^0.25\ntp @s[scores={gm4_mu_timer=61..70}] ^ ^ ^0.15\ntp @s[scores={gm4_mu_timer=71..}] ^ ^ ^0.05\n\nscoreboard players set $flare_hit gm4_mu_data 0\n# hit players\nexecute positioned ~-.15 ~-.15 ~-.15 as @a[dx=0,dy=0,dz=0] positioned ~-0.55 ~-0.55 ~-0.55 if entity @s[dx=0,dy=0,dz=0] run scoreboard players set $flare_hit gm4_mu_data 1\n# hit terrain\nexecute unless block ~ ~ ~ #gm4:no_collision run scoreboard players set $flare_hit gm4_mu_data 1\n# timer ran out\nscoreboard players add @s gm4_mu_timer 1\nexecute if score @s gm4_mu_timer matches 80.. run scoreboard players set $flare_hit gm4_mu_data 1\n# explode when something is hit\nexecute if score $flare_hit gm4_mu_data matches 1 run return run function gm4_monsters_unbound:mob/process/elite/blazing/flare_explode\n\n# keep running\nscoreboard players set $keep_tick.elite_process_flare gm4_mu_keep_tick 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/check_type.mcfunction",
    "content": "# process elites\n# @s = elite mob\n# at @s\n# run from main\n\nexecute if entity @s[tag=gm4_mu_elite.mending] run function gm4_monsters_unbound:mob/process/elite/mending/process\nexecute if entity @s[tag=gm4_mu_elite.blazing] run function gm4_monsters_unbound:mob/process/elite/blazing/process\nexecute if entity @s[tag=gm4_mu_elite.zephyr] run function gm4_monsters_unbound:mob/process/elite/zephyr/process\nexecute if entity @s[tag=gm4_mu_elite.gargantuan] run function gm4_monsters_unbound:mob/process/elite/gargantuan/process\nexecute if entity @s[tag=gm4_mu_elite.pearlescent] run function gm4_monsters_unbound:mob/process/elite/pearlescent/process\nexecute if entity @s[tag=gm4_mu_elite.splitting] run function gm4_monsters_unbound:mob/process/elite/splitting/process\nexecute if entity @s[tag=gm4_mu_elite.volatile] run function gm4_monsters_unbound:mob/process/elite/volatile/process\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/activate.mcfunction",
    "content": "# activate gargantuan elite ground slam\n# @s = gargantuan elite\n# at @s\n# run from mob/process/elite/check_type\n\nattribute @s minecraft:follow_range modifier remove gm4_monsters_unbound:elite_buff.giant.charging\nattribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.giant.charging\nplaysound minecraft:entity.zombie.attack_wooden_door hostile @a ~ ~ ~ 1.25 0\n\nexecute store result storage gm4_monsters_unbound:temp deal.damage float 1.75 run attribute @s minecraft:attack_damage get\n\ntag @s add gm4_mu_self\nexecute as @a[distance=..7,gamemode=!spectator] run function gm4_monsters_unbound:mob/process/elite/gargantuan/player_hit with storage gm4_monsters_unbound:temp deal\ntag @s remove gm4_mu_self\n\ndata remove storage gm4_monsters_unbound:temp deal\n\nscoreboard players set $particle_ring gm4_mu_data 72\nexecute rotated 0 0 run function gm4_monsters_unbound:mob/process/elite/gargantuan/particle_ring_big\n\nscoreboard players set @s gm4_mu_timer -6\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/eval_stats.mcfunction",
    "content": "# set gargantuan elite stats\n# @s = gargantuan elite\n# at @s\n# run from mob/process/elite/gargantuan/update_stats\n\n$attribute @s movement_speed modifier add gm4_monsters_unbound:elite_buff.giant.health_reduction_stats $(speed) add_multiplied_total\n$attribute @s attack_damage modifier add gm4_monsters_unbound:elite_buff.giant.health_reduction_stats $(damage) add_multiplied_total\n$attribute @s knockback_resistance modifier add gm4_monsters_unbound:elite_buff.giant.health_reduction_stats $(knockback_resistance) add_value\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/particle_ring.mcfunction",
    "content": "# show a particle ring for gargantuan elite ground slam\n# @s = gargantuan elite\n# at @s\n# run from mob/process/elite/gargantuan/process\n# run from here\n\nparticle block{block_state:\"chest\"} ^ ^0.2 ^7 0.15 0.15 0.15 0.5 2\nparticle block{block_state:\"chest\"} ^ ^0.4 ^7 0.15 0.15 0.15 0.5 2\nparticle block{block_state:\"chest\"} ^ ^0.6 ^7 0.15 0.15 0.15 0.5 2\n\nscoreboard players remove $particle_ring gm4_mu_data 1\nexecute if score $particle_ring gm4_mu_data matches 1.. rotated ~5 ~ run function gm4_monsters_unbound:mob/process/elite/gargantuan/particle_ring\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/particle_ring_big.mcfunction",
    "content": "# show a particle ring for gargantuan elite ground slam\n# @s = gargantuan elite\n# at @s\n# run from mob/process/elite/activate\n# run from run\n\nparticle block{block_state:\"chest\"} ^ ^ ^7 0.225 0.225 0.225 1 5\nparticle block{block_state:\"chest\"} ^ ^0.2 ^7 0.225 0.225 0.225 1 5\nparticle block{block_state:\"chest\"} ^ ^0.4 ^7 0.225 0.225 0.225 1 5\nparticle block{block_state:\"chest\"} ^ ^0.6 ^7 0.225 0.225 0.225 1 5\nparticle block{block_state:\"chest\"} ^ ^0.8 ^7 0.225 0.225 0.225 1 5\n\nscoreboard players remove $particle_ring gm4_mu_data 1\nexecute if score $particle_ring gm4_mu_data matches 1.. rotated ~5 ~ run function gm4_monsters_unbound:mob/process/elite/gargantuan/particle_ring_big\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/player_hit.mcfunction",
    "content": "# damage player from gargantuan ground slam\n# @s = player that got hit\n# at @s\n# run from mob/process/elite/gargantuan/activate\n\nparticle block{block_state:\"chest\"} ~ ~1.2 ~ 0.325 0.925 0.325 1 12\n\n$damage @s $(damage) mob_attack by @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_self,limit=1,distance=..7]\neffect give @s slowness 3 3\neffect give @s nausea 5 0\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/process.mcfunction",
    "content": "# process gargantuan elite\n# @s = gargantuan elite\n# at @s\n# run from mob/process/elite/check_type\n\n# check health\nexecute store result score $curr_health gm4_mu_data run data get entity @s Health 1000\nexecute unless score $curr_health gm4_mu_data = @s gm4_mu_data run function gm4_monsters_unbound:mob/process/elite/gargantuan/update_stats\n\n# no nearby players\nexecute unless score @s gm4_mu_timer matches 1.. unless entity @a[gamemode=!spectator,distance=..7] run return 0\n# otherwise 40% chance to start attack (60% to return and not use it)\nexecute unless score @s gm4_mu_timer matches 1.. if entity @a[gamemode=!spectator,distance=..7] if predicate {condition:\"minecraft:random_chance\",chance:0.6} run return 0\n\nscoreboard players add @s gm4_mu_timer 1\nscoreboard players set @s[scores={gm4_mu_timer=20..}] gm4_mu_timer 0\n\nscoreboard players set $particle_ring gm4_mu_data 72\nexecute if score @s gm4_mu_timer matches 2..4 rotated 0 0 run function gm4_monsters_unbound:mob/process/elite/gargantuan/particle_ring\n\nattribute @s[scores={gm4_mu_timer=1}] minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.giant.charging -1 add_multiplied_total\nattribute @s[scores={gm4_mu_timer=1}] minecraft:follow_range modifier add gm4_monsters_unbound:elite_buff.giant.charging -1 add_multiplied_total\n\nexecute if score @s gm4_mu_timer matches 2 run playsound minecraft:entity.zombie.attack_wooden_door hostile @a ~ ~ ~ 1 1.2\nexecute if score @s gm4_mu_timer matches 3 run playsound minecraft:entity.zombie.attack_wooden_door hostile @a ~ ~ ~ 1 1.4\nexecute if score @s gm4_mu_timer matches 4 run playsound minecraft:entity.zombie.attack_wooden_door hostile @a ~ ~ ~ 1 1.7\n\ndata modify entity @s[scores={gm4_mu_timer=4}] Motion set value [0d,0.5d,0d]\n\nexecute if score @s gm4_mu_timer matches 5 run function gm4_monsters_unbound:mob/process/elite/gargantuan/activate\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/update_stats.mcfunction",
    "content": "# update gargantuan elite stats\n# @s = gargantuan elite\n# at @s\n# run from mob/process/elite/gargantuan/process\n\nscoreboard players operation @s gm4_mu_data = $curr_health gm4_mu_data\nattribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.giant.health_reduction_stats\nattribute @s minecraft:attack_damage modifier remove gm4_monsters_unbound:elite_buff.giant.health_reduction_stats\nattribute @s minecraft:knockback_resistance modifier remove gm4_monsters_unbound:elite_buff.giant.health_reduction_stats\n\nexecute store result score $max_health gm4_mu_data run attribute @s minecraft:max_health get 10\nscoreboard players operation $curr_health gm4_mu_data /= $max_health gm4_mu_data\nscoreboard players set $curr_health_percent_lost gm4_mu_data 100\nscoreboard players operation $curr_health_percent_lost gm4_mu_data -= $curr_health gm4_mu_data\n\nexecute if score $curr_health_percent_lost gm4_mu_data matches 50.. run effect give @s[type=!#gm4_monsters_unbound:skeleton_types] minecraft:resistance infinite 0 true\nexecute if score $curr_health_percent_lost gm4_mu_data matches 75.. run effect give @s[type=!#gm4_monsters_unbound:skeleton_types] minecraft:resistance infinite 1 true\n\nexecute if score $curr_health_percent_lost gm4_mu_data matches 50.. run scoreboard players set @s[type=#gm4_monsters_unbound:skeleton_types] gm4_sr_arrow.fire_delay 4\nexecute if score $curr_health_percent_lost gm4_mu_data matches 75.. run scoreboard players set @s[type=#gm4_monsters_unbound:skeleton_types] gm4_sr_arrow.fire_delay 6\n\nexecute store result storage gm4_monsters_unbound:temp set.speed float 0.015 run scoreboard players get $curr_health_percent_lost gm4_mu_data\nexecute store result storage gm4_monsters_unbound:temp set.damage float 0.005 run scoreboard players get $curr_health_percent_lost gm4_mu_data\nexecute store result storage gm4_monsters_unbound:temp set.knockback_resistance float 0.0015 run scoreboard players add $curr_health_percent_lost gm4_mu_data 567\nfunction gm4_monsters_unbound:mob/process/elite/gargantuan/eval_stats with storage gm4_monsters_unbound:temp set\ndata remove storage gm4_monsters_unbound:temp set\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/glacial/death.mcfunction",
    "content": "# run on glacial elite death\n# @s = glacial elite\n# at @s\n# run from mob/process/elite/on_death/run\n\nsummon marker ~ ~-1 ~ {Tags:[\"gm4_mu_elite_death_marker\",\"gm4_mu_elite.glacial_processing\"]}\nexecute unless score $keep_tick.elite_glacial_death gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/glacial_death 1t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/glacial/explode.mcfunction",
    "content": "# explode the glacial bomb\n# @s = glacial elite death marker\n# at @s\n# run from mob/process/elite/glacial/process_explosion\n\nscoreboard players set $freeze_seconds gm4_mu_data 3\nexecute as @e[distance=..4.81,type=!#gm4:non_living,tag=!smithed.entity,tag=!smithed.strict] run function gm4_monsters_unbound:effect/freeze/apply\nexecute as @a[gamemode=!spectator,distance=..12] facing entity @s eyes positioned ^ ^ ^4.5 positioned ~-.05 ~-.05 ~-.05 if entity @s[dx=0,dy=0,dz=0] positioned ~-0.9 ~-0.9 ~-0.9 if entity @s[dx=0,dy=0,dz=0] run function gm4_monsters_unbound:effect/freeze/apply\nplaysound block.glass.break hostile @a[distance=..4.81] ~ ~ ~ 1 0.8\n\nkill @s\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/glacial/process_explosion.mcfunction",
    "content": "# process the glacial bomb\n# @s = glacial elite death marker\n# at @s\n# run from clocks/elite/glacial_death\n\n# before show warning\nparticle dust{color:[0.725,0.910,0.918],scale:3} ~ ~ ~ 0.04 0.04 0.04 0 4 normal\nparticle snowflake ~ ~ ~ 1.75 1.75 1.75 0 7 normal\nscoreboard players set $frost_ring_yaw gm4_mu_data 0\nexecute if score @s gm4_mu_data matches ..360 rotated 0 80 run function gm4_monsters_unbound:mob/process/elite/glacial/warning_yaw_loop\n\n# explode after 2 seconds\nscoreboard players add @s gm4_mu_data 20\n\nplaysound minecraft:block.snow.break hostile @a[distance=..4.81] ~ ~ ~ 1.55 1.2\nplaysound minecraft:block.snow.fall hostile @a[distance=..4.81] ~ ~ ~ 2 0.75\nplaysound minecraft:block.snow.fall hostile @a[distance=4.81..16] ~ ~ ~ 1 0.6\n\nexecute if score @s gm4_mu_data matches 400.. run return run function gm4_monsters_unbound:mob/process/elite/glacial/explode\nscoreboard players set $keep_tick.elite_glacial_death gm4_mu_keep_tick 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/glacial/warning_pitch_loop_big.mcfunction",
    "content": "# show warning particles\n# @s = glacial elite death marker\n# at @s\n# run from mob/process/elite/glacial/warning_yaw_loop\n# run from here\n\nparticle dust{color:[0.725,0.910,0.918],scale:2} ^ ^ ^4.8 0.02 0.02 0.02 0 1 normal\nscoreboard players remove $frost_ring_pitch gm4_mu_data 5\nexecute if score $frost_ring_pitch gm4_mu_data matches -85.. rotated ~5 ~-5 run function gm4_monsters_unbound:mob/process/elite/glacial/warning_pitch_loop_big\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/glacial/warning_pitch_loop_small.mcfunction",
    "content": "# show warning particles\n# @s = glacial elite death marker\n# at @s\n# run from mob/process/elite/glacial/warning_yaw_loop\n# run from here\n\nexecute if predicate {condition:\"minecraft:random_chance\",chance:0.15} run particle snowflake ^ ^ ^4.8 0.005 0.005 0.005 0 1 normal\nscoreboard players remove $frost_ring_pitch gm4_mu_data 5\nexecute if score $frost_ring_pitch gm4_mu_data matches -85.. rotated ~5 ~-5 run function gm4_monsters_unbound:mob/process/elite/glacial/warning_pitch_loop_small\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/glacial/warning_yaw_loop.mcfunction",
    "content": "# show warning particles\n# @s = glacial elite death marker\n# at @s\n# run from mob/process/elite/glacial/process_explosion\n# run from here\n\nscoreboard players set $frost_ring_pitch gm4_mu_data 80\nexecute if score $frost_ring_yaw gm4_mu_data < @s gm4_mu_data run function gm4_monsters_unbound:mob/process/elite/glacial/warning_pitch_loop_big\nexecute unless score $frost_ring_yaw gm4_mu_data < @s gm4_mu_data run function gm4_monsters_unbound:mob/process/elite/glacial/warning_pitch_loop_small\n\nscoreboard players add $frost_ring_yaw gm4_mu_data 10\nexecute if score $frost_ring_yaw gm4_mu_data matches ..360 rotated ~10 ~ run function gm4_monsters_unbound:mob/process/elite/glacial/warning_yaw_loop\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/mending/check_los_raycast.mcfunction",
    "content": "# check LOS to this undead\n# @s = undead near mending elite\n# at @s\n# run from mob/process/elite/mending/process\n# run from here\n\nexecute if score $target_healed gm4_mu_data matches 1.. run return 0\n\ntag @s remove gm4_mu_target\n\nscoreboard players add $raycast_travel_distance gm4_mu_data 3\n\nexecute positioned ~-.05 ~-.05 ~-.05 if entity @s[dx=0,dy=0,dz=0] positioned ~-0.9 ~-0.9 ~-0.9 if entity @s[dx=0,dy=0,dz=0] at @s anchored eyes positioned ^ ^ ^ run function gm4_monsters_unbound:mob/process/elite/mending/trigger\nexecute if score $target_healed gm4_mu_data matches 1.. run return run function gm4_monsters_unbound:mob/process/elite/mending/particle_raycast\n\nexecute unless score $raycast_travel_distance gm4_mu_data matches ..300 run return run scoreboard players reset $raycast_travel_distance gm4_mu_data\nexecute positioned ^ ^ ^.3 if block ~ ~ ~ #gm4:no_collision run function gm4_monsters_unbound:mob/process/elite/mending/check_los_raycast\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/mending/check_target.mcfunction",
    "content": "# check if this entity is a valid target to be healed\n# @s = undead near mending elite\n# at @s\n# run from mob/process/elite/mending/process\n\nexecute store result score $curr_health gm4_mu_data run data get entity @s Health 10\nexecute store result score $max_health gm4_mu_data run attribute @s minecraft:max_health get 10\n# remove a slight amount from max_health to fix floating point errors\nscoreboard players remove $max_health gm4_mu_data 2\nexecute if score $curr_health gm4_mu_data < $max_health gm4_mu_data run tag @s add gm4_mu_target\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/mending/particle_raycast.mcfunction",
    "content": "# check LOS to this undead\n# @s = undead near mending elite\n# at @s\n# run from mob/process/elite/mending/process\n# run from here\n\nscoreboard players remove $raycast_travel_distance gm4_mu_data 1\n\nparticle dust_color_transition{from_color:[0.000,1.000,0.000],scale:0.65,to_color:[0.000,0.000,0.000]} ~ ~ ~ 0.1 0.1 0.1 0 0\n\nexecute unless score $raycast_travel_distance gm4_mu_data matches 1.. run particle dust_color_transition{from_color:[0.000,1.000,0.000],scale:0.85,to_color:[0.000,0.000,0.000]} ~ ~ ~ 0.22 0.22 0.22 0.5 12\n\nexecute if score $raycast_travel_distance gm4_mu_data matches 1.. positioned ^ ^ ^-.1 run function gm4_monsters_unbound:mob/process/elite/mending/particle_raycast\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/mending/process.mcfunction",
    "content": "# process mending elite\n# @s = mending elite\n# at @s\n# run from mob/process/elite/check_type\n\nexecute as @e[type=#minecraft:undead,tag=!gm4_mu_elite.mending,distance=..30,limit=12,sort=random] run function gm4_monsters_unbound:mob/process/elite/mending/check_target\n\ntag @s add gm4_mu_self\nscoreboard players set $target_healed gm4_mu_data 0\nexecute at @s anchored eyes positioned ^ ^0.4375 ^ as @e[type=#minecraft:undead,tag=gm4_mu_target,distance=..30,sort=random] facing entity @s eyes run function gm4_monsters_unbound:mob/process/elite/mending/check_los_raycast\ntag @s remove gm4_mu_self\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/mending/trigger.mcfunction",
    "content": "# heal this undead\n# @s = undead near mending elite\n# at @s\n# run from mob/process/elite/mending/check_los_raycast\n\nscoreboard players set $target_healed gm4_mu_data 1\n\neffect give @s instant_damage 1 2 false\neffect give @s resistance 1 1 false\nparticle heart ^ ^ ^ 0.2 0.2 0.2 0.05 1\n\nplaysound minecraft:item.bottle.fill hostile @a ~ ~ ~ 0.7 2\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/on_death/run.mcfunction",
    "content": "# check which elite has died\n# @s = item dropped from killed elite\n# at @s\n# run from check_item\n\nexecute store result score $elite_type gm4_mu_data run data get entity @s Item.components.\"minecraft:custom_data\".gm4_mu_elite_on_death.id\nexecute if score $elite_type gm4_mu_data matches 1 run function gm4_monsters_unbound:mob/process/elite/glacial/death\nexecute if score $elite_type gm4_mu_data matches 2 positioned ~ ~1.75 ~ summon item_display run function gm4_monsters_unbound:mob/process/elite/vorpal/init_fear_cloud\nexecute if score $elite_type gm4_mu_data matches 3 positioned ~ ~0.25 ~ run function gm4_monsters_unbound:mob/process/elite/splitting/zombie\nexecute if score $elite_type gm4_mu_data matches 4 positioned ~ ~0.25 ~ run function gm4_monsters_unbound:mob/process/elite/splitting/skeleton\nexecute if score $elite_type gm4_mu_data matches 5 run function gm4_monsters_unbound:mob/process/elite/volatile/death\n\nkill @s\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/on_hit/check_mob.mcfunction",
    "content": "# process elite that got hit\n# @s = elite that got hit\n# at @s\n# run from mob/process/elite/on_hit/run\n\nexecute if entity @s[tag=gm4_mu_elite.vorpal] if predicate {condition:\"minecraft:random_chance\",chance:0.65} run function gm4_monsters_unbound:mob/process/elite/vorpal/warp/run\nexecute if entity @s[tag=gm4_mu_elite.zephyr] run function gm4_monsters_unbound:mob/process/elite/zephyr/hit_when_charging\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/on_hit/run.mcfunction",
    "content": "# process elites being hit\n# @s = player that hit an elite\n# at @s\nadvancement revoke @s only gm4_monsters_unbound:elite/on_hit\n\nexecute as @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_elite.on_hit,nbt={HurtTime:10s},limit=1,sort=nearest] at @s run function gm4_monsters_unbound:mob/process/elite/on_hit/check_mob\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/pearlescent/get_facing.mcfunction",
    "content": "# get facing direction towards target\n# @s = marker\n# at elite anchored eyes positioned ^ ^ ^0.2\n# run from mob/process/elite/pearlescent/laser\n\ntp @s ~ ~ ~ facing entity @p[tag=gm4_mu_target] eyes\ndata modify storage gm4_monsters_unbound:temp Rotation set from entity @s Rotation\nkill @s\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/pearlescent/laser.mcfunction",
    "content": "# shoot laser\n# @s = pearlescent elite\n# at @s\n# run from mob/process/elite/pearlescent/process\n\nplaysound block.campfire.crackle hostile @a ~ ~ ~ 0.5 0.8\nparticle flash{color:-1} ~ ~1.8 ~\n\nexecute on target run tag @s[type=player] add gm4_mu_target\nexecute unless entity @p[tag=gm4_mu_target] run return 0\ntag @s add gm4_mu_self\n\nscoreboard players set $laser_limit gm4_mu_data 150\n\nexecute anchored eyes positioned ^ ^ ^0.2 summon marker run function gm4_monsters_unbound:mob/process/elite/pearlescent/get_facing\ndata modify entity @s Rotation set from storage gm4_monsters_unbound:temp Rotation\ndata remove storage gm4_monsters_unbound:temp Rotation\nexecute at @s anchored eyes positioned ^ ^ ^0.2 run function gm4_monsters_unbound:mob/process/elite/pearlescent/laser_raycast\n\nexecute on target run tag @s remove gm4_mu_target\ntag @s remove gm4_mu_self\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/pearlescent/laser_damage.mcfunction",
    "content": "# deal damage to hit player\n# @s = player hit by laser\n# at near @s\n# run from mob/process/elite/pearlescent/laser_raycast\n\nscoreboard players set $attack_hit gm4_mu_data 1\nscoreboard players set $laser_limit gm4_mu_data 0\n\nexecute store result score $showDeathMessages gm4_mu_data run gamerule show_death_messages\ngamerule show_death_messages false\ndamage @s 1.0 in_fire\ntag @s add gm4_mu_self\nexecute if score $showDeathMessages gm4_mu_data matches 1 at @s unless entity @e[type=player,tag=gm4_mu_self,distance=..0.1,limit=1] run tellraw @a [\"\",{\"translate\":\"text.gm4.monsters_unbound.death.pearlescent_elite_laser\",\"fallback\":\"%s was seen by %s\",with:[{\"selector\":\"@s\"},{\"selector\":\"@e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_elite.pearlescent,distance=..32,limit=1]\"}]}]\ntag @s remove gm4_mu_self\nexecute if score $showDeathMessages gm4_mu_data matches 1 run gamerule show_death_messages true\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/pearlescent/laser_raycast.mcfunction",
    "content": "# raycast to target player\n# @s = pearlescent elite\n# at @s\n# run from mob/process/elite/pearlescent/laser\n# run from here\n\nparticle dust_color_transition{from_color:[0.400,0.325,0.450],to_color:[0.800,0.650,0.900],scale:1.25} ^0.125 ^ ^ 0.01 0.01 0.01 0 1\nparticle dust_color_transition{from_color:[0.400,0.325,0.450],to_color:[0.800,0.650,0.900],scale:1.25} ^-0.125 ^ ^ 0.01 0.01 0.01 0 1\n\nparticle dust_color_transition{from_color:[0.400,0.325,0.450],to_color:[0.800,0.650,0.900],scale:1.25} ^0.125 ^ ^0.1 0.01 0.01 0.01 0 1\nparticle dust_color_transition{from_color:[0.400,0.325,0.450],to_color:[0.800,0.650,0.900],scale:1.25} ^-0.125 ^ ^0.1 0.01 0.01 0.01 0 1\n\nexecute positioned ~-0.1 ~-0.1 ~-0.1 as @a[gamemode=!spectator,dx=0,dy=0,dz=0] positioned ~-0.8 ~-0.8 ~-0.8 if entity @s[dx=0,dy=0,dz=0] run function gm4_monsters_unbound:mob/process/elite/pearlescent/laser_damage\n\nscoreboard players remove $laser_limit gm4_mu_data 1\nexecute if score $laser_limit gm4_mu_data matches 1.. positioned ^ ^ ^0.2 if block ~ ~ ~ #gm4:no_collision run function gm4_monsters_unbound:mob/process/elite/pearlescent/laser_raycast\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/pearlescent/process.mcfunction",
    "content": "# process pearlescent elite\n# @s = pearlescent elite\n# at @s\n# run from mob/process/elite/check_type\n\n# 33% chance to start attack if mob has a target\nscoreboard players set $attack gm4_mu_data 0\nexecute if score @s gm4_mu_timer matches 1.. run scoreboard players set $attack gm4_mu_data 1\nexecute unless score $attack gm4_mu_data matches 1 on target if entity @s[type=player] if predicate {condition:\"minecraft:random_chance\",chance:0.33} run scoreboard players set $attack gm4_mu_data 1\nexecute if score $attack gm4_mu_data matches 0 run return 0\n\nscoreboard players add @s gm4_mu_timer 1\nscoreboard players set @s[scores={gm4_mu_timer=300..}] gm4_mu_timer 0\n\nexecute if score @s gm4_mu_timer matches 1 run playsound block.beacon.activate hostile @a ~ ~ ~ 1 0.7\nexecute if score @s gm4_mu_timer matches 101..110 run playsound block.beacon.deactivate hostile @a ~ ~ ~ 1 0.7\n\nattribute @s[scores={gm4_mu_timer=1}] minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.pearlescent.charging -0.75 add_multiplied_total\nattribute @s[scores={gm4_mu_timer=5}] minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.pearlescent.charging\nattribute @s[scores={gm4_mu_timer=5}] minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.pearlescent.firing -0.33 add_multiplied_total\nattribute @s[scores={gm4_mu_timer=101..110}] minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.pearlescent.firing\n\nexecute if score @s gm4_mu_timer matches ..100 run particle block{block_state:\"pearlescent_froglight\"} ~ ~2 ~ 0.3 0.3 0.3 0.5 8\n\nscoreboard players set $attack_hit gm4_mu_data 0\nexecute if score @s gm4_mu_timer matches 5..100 run function gm4_monsters_unbound:mob/process/elite/pearlescent/laser\nexecute if score @s gm4_mu_timer matches 10.. if score $attack_hit gm4_mu_data matches 0 run scoreboard players add @s gm4_mu_timer 10\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/splitting/init_entity.mcfunction",
    "content": "# init split entity\n# @s = split entity\n# at @s\n# run from mob/process/elite/splitting/skeleton\n# run from mob/process/elite/splitting/zombie\n\nattribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total\nattribute @s minecraft:gravity modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total\nattribute @s minecraft:jump_strength modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total\nattribute @s minecraft:knockback_resistance modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total\nattribute @s minecraft:max_health modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total\nattribute @s minecraft:scale modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total\nattribute @s minecraft:step_height modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total\nattribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:split_entity 0.33 add_multiplied_total\nattribute @s[type=#gm4_monsters_unbound:skeleton_types] minecraft:follow_range modifier add gm4_monsters_unbound:split_entity -0.66 add_multiplied_total\n\nscoreboard players set @s gm4_sr_arrow.fire_delay 6\nscoreboard players set @s gm4_sr_arrow.damage_change -14\n\ndata modify entity @s CustomName set from storage gm4_monsters_unbound:temp CustomName\n\nexecute store result entity @s Motion[0] double 0.01 run random value -30..30\nexecute store result entity @s Motion[1] double 0.01 run random value 20..60\nexecute store result entity @s Motion[2] double 0.01 run random value -30..30\n\ntag @s add gm4_mu_elite.split_entity\ntag @s add gm4_mu_split_entity\nexecute if score gm4_survival_refightalized load.status matches 1.. if dimension minecraft:overworld run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute if score gm4_survival_refightalized load.status matches 1.. unless dimension minecraft:overworld run function gm4_survival_refightalized:mob/init/calc_difficulty_else\nexecute unless score gm4_survival_refightalized load.status matches 1.. run function gm4_monsters_unbound:mob/init/initialize\n\nitem replace entity @s armor.head with spawner\ndata modify entity @s drop_chances.head set value 0\n\nteam join gm4_mu_elite.split\nexecute if score $has_bow gm4_mu_data matches 0 run item replace entity @s[type=#gm4_monsters_unbound:skeleton_types] weapon.mainhand with wooden_sword\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/splitting/process.mcfunction",
    "content": "# process splitting elite\n# @s = splitting elite\n# at @s\n# run from mob/process/elite/check_type\n\ndata modify entity @s equipment.head.components.\"minecraft:custom_name\" set from entity @s CustomName\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/splitting/skeleton.mcfunction",
    "content": "# split splitting elite on death\n# @s = item\n# at @s\n# run from mob/process/elite/on_death/run\n\ndata modify storage gm4_monsters_unbound:temp CustomName set from entity @s Item.components.\"minecraft:custom_name\"\n\n# only 2-3 of the spawned skeletons will have bows, the rest will be melee with wooden swords\nscoreboard players set $has_bow gm4_mu_data 1\nexecute summon skeleton run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity\nexecute summon skeleton run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity\nexecute store result score $has_bow gm4_mu_data run random value 0..1\nexecute summon skeleton run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity\nscoreboard players set $has_bow gm4_mu_data 0\nexecute summon skeleton run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity\nexecute summon skeleton run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity\nexecute summon skeleton run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity\n\ndata remove storage gm4_monsters_unbound:temp CustomName\n\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/splitting/zombie.mcfunction",
    "content": "# split splitting elite on death\n# @s = item\n# at @s\n# run from mob/process/elite/on_death/run\n\ndata modify storage gm4_monsters_unbound:temp CustomName set from entity @s Item.components.\"minecraft:custom_name\"\n\nexecute summon zombie run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity\nexecute summon zombie run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity\nexecute summon zombie run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity\nexecute summon zombie run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity\nexecute summon zombie run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity\nexecute summon zombie run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity\n\ndata remove storage gm4_monsters_unbound:temp CustomName\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/death.mcfunction",
    "content": "# spawn many volatile pillars on death\n# @s = item\n# at @s\n# run from mob/process/elite/on_death/run\n\nexecute positioned ~ ~ ~3 summon marker run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location\nexecute positioned ~ ~ ~-3 summon marker run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location\nexecute positioned ~3 ~ ~ summon marker run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location\nexecute positioned ~-3 ~ ~ summon marker run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/pillar_damage.mcfunction",
    "content": "# damage from volatile pillar\n# @s = player that was hit\n# at near @s\n# run from mob/process/elite/volatile/pillar_explode\n\neffect give @s slowness 2 2\neffect give @s nausea 4 0\n\nexecute store result score $showDeathMessages gm4_mu_data run gamerule show_death_messages\ngamerule show_death_messages false\ndamage @s 9.0 explosion\ntag @s add gm4_mu_self\nexecute if score $showDeathMessages gm4_mu_data matches 1 at @s unless entity @e[type=player,tag=gm4_mu_self,distance=..0.1,limit=1] run tellraw @a [\"\",{\"translate\":\"text.gm4.monsters_unbound.death.volatile_elite_meteorite\",\"fallback\":\"%s was struck by a meteorite\",with:[{\"selector\":\"@s\"}]}]\ntag @s remove gm4_mu_self\nexecute if score $showDeathMessages gm4_mu_data matches 1 run gamerule show_death_messages true\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/pillar_explode.mcfunction",
    "content": "# explode volatile pillar\n# @s = pillar marker\n# at @s\n# run from mob/process/elite/volatile/pillar_process\n\nexecute if score @s gm4_mu_data matches 2 as @a[gamemode=!spectator,distance=..2.25] run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_damage\nexecute if score @s gm4_mu_data matches 3 as @a[gamemode=!spectator,distance=..2.5] run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_damage\nexecute if score @s gm4_mu_data matches 4 as @a[gamemode=!spectator,distance=..2.75] run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_damage\nexecute if score @s gm4_mu_data matches 5 as @a[gamemode=!spectator,distance=..3] run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_damage\nkill @s\nparticle minecraft:dragon_breath ~ ~ ~ 0.2 0.2 0.2 0.33 64\nparticle minecraft:dragon_breath ~ ~0.25 ~ 0.5 0.5 0.5 0 32\nparticle minecraft:dragon_breath ~ ~5 ~ 0.2 8 0.2 1 32\nplaysound entity.dragon_fireball.explode hostile @a[distance=..32] ~ ~ ~ 1 0.9 0.5\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/pillar_location.mcfunction",
    "content": "# get a location for volatile pillar\n# @s = pillar marker\n# at @s\n# run from mob/process/elite/volatile/process\n\ntag @s add gm4_mu_elite.volatile_pillar\nexecute store result score @s gm4_mu_timer run random value 0..14\nexecute store result score @s gm4_mu_data run random value 2..5\nscoreboard players operation @s gm4_mu_timer -= @s gm4_mu_data\nscoreboard players operation @s gm4_mu_timer -= @s gm4_mu_data\n\nexecute store result score $randomX gm4_mu_data run random value 0..12\nexecute store result score $randomZ gm4_mu_data run random value 0..12\ntp @s ~-6 ~ ~-6\n\nexecute at @s if score $randomX gm4_mu_data matches 8.. run tp @s ~8 ~ ~\nexecute if score $randomX gm4_mu_data matches 8.. run scoreboard players remove $randomX gm4_mu_data 8\nexecute at @s if score $randomX gm4_mu_data matches 4.. run tp @s ~4 ~ ~\nexecute if score $randomX gm4_mu_data matches 4.. run scoreboard players remove $randomX gm4_mu_data 4\nexecute at @s if score $randomX gm4_mu_data matches 2.. run tp @s ~2 ~ ~\nexecute if score $randomX gm4_mu_data matches 2.. run scoreboard players remove $randomX gm4_mu_data 2\nexecute at @s if score $randomX gm4_mu_data matches 1.. run tp @s ~1 ~ ~\nexecute if score $randomX gm4_mu_data matches 1.. run scoreboard players remove $randomX gm4_mu_data 1\n\nexecute at @s if score $randomZ gm4_mu_data matches 8.. run tp @s ~ ~ ~8\nexecute if score $randomZ gm4_mu_data matches 8.. run scoreboard players remove $randomZ gm4_mu_data 8\nexecute at @s if score $randomZ gm4_mu_data matches 4.. run tp @s ~ ~ ~4\nexecute if score $randomZ gm4_mu_data matches 4.. run scoreboard players remove $randomZ gm4_mu_data 4\nexecute at @s if score $randomZ gm4_mu_data matches 2.. run tp @s ~ ~ ~2\nexecute if score $randomZ gm4_mu_data matches 2.. run scoreboard players remove $randomZ gm4_mu_data 2\nexecute at @s if score $randomZ gm4_mu_data matches 1.. run tp @s ~ ~ ~1\nexecute if score $randomZ gm4_mu_data matches 1.. run scoreboard players remove $randomZ gm4_mu_data 1\n\nscoreboard players set $move_y_limit gm4_mu_data 12\nexecute at @s store result score $location_found gm4_mu_data run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location_y\nexecute if score $location_found gm4_mu_data matches 0 run return run kill @s\n\nexecute unless score $keep_tick.elite_pillar_volatile gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/volatile_pillar 1t\nexecute at @s run playsound minecraft:entity.ender_dragon.shoot hostile @a ~ ~ ~ 1 0.5\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/pillar_location_y.mcfunction",
    "content": "# get a location for volatile pillar\n# @s = pillar marker\n# at @s\n# run from mob/process/elite/volatile/pillar_location\n# run from here\n\nexecute if block ~ ~ ~ #gm4:no_collision unless block ~ ~-1 ~ #gm4:no_collision align y run return run tp @s ~ ~ ~\n\nscoreboard players remove $move_y_limit gm4_mu_data 1\nexecute if score $move_y_limit gm4_mu_data matches 0 run return 0\nexecute if block ~ ~ ~ #gm4:no_collision positioned ~ ~-1 ~ run return run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location_y\nexecute positioned ~ ~1 ~ run return run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location_y\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/pillar_particle_ring.mcfunction",
    "content": "# volatile pillar particles\n# @s = pillar marker\n# at @s rotated ~x ~\n# run from clocks/elite/pillaer_process\n# run from here\n\nexecute if score @s gm4_mu_data matches 2 run particle dust_color_transition{from_color:[0.667,0.000,0.667],scale:1,to_color:[0.000,0.000,0.000]} ^ ^ ^2.25 0 0 0 1 0 normal\nexecute if score @s gm4_mu_data matches 3 run particle dust_color_transition{from_color:[0.667,0.000,0.667],scale:1,to_color:[0.000,0.000,0.000]} ^ ^ ^2.5 0 0 0 1 0 normal\nexecute if score @s gm4_mu_data matches 4 run particle dust_color_transition{from_color:[0.667,0.000,0.667],scale:1,to_color:[0.000,0.000,0.000]} ^ ^ ^2.75 0 0 0 1 0 normal\nexecute if score @s gm4_mu_data matches 5 run particle dust_color_transition{from_color:[0.667,0.000,0.667],scale:1,to_color:[0.000,0.000,0.000]} ^ ^ ^3 0 0 0 1 0 normal\n\nscoreboard players remove $particle_ring gm4_mu_data 6\nexecute if score $particle_ring gm4_mu_data matches 1.. rotated ~6 ~ run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_particle_ring\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/pillar_process.mcfunction",
    "content": "# process volatile pillar\n# @s = pillar marker\n# at @s\n# run from clocks/elite/volatile_pillar\n\nparticle block{block_state:\"purple_glazed_terracotta\"} ~ ~5 ~ 0.2 8 0.2 1 32\n\nscoreboard players set $particle_ring gm4_mu_data 360\nfunction gm4_monsters_unbound:mob/process/elite/volatile/pillar_particle_ring\n\nscoreboard players add @s gm4_mu_timer 1\n\nexecute if score @s gm4_mu_timer matches 60 run playsound minecraft:entity.breeze.inhale hostile @a ~ ~ ~ 2 2\nexecute if score @s gm4_mu_timer matches 70.. run return run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_explode\n\nscoreboard players set $keep_tick.elite_pillar_volatile gm4_mu_keep_tick 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/process.mcfunction",
    "content": "# process volatile elite\n# @s = volatile elite\n# at @s\n# run from mob/process/elite/check_type\n\nscoreboard players set $has_target gm4_mu_data 0\nexecute on target if entity @s[type=player,distance=..22] run scoreboard players set $has_target gm4_mu_data 1\nexecute if score $has_target gm4_mu_data matches 0 run return 0\n\nscoreboard players add @s gm4_mu_timer 1\nexecute if predicate {condition:\"random_chance\",\"chance\":0.45} run scoreboard players add @s gm4_mu_timer 1\n\nexecute if score @s gm4_mu_timer matches 8..12 run particle block{block_state:\"purple_glazed_terracotta\"} ~ ~2 ~ 0 4 0 0.25 32\nexecute if score @s gm4_mu_timer matches 8..12 on target at @s summon marker run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location\nscoreboard players set @s[scores={gm4_mu_timer=12..}] gm4_mu_timer 0\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/fear_hit.mcfunction",
    "content": "# apply fear to hit player\n# @s = player that was hit\n# at @s\n# run from mob/process/elite/vorpal/process_fear_cloud\n\nscoreboard players set $player_hit gm4_mu_data 1\n\nexecute store result score $fear_seconds gm4_mu_data run random value 10..16\nfunction gm4_monsters_unbound:effect/fear/apply\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/init_fear_cloud.mcfunction",
    "content": "# spawn fear cloud skull\n# @s = block_display\n# at @s\n# run from mob/process/elite/on_death/run\n\ndata merge entity @s {Tags:[\"gm4_mu_elite.fear_cloud\"],teleport_duration:1,brightness:{sky:15,block:15},transformation:{left_rotation:[0f,1f,0f,0f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.25f,0f],scale:[1f,1f,1f]},item:{id:\"minecraft:wither_skeleton_skull\",count:1}}\n\nplaysound minecraft:entity.blaze.shoot hostile @a ~ ~ ~ 1 1.2\n\ntp @s ~ ~ ~ facing entity @p[gamemode=!spectator]\n\nexecute unless score $keep_tick.elite_death_vorpal gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/vorpal_death 1t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/process_fear_cloud.mcfunction",
    "content": "# process fear cloud skull\n# @s = block_display\n# at @s\n# run from clocks/elite/vorpal_death\n\n# particles\nparticle dust{color:[0.000,0.000,0.000],scale:1} ^ ^ ^0.0125 0.2666 0.2666 0.2666 0.666 4 normal\n\nscoreboard players add @s gm4_mu_timer 1\n\n# track towards closest player\nexecute facing entity @p[gamemode=!spectator,gamemode=!creative] eyes positioned ^ ^ ^25 rotated as @s positioned ^ ^ ^25 facing entity @s eyes facing ^ ^ ^-1 positioned as @s run tp @s ~ ~ ~ ~ ~\ntp @s[scores={gm4_mu_timer=..29}] ^ ^ ^0.025\ntp @s[scores={gm4_mu_timer=30..60}] ^ ^ ^0.075\ntp @s[scores={gm4_mu_timer=61..90}] ^ ^ ^0.125\ntp @s[scores={gm4_mu_timer=91..120}] ^ ^ ^0.200\ntp @s[scores={gm4_mu_timer=121..140}] ^ ^ ^0.300\ntp @s[scores={gm4_mu_timer=141..160}] ^ ^ ^0.450\ntp @s[scores={gm4_mu_timer=161..}] ^ ^ ^0.650\n\n# hit players\nscoreboard players set $player_hit gm4_mu_data 0\nexecute positioned ~-.15 ~-.15 ~-.15 as @a[dx=0,dy=0,dz=0,gamemode=!spectator,gamemode=!creative] positioned ~-0.55 ~-0.55 ~-0.55 if entity @s[dx=0,dy=0,dz=0] run function gm4_monsters_unbound:mob/process/elite/vorpal/fear_hit\nexecute if score $player_hit gm4_mu_data matches 1 run return run kill @s\n\n# timer ran out\nexecute if score @s gm4_mu_timer matches 240.. run return run kill @s\n\n# keep running if entity is still around\nscoreboard players set $keep_tick.elite_death_vorpal gm4_mu_keep_tick 1\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/warp/randomize.mcfunction",
    "content": "# get random teleport location\n# @s = marker\n# at @s\n# run from clocks/elite/vorpal/warp/spawn_marker\n\nexecute store result score $randomX gm4_mu_data run random value 0..12\nexecute store result score $randomZ gm4_mu_data run random value 0..12\n\nexecute at @s run function gm4_monsters_unbound:mob/process/elite/vorpal/warp/tp_marker\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/warp/run.mcfunction",
    "content": "# teleport the elite randomly\n# @s = vorpal elite\n# at @s\n# run from clocks/elite/on_hit/check_mob\n\n# teleport up to 12 blocks away\ntag @s add gm4_mu_target\nexecute positioned ~-6 ~ ~-6 summon marker run function gm4_monsters_unbound:mob/process/elite/vorpal/warp/spawn_marker\ntag @s remove gm4_mu_target\n\nplaysound minecraft:entity.enderman.teleport hostile @a ~ ~ ~ 1 0.75\n\nexecute at @s run particle minecraft:portal ~ ~1.75 ~ 0 0 0 0.75 32\nexecute at @s run playsound minecraft:entity.enderman.teleport hostile @a ~ ~ ~ 1 0.75\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/warp/set_ypos.mcfunction",
    "content": "# get random teleport location\n# @s = marker\n# at @s\n# run from clocks/elite/vorpal/warp/tp_marker\n\nexecute at @s run tp @s ~ ~-1 ~\nscoreboard players add $set_y gm4_mu_data 1\nscoreboard players set $warp_safe gm4_mu_data 0\nexecute at @s if predicate gm4_monsters_unbound:technical/valid_tp unless entity @a[gamemode=!creative,gamemode=!spectator,distance=..3] run scoreboard players set $warp_safe gm4_mu_data 1\nexecute if score $warp_safe gm4_mu_data matches 1 run scoreboard players set $warp_attempt gm4_mu_data 33\nexecute unless score $set_y gm4_mu_data matches 8.. at @s unless score $warp_safe gm4_mu_data matches 1 run function gm4_monsters_unbound:mob/process/elite/vorpal/warp/set_ypos\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/warp/spawn_marker.mcfunction",
    "content": "# get random teleport location\n# @s = marker\n# at @s\n# run from clocks/elite/vorpal/warp/run\n\nexecute store result score $y_pos gm4_mu_data run data get entity @s Pos[1]\nscoreboard players set $warp_attempt gm4_mu_data 0\n\nfunction gm4_monsters_unbound:mob/process/elite/vorpal/warp/randomize\n\nexecute if score $warp_safe gm4_mu_data matches 1 at @s align xyz run tp @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_target] ~.5 ~ ~.5\nkill @s\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/warp/tp_marker.mcfunction",
    "content": "# get random teleport location\n# @s = marker\n# at @s\n# run from clocks/elite/vorpal/warp/randomize\n# run from here\n\nexecute at @s if score $randomX gm4_mu_data matches 8.. run tp @s ~8 ~ ~\nexecute if score $randomX gm4_mu_data matches 8.. run scoreboard players remove $randomX gm4_mu_data 8\nexecute at @s if score $randomX gm4_mu_data matches 4.. run tp @s ~4 ~ ~\nexecute if score $randomX gm4_mu_data matches 4.. run scoreboard players remove $randomX gm4_mu_data 4\nexecute at @s if score $randomX gm4_mu_data matches 2.. run tp @s ~2 ~ ~\nexecute if score $randomX gm4_mu_data matches 2.. run scoreboard players remove $randomX gm4_mu_data 2\nexecute at @s if score $randomX gm4_mu_data matches 1.. run tp @s ~1 ~ ~\nexecute if score $randomX gm4_mu_data matches 1.. run scoreboard players remove $randomX gm4_mu_data 1\n\nexecute at @s if score $randomZ gm4_mu_data matches 8.. run tp @s ~ ~ ~8\nexecute if score $randomZ gm4_mu_data matches 8.. run scoreboard players remove $randomZ gm4_mu_data 8\nexecute at @s if score $randomZ gm4_mu_data matches 4.. run tp @s ~ ~ ~4\nexecute if score $randomZ gm4_mu_data matches 4.. run scoreboard players remove $randomZ gm4_mu_data 4\nexecute at @s if score $randomZ gm4_mu_data matches 2.. run tp @s ~ ~ ~2\nexecute if score $randomZ gm4_mu_data matches 2.. run scoreboard players remove $randomZ gm4_mu_data 2\nexecute at @s if score $randomZ gm4_mu_data matches 1.. run tp @s ~ ~ ~1\nexecute if score $randomZ gm4_mu_data matches 1.. run scoreboard players remove $randomZ gm4_mu_data 1\n\nexecute store result entity @s Pos[1] double 1 run scoreboard players get $y_pos gm4_mu_data\nexecute at @s run tp @s ~ ~4 ~\nscoreboard players set $set_y gm4_mu_data 0\nexecute at @s run function gm4_monsters_unbound:mob/process/elite/vorpal/warp/set_ypos\n\nscoreboard players add $warp_attempt gm4_mu_data 1\nexecute unless score $warp_attempt gm4_mu_data matches 33.. run function gm4_monsters_unbound:mob/process/elite/vorpal/warp/randomize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/activate.mcfunction",
    "content": "# activate charged attack\n# @s = zephyr elite\n# at @s\n# run from mob/process/elite/zephyr/process\n\nexecute anchored eyes positioned ^ ^-1.15 ^ run particle gust_emitter_small ~ ~ ~ 0 0 0 1 1 normal\nplaysound minecraft:entity.breeze.wind_burst hostile @a ~ ~ ~ 1 0\n\n# skeletons shoot arrows instead of speed burst\nexecute if entity @s[type=#gm4_monsters_unbound:skeleton_types] run return run function gm4_monsters_unbound:mob/process/elite/zephyr/skeleton/start\n\nsummon breeze_wind_charge ~ ~ ~ {Motion:[0.0,-5.0,0.0]}\nattribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.speed.charging\nattribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.speed.charged 1.5 add_multiplied_total\nattribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:elite_buff.speed.charged 0.75 add_multiplied_total\nattribute @s minecraft:attack_knockback modifier add gm4_monsters_unbound:elite_buff.speed.charged 2 add_value\n\ntag @s add gm4_mu_charging_attack\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/charge_complete.mcfunction",
    "content": "# charge is complete\n# @s = zephyr elite\n# at @s\n# run from mob/process/attack_effect/charging_attack\n\nattribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.speed.charged\nattribute @s minecraft:attack_damage modifier remove gm4_monsters_unbound:elite_buff.speed.charged\nattribute @s minecraft:attack_knockback modifier remove gm4_monsters_unbound:elite_buff.speed.charged\n\n# don't charge again until player target is lost\ntag @s remove gm4_mu_charging_attack\ntag @s remove gm4_mu_elite.on_hit\nscoreboard players set @s gm4_mu_timer -12\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/hit_when_charging.mcfunction",
    "content": "# remove charge if mob is hit\n# @s = zephyr elite\n# at @s\n# run from mob/process/elite/on_hit/check_mob\n\nexecute anchored eyes positioned ^ ^-0.15 ^ run particle small_gust ~ ~ ~ 0.45 0.45 0.45 1 16 normal\nplaysound minecraft:entity.breeze.hurt hostile @a ~ ~ ~ 1 0\neffect give @s slowness 1 9 true\n\nattribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.speed.charging\nattribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.speed.charged\nattribute @s minecraft:attack_damage modifier remove gm4_monsters_unbound:elite_buff.speed.charged\nattribute @s minecraft:attack_knockback modifier remove gm4_monsters_unbound:elite_buff.speed.charged\n\nexecute if score @s gm4_mu_timer matches 2.. run summon breeze_wind_charge ~ ~ ~ {Motion:[0.0,-5.0,0.0]}\n\n# disable charge for a little time\ntag @s remove gm4_mu_elite.zephyr_skeleton_burst\ntag @s remove gm4_mu_charging_attack\ntag @s remove gm4_mu_elite.on_hit\nscoreboard players set @s gm4_mu_timer -4\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/lose_charge.mcfunction",
    "content": "# remove charge if target is lost\n# @s = zephyr elite\n# at @s\n# run from mob/process/elite/zephyr/process\n\nattribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.speed.charging\nattribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.speed.charged\nattribute @s minecraft:attack_damage modifier remove gm4_monsters_unbound:elite_buff.speed.charged\nattribute @s minecraft:attack_knockback modifier remove gm4_monsters_unbound:elite_buff.speed.charged\nscoreboard players reset @s gm4_mu_timer\n\neffect give @s[tag=gm4_mu_elite.zephyr_skeleton_burst] speed 3 3\ntag @s remove gm4_mu_elite.zephyr_skeleton_burst\ntag @s remove gm4_mu_elite.on_hit\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/process.mcfunction",
    "content": "# process zephyr elite\n# @s = zephyr elite\n# at @s\n# run from mob/process/elite/check_type\n\nscoreboard players set $has_target gm4_mu_data 0\nexecute on target run scoreboard players set $has_target gm4_mu_data 1\nexecute if entity @s[type=#gm4_monsters_unbound:skeleton_types,scores={gm4_mu_timer=1..}] run scoreboard players set $has_target gm4_mu_data 1\n\n# no target\nexecute if score $has_target gm4_mu_data matches 0 if score @s gm4_mu_timer matches -2147483648..2147483647 run function gm4_monsters_unbound:mob/process/elite/zephyr/lose_charge\nexecute if score $has_target gm4_mu_data matches 0 run return run scoreboard players reset @s gm4_mu_timer\n\nscoreboard players add @s gm4_mu_timer 1\n\nexecute if score @s gm4_mu_timer matches 1..4 anchored eyes positioned ^ ^-0.15 ^ run particle small_gust ~ ~ ~ 0.35 0.35 0.35 1 6 normal\n\ntag @s[scores={gm4_mu_timer=1}] add gm4_mu_elite.on_hit\nattribute @s[scores={gm4_mu_timer=1}] minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.speed.charging -1 add_multiplied_total\n\nexecute if score @s gm4_mu_timer matches 2 run playsound minecraft:entity.breeze.inhale hostile @a ~ ~ ~ 1 0.5\nexecute if score @s gm4_mu_timer matches 3 run playsound minecraft:entity.breeze.charge hostile @a ~ ~ ~ 1 0.5\nexecute if score @s gm4_mu_timer matches 4 run playsound minecraft:entity.breeze.idle_air hostile @a ~ ~ ~ 1 0.65\n\nexecute if score @s gm4_mu_timer matches 5 run function gm4_monsters_unbound:mob/process/elite/zephyr/activate\nexecute if score @s[type=#gm4_monsters_unbound:skeleton_types] gm4_mu_timer matches 6..10 run function gm4_monsters_unbound:mob/process/elite/zephyr/skeleton/arrow_burst\n\nscoreboard players reset @s[scores={gm4_mu_timer=14..},tag=!gm4_mu_charging_attack] gm4_mu_timer\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/skeleton/arrow_burst.mcfunction",
    "content": "# shoot many arrows\n# @s = zephyr elite\n# at @s\n# run from mob/process/elite/zephyr/process\n# run from clocks/elite/zephyr_process\n\nscoreboard players add @s gm4_mu_data 1\n\nexecute if score @s gm4_mu_data matches 16.. run return run function gm4_monsters_unbound:mob/process/elite/zephyr/lose_charge\n\nscoreboard players set $keep_tick.elite_process_zephyr gm4_mu_keep_tick 1\n\nexecute anchored eyes positioned ^ ^ ^0.05 on target facing entity @s eyes summon arrow run function gm4_monsters_unbound:mob/process/elite/zephyr/skeleton/init_arrow\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/skeleton/get_target_pos.mcfunction",
    "content": "# get pos of target\n# @s = marker\n# at @s\n# run from mob/process/elite/zephyr/skeleton/init_arrow\n\ndata modify storage gm4_monsters_unbound:temp Pos set from entity @s Pos\nexecute store result score $target_x gm4_mu_data run data get storage gm4_monsters_unbound:temp Pos[0] 100\nexecute store result score $target_y gm4_mu_data run data get storage gm4_monsters_unbound:temp Pos[1] 100\nexecute store result score $target_z gm4_mu_data run data get storage gm4_monsters_unbound:temp Pos[2] 100\nkill @s\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/skeleton/init_arrow.mcfunction",
    "content": "# init arrow burst arrow\n# @s = arrow\n# at @s\n# run from mob/process/elite/zephyr/skeleton/arrow_burst\n\n# don't process this arrow in survival_refightalized\ntag @s add gm4_sr_arrow_checked\n\n# arrow deals half damage\ndata modify entity @s damage set value 0.5\n\n# get player pos\nexecute positioned ^ ^ ^10 summon marker run function gm4_monsters_unbound:mob/process/elite/zephyr/skeleton/get_target_pos\n\n# get vector\ndata modify storage gm4_monsters_unbound:temp Pos set from entity @s Pos\nexecute store result score $motion_x gm4_mu_data run data get storage gm4_monsters_unbound:temp Pos[0] 100\nexecute store result score $motion_y gm4_mu_data run data get storage gm4_monsters_unbound:temp Pos[1] 100\nexecute store result score $motion_z gm4_mu_data run data get storage gm4_monsters_unbound:temp Pos[2] 100\n\nexecute store result score $motion_x_offset gm4_mu_data run random value -128..128\nexecute store result score $motion_y_offset gm4_mu_data run random value -32..32\nexecute store result score $motion_z_offset gm4_mu_data run random value -128..128\n\nscoreboard players operation $target_x gm4_mu_data += $motion_x_offset gm4_mu_data\nscoreboard players operation $target_y gm4_mu_data += $motion_y_offset gm4_mu_data\nscoreboard players operation $target_z gm4_mu_data += $motion_z_offset gm4_mu_data\n\nscoreboard players operation $motion_x gm4_mu_data -= $target_x gm4_mu_data\nscoreboard players operation $motion_y gm4_mu_data -= $target_y gm4_mu_data\nscoreboard players operation $motion_z gm4_mu_data -= $target_z gm4_mu_data\n\n# set motion\nexecute store result entity @s Motion[0] double -0.0016517 run scoreboard players get $motion_x gm4_mu_data\nexecute store result entity @s Motion[1] double -0.0016517 run scoreboard players get $motion_y gm4_mu_data\nexecute store result entity @s Motion[2] double -0.0016517 run scoreboard players get $motion_z gm4_mu_data\n\ndata remove storage gm4_monsters_unbound:temp Pos\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/skeleton/start.mcfunction",
    "content": "# start arrow burst for skeleton zephyr elite\n# @s = zephyr elite\n# at @s\n# run from mob/process/elite/zephyr/process\n\ntag @s add gm4_mu_elite.zephyr_skeleton_burst\nscoreboard players set @s gm4_mu_data 0\nexecute unless score $keep_tick.elite_process_zephyr gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/zephyr_process 2t\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/reveal_dripstone_trap.mcfunction",
    "content": "# reveal dripstone trap when a player gets below\n# @s = hidden dripstone trap\n# at @s\n# run from main\n\nkill @s \n\nexecute unless block ~ ~1 ~ #gm4_monsters_unbound:dripstone run return 0\n\n# spring the trap\nparticle block{block_state:\"dripstone_block\"} ~ ~ ~ 0.2 0.6 0.2 1 24\nparticle block{block_state:\"dripstone_block\"} ~ ~-16 ~ 0.2 10 0.2 1 64\nplaysound minecraft:block.dripstone_block.break block @a[distance=..42] ~ ~ ~ 1.5 0.8 1\n\nexecute store result score $pick_entity gm4_mu_data run random value 1..3\nscoreboard players set $mob_extras gm4_sr_data 1\nexecute if score $pick_entity gm4_mu_data matches 1 run summon skeleton ~ ~-0.8 ~ {Tags:[\"gm4_sr_extra_mob\"],Motion:[0.0d,-0.275d,0.0d],attributes:[{id:\"fall_damage_multiplier\",base:1,modifiers:[{id:\"gm4_monsters_unbound:stat_change.dripstone_trap\",amount:-0.95,operation:\"add_multiplied_total\"}]}]}\nexecute if score $pick_entity gm4_mu_data matches 2 run summon zombie ~ ~-0.8 ~ {Tags:[\"gm4_sr_extra_mob\"],Motion:[0.0d,-0.275d,0.0d],attributes:[{id:\"fall_damage_multiplier\",base:1,modifiers:[{id:\"gm4_monsters_unbound:stat_change.dripstone_trap\",amount:-0.95,operation:\"add_multiplied_total\"}]}]}\nexecute if score $pick_entity gm4_mu_data matches 3 run summon spider ~ ~ ~ {Tags:[\"gm4_sr_extra_mob\"],Motion:[0.0d,-0.275d,0.0d],attributes:[{id:\"fall_damage_multiplier\",base:1,modifiers:[{id:\"gm4_monsters_unbound:stat_change.dripstone_trap\",amount:-0.95,operation:\"add_multiplied_total\"}]}]}\n\nexecute if score gm4_survival_refightalized load.status matches 1.. as @e[type=#gm4_monsters_unbound:modify,tag=gm4_sr_extra_mob,distance=..1,limit=1] at @s run function gm4_survival_refightalized:mob/init/initiate\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @e[type=#gm4_monsters_unbound:modify,tag=gm4_sr_extra_mob,distance=..1,limit=1] at @s run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/reveal_snowy_trap.mcfunction",
    "content": "# reveal snowy trap when a player gets nearby\n# @s = hidden snowy trap\n# at @s\n# run from main\n\nkill @s \n\nexecute unless block ~ ~ ~ snow run return 0\n\n# spring the trap\nparticle block{block_state:\"snow\"} ~ ~1 ~ 0.2 0.6 0.2 1 12\nplaysound minecraft:block.snow.place block @a ~ ~ ~ 1.5 0.8\n\nexecute store result score $pick_entity gm4_mu_data run random value 1..3\nscoreboard players set $mob_extras gm4_sr_data 1\nexecute if score $pick_entity gm4_mu_data matches 1 run summon zombie ~ ~-0.75 ~ {Tags:[\"gm4_sr_extra_mob\"],Motion:[0.0d,0.5d,0.0d]}\nexecute if score $pick_entity gm4_mu_data matches 2 run summon stray ~ ~-0.75 ~ {Tags:[\"gm4_sr_extra_mob\"],Motion:[0.0d,0.5d,0.0d]}\nexecute if score $pick_entity gm4_mu_data matches 3 run summon creeper ~ ~-0.75 ~ {Tags:[\"gm4_sr_extra_mob\"],Motion:[0.0d,0.5d,0.0d]}\n\nexecute if score gm4_survival_refightalized load.status matches 1.. as @e[type=#gm4_monsters_unbound:modify,tag=gm4_sr_extra_mob,distance=..1,limit=1] at @s run function gm4_survival_refightalized:mob/init/initiate\nexecute unless score gm4_survival_refightalized load.status matches 1.. as @e[type=#gm4_monsters_unbound:modify,tag=gm4_sr_extra_mob,distance=..1,limit=1] at @s run function gm4_monsters_unbound:mob/init/initialize\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/spore/activate.mcfunction",
    "content": "# summon new zombie/husk/drowned when spore is grown\n# @s = spore item\n# at @s\n# run from mob/process/spore/advance\n\n# check for mob cap\nexecute at @p[gamemode=!spectator] store result score $spore_zombie_count gm4_mu_data if entity @e[type=#gm4_monsters_unbound:zombie_types,tag=gm4_mu_spore_mob,distance=..32]\nexecute if score $spore_zombie_count gm4_mu_data > $mob_limit.spore_zombie gm4_mu_config run kill @s\nexecute if score $spore_zombie_count gm4_mu_data > $mob_limit.spore_zombie gm4_mu_config run return 0\n\n# get spores in stack and their generation\nexecute store result score $spore_count gm4_mu_data run data get entity @s Item.count\nexecute store result score $generation gm4_mu_data run data get entity @s Item.components.\"minecraft:custom_data\".gm4_mu_spore.generation\n\n# spawn up to 4 spore zombies\nexecute align xz run summon zombie ~.5 ~ ~.5 {Tags:[\"gm4_sr_extra_mob\",\"gm4_mu_spore_mob\"]}\nexecute if score $spore_count gm4_mu_data matches 2.. align xz run summon zombie ~.51 ~ ~.47 {Tags:[\"gm4_sr_extra_mob\",\"gm4_mu_spore_mob\"]}\nexecute if score $spore_count gm4_mu_data matches 3.. align xz run summon zombie ~.54 ~ ~.52 {Tags:[\"gm4_sr_extra_mob\",\"gm4_mu_spore_mob\"]}\nexecute if score $spore_count gm4_mu_data matches 4.. align xz run summon zombie ~0.47 ~ ~.54 {Tags:[\"gm4_sr_extra_mob\",\"gm4_mu_spore_mob\"]}\nexecute if entity @s[tag=gm4_mu_spore.cherry] run tag @e[type=zombie,tag=gm4_mu_spore_mob,distance=..1] add gm4_mu_spore_zombie.cherry\n\n# vfx\nparticle minecraft:block{block_state:\"minecraft:flowering_azalea_leaves\"} ~ ~1 ~ 0.35 1 0.35 0.1 32\nplaysound block.grass.break hostile @a ~ ~ ~ 0.6 0.6\n\n# remove spores\nexecute if score $spore_count gm4_mu_data matches ..4 run kill @s\nexecute if score $spore_count gm4_mu_data matches 5.. store result entity @s Item.count byte 1 run scoreboard players remove $spore_count gm4_mu_data 4\n\n# set spore zombie generation\nexecute as @e[tag=gm4_mu_spore_mob,distance=..1] at @s run function gm4_monsters_unbound:mob/process/spore/set_generation\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/spore/advance.mcfunction",
    "content": "# advance spore growth\n# @s = spore item\n# at @s\n# run from main\n\nexecute if score @s gm4_mu_data matches 10.. run return run function gm4_monsters_unbound:mob/process/spore/activate\n\nscoreboard players add @s gm4_mu_data 1\nexecute if score @s[tag=!gm4_mu_spore.cherry] gm4_mu_data matches 1..4 run particle minecraft:block{block_state:\"minecraft:flowering_azalea_leaves\"} ~ ~ ~ 0.04 0.15 0.04 0.05 5\nexecute if score @s[tag=!gm4_mu_spore.cherry] gm4_mu_data matches 5..7 run particle minecraft:block{block_state:\"minecraft:flowering_azalea_leaves\"} ~ ~ ~ 0.045 0.175 0.045 0.1 8\nexecute if score @s[tag=!gm4_mu_spore.cherry] gm4_mu_data matches 8.. run particle minecraft:block{block_state:\"minecraft:flowering_azalea_leaves\"} ~ ~ ~ 0.05 0.2 0.05 0.15 16\nexecute if score @s[tag=gm4_mu_spore.cherry] gm4_mu_data matches 1..4 run particle minecraft:block{block_state:\"minecraft:cherry_leaves\"} ~ ~ ~ 0.04 0.15 0.04 0.05 5\nexecute if score @s[tag=gm4_mu_spore.cherry] gm4_mu_data matches 5..7 run particle minecraft:block{block_state:\"minecraft:cherry_leaves\"} ~ ~ ~ 0.045 0.175 0.045 0.1 8\nexecute if score @s[tag=gm4_mu_spore.cherry] gm4_mu_data matches 8.. run particle minecraft:block{block_state:\"minecraft:cherry_leaves\"} ~ ~ ~ 0.05 0.2 0.05 0.15 16\nplaysound block.grass.step hostile @a ~ ~ ~ 2 0.5\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/spore/burn_on_head.mcfunction",
    "content": "# burn the spore if a spore zombie is on fire\n# @s = spore zombie\n# at unspecified\n# run from main\n\nitem replace entity @s armor.head with air\ntag @s remove gm4_mu_spore_zombie\ntag @s remove gm4_mu_spore_zombie.cherry\n\nexecute anchored eyes run particle flame ^ ^0.1 ^-0.1 0.1 0.1 0.1 0.15 8\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/spore/initialise.mcfunction",
    "content": "# tag spore item as spore\n# @s = spore item\n# at unspecified\n# run from check_item\n\ntag @s add gm4_mu_spore\ndata merge entity @s {Age:-32768,PickupDelay:32767,Health:4}\nexecute if items entity @s contents minecraft:cherry_leaves run tag @s add gm4_mu_spore.cherry\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/spore/set_generation.mcfunction",
    "content": "# set generation of new zombie/husk/drowned\n# @s = zombie/husk/drowned\n# at @s\n# run from mob/process/spore/activate\n\nscoreboard players operation @s gm4_mu_generation = $generation gm4_mu_data\ntag @s remove gm4_mu_spore_mob\ntag @s add gm4_mu_spore_zombie\nfunction gm4_monsters_unbound:mob/init/initiate\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/toxic_creeper.mcfunction",
    "content": "# refresh effects on creeper\n# @s = toxic creeper\n# at unspecified\n# run from slow_clock\n# run from mob/init/mob_type/creeper\n\neffect give @s weakness 33 1\neffect give @s blindness 33 0 true\neffect give @s nausea 33 0 true\neffect give @s hunger 33 1 true\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/slow_clock.mcfunction",
    "content": "schedule function gm4_monsters_unbound:slow_clock 30s\n\n# toxic creepers\nexecute as @e[type=creeper,tag=gm4_mu_toxic_creeper] run function gm4_monsters_unbound:mob/process/toxic_creeper\n\n# cloaked crepers\neffect give @e[type=creeper,tag=gm4_mu_cloaked_creeper] invisibility 33 0\n\n# remove traps that have not been triggered\nexecute as @e[type=marker,tag=gm4_mu_trap] at @s unless entity @a[gamemode=!spectator,distance=..128] run kill @s\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/function/tick.mcfunction",
    "content": "schedule function gm4_monsters_unbound:tick 1t\n\n# check for items on the ground\nexecute as @e[type=item,tag=!gm4_mu_item_checked,tag=!smithed.strict,tag=!smithed.entity] run function gm4_monsters_unbound:check_item\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/guidebook/monsters_unbound.json",
    "content": "{\n  \"id\": \"monsters_unbound\",\n  \"name\": \"Monsters Unbound\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:chainmail_chestplate\"\n  },\n  \"criteria\": {\n    \"enter_underground\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_monsters_unbound:technical/underground\"\n          }\n        ]\n      }\n    },\n    \"enter_dripstone_caves\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"biomes\": \"minecraft:dripstone_caves\"\n            }\n          }\n        ]\n      }\n    },\n    \"enter_burned\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_monsters_unbound:biome/burned\"\n          }\n        ]\n      }\n    },\n    \"enter_flowering\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_monsters_unbound:biome/flowering\"\n          }\n        ]\n      }\n    },\n    \"enter_growth\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_monsters_unbound:biome/growth\"\n          }\n        ]\n      }\n    },\n    \"enter_mountainous\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_monsters_unbound:biome/mountainous\"\n          }\n        ]\n      }\n    },\n    \"enter_warm_ocean\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"biomes\": \"minecraft:warm_ocean\"\n            }\n          }\n        ]\n      }\n    },\n    \"enter_snowy\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_monsters_unbound:biome/snowy\"\n          }\n        ]\n      }\n    },\n    \"enter_toxic\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_monsters_unbound:biome/toxic\"\n          }\n        ]\n      }\n    },\n    \"kill_elite_blazing\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.blazing\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"kill_elite_gargantuan\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.gargantuan\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"kill_elite_glacial\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.glacial\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"kill_elite_mending\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.mending\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"kill_elite_pearlescent\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.pearlescent\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"kill_elite_splitting\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.splitting\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"kill_elite_volatile\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.volatile\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"kill_elite_vorpal\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.vorpal\\\"]}\"\n            }\n          }\n        ]\n      }\n    },\n    \"kill_elite_zephyr\": {\n      \"trigger\": \"minecraft:player_killed_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_mu_elite.zephyr\\\"]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"biomes\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.biomes\",\n            \"fallback\": \"Mobs spawned in different biomes have special modifiers.\\n\\nSome areas and biomes spawn different mobs than usual.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"underground\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"enter_underground\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.underground\",\n            \"fallback\": \"Mobs spawned underground are generally stronger and can have varying buffs and potion effects.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"burned\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"enter_burned\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.burned\",\n            \"fallback\": \"Mobs spawned in a %s biome are weaker but faster.\\n\\nHusks spawn in large groups.\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.guidebook.monsters_unbound.burned\",\n                \"fallback\": \"burned\",\n                \"color\": \"blue\",\n                \"hover_event\": {\n                  \"action\": \"show_text\",\n                  \"value\": [\n                    \"- \",\n                    {\n                      \"translate\": \"biome.minecraft.desert\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.savanna\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.savanna_plateau\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.windswept_savanna\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.badlands\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.wooded_badlands\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.eroded_badlands\"\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"dripstone_caves\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"enter_dripstone_caves\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.dripstone_caves\",\n            \"fallback\": \"More Spiders are found in Dripstone Caves, and Skeletons may wield pickaxes.\\n\\nSome Dripstone may be trapped and drop a mob when walked below.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"flowering\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"enter_flowering\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.flowering\",\n            \"fallback\": \"In %s biomes Spore Zombies can be found, these drop a respawning Spore on death. Spores are susceptible to fire.\\n\\nCreepers are weaker but invisible.\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.guidebook.monsters_unbound.flowering\",\n                \"fallback\": \"flowering\",\n                \"color\": \"blue\",\n                \"hover_event\": {\n                  \"action\": \"show_text\",\n                  \"value\": [\n                    \"- \",\n                    {\n                      \"translate\": \"biome.minecraft.sunflower_plains\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.flower_forest\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.cherry_grove\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.lush_caves\"\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"growth\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"enter_growth\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.growth\",\n            \"fallback\": \"Mobs spawned in a %s biome are faster.\\n\\nSkeletons usually use melee weapons.\\n\\nMore Spiders are found here\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.guidebook.monsters_unbound.growth\",\n                \"fallback\": \"growth\",\n                \"color\": \"blue\",\n                \"hover_event\": {\n                  \"action\": \"show_text\",\n                  \"value\": [\n                    \"- \",\n                    {\n                      \"translate\": \"biome.minecraft.snowy_taiga\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.grove\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.taiga\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.old_growth_pine_taiga\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.old_growth_spruce_taiga\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.dark_forest\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.mangrove_swamp\"\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"mountainous\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"enter_mountainous\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.mountainous\",\n            \"fallback\": \"Phantoms can spawn in %s biomes.\\n\\nCreepers have more health.\\n\\nSpiders are faster\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.guidebook.monsters_unbound.mountainous\",\n                \"fallback\": \"mountainous\",\n                \"color\": \"blue\",\n                \"hover_event\": {\n                  \"action\": \"show_text\",\n                  \"value\": [\n                    \"- \",\n                    {\n                      \"translate\": \"biome.minecraft.snowy_slopes\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.jagged_peaks\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.frozen_peaks\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.windswept_hills\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.windswept_gravelly_hills\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.windswept_forest\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.stony_shore\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.cherry_grove\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.meadow\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.stony_peaks\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.windswept_savanna\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.eroded_badlands\"\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"snowy\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"enter_snowy\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.snowy\",\n            \"fallback\": \"Mobs can ambush the player from snow in %s biomes.\\n\\nMobs can apply slowness.\\n\\nSpiders can be Gargantuan Elites.\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.guidebook.monsters_unbound.snowy\",\n                \"fallback\": \"snowy\",\n                \"color\": \"blue\",\n                \"hover_event\": {\n                  \"action\": \"show_text\",\n                  \"value\": [\n                    \"- \",\n                    {\n                      \"translate\": \"biome.minecraft.snowy_plains\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.ice_spikes\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.snowy_taiga\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.snowy_beach\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.grove\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.snowy_slopes\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.jagged_peaks\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.frozen_peaks\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.frozen_river\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.frozen_ocean\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.deep_frozen_ocean\"\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"toxic\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"enter_toxic\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.toxic\",\n            \"fallback\": \"Mobs spawned in a %s biome can apply various negative effects.\\n\\nMore Witches are found here.\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.guidebook.monsters_unbound.toxic\",\n                \"fallback\": \"toxic\",\n                \"color\": \"blue\",\n                \"hover_event\": {\n                  \"action\": \"show_text\",\n                  \"value\": [\n                    \"- \",\n                    {\n                      \"translate\": \"biome.minecraft.swamp\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.mangrove_swamp\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.jungle\"\n                    },\n                    \"\\n- \",\n                    {\n                      \"translate\": \"biome.minecraft.bamboo_jungle\"\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"warm_ocean\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"enter_warm_ocean\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.warm_ocean\",\n            \"fallback\": \"Drowned spawned in a Warm Ocean are much more powerful and have a larger chance to spawn wielding a Trident.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"elites\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.elites\",\n            \"fallback\": \"Zombies that spawn as babies or as leaders are replaced with a random Elite variant.\\n\\nSkeletons have a static 5% chance to be an Elite.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"elite_blazing\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_elite_blazing\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.elite_blazing\",\n            \"fallback\": \"Blazing Elites are slow and immune to burning. Their attacks deal little damage but have Fire Aspect II or Flame. Occasionally will spawn slow moving homing projectiles that explode on contact.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"elite_gargantuan\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_elite_gargantuan\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.elite_gargantuan\",\n            \"fallback\": \"Gargantuan Elites are much bigger and gain stats based on their missing health. Will occasionally perform an AoE stomp attack.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"elite_glacial\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_elite_glacial\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.elite_glacial\",\n            \"fallback\": \"Glacial Elites leave a sphere of frozen energy on death. This sphere explodes after 2 seconds freezing any entity inside for 3 seconds.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"elite_mending\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_elite_mending\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.elite_mending\",\n            \"fallback\": \"Mending Elites will heal other undead mobs in their line of sight, this will never target other Mending Elites.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"elite_pearlescent\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_elite_pearlescent\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.elite_pearlescent\",\n            \"fallback\": \"Pearescent Elites can shoot damaging lasers from their eyes, the laser is blocked by terrain.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"elite_splitting\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_elite_splitting\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.elite_splitting\",\n            \"fallback\": \"Splitting Elites split into 6 smaller and weaker versions of itself on death.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"elite_volatile\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_elite_volatile\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.elite_volatile\",\n            \"fallback\": \"Volatile Elites create randomly targeted purple beams of energy around them that explode after a delay, dealing heavy magic damage.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"elite_vorpal\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_elite_vorpal\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.elite_vorpal\",\n            \"fallback\": \"Vorpal Elites teleport randomly on getting hit. On death a homing skull will track the nearest player and apply Fear, which blinds and slows interactions.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"elite_zephyr\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_elite_zephyr\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.monsters_unbound.description.elite_zephyr\",\n            \"fallback\": \"Zephyr Elites can charge a powerful wind-charged attack. Damaging them during the charge time dissipates the charge. Zephyr Zombies will rush the player, Zephyr Skeletons fire a burst of arrows.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/glacial.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:packed_ice\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_mu_elite_on_death:{name:glacial,id:1}}\"\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_monsters_unbound:item/elite_headwear/glacial\"]},\n                \"enchantment_glint_override\": false,\n                \"enchantments\": {\n                  \"binding_curse\": 1\n                }\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/mending.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:lime_glazed_terracotta\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_monsters_unbound:item/elite_headwear/mending\"]},\n                \"enchantment_glint_override\": false,\n                \"enchantments\": {\n                  \"binding_curse\": 1\n                }\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/pearlescent.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:pearlescent_froglight\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_monsters_unbound:item/elite_headwear/pearlescent\"]},\n                \"enchantment_glint_override\": false,\n                \"enchantments\": {\n                  \"binding_curse\": 1\n                }\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/splitting_skeleton.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:spawner\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_mu_elite_on_death:{name:splitting_skeleton,id:4}}\"\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"enchantment_glint_override\": false,\n                \"enchantments\": {\n                  \"binding_curse\": 1\n                }\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/splitting_zombie.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:spawner\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_mu_elite_on_death:{name:splitting_zombie,id:3}}\"\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"enchantment_glint_override\": false,\n                \"enchantments\": {\n                  \"binding_curse\": 1\n                }\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/volatile.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:purple_glazed_terracotta\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_mu_elite_on_death:{name:volatile,id:5}}\"\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"enchantment_glint_override\": false,\n                \"enchantments\": {\n                  \"blast_protection\": 10,\n                  \"binding_curse\": 1\n                }\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/vorpal.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:black_wool\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_mu_elite_on_death:{name:vorpal,id:2}}\"\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"enchantment_glint_override\": false,\n                \"enchantments\": {\n                  \"binding_curse\": 1\n                }\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/mob/equip_armor/spore.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:cherry_leaves\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_monsters_unbound:item/spore/cherry\"]}\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"nbt\": \"{Tags:[\\\"gm4_mu_spore_zombie.cherry\\\"]}\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:azalea_leaves\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_monsters_unbound:item/spore/default\"]}\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:random_chance\",\n              \"chance\": 0.66\n            },\n            {\n              \"condition\": \"minecraft:inverted\",\n              \"term\": {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"nbt\": \"{Tags:[\\\"gm4_mu_spore_zombie.cherry\\\"]}\"\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flowering_azalea_leaves\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_monsters_unbound:item/spore/flowering\"]}\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:inverted\",\n              \"term\": {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"nbt\": \"{Tags:[\\\"gm4_mu_spore_zombie.cherry\\\"]}\"\n                }\n              }\n            }\n          ]\n        }\n      ],\n      \"functions\": [\n        {\n          \"function\": \"minecraft:set_custom_data\",\n          \"tag\": \"{gm4_mu_spore:{generation:0}}\"\n        },\n        {\n          \"function\": \"minecraft:set_name\",\n          \"target\": \"item_name\",\n          \"name\": {\n            \"translate\": \"item.gm4.monsters_unbound.zombie_spore\",\n            \"fallback\": \"Zombie Spore\"\n          }\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/mob/equip_arrow/skeleton_toxic.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:tipped_arrow\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:potion_contents\": {\n                  \"custom_color\": 8889187,\n                  \"custom_effects\": [\n                    {\n                      \"id\": \"minecraft:weakness\",\n                      \"amplifier\": 0,\n                      \"duration\": 800,\n                      \"show_particles\": true,\n                      \"show_icon\": true,\n                      \"ambient\": false\n                    },\n                    {\n                      \"id\": \"minecraft:hunger\",\n                      \"amplifier\": 1,\n                      \"duration\": 800,\n                      \"show_particles\": true,\n                      \"show_icon\": true,\n                      \"ambient\": false\n                    },\n                    {\n                      \"id\": \"minecraft:poison\",\n                      \"amplifier\": 0,\n                      \"duration\": 800,\n                      \"show_particles\": true,\n                      \"show_icon\": true,\n                      \"ambient\": false\n                    }\n                  ]\n                }\n              }\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"custom_name\",\n              \"name\": {\n                \"translate\": \"item.minecraft.tipped_arrow.effect.poison\",\n                \"italic\": false\n              }\n            },\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 4\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/mob/equip_arrow/stray_snowy.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:tipped_arrow\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:potion_contents\": {\n                  \"custom_color\": 9154528,\n                  \"custom_effects\": [\n                    {\n                      \"id\": \"minecraft:slowness\",\n                      \"amplifier\": 2,\n                      \"duration\": 4800,\n                      \"show_particles\": true,\n                      \"show_icon\": true,\n                      \"ambient\": false\n                    }\n                  ]\n                }\n              }\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"custom_name\",\n              \"name\": {\n                \"translate\": \"item.minecraft.tipped_arrow.effect.slowness\",\n                \"italic\": false\n              }\n            },\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/mob/equip_arrow/stray_toxic.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:tipped_arrow\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:potion_contents\": {\n                  \"custom_color\": 8889187,\n                  \"custom_effects\": [\n                    {\n                      \"id\": \"minecraft:weakness\",\n                      \"amplifier\": 0,\n                      \"duration\": 800,\n                      \"show_particles\": true,\n                      \"show_icon\": true,\n                      \"ambient\": false\n                    },\n                    {\n                      \"id\": \"minecraft:poison\",\n                      \"amplifier\": 1,\n                      \"duration\": 800,\n                      \"show_particles\": true,\n                      \"show_icon\": true,\n                      \"ambient\": false\n                    },\n                    {\n                      \"id\": \"minecraft:slowness\",\n                      \"amplifier\": 0,\n                      \"duration\": 4800,\n                      \"show_particles\": true,\n                      \"show_icon\": true,\n                      \"ambient\": false\n                    }\n                  ]\n                }\n              }\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"custom_name\",\n              \"name\": {\n                \"translate\": \"item.minecraft.tipped_arrow.effect.poison\",\n                \"italic\": false\n              }\n            },\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 4\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/burned.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:inverted\",\n    \"term\": {\n      \"condition\": \"minecraft:reference\",\n      \"name\": \"gm4_monsters_unbound:technical/underground\"\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n      \"biomes\": [\n        \"minecraft:desert\",\n        \"minecraft:savanna\",\n        \"minecraft:savanna_plateau\",\n        \"minecraft:windswept_savanna\",\n        \"minecraft:badlands\",\n        \"minecraft:wooded_badlands\",\n        \"minecraft:eroded_badlands\"\n      ]\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/flowering.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:location_check\",\n        \"predicate\": {\n          \"biomes\": \"minecraft:lush_caves\"\n        }\n      },\n      {\n        \"condition\": \"minecraft:all_of\",\n        \"terms\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_monsters_unbound:technical/underground\"\n            }\n          },\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"biomes\": [\n                \"minecraft:sunflower_plains\",\n                \"minecraft:flower_forest\",\n                \"minecraft:cherry_grove\"\n              ]\n            }\n          }\n        ]\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/growth.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:inverted\",\n    \"term\": {\n      \"condition\": \"minecraft:reference\",\n      \"name\": \"gm4_monsters_unbound:technical/underground\"\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n      \"biomes\": [\n        \"minecraft:snowy_taiga\",\n        \"minecraft:grove\",\n        \"minecraft:taiga\",\n        \"minecraft:old_growth_pine_taiga\",\n        \"minecraft:old_growth_spruce_taiga\",\n        \"minecraft:dark_forest\",\n        \"minecraft:mangrove_swamp\"\n      ]\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/mountainous.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:inverted\",\n    \"term\": {\n      \"condition\": \"minecraft:reference\",\n      \"name\": \"gm4_monsters_unbound:technical/underground\"\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n      \"biomes\": [\n        \"minecraft:snowy_slopes\",\n        \"minecraft:jagged_peaks\",\n        \"minecraft:frozen_peaks\",\n        \"minecraft:windswept_hills\",\n        \"minecraft:windswept_gravelly_hills\",\n        \"minecraft:windswept_forest\",\n        \"minecraft:stony_shore\",\n        \"minecraft:meadow\",\n        \"minecraft:stony_peaks\",\n        \"minecraft:windswept_savanna\",\n        \"minecraft:eroded_badlands\",\n        \"minecraft:cherry_grove\"\n      ]\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/reef.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:reference\",\n          \"name\": \"gm4_monsters_unbound:technical/underground\"\n        }\n      },\n      {\n        \"condition\": \"minecraft:location_check\",\n        \"predicate\": {\n          \"block\": {\n            \"blocks\": \"#gm4:water\"\n          }\n        }\n      }\n    ]\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n      \"biomes\": \"minecraft:warm_ocean\"\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/snowy.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:inverted\",\n    \"term\": {\n      \"condition\": \"minecraft:reference\",\n      \"name\": \"gm4_monsters_unbound:technical/underground\"\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n      \"biomes\": [\n        \"minecraft:snowy_plains\",\n        \"minecraft:ice_spikes\",\n        \"minecraft:snowy_taiga\",\n        \"minecraft:snowy_beach\",\n        \"minecraft:grove\",\n        \"minecraft:snowy_slopes\",\n        \"minecraft:jagged_peaks\",\n        \"minecraft:frozen_peaks\",\n        \"minecraft:frozen_river\",\n        \"minecraft:frozen_ocean\",\n        \"minecraft:deep_frozen_ocean\"\n      ]\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/toxic.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:inverted\",\n    \"term\": {\n      \"condition\": \"minecraft:reference\",\n      \"name\": \"gm4_monsters_unbound:technical/underground\"\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n      \"biomes\": [\n        \"minecraft:swamp\",\n        \"minecraft:mangrove_swamp\",\n        \"minecraft:jungle\",\n        \"minecraft:bamboo_jungle\"\n      ]\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/chance/spawn_phantom.json",
    "content": "[\n    {\n        \"condition\": \"minecraft:random_chance\",\n        \"chance\": 0.075\n    },\n    {\n        \"condition\": \"minecraft:reference\",\n        \"name\": \"gm4_monsters_unbound:biome/mountainous\"\n    },\n    {\n        \"condition\": \"minecraft:time_check\",\n        \"clock\": \"minecraft:overworld\",\n        \"value\": {\n            \"min\": 13188,\n            \"max\": 22812\n        },\n        \"period\": 24000\n    }\n]\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/technical/on_fire.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n      \"flags\": {\n        \"is_on_fire\": true\n      }\n    }\n  }\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/technical/underground.json",
    "content": "[\n    {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n                \"block\": {\n                    \"blocks\": \"#gm4:water\"\n                }\n            }\n        }\n    },\n    {\n        \"condition\": \"minecraft:location_check\",\n        \"offsetY\": 1,\n        \"predicate\": {\n            \"light\": {\n                \"light\": 0\n            }\n        }\n    }\n]\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/technical/valid_tp.json",
    "content": "[\n    {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n            \"condition\": \"minecraft:location_check\",\n            \"offsetY\": -1,\n            \"predicate\": {\n                \"block\": {\n                    \"blocks\": \"#gm4:no_collision\"\n                }\n            }\n        }\n    },\n    {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n            \"condition\": \"minecraft:any_of\",\n            \"terms\": [\n                {\n                    \"condition\": \"minecraft:location_check\",\n                    \"offsetY\": 1,\n                    \"predicate\": {\n                        \"fluid\": {\n                            \"fluids\": \"#minecraft:lava\"\n                        }\n                    }\n                },\n                {\n                    \"condition\": \"minecraft:location_check\",\n                    \"predicate\": {\n                        \"fluid\": {\n                            \"fluids\": \"#minecraft:lava\"\n                        }\n                    }\n                },\n                {\n                    \"condition\": \"minecraft:location_check\",\n                    \"offsetY\": 1,\n                    \"predicate\": {\n                        \"fluid\": {\n                            \"fluids\": \"#minecraft:water\"\n                        }\n                    }\n                },\n                {\n                    \"condition\": \"minecraft:location_check\",\n                    \"predicate\": {\n                        \"fluid\": {\n                            \"fluids\": \"#minecraft:water\"\n                        }\n                    }\n                }\n            ]\n        }\n    },\n    {\n        \"condition\": \"minecraft:location_check\",\n        \"offsetY\": 1,\n        \"predicate\": {\n            \"block\": {\n                \"blocks\": \"#gm4:no_collision\"\n            }\n        }\n    },\n    {\n        \"condition\": \"minecraft:location_check\",\n        \"predicate\": {\n            \"block\": {\n                \"blocks\": \"#gm4:no_collision\"\n            }\n        }\n    }\n]\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/tags/block/dripstone.json",
    "content": "{\n    \"values\": [\n        \"minecraft:dripstone_block\",\n        \"minecraft:pointed_dripstone\"\n    ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/tags/entity_type/elite_types.json",
    "content": "{\n    \"values\": [\n        \"minecraft:bogged\",\n        \"minecraft:drowned\",\n        \"minecraft:husk\",\n        \"minecraft:skeleton\",\n        \"minecraft:stray\",\n        \"minecraft:zombie\"\n    ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/tags/entity_type/modify.json",
    "content": "{\n    \"values\": [\n        \"minecraft:bogged\",\n        \"minecraft:cave_spider\",\n        \"minecraft:creeper\",\n        \"minecraft:drowned\",\n        \"minecraft:enderman\",\n        \"minecraft:husk\",\n        \"minecraft:parched\",\n        \"minecraft:phantom\",\n        \"minecraft:piglin\",\n        \"minecraft:silverfish\",\n        \"minecraft:skeleton\",\n        \"minecraft:spider\",\n        \"minecraft:stray\",\n        \"minecraft:wither_skeleton\",\n        \"minecraft:zombie\",\n        \"minecraft:zombie_villager\",\n        \"minecraft:zombified_piglin\"\n    ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/tags/entity_type/modify_in_air.json",
    "content": "{\n    \"values\": [\n        \"minecraft:cave_spider\",\n        \"minecraft:drowned\",\n        \"minecraft:phantom\",\n        \"minecraft:silverfish\"\n    ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/tags/entity_type/skeleton_types.json",
    "content": "{\n    \"values\": [\n        \"minecraft:bogged\",\n        \"minecraft:parched\",\n        \"minecraft:skeleton\",\n        \"minecraft:stray\",\n        \"minecraft:wither_skeleton\"\n    ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_monsters_unbound/tags/entity_type/zombie_types.json",
    "content": "{\n    \"values\": [\n        \"minecraft:drowned\",\n        \"minecraft:husk\",\n        \"minecraft:zombie\",\n        \"minecraft:zombie_villager\"\n    ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/data/gm4_survival_refightalized/tags/function/init_mob.json",
    "content": "{\n    \"values\": [\n        \"gm4_monsters_unbound:mob/init/mob_type\"\n    ]\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/mod.mcdoc",
    "content": "use ::java::util::text::Text\n\ndispatch minecraft:storage[gm4_monsters_unbound:temp] to struct {\n  slowness?: struct {\n    level: int,\n  },\n  deal?: struct {\n    damage: float,\n  },\n  set?: struct {\n    speed: float,\n    damage: float,\n    knockback_resistance: float,\n  },\n  Rotation?: [float] @ 2,\n  Pos?: [double] @ 3,\n  CustomName?: Text,\n}\n"
  },
  {
    "path": "gm4_monsters_unbound/translations.csv",
    "content": "key,en_us\nadvancement.gm4.monsters_unbound.elite_kill.title,Elite Hunter\nadvancement.gm4.monsters_unbound.elite_kill.description,Kill any Elite monster\nadvancement.gm4.monsters_unbound.elite_kill_all.title,Elites Hunted\nadvancement.gm4.monsters_unbound.elite_kill_all.description,Kill one of every Elite monster\nitem.gm4.monsters_unbound.zombie_spore,Zombie Spore\ntext.gm4.monsters_unbound.elite_name.glacial,Glacial \ntext.gm4.monsters_unbound.elite_name.slate,Slate \ntext.gm4.monsters_unbound.elite_name.blazing,Blazing \ntext.gm4.monsters_unbound.elite_name.zephyr,Zephyr \ntext.gm4.monsters_unbound.elite_name.gargantuan,Gargantuan \ntext.gm4.monsters_unbound.elite_name.vorpal,Vorpal \ntext.gm4.monsters_unbound.elite_name.splitting,Splitting \ntext.gm4.monsters_unbound.elite_name.split,Split \ntext.gm4.monsters_unbound.elite_name.volatile,Volatile \ntext.gm4.monsters_unbound.elite_name.pearlescent,Pearlescent \ntext.gm4.guidebook.module_desc.monsters_unbound,Mobs gain special effects based on their biome.\ntext.gm4.guidebook.monsters_unbound.description.biomes,Mobs spawned in different biomes have special modifiers.\\n\\nSome areas and biomes spawn different mobs than usual.\ntext.gm4.guidebook.monsters_unbound.description.underground,Mobs spawned underground are generally stronger and can have varying buffs and potion effects.\ntext.gm4.guidebook.monsters_unbound.burned,burned\ntext.gm4.guidebook.monsters_unbound.description.burned,Mobs spawned in a %s biome are weaker but faster.\\n\\nHusks spawn in large groups.\ntext.gm4.guidebook.monsters_unbound.description.dripstone_caves,\"More Spiders are found in Dripstone Caves, and Skeletons may wield pickaxes.\\n\\nSome Dripstone may be trapped and drop a mob when walked below.\"\ntext.gm4.guidebook.monsters_unbound.flowering,flowering\ntext.gm4.guidebook.monsters_unbound.description.flowering,\"In %s biomes Spore Zombies can be found, these drop a respawning Spore on death. Spores are susceptible to fire.\\n\\nCreepers are weaker but invisible.\"\ntext.gm4.guidebook.monsters_unbound.growth,growth\ntext.gm4.guidebook.monsters_unbound.description.growth,Mobs spawned in a %s biome are faster.\\n\\nSkeletons usually use melee weapons.\\n\\nMore Spiders are found here\ntext.gm4.guidebook.monsters_unbound.mountainous,mountainous\ntext.gm4.guidebook.monsters_unbound.description.mountainous,Phantoms can spawn in %s biomes.\\n\\nCreepers have more health.\\n\\nSpiders are faster\ntext.gm4.guidebook.monsters_unbound.snowy,snowy\ntext.gm4.guidebook.monsters_unbound.description.snowy,Mobs can ambush the player from snow in %s biomes.\\n\\nMobs can apply slowness.\\n\\nSpiders can be Gargantuan Elites.\ntext.gm4.guidebook.monsters_unbound.toxic,toxic\ntext.gm4.guidebook.monsters_unbound.description.toxic,Mobs spawned in a %s biome can apply various negative effects.\\n\\nMore Witches are found here.\ntext.gm4.guidebook.monsters_unbound.description.warm_ocean,Drowned spawned in a Warm Ocean are much more powerful and have a larger chance to spawn wielding a Trident.\ntext.gm4.guidebook.monsters_unbound.description.elites,Zombies that spawn as babies or as leaders are replaced with a random Elite variant.\\n\\nSkeletons have a static 5% chance to be an Elite.\ntext.gm4.guidebook.monsters_unbound.description.elite_zephyr,\"Zephyr Elites can charge a powerful wind-charged attack. Damaging them during the charge time dissipates the charge. Zephyr Zombies will rush the player, Zephyr Skeletons fire a burst of arrows.\"\ntext.gm4.guidebook.monsters_unbound.description.elite_blazing,Blazing Elites are slow and immune to burning. Their attacks deal little damage but have Fire Aspect II or Flame. Occasionally will spawn slow moving homing projectiles that explode on contact.\ntext.gm4.guidebook.monsters_unbound.description.elite_gargantuan,Gargantuan Elites are much bigger and gain stats based on their missing health. Will occasionally perform an AoE stomp attack.\ntext.gm4.guidebook.monsters_unbound.description.elite_glacial,Glacial Elites leave a sphere of frozen energy on death. This sphere explodes after 2 seconds freezing any entity inside for 3 seconds.\ntext.gm4.guidebook.monsters_unbound.description.elite_mending,\"Mending Elites will heal other undead mobs in their line of sight, this will never target other Mending Elites.\"\ntext.gm4.guidebook.monsters_unbound.description.elite_pearlescent,\"Pearescent Elites can shoot damaging lasers from their eyes, the laser is blocked by terrain.\"\ntext.gm4.guidebook.monsters_unbound.description.elite_splitting,Splitting Elites split into 6 smaller and weaker versions of itself on death.\ntext.gm4.guidebook.monsters_unbound.description.elite_volatile,\"Volatile Elites create randomly targeted purple beams of energy around them that explode after a delay, dealing heavy magic damage.\"\ntext.gm4.guidebook.monsters_unbound.description.elite_vorpal,\"Vorpal Elites teleport randomly on getting hit. On death a homing skull will track the nearest player and apply Fear, which blinds and slows interactions.\"\ntext.gm4.monsters_unbound.death.pearlescent_elite_laser,\"%s was seen by %s\"\ntext.gm4.monsters_unbound.death.volatile_elite_meteorite,\"%s was struck by a meteorite\"\ntext.gm4.monsters_unbound.death.blazing_elite_flare,\"%s was blown up by a Blazing Flare\"\n"
  },
  {
    "path": "gm4_mysterious_midnights/README.md",
    "content": "# Mysterious Midnights<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nFull moons gain an element of surprise with random events.<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Every full moon, there is a chance of a random event bing triggered.\r\n- When triggered, all players will hear a wolf howl sound.\r\n- The base pack has 6 events ranging from skeletons being resurrected when bones are on the floor to skeletons being given tipped arrows\r\n\r\n### Expansions\r\nAdd 6 more event variants using [Midnight Menaces]($dynamicLink:gm4_midnight_menaces)!\r\n"
  },
  {
    "path": "gm4_mysterious_midnights/beet.yaml",
    "content": "id: gm4_mysterious_midnights\nname: Mysterious Midnights\nversion: 1.8.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_forceload\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_forceload: 1.6.0\n      schedule_loops: [main]\n    model_data:\n      - item: end_stone\n        reference: item/endermite_egg\n        template: vanilla\n    website:\n      description: Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl...\n      recommended:\n        - gm4_midnight_menaces\n      notes: []\n    modrinth:\n      project_id: 9skST20d\n    wiki: https://wiki.gm4.co/wiki/Mysterious_Midnights\n    credits:\n      Creator:\n        - Bloo\n      Updated by:\n        - Bloo\n        - BPR\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/function/event.mcfunction",
    "content": "# @s = none\n# at world spawn\n# called by mysterious midnights base if this expansion was selected. pulsed every 0.8 seconds throughout the night.\n\n# slow clock for falling star spawning\nscoreboard players add $shower_clock gm4_fstar_decay 1\nexecute if score $shower_clock gm4_fstar_decay matches 150.. run function gm4_falling_stars:star_shower\n\n# hatch endermite eggs\nexecute as @e[type=item,tag=gm4_endermite_star,nbt={OnGround:1b}] at @s run function gm4_falling_stars:hatch_endermite\n\n# decay all falling star entities (saftey cap)\nexecute as @e[type=splash_potion,tag=gm4_falling_star] at @s run function gm4_falling_stars:falling_star/decay\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/function/falling_star/accumulate_impact_points.mcfunction",
    "content": "# @s = @e[type=marker,tag=gm4_star_impact_point]\n# at @s\n# run from gm4_falling_stars:falling_star/select_spawn_location\n\n# spawn impact points. Max 20, each with a chance.\nscoreboard players add $loop_count gm4_mm_data 1\nexecute if predicate gm4_falling_stars:spawn_chance run summon marker ~ ~ ~ {CustomName:\"gm4_falling_stars_impact_point\",Tags:[\"gm4_falling_stars_impact_point\"]}\n\n# loop\nexecute unless score $loop_count gm4_mm_data matches 8.. run function gm4_falling_stars:falling_star/accumulate_impact_points\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/function/falling_star/decay.mcfunction",
    "content": "# tracks and decays falling stars. This is a saftey feature to prevent buildup of falling stars\n# @s = players in the overworld during a falling star night\n# at @s\n# run from gm4_falling_stars:event\n\n# track age\nscoreboard players add @s gm4_fstar_decay 1\n\n# remove old falling stars\nexecute if score @s gm4_fstar_decay matches 15.. run kill @e[type=#gm4_falling_stars:falling_star,tag=gm4_falling_star,distance=..2]\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/function/falling_star/initilize.mcfunction",
    "content": "# initializes this falling star\n# @s = @e[type=marker,tag=gm4_star_impact_point]\n# at @s positioned ~ 260 ~\n# run from gm4_falling_stars:falling_star/spawn\n\n# apply motion\ndata modify entity @s Motion set from storage gm4_falling_stars:motion temp.motion\n\n# remove tag\ntag @s remove gm4_new_falling_star\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/function/falling_star/select_spawn_location.mcfunction",
    "content": "# spreads impact points\n# @s = players in the overworld during a falling star night\n# at @s\n# run from gm4_falling_stars:falling_star/start_in_area\n\n# spawn impact points\nfunction gm4_falling_stars:falling_star/accumulate_impact_points\nscoreboard players reset $loop_count gm4_mm_data\n\n# spread impact points\nexecute store success score $spread_successful gm4_mm_data run spreadplayers ~ ~ 1 64 false @e[type=marker,tag=gm4_falling_stars_impact_point,distance=..4]\n\n# kill impact points if spread failed\nexecute if score $spread_successful gm4_mm_data matches 1.. run kill @e[type=marker,tag=gm4_falling_stars_impact_point,distance=..4]\n\n# reset fake players\nscoreboard players reset $spread_successful gm4_mm_data\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/function/falling_star/spawn.mcfunction",
    "content": "# @s = @e[type=marker,tag=gm4_star_impact_point]\n# at @s positioned ~ 260 ~\n# run from gm4_falling_stars:event\n\n# summon falling star\nsummon shulker_bullet ~ ~ ~ {Motion:[0.0d,0.0d,0.0d],Tags:[\"gm4_falling_star\",\"gm4_new_falling_star\"],CustomName:{\"translate\":\"entity.gm4.falling_star\",\"fallback\":\"Falling Star\"},Steps:0,Passengers:[{id:\"splash_potion\",Tags:[\"gm4_falling_star\"],CustomName:\"Falling Star\",Item:{count:1,id:\"splash_potion\",components:{\"minecraft:potion_contents\":{potion:\"thick\",custom_color:16777215,custom_effects:[{id:\"minecraft:levitation\",amplifier:0,duration:300}]}}}},{id:\"area_effect_cloud\",Tags:[\"gm4_falling_star\"],Duration:600,CustomName:\"gm4_falling_star_particle\",Radius:0.5f,custom_particle:{type:\"minecraft:end_rod\"}},{id:\"item\",Age:3600,Tags:[\"gm4_falling_star\",\"gm4_falling_stars_item\"],Item:{count:1,id:\"minecraft:end_stone\"}}]}\n\n# set random motion vector\ndata modify storage gm4_falling_stars:motion temp.motion set value [0.0d,0.0d,0.0d]\nexecute store result storage gm4_falling_stars:motion temp.motion[0] double 0.001 run random value -644..644\nexecute store result storage gm4_falling_stars:motion temp.motion[2] double 0.001 run random value -644..644\nexecute as @e[type=shulker_bullet,tag=gm4_new_falling_star,limit=1] run function gm4_falling_stars:falling_star/initilize\ndata remove storage gm4_falling_stars:motion temp\n\n# add loot to falling star\nloot spawn ~ 300 ~ loot gm4_falling_stars:star_type\nexecute positioned ~ 300 ~ run data modify entity @e[type=item,limit=1,tag=gm4_falling_stars_item] Item set from entity @e[type=item,limit=1,distance=..1] Item\nexecute as @e[type=item,limit=1,tag=gm4_falling_stars_item] if items entity @s contents *[custom_data~{gm4_endermite_egg:1b}] run tag @s add gm4_endermite_star\n\ntag @e[type=item] remove gm4_falling_stars_item\nexecute positioned ~ 300 ~ run kill @e[type=item,limit=1,distance=..1]\n\n# kill marker to avoid buildup\nkill @s\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/function/falling_star/start_in_area.mcfunction",
    "content": "# spawns a falling star shower on a player if the right conditions have been met\n# @s = players in the overworld during a falling star night\n# at @s\n# run from gm4_falling_stars:star_shower\n\n# start spawn attempt if there wasn't a spawn attempt by nearby player already and have a random chance to abort\nexecute unless entity @s[tag=gm4_falling_stars_ignore] if predicate gm4_falling_stars:shower_chance run function gm4_falling_stars:falling_star/select_spawn_location\n\n# ignore all players nearby (makes sure the amount of falling stars stays constant with varying player count in an area)\ntag @a[gamemode=!spectator,distance=..128] add gm4_falling_stars_ignore\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/function/hatch_endermite.mcfunction",
    "content": "#@s = @e[type=item,tag=gm4_endermite_star,nbt={OnGround:1b}]\n#at @s\n#called by event\n\n#summon mite\nsummon endermite ~ ~ ~ {PlayerSpawned:1b}\n\n#sound and particles\nparticle minecraft:block{block_state:\"minecraft:end_stone\"} ~ ~ ~ .14 .14 .14 1 20\nplaysound minecraft:entity.turtle.egg_crack master @a[distance=..8] ~ ~ ~ .4 .4\n\n#remove end_stone\nkill @s\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/function/setup.mcfunction",
    "content": "#called upon start of a rare mysterious midnight. Used to select this expansion by chance.\n\nsummon minecraft:area_effect_cloud ~ ~ ~ {CustomName:\"gm4_falling_stars\",Tags:[\"gm4_mysterious_midnights_expansion\",\"gm4_falling_stars\"],Duration:18000,Radius:0f,custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/function/star_shower.mcfunction",
    "content": "# starts a falling star shower\n# @s = players in the overworld during a falling star night\n# at @s\n# run from gm4_falling_stars:event\n\n# try to start falling stars for all players\nexecute as @a[tag=!gm4_falling_stars_ignore,gamemode=!spectator,x=0] at @s run function gm4_falling_stars:falling_star/start_in_area\ntag @a remove gm4_falling_stars_ignore\nexecute as @e[type=marker,tag=gm4_falling_stars_impact_point,x=0] at @s if entity @a[gamemode=!spectator,distance=..60] positioned ~ 260 ~ run function gm4_falling_stars:falling_star/spawn\n\n# reset fake player\nscoreboard players set $shower_clock gm4_fstar_decay 0\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/guidebook/falling_stars.json",
    "content": "{\n  \"id\": \"falling_stars\",\n  \"name\": \"Falling Stars\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"mysterious_midnights\",\n  \"base_module\": \"mysterious_midnights\",\n  \"wiki_link\": \"https://wiki.gm4.co/Mysterious_Midnights/Falling_Stars\",\n  \"icon\": {\n    \"id\": \"minecraft:end_stone\"\n  },\n  \"criteria\": {\n    \"find_falling_star\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:any_of\",\n            \"terms\": [\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"type\": \"minecraft:splash_potion\",\n                  \"nbt\": \"{Tags:['gm4_falling_star']}\"\n                }\n              },\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"type_specific\": {\n                    \"type\": \"player\",\n                    \"looking_at\": {\n                      \"type\": \"minecraft:area_effect_cloud\",\n                      \"nbt\": \"{Tags:['gm4_falling_star']}\"\n                    }\n                  }\n                }\n              },\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"type_specific\": {\n                    \"type\": \"player\",\n                    \"looking_at\": {\n                      \"type\": \"minecraft:shulker_bullet\",\n                      \"nbt\": \"{Tags:['gm4_falling_star']}\"\n                    }\n                  }\n                }\n              }\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"find_falling_star\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.falling_stars.description\",\n            \"fallback\": \"During a Falling Stars event, gifts will drop from the sky.\\n\\nDiamonds, iron nuggets, gold nuggets, endermites, end stone, and chorus fruit can be found falling from the sky.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/loot_table/endermite_egg.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:end_stone\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.endermite_egg\",\n                                \"fallback\": \"Endermite Egg\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.endermite_egg.lore\",\n                                    \"fallback\": \"Oh, it didn't hatch\",\n                                    \"color\": \"dark_gray\",\n                                    \"italic\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_mysterious_midnights:item/endermite_egg\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_endermite_egg:1b}\"\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/loot_table/star_type.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 8,\n                    \"name\": \"minecraft:diamond\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 3,\n                    \"name\": \"minecraft:gold_nugget\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 2,\n                    \"name\": \"minecraft:iron_nugget\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 1,\n                    \"name\": \"minecraft:chorus_fruit\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 1,\n                    \"name\": \"minecraft:end_stone\"\n                },\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"weight\": 2,\n                    \"value\": \"gm4_falling_stars:endermite_egg\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/predicate/shower_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.8\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/predicate/spawn_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.8\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_falling_stars/tags/entity_type/falling_star.json",
    "content": "{\n    \"values\": [\n        \"minecraft:area_effect_cloud\",\n        \"minecraft:item\",\n        \"minecraft:shulker_bullet\",\n        \"minecraft:splash_potion\"\n    ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_harvest_moons/function/dawn_active_check.mcfunction",
    "content": "#@s = none\n#at world spawn\n#called by mysterious midnights base upon the break of dawn. Only runs once. Techincal function to prevent inactive expansions from running their dawn event.\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_harvest_moons,tag=gm4_mysterious_midnights_active] run function gm4_harvest_moons:dawn_event\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_harvest_moons/function/dawn_event.mcfunction",
    "content": "#@s = none\n#at world spawn\n#called by mysterious midnights base upon the break of dawn. Only runs once.\n\ngamerule random_tick_speed 3\nscoreboard players reset started_harvest_moon gm4_mm_data\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_harvest_moons/function/event.mcfunction",
    "content": "#@s = none\n#at world spawn\n#called by mysterious midnights base if this expansion was selected. pulsed every 0.8 seconds throughout the night.\n\nexecute unless score started_harvest_moon gm4_mm_data matches 1 run gamerule random_tick_speed 60\nexecute unless score started_harvest_moon gm4_mm_data matches 1 run scoreboard players set started_harvest_moon gm4_mm_data 1\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_harvest_moons/function/setup.mcfunction",
    "content": "#called upon start of a rare mysterious midnight. Used to select this expansion by chance.\n\nsummon minecraft:area_effect_cloud ~ ~ ~ {CustomName:\"gm4_harvest_moons\",Tags:[\"gm4_mysterious_midnights_expansion\",\"gm4_harvest_moons\"],Duration:18000,Radius:0f,custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_harvest_moons/guidebook/harvest_moons.json",
    "content": "{\n  \"id\": \"harvest_moons\",\n  \"name\": \"Harvest Moons\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"mysterious_midnights\",\n  \"base_module\": \"mysterious_midnights\",\n  \"wiki_link\": \"https://wiki.gm4.co/Mysterious_Midnights/Harvest_Moons\",\n  \"icon\": {\n    \"id\": \"minecraft:wheat\"\n  },\n  \"criteria\": {\n    \"farming_during_harvest_moon\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"started_harvest_moon\"\n              },\n              \"score\": \"gm4_mm_data\"\n            },\n            \"range\": 1\n          },\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"night_active\"\n              },\n              \"score\": \"gm4_mm_data\"\n            },\n            \"range\": 1\n          },\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"difficulty\"\n              },\n              \"score\": \"gm4_mm_data\"\n            },\n            \"range\": {\n              \"min\": 6\n            }\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"block\": {\n                  \"blocks\": [\n                    \"minecraft:farmland\"\n                  ]\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"farming_during_harvest_moon\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.harvest_moons.description\",\n            \"fallback\": \"During a Harvest Moons event, random tick events, such as crop growth, will be 20 times quicker than normal.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/calculate_difficulty.mcfunction",
    "content": "# @s = none\n# at 29999998 1 7134 (forceloaded chunk)\n# run from gm4_mysterious_midnights:start_midnight\n\n# generate random number from 0 to 15\nexecute store result storage gm4_mysterious_midnights:temp day int 1 run time query day repetition\nfunction gm4_mysterious_midnights:roll_difficulty with storage gm4_mysterious_midnights:temp\nscoreboard players set 16 gm4_mm_data 16\nscoreboard players operation difficulty gm4_mm_data %= 16 gm4_mm_data\n\n# spawn AEC for random selection (1/3 of nights are not a mysterious midnight)\nexecute if score difficulty gm4_mm_data matches 6.. run playsound event.mob_effect.raid_omen weather @a[x=0] ~ ~100000000000 ~ 0 .5 1\nexecute if score difficulty gm4_mm_data matches 6.. run playsound block.trial_spawner.ominous_activate weather @a[x=0] ~ ~100000000000 ~ 0 .6 1\nexecute if score difficulty gm4_mm_data matches 6..10 run function #gm4_mysterious_midnights:setup_common_expansion\nexecute if score difficulty gm4_mm_data matches 11..13 run function #gm4_mysterious_midnights:setup_uncommon_expansion\nexecute if score difficulty gm4_mm_data matches 14.. run function #gm4_mysterious_midnights:setup_rare_expansion\n\n# chose one expansion\ntag @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,limit=1,sort=random] add gm4_mysterious_midnights_active\nkill @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=!gm4_mysterious_midnights_active]\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/end_pulse.mcfunction",
    "content": "# @s = none\n# at world spawn\n# run from event_clock as long as a mysterious midnight is active\n\n# reset flag\nscoreboard players set night_active gm4_mm_data 0\n\n# notify expansions of night end\nfunction #gm4_mysterious_midnights:end_pulse\n\n# kill all expansions AECs\nkill @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion]\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/event_clock.mcfunction",
    "content": "# @s = none\n# at world spawn\n# run from start_midnight run on a loop as long as it a mysterious midnight\n\n# call default expansions\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_harvest_moons,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_harvest_moons:event\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_falling_stars,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_falling_stars:event\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_resurrecting_skeletons,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_resurrecting_skeletons:event\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_resurrecting_zombies,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_resurrecting_zombies:event\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_tipped_skeletons,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_tipped_skeletons:event\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_nightmare_nights,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_nightmare_nights:event\n\n# call other expansions\nfunction #gm4_mysterious_midnights:active_night\n\n# check if it is day again\nexecute unless predicate gm4_mysterious_midnights:is_full_moon_night run function gm4_mysterious_midnights:end_pulse\n\n# reschedule if the night is still active\nexecute if score night_active gm4_mm_data matches 1 run schedule function gm4_mysterious_midnights:event_clock 16t\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/init.mcfunction",
    "content": "# mysterious midnights base\nscoreboard objectives add gm4_mm_data dummy\n\n# expansions\nscoreboard objectives add gm4_tipped_type dummy\nscoreboard objectives add gm4_rezombify dummy\nscoreboard objectives add gm4_reskelify dummy\nscoreboard objectives add gm4_fstar_decay dummy\n\nexecute unless score mysterious_midnights gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Mysterious Midnights\"}\nexecute unless score mysterious_midnights gm4_earliest_version < mysterious_midnights gm4_modules run scoreboard players operation mysterious_midnights gm4_earliest_version = mysterious_midnights gm4_modules\nscoreboard players set mysterious_midnights gm4_modules 1\n\nschedule function gm4_mysterious_midnights:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/main.mcfunction",
    "content": "execute unless score night_active gm4_mm_data matches 1 if predicate gm4_mysterious_midnights:is_full_moon_night run function gm4_mysterious_midnights:start_midnight\n\nschedule function gm4_mysterious_midnights:main 60s\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/roll_difficulty.mcfunction",
    "content": "# Rolls a new value for the difficulty based on the world seed and the day number.\n# @s = none\n# at 29999998 1 7134 (forceloaded chunk)\n# run from gm4_mysterious_midnights:calculate_difficulty\n\n# reset rng to use day count as seed\n$random reset gm_mysterious_midnights:midnight_difficulty $(day) true true\n\n# store random value\nexecute store result score difficulty gm4_mm_data run random value 0..15 gm_mysterious_midnights:midnight_difficulty\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/start_midnight.mcfunction",
    "content": "# @s = none\n# at world spawn\n# run from main\n\n# set \"night-active\" flag\nscoreboard players set night_active gm4_mm_data 1\n\n# calculate difficulty\nexecute positioned 29999998 1 7134 run function gm4_mysterious_midnights:calculate_difficulty\n\n# schedule continous clock start\nschedule function gm4_mysterious_midnights:event_clock 1t\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/guidebook/mysterious_midnights.json",
    "content": "{\n  \"id\": \"mysterious_midnights\",\n  \"name\": \"Mysterious Midnights\",\n  \"module_type\": \"base\",\n  \"icon\": {\n    \"id\": \"minecraft:clock\"\n  },\n  \"criteria\": {},\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.mysterious_midnights.description\",\n            \"fallback\": \"Every full moon, there is a high chance that a Mysterious Midnight event will occur.\\n\\nWhen a Mysterious Midnight event occurs, a howling sound will be heard.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.mysterious_midnights.sleeping\",\n            \"fallback\": \"Mysterious Midnight events can usually be skipped by sleeping the night away.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/predicate/is_full_moon_night.json",
    "content": "{\n  \"condition\": \"minecraft:time_check\",\n  \"clock\": \"minecraft:overworld\",\n  \"value\": {\n    \"min\": 13000,\n    \"max\": 24000\n  },\n  \"period\": 192000\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/tags/function/active_night.json",
    "content": "{\n    \"values\":[]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/tags/function/end_pulse.json",
    "content": "{\n    \"values\":[\n      \"gm4_harvest_moons:dawn_active_check\",\n      \"gm4_nightmare_nights:dawn_active_check\"\n    ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/tags/function/setup_common_expansion.json",
    "content": "{\n    \"values\":[\n      \"gm4_resurrecting_skeletons:setup\",\n      \"gm4_resurrecting_zombies:setup\"\n    ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/tags/function/setup_rare_expansion.json",
    "content": "{\n    \"values\":[\n      \"gm4_falling_stars:setup\",\n      \"gm4_nightmare_nights:setup\"\n    ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_mysterious_midnights/tags/function/setup_uncommon_expansion.json",
    "content": "{\n    \"values\":[\n      \"gm4_harvest_moons:setup\",\n      \"gm4_tipped_skeletons:setup\"\n    ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_nightmare_nights/function/dawn_active_check.mcfunction",
    "content": "#@s = none\n#at world spawn\n#called by mysterious midnights base upon the break of dawn. Only runs once. Techincal function to prevent inactive expansions from running their dawn event.\nexecute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_nightmare_nights,tag=gm4_mysterious_midnights_active] run function gm4_nightmare_nights:dawn_event\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_nightmare_nights/function/dawn_event.mcfunction",
    "content": "#@s = none\n#at world spawn\n#called by mysterious midnights base upon the break of dawn. Only runs once.\n\nworldborder warning distance 5\nscoreboard players reset started_nightmare_night gm4_mm_data\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_nightmare_nights/function/event.mcfunction",
    "content": "#@s = none\n#at world spawn\n#called by mysterious midnights base if this expansion was selected. pulsed every 0.8 seconds throughout the night.\n\n#kick players out of beds\neffect give @a[nbt=!{SleepTimer:0s}] minecraft:instant_damage 1 0\n\n#initialise nightmare night\nexecute unless score started_nightmare_night gm4_mm_data matches 1 run function gm4_nightmare_nights:initialise\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_nightmare_nights/function/initialise.mcfunction",
    "content": "#@s = none\n#at world spawn\n#called by event. Only runs once per nightmare night.\n\n#red screen tint\nworldborder warning distance 300000000\n\n#activate all nightmare night expansions\nexecute positioned 29999998 1 7134 run function #gm4_nightmare_nights:nightmare_night_expansion\n\n#tag all to be active\ntag @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion] add gm4_mysterious_midnights_active\n\n#initialise is done\nscoreboard players set started_nightmare_night gm4_mm_data 1\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_nightmare_nights/function/setup.mcfunction",
    "content": "#called upon start of a rare mysterious midnight. Used to select this expansion by chance.\n\nsummon minecraft:area_effect_cloud ~ ~ ~ {CustomName:\"gm4_nightmare_nights\",Tags:[\"gm4_mysterious_midnights_expansion\",\"gm4_nightmare_nights\"],Duration:18000,Radius:0f,custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_nightmare_nights/guidebook/nightmare_nights.json",
    "content": "{\n  \"id\": \"nightmare_nights\",\n  \"name\": \"Nightmare Nights\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"mysterious_midnights\",\n  \"base_module\": \"mysterious_midnights\",\n  \"wiki_link\": \"https://wiki.gm4.co/Mysterious_Midnights/Nightmare_Nights\",\n  \"icon\": {\n    \"id\": \"minecraft:blaze_powder\"\n  },\n  \"criteria\": {\n    \"nightmare_sleep\": {\n      \"trigger\": \"minecraft:slept_in_bed\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"started_nightmare_night\"\n              },\n              \"score\": \"gm4_mm_data\"\n            },\n            \"range\": 1\n          },\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"night_active\"\n              },\n              \"score\": \"gm4_mm_data\"\n            },\n            \"range\": 1\n          },\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"difficulty\"\n              },\n              \"score\": \"gm4_mm_data\"\n            },\n            \"range\": {\n              \"min\": 6\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"nightmare_sleep\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.nightmare_nights.description\",\n            \"fallback\": \"Nightmare Nights cannot be slept away. Attempting to sleep will deal instant damage.\\n\\nAdditionally, multiple Mysterious Midnights events will occur.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"events\",\n      \"enable\": [\n        {\n          \"id\": \"gm4_midnight_menaces\",\n          \"load\": -1\n        }\n      ],\n      \"requirements\": [\n        [\n          \"nightmare_sleep\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.nightmare_nights.events\",\n            \"fallback\": \"While a Nightmare Night is active, the following events will occur:\\n\\n - Resurrecting Skeletons\\n - Resurrecting Zombies\\n - Tipped Skeletons\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"events_with_menaces\",\n      \"enable\": [\n        {\n          \"id\": \"gm4_midnight_menaces\",\n          \"load\": 1\n        }\n      ],\n      \"requirements\": [\n        [\n          \"nightmare_sleep\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.nightmare_nights.events_with_menaces\",\n            \"fallback\": \"While a Nightmare Night is active, the following events will occur:\\n\\n - Resurrecting Skeletons\\n - Resurrecting Zombies\\n - Tipped Skeletons\\n - Enlarging Phantoms\\n - Illusioner Nights\\n - Menacing Goblins\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_nightmare_nights/tags/function/nightmare_night_expansion.json",
    "content": "{\n    \"values\":[\n      \"gm4_tipped_skeletons:setup\",\n      \"gm4_resurrecting_skeletons:setup\",\n      \"gm4_resurrecting_zombies:setup\"\n    ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_resurrecting_skeletons/function/absorb_bone.mcfunction",
    "content": "#@s = bone item on the ground\n#at @s\n#called by spawn_skeleton\n\n#remove 1 from count of bone stack\nexecute store result score count gm4_reskelify run data get entity @s Item.count 0.99\nexecute store result entity @s Item.count byte 1 run scoreboard players get count gm4_reskelify\n#Spigot fix\nexecute if score count gm4_reskelify matches 0 run kill @s\n\n#reset timer to 0\nscoreboard players set @s gm4_reskelify 0\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_resurrecting_skeletons/function/event.mcfunction",
    "content": "#@s = none\n#at world spawn\n#called by mysterious midnights base if this expansion was selected. pulsed every 0.8 seconds throughout the night.\n\nexecute as @e[type=item,x=0] if items entity @s contents minecraft:bone if entity @s[nbt={OnGround:1b}] run function gm4_resurrecting_skeletons:mark_bone\nexecute as @e[type=item,scores={gm4_reskelify=8..}] at @s run function gm4_resurrecting_skeletons:spawn_skeleton\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_resurrecting_skeletons/function/mark_bone.mcfunction",
    "content": "#@s = bone item on the ground\n#at world spawn\n#called by event\n\nscoreboard players add @s gm4_reskelify 1\nexecute at @s run particle minecraft:entity_effect{color:[0.33,0.11,0.29,1.0]} ~ ~ ~ 0 0 0 1 0\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_resurrecting_skeletons/function/setup.mcfunction",
    "content": "#called upon start of a rare mysterious midnight. Used to select this expansion by chance.\n\nsummon minecraft:area_effect_cloud ~ ~ ~ {CustomName:\"gm4_resurrecting_skeletons\",Tags:[\"gm4_mysterious_midnights_expansion\",\"gm4_resurrecting_skeletons\"],Duration:18000,Radius:0f,custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_resurrecting_skeletons/function/spawn_skeleton.mcfunction",
    "content": "#@s = bone item on the ground\n#at @s\n#called by event\n\nsummon skeleton ~ ~ ~ {DeathLootTable:\"gm4:empty\",equipment:{},active_effects:[{id:'minecraft:nausea',amplifier:1,duration:30}],attributes:[{id:\"minecraft:attack_damage\",base:10.0}]}\n\nplaysound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 1 .1\nfunction gm4_resurrecting_skeletons:absorb_bone\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_resurrecting_skeletons/guidebook/resurrecting_skeletons.json",
    "content": "{\n  \"id\": \"resurrecting_skeletons\",\n  \"name\": \"Resurrecting Skeletons\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"mysterious_midnights\",\n  \"base_module\": \"mysterious_midnights\",\n  \"wiki_link\": \"https://wiki.gm4.co/Mysterious_Midnights/Resurrecting_Skeletons\",\n  \"icon\": {\n    \"id\": \"minecraft:bone\"\n  },\n  \"criteria\": {\n    \"fight_resurrected_skeleton\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:skeleton\",\n              \"nbt\": \"{DeathLootTable:\\\"minecraft:empty\\\",attributes:[{id:\\\"minecraft:attack_damage\\\",base:10.0d}]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"fight_resurrected_skeleton\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.resurrecting_skeletons.description\",\n            \"fallback\": \"During a Resurrecting Skeletons event, bones on the floor will resurrect into unarmed skeletons, with a powerful attack.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_resurrecting_zombies/function/absorb_rotten_flesh.mcfunction",
    "content": "#@s = rotten_flesh item on the ground\n#at @s\n#called by spawn_zombie\n\n#remove 1 from count of rotten flesh stack\nexecute store result score count gm4_rezombify run data get entity @s Item.count 0.99\nexecute store result entity @s Item.count byte 1 run scoreboard players get count gm4_rezombify\n#Spigot fix\nexecute if score count gm4_rezombify matches 0 run kill @s\n\n#reset timer to 0\nscoreboard players set @s gm4_rezombify 0\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_resurrecting_zombies/function/event.mcfunction",
    "content": "#@s = none\n#at world spawn\n#called by mysterious midnights base if this expansion was selected. pulsed every 0.8 seconds throughout the night.\n\nexecute as @e[type=item,x=0] if items entity @s contents minecraft:rotten_flesh if entity @s[nbt={OnGround:1b}] run function gm4_resurrecting_zombies:mark_rotten_flesh\nexecute as @e[type=item,scores={gm4_rezombify=8..}] at @s run function gm4_resurrecting_zombies:spawn_zombie\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_resurrecting_zombies/function/mark_rotten_flesh.mcfunction",
    "content": "#@s = rotten_flesh item on the ground\n#at world spawn\n#called by event\n\nscoreboard players add @s gm4_rezombify 1\nexecute at @s run particle minecraft:entity_effect{color:[0.33,0.11,0.29,1.0]} ~ ~ ~ 0 0 0 1 0\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_resurrecting_zombies/function/setup.mcfunction",
    "content": "#called upon start of a rare mysterious midnight. Used to select this expansion by chance.\n\nsummon minecraft:area_effect_cloud ~ ~ ~ {CustomName:\"gm4_resurrecting_zombies\",Tags:[\"gm4_mysterious_midnights_expansion\",\"gm4_resurrecting_zombies\"],Duration:18000,Radius:0f,custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_resurrecting_zombies/function/spawn_zombie.mcfunction",
    "content": "#@s = rotten_flesh item on the ground\n#at @s\n#called by event\n\nsummon zombie ~ ~ ~ {DeathLootTable:\"gm4:empty\",equipment:{},active_effects:[{id:'minecraft:nausea',amplifier:1,duration:30}],attributes:[{id:\"minecraft:attack_damage\",base:10.0}]}\n\nplaysound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 1 .1\nfunction gm4_resurrecting_zombies:absorb_rotten_flesh\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_resurrecting_zombies/guidebook/resurrecting_zombies.json",
    "content": "{\n  \"id\": \"resurrecting_zombies\",\n  \"name\": \"Resurrecting Zombies\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"mysterious_midnights\",\n  \"base_module\": \"mysterious_midnights\",\n  \"wiki_link\": \"https://wiki.gm4.co/Mysterious_Midnights/Resurrecting_Zombies\",\n  \"icon\": {\n    \"id\": \"minecraft:rotten_flesh\"\n  },\n  \"criteria\": {\n    \"fight_resurrected_zombie\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:zombie\",\n              \"nbt\": \"{DeathLootTable:\\\"minecraft:empty\\\",attributes:[{id:\\\"minecraft:attack_damage\\\",base:10.0d}]}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"fight_resurrected_zombie\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.resurrecting_zombies.description\",\n            \"fallback\": \"During a Resurrecting Zombies event, rotten flesh on the floor will resurrect into unarmed zombies, with a powerful attack.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_tipped_skeletons/function/event.mcfunction",
    "content": "#@s = none\n#at world spawn\n#called by mysterious midnights base if this expansion was selected. pulsed every 0.8 seconds throughout the night.\n\nexecute as @e[type=skeleton,tag=!smithed.entity,tag=!gm4_tipped_skeleton,x=0,nbt={equipment:{mainhand:{id:\"minecraft:bow\",count:1}},PersistenceRequired:0b}] at @s run function gm4_tipped_skeletons:tipp\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_tipped_skeletons/function/setup.mcfunction",
    "content": "#called upon start of a rare mysterious midnight. Used to select this expansion by chance.\n\nsummon minecraft:area_effect_cloud ~ ~ ~ {CustomName:\"gm4_tipped_skeletons\",Tags:[\"gm4_mysterious_midnights_expansion\",\"gm4_tipped_skeletons\"],Duration:18000,Radius:0f,custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_tipped_skeletons/function/tipp.mcfunction",
    "content": "#@s = not tipped skeletons with nbt={equipment:{mainhand:{id:\"minecraft:bow\",count:1}},PersistenceRequired:0b}\n#at @s\n#called by event\n\ntag @s add gm4_tipped_skeleton\ndata modify entity @s drop_chances merge value {offhand:0.75f}\nloot replace entity @s weapon.offhand loot gm4_tipped_skeletons:tipped_type\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_tipped_skeletons/guidebook/tipped_skeletons.json",
    "content": "{\n  \"id\": \"tipped_skeletons\",\n  \"name\": \"Tipped Skeletons\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"mysterious_midnights\",\n  \"base_module\": \"mysterious_midnights\",\n  \"wiki_link\": \"https://wiki.gm4.co/Mysterious_Midnights/Tipped_Skeletons\",\n  \"icon\": {\n    \"id\": \"minecraft:tipped_arrow\",\n    \"components\": {\n      \"minecraft:potion_contents\": \"minecraft:long_poison\"\n    }\n  },\n  \"criteria\": {\n    \"shot_by_tipped_skeleton\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"source_entity\": {\n            \"type\": \"minecraft:skeleton\",\n            \"nbt\": \"{Tags:['gm4_tipped_skeleton']}\"\n          }\n        }\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"shot_by_tipped_skeleton\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.tipped_skeletons.description\",\n            \"fallback\": \"During a Tipped Skeletons event, skeletons will be equipped with tipped arrows.\\n\\nExtended slowness, extended weakness, extended poison, and strong harming tipped arrows are used.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/data/gm4_tipped_skeletons/loot_table/tipped_type.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 1,\n                    \"name\": \"minecraft:tipped_arrow\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:potion_contents\": \"minecraft:strong_harming\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": {\n                                \"min\": 7,\n                                \"max\": 11\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 2,\n                    \"name\": \"minecraft:tipped_arrow\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:potion_contents\": \"minecraft:long_poison\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": {\n                                \"min\": 9,\n                                \"max\": 12\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 2,\n                    \"name\": \"minecraft:tipped_arrow\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:potion_contents\": \"minecraft:long_weakness\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": {\n                                \"min\": 4,\n                                \"max\": 8\n                            }\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 1,\n                    \"name\": \"minecraft:tipped_arrow\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:potion_contents\": \"minecraft:long_slowness\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": {\n                                \"min\": 4,\n                                \"max\": 8\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/mod.mcdoc",
    "content": "dispatch minecraft:storage[gm4_mysterious_midnights:temp] to struct {\n  day?: int,\n}\n\ndispatch minecraft:storage[gm4_falling_stars:motion] to struct {\n  temp?: struct {\n    motion: [double] @ 3,\n  },\n}\n"
  },
  {
    "path": "gm4_mysterious_midnights/translations.csv",
    "content": "key,en_us\r\nentity.gm4.falling_star,Falling Star\r\nitem.gm4.endermite_egg,Endermite Egg\r\nitem.gm4.endermite_egg.lore,\"Oh, it didn't hatch\"\r\ntext.gm4.guidebook.module_desc.falling_stars,\"Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl...\"\r\ntext.gm4.guidebook.falling_stars.description,\"During a Falling Stars event, gifts will drop from the sky.\\n\\nDiamonds, iron nuggets, gold nuggets, endermites, end stone, and chorus fruit can be found falling from the sky.\"\r\ntext.gm4.guidebook.module_desc.harvest_moons,\"Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl...\"\r\ntext.gm4.guidebook.harvest_moons.description,\"During a Harvest Moons event, random tick events, such as crop growth, will be 20 times quicker than normal.\"\r\ntext.gm4.guidebook.mysterious_midnights.description,\"Every full moon, there is a high chance that a Mysterious Midnight event will occur.\\n\\nWhen a Mysterious Midnight event occurs, a howling sound will be heard.\"\r\ntext.gm4.guidebook.mysterious_midnights.sleeping,Mysterious Midnight events can usually be skipped by sleeping the night away.\r\ntext.gm4.guidebook.module_desc.nightmare_nights,\"Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl...\"\r\ntext.gm4.guidebook.nightmare_nights.description,\"Nightmare Nights cannot be slept away. Attempting to sleep will deal instant damage.\\n\\nAdditionally, multiple Mysterious Midnights events will occur.\"\r\ntext.gm4.guidebook.nightmare_nights.events,\"While a Nightmare Night is active, the following events will occur:\\n\\n - Resurrecting Skeletons\\n - Resurrecting Zombies\\n - Tipped Skeletons\"\r\ntext.gm4.guidebook.nightmare_nights.events_with_menaces,\"While a Nightmare Night is active, the following events will occur:\\n\\n - Resurrecting Skeletons\\n - Resurrecting Zombies\\n - Tipped Skeletons\\n - Enlarging Phantoms\\n - Illusioner Nights\\n - Menacing Goblins\"\r\ntext.gm4.guidebook.module_desc.resurrecting_skeletons,\"Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl...\"\r\ntext.gm4.guidebook.resurrecting_skeletons.description,\"During a Resurrecting Skeletons event, bones on the floor will resurrect into unarmed skeletons, with a powerful attack.\"\r\ntext.gm4.guidebook.module_desc.resurrecting_zombies,\"Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl...\"\r\ntext.gm4.guidebook.resurrecting_zombies.description,\"During a Resurrecting Zombies event, rotten flesh on the floor will resurrect into unarmed zombies, with a powerful attack.\"\r\ntext.gm4.guidebook.module_desc.tipped_skeletons,\"Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl...\"\r\ntext.gm4.guidebook.tipped_skeletons.description,\"During a Tipped Skeletons event, skeletons will be equipped with tipped arrows.\\n\\nExtended slowness, extended weakness, extended poison, and strong harming tipped arrows are used.\"\r\n"
  },
  {
    "path": "gm4_note_block_interface/README.md",
    "content": "# Note Block Interface<!--$headerTitle--><!--$pmc:delete-->\n\nNote Blocks have always been a bit... odd to use. Figuring out what note its set to involves a cryptic colour scheme of the note particle, and if you miss the note you want, you have to go around the whole range again. This simple data pack displays the current note above a note block, and allows you to go backwards by sneaking. <!--$pmc:headerSize-->\n\n![Note Block Interface Example](images/note_block_interface_example.webp)<!--$localAssetToURL--><!--$modrinth:replaceWithVideo--><!--$pmc:delete-->\n\n### Features\n- The current pitch of a note block is displayed above it when struck or tuned by the player.\n- Enables tuning back down the scale by sneaking while tuning the note block\n"
  },
  {
    "path": "gm4_note_block_interface/beet.yaml",
    "content": "id: gm4_note_block_interface\nname: Note Block Interface\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [tick]\n    website:\n      description: Adds a neat interface to improve your musical skills!\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: ikXgoCNB\n    smithed:\n      pack_id: gm4_note_block_interface\n    planetminecraft: \n      uid: 4308978\n    video: https://www.youtube.com/watch?v=Kqrdy-8-sb8\n    wiki: https://wiki.gm4.co/wiki/Note_Block_Interface\n    credits:\n      Creator:\n        - Scommander\n      Updated by:\n        - Denniss\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/advancement/tune.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:default_block_use\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:note_block\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_note_block_interface:tune\"\n  }\n}\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_nbi_play minecraft.custom:minecraft.play_noteblock\nscoreboard objectives add gm4_nbi_tune minecraft.custom:minecraft.tune_noteblock\nscoreboard objectives add gm4_nbi_ray dummy\nscoreboard objectives add gm4_nbi_change dummy\n\nexecute unless score note_block_interface gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Note Block Interface\"}\nexecute unless score note_block_interface gm4_earliest_version < note_block_interface gm4_modules run scoreboard players operation note_block_interface gm4_earliest_version = note_block_interface gm4_modules\nscoreboard players set note_block_interface gm4_modules 1\n\nschedule function gm4_note_block_interface:tick 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/function/interface/change.mcfunction",
    "content": "# change note to decrease instead of increase\n# @s = player tuning note block while sneaking\n# at note block\n# run from gm4_note_block_interface:tune/sneak_loop\n\n# lowers the note of the note block\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=0] run setblock ~ ~ ~ note_block[note=23]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=1] run setblock ~ ~ ~ note_block[note=24]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=2] run setblock ~ ~ ~ note_block[note=0]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=3] run setblock ~ ~ ~ note_block[note=1]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=4] run setblock ~ ~ ~ note_block[note=2]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=5] run setblock ~ ~ ~ note_block[note=3]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=6] run setblock ~ ~ ~ note_block[note=4]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=7] run setblock ~ ~ ~ note_block[note=5]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=8] run setblock ~ ~ ~ note_block[note=6]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=9] run setblock ~ ~ ~ note_block[note=7]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=10] run setblock ~ ~ ~ note_block[note=8]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=11] run setblock ~ ~ ~ note_block[note=9]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=12] run setblock ~ ~ ~ note_block[note=10]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=13] run setblock ~ ~ ~ note_block[note=11]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=14] run setblock ~ ~ ~ note_block[note=12]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=15] run setblock ~ ~ ~ note_block[note=13]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=16] run setblock ~ ~ ~ note_block[note=14]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=17] run setblock ~ ~ ~ note_block[note=15]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=18] run setblock ~ ~ ~ note_block[note=16]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=19] run setblock ~ ~ ~ note_block[note=17]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=20] run setblock ~ ~ ~ note_block[note=18]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=21] run setblock ~ ~ ~ note_block[note=19]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=22] run setblock ~ ~ ~ note_block[note=20]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=23] run setblock ~ ~ ~ note_block[note=21]\nexecute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=24] run setblock ~ ~ ~ note_block[note=22]\n\n# resets gm4_nbi_change\nscoreboard players reset @s gm4_nbi_change\n\n# runs function to display the note\nfunction gm4_note_block_interface:interface/create\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/function/interface/create.mcfunction",
    "content": "# check note and show as floating text\n# @s = player punching/tuning note block\n# at note block\n# run from gm4_note_block_interface:play/loop\n# run from gm4_note_block_interface:tune/loop\n# run from gm4_note_block_interface:interface/change\n\n# kills old AEC\nkill @e[distance=..0.5,type=area_effect_cloud,tag=gm4_nbi_display]\n\n# summons new AEC with correct note\nexecute if block ~ ~ ~ note_block[note=0] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"F♯\"}}\nexecute if block ~ ~ ~ note_block[note=1] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"G\"}}\nexecute if block ~ ~ ~ note_block[note=2] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"G♯\"}}\nexecute if block ~ ~ ~ note_block[note=3] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"A\"}}\nexecute if block ~ ~ ~ note_block[note=4] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"A♯\"}}\nexecute if block ~ ~ ~ note_block[note=5] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"B\"}}\nexecute if block ~ ~ ~ note_block[note=6] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"C\"}}\nexecute if block ~ ~ ~ note_block[note=7] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"C♯\"}}\nexecute if block ~ ~ ~ note_block[note=8] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"D\"}}\nexecute if block ~ ~ ~ note_block[note=9] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"D♯\"}}\nexecute if block ~ ~ ~ note_block[note=10] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"E\"}}\nexecute if block ~ ~ ~ note_block[note=11] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"F\"}}\nexecute if block ~ ~ ~ note_block[note=12] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"F♯\"}}\nexecute if block ~ ~ ~ note_block[note=13] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"G\"}}\nexecute if block ~ ~ ~ note_block[note=14] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"G♯\"}}\nexecute if block ~ ~ ~ note_block[note=15] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"A\"}}\nexecute if block ~ ~ ~ note_block[note=16] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"A♯\"}}\nexecute if block ~ ~ ~ note_block[note=17] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"B\"}}\nexecute if block ~ ~ ~ note_block[note=18] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"C\"}}\nexecute if block ~ ~ ~ note_block[note=19] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"C♯\"}}\nexecute if block ~ ~ ~ note_block[note=20] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"D\"}}\nexecute if block ~ ~ ~ note_block[note=21] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"D♯\"}}\nexecute if block ~ ~ ~ note_block[note=22] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"E\"}}\nexecute if block ~ ~ ~ note_block[note=23] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"F\"}}\nexecute if block ~ ~ ~ note_block[note=24] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}},Tags:[\"gm4_nbi_display\"],CustomNameVisible:1b,CustomName:{\"text\":\"F♯\"}}\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/function/play/loop.mcfunction",
    "content": "# ray cast to find note block\n# @s = player punching note block\n# at @s anchored eyes positioned ^ ^ ^\n# run from gm4_note_block_interface:play/setup\n\n# removes 1 from raycast\nscoreboard players remove @s gm4_nbi_ray 1\n\n# tests for note_block\nexecute if block ~ ~ ~ note_block align xyz positioned ~0.5 ~0.6 ~0.5 run function gm4_note_block_interface:interface/create\n\n# runs the loop again\nexecute unless block ~ ~ ~ note_block if score @s gm4_nbi_ray matches 1.. positioned ^ ^ ^0.1 run function gm4_note_block_interface:play/loop\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/function/play/setup.mcfunction",
    "content": "# start ray to find note block\n# @s = player punching note block\n# at @s anchored eyes positioned ^ ^ ^\n# run from gm4_note_block_interface:tick\n\n# resets play score\nscoreboard players reset @s gm4_nbi_play\n\n# sets raycast limit\nscoreboard players set @s gm4_nbi_ray 50\n\n# runs raycast loop\nfunction gm4_note_block_interface:play/loop\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/function/tick.mcfunction",
    "content": "# tests if the player has played a note block\nexecute as @a[scores={gm4_nbi_play=1..}] at @s anchored eyes positioned ^ ^ ^ run function gm4_note_block_interface:play/setup\n\nschedule function gm4_note_block_interface:tick 1t\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/function/tune/loop.mcfunction",
    "content": "# ray cast to find note block\n# @s = player tuning note block\n# at @s anchored eyes positioned ^ ^ ^\n# run from gm4_note_block_interface:tune/setup\n\n# removes 1 from raycast\nscoreboard players remove @s gm4_nbi_ray 1\n\n# tests for note_block\nexecute if block ~ ~ ~ note_block align xyz positioned ~0.5 ~0.6 ~0.5 run function gm4_note_block_interface:interface/create\n\n# runs the loop again\nexecute unless block ~ ~ ~ note_block if score @s gm4_nbi_ray matches 1.. positioned ^ ^ ^0.1 run function gm4_note_block_interface:tune/loop\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/function/tune/setup.mcfunction",
    "content": "# check if player is sneaking and start ray cast to find note block\n# @s = player tuning note block\n# at @s anchored eyes positioned ^ ^ ^\n# run from gm4_note_block_interface:tune\n\n# resets tune scores\nscoreboard players reset @s gm4_nbi_tune\n\n# sets raycast limit\nscoreboard players set @s gm4_nbi_ray 50\n\n# runs raycast loop\nexecute unless predicate gm4_note_block_interface:sneaking run function gm4_note_block_interface:tune/loop\nexecute if predicate gm4_note_block_interface:sneaking run function gm4_note_block_interface:tune/sneak_loop\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/function/tune/sneak_loop.mcfunction",
    "content": "# ray cast to find note block\n# @s = player tuning note block\n# at @s anchored eyes positioned ^ ^ ^\n# run from gm4_note_block_interface:tune/setup\n\n# removes 1 from raycast\nscoreboard players remove @s gm4_nbi_ray 1\n\n# tests for note_block\nexecute if block ~ ~ ~ note_block align xyz positioned ~0.5 ~0.6 ~0.5 run function gm4_note_block_interface:interface/change\n\n# runs the loop again\nexecute unless block ~ ~ ~ note_block if score @s gm4_nbi_ray matches 1.. positioned ^ ^ ^0.1 run function gm4_note_block_interface:tune/sneak_loop\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/function/tune.mcfunction",
    "content": "# checks if player tuned the note block\n# @s = player tuning note block\n# at @s\n# run from advancement tune\n\nadvancement revoke @s only gm4_note_block_interface:tune\n\n# tests if the player has tuned a note block\nexecute if entity @s[scores={gm4_nbi_tune=1..}] anchored eyes positioned ^ ^ ^ run function gm4_note_block_interface:tune/setup\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/guidebook/note_block_interface.json",
    "content": "{\n  \"id\": \"note_block_interface\",\n  \"name\": \"Note Block Interface\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:note_block\"\n  },\n  \"criteria\": {\n    \"tune_note_block\": {\n      \"trigger\": \"minecraft:default_block_use\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"flags\": {\n                \"is_sneaking\": false\n              }\n            }\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:note_block\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"tune_note_block\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.note_block_interface.description\",\n            \"fallback\": \"Tuning or playing a note block will show its note above it.\\n\\nSneaking while tuning will cause the pitch to go down instead of up.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/predicate/sneaking.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"flags\": {\n      \"is_sneaking\": true\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/test/play_note.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1.5 ~1 ~0.5\n\nsetblock ~1 ~1 ~1 note_block\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1 ~1\n# fake click a note block\nscoreboard players add @s gm4_nbi_play 1\n\nawait entity @e[type=area_effect_cloud,tag=gm4_nbi_display] inside\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/test/tune_down.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1.5 ~1 ~0.5\n\nsetblock ~1 ~1 ~1 note_block\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1 ~1\ndummy @s sneak true\nawait delay 1t\nclear @s\ndummy @s use block ~1 ~1 ~1\n\nawait entity @e[type=area_effect_cloud,tag=gm4_nbi_display] inside\nassert block ~1 ~1 ~1 note_block[note=24]\n"
  },
  {
    "path": "gm4_note_block_interface/data/gm4_note_block_interface/test/tune_up.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1.5 ~1 ~0.5\n\nsetblock ~1 ~1 ~1 note_block\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1 ~1\ndummy @s use block ~1 ~1 ~1\n\nawait entity @e[type=area_effect_cloud,tag=gm4_nbi_display] inside\nassert block ~1 ~1 ~1 note_block[note=1]\n"
  },
  {
    "path": "gm4_note_block_interface/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.note_block_interface,Adds a neat interface to improve your musical skills!\ntext.gm4.guidebook.note_block_interface.description,Tuning or playing a note block will show its note above it.\\n\\nSneaking while tuning will cause the pitch to go down instead of up.\n"
  },
  {
    "path": "gm4_orb_of_ankou/README.md",
    "content": "# Orb of Ankou<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nEver found yourself envious of certain monsters abilities? Orb of Ankou allows you to gain some of those abilities.<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Integrates with the [Metallurgy]($dynamicLink:gm4_metallurgy) Shamir system to allow the player to collect \"Soul Essence\" from mobs\r\n- Adds certain qualities to mobs (such as Aggressive, Agile, Anchoring) and allows their soul to be harvested to collect each essence\r\n- Apon collecting enough of an essence type, the player can convert it into a Shard to channel the ability, which are then activated upon a certain condition.\r\n- Adds an Orb which allows holding multiple shards (that contain mob based abilities)\r\n\r\nRead more about all the options on the [Wiki](https://wiki.gm4.co/Orb_of_Ankou).\r\n"
  },
  {
    "path": "gm4_orb_of_ankou/assets/gm4_orb_of_ankou/optifine/cit/fire_sprite.properties",
    "content": "type=armor\nmatchItems=golden_helmet\ntexture.gold_layer_1=fire_sprite_layer_1\nnbt.CustomModelData=$entity/fire_sprite\n"
  },
  {
    "path": "gm4_orb_of_ankou/assets/minecraft/optifine/anim/bat2.properties",
    "content": "from=minecraft:optifine/mob/bat2_anim.png\nto=minecraft:optifine/mob/bat2.png\nx=0\ny=0\nw=32\nh=32\ninterpolate=false\ntile.0=0\nduration.0=5\ntile.1=1\nduration.1=5\ntile.2=2\nduration.2=5\ntile.3=3\nduration.3=5\ntile.4=4\nduration.4=5\ntile.5=5\nduration.5=5\ntile.6=6\nduration.6=5\ntile.7=7\nduration.7=5"
  },
  {
    "path": "gm4_orb_of_ankou/assets/minecraft/optifine/anim/bat2_e.properties",
    "content": "from=minecraft:optifine/mob/bat2_e_anim.png\nto=minecraft:optifine/mob/bat2_e.png\nx=0\ny=0\nw=32\nh=32\ninterpolate=true\ntile.0=0\nduration.0=15\ntile.1=1\nduration.1=15\ntile.2=2\nduration.2=15\ntile.3=3\nduration.3=15\ntile.4=4\nduration.4=15\ntile.5=5\nduration.5=15\ntile.6=6\nduration.6=15\ntile.7=7\nduration.7=15"
  },
  {
    "path": "gm4_orb_of_ankou/assets/minecraft/optifine/anim/endermite2.properties",
    "content": "from=minecraft:optifine/mob/endermite2_anim.png\nto=minecraft:optifine/mob/endermite2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=false\ntile.0=0\nduration.0=5\ntile.1=1\nduration.1=5\ntile.2=2\nduration.2=5\ntile.3=3\nduration.3=5"
  },
  {
    "path": "gm4_orb_of_ankou/assets/minecraft/optifine/anim/endermite2_e.properties",
    "content": "from=minecraft:optifine/mob/endermite2_e_anim.png\nto=minecraft:optifine/mob/endermite2_e.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=false\ntile.0=0\nduration.0=5\ntile.1=1\nduration.1=5\ntile.2=2\nduration.2=5\ntile.3=3\nduration.3=5"
  },
  {
    "path": "gm4_orb_of_ankou/assets/minecraft/optifine/anim/phantom2.properties",
    "content": "from=minecraft:optifine/mob/phantom2_anim.png\nto=minecraft:optifine/mob/phantom2.png\nx=0\ny=0\nw=128\nh=128\ninterpolate=false\ntile.0=0\nduration.0=2\ntile.1=1\nduration.1=2\ntile.2=2\nduration.2=2\ntile.3=3\nduration.3=2"
  },
  {
    "path": "gm4_orb_of_ankou/assets/minecraft/optifine/anim/silverfish3.properties",
    "content": "from=minecraft:optifine/mob/silverfish3_anim.png\nto=minecraft:optifine/mob/silverfish3.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=15\ntile.1=1\nduration.1=15\ntile.2=2\nduration.2=15\ntile.3=3\nduration.3=15\ntile.4=4\nduration.4=15\ntile.5=5\nduration.5=15\ntile.6=6\nduration.6=15\ntile.7=7\nduration.7=15"
  },
  {
    "path": "gm4_orb_of_ankou/assets/minecraft/optifine/anim/silverfish3_e.properties",
    "content": "from=minecraft:optifine/mob/silverfish3_e_anim.png\nto=minecraft:optifine/mob/silverfish3_e.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=false\ntile.0=0\nduration.0=15\ntile.1=1\nduration.1=15\ntile.2=2\nduration.2=15\ntile.3=3\nduration.3=15\ntile.4=4\nduration.4=15\ntile.5=5\nduration.5=15\ntile.6=6\nduration.6=15\ntile.7=7\nduration.7=15"
  },
  {
    "path": "gm4_orb_of_ankou/assets/minecraft/optifine/cem/bat.jem",
    "content": "{\n\t\"texture\": \"bat.png\",\n\t\"textureSize\": [32, 32],\n\t\"models\": [\n\t\t{\n\t\t\t\"part\": \"head\",\n\t\t\t\"id\": \"head\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -7, 0],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-2, 7, -1, 4, 3, 2], \"textureOffset\": [0, 7]},\n\t\t\t\t{\"coordinates\": [-4, 8, 0, 3, 5, 0], \"textureOffset\": [8, 15]},\n\t\t\t\t{\"coordinates\": [1, 8, 0, 3, 5, 0], \"textureOffset\": [1, 15]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"body\",\n\t\t\t\"id\": \"body\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -7, 0],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-1.5, 2, -1, 3, 5, 2], \"textureOffset\": [0, 0]},\n\t\t\t\t{\"coordinates\": [-1.5, 5, -2, 3, 4, 3], \"textureOffset\": [20, 17]},\n\t\t\t\t{\"coordinates\": [-1.5, 0, -2, 5, 5, 3], \"textureOffset\": [16, 24]},\n\t\t\t\t{\"coordinates\": [-1.5, 0, 0, 3, 2, 0], \"textureOffset\": [16, 16]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"left_wing\",\n\t\t\t\"id\": \"left_wing\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [1.5, -7, 0],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-3.5, 2, 0, 2, 7, 0], \"textureOffset\": [12, 7]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"outer_left_wing\",\n\t\t\t\"id\": \"outer_left_wing\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [3.5, -7, 0],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-9.5, 1, 0, 6, 8, 0], \"textureOffset\": [16, 8]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"right_wing\",\n\t\t\t\"id\": \"right_wing\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [-1.5, -7, 0],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [1.5, 2, 0, 2, 7, 0], \"textureOffset\": [12, 0]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"outer_right_wing\",\n\t\t\t\"id\": \"outer_right_wing\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [-3.5, -7, 0],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [3.5, 1, 0, 6, 8, 0], \"textureOffset\": [16, 0]}\n\t\t\t]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/assets/minecraft/optifine/cem/endermite.jem",
    "content": "{\n\t\"textureSize\": [64, 32],\n\t\"models\": [\n\t\t{\n\t\t\t\"part\": \"body1\",\n\t\t\t\"id\": \"body1\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -3, 3.5],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-2, 0, -4.5, 4, 3, 2], \"textureOffset\": [0, 0]},\n\t\t\t\t{\"coordinates\": [-1.5, 1, -2.5, 3, 5, 3], \"textureOffset\": [52, 0]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"body2\",\n\t\t\t\"id\": \"body2\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -4, 0],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-3, 0, -2.5, 6, 4, 5], \"textureOffset\": [0, 5]},\n\t\t\t\t{\"coordinates\": [-2.5, 5, -3.5, 5, 5, 5], \"textureOffset\": [44, 22]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"body3\",\n\t\t\t\"id\": \"body3\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -3, -3],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-1.5, 0, 2.5, 3, 3, 1], \"textureOffset\": [0, 14]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"body4\",\n\t\t\t\"id\": \"body4\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -2, -4],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-0.5, 0, 3.5, 1, 2, 1], \"textureOffset\": [0, 18]}\n\t\t\t]\n\t\t}\n\t]\n}"
  },
  {
    "path": "gm4_orb_of_ankou/assets/minecraft/optifine/cem/silverfish.jem",
    "content": "{\n\t\"textureSize\": [64, 32],\n\t\"models\": [\n\t\t{\n\t\t\t\"part\": \"body1\",\n\t\t\t\"id\": \"body1\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -2, 3.5],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-1.5, 0, -4.5, 3, 2, 2], \"textureOffset\": [0, 0]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"body2\",\n\t\t\t\"id\": \"body2\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -3, 1.5],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-2, 0, -2.5, 4, 3, 2], \"textureOffset\": [0, 4]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"body3\",\n\t\t\t\"id\": \"body3\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -4, -1],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-3, 0, -0.5, 6, 4, 3], \"textureOffset\": [0, 9]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"body4\",\n\t\t\t\"id\": \"body4\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -3, -4],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-1.5, 0, 2.5, 3, 3, 3], \"textureOffset\": [0, 16]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"body5\",\n\t\t\t\"id\": \"body5\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -2, -7],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-1, 0, 5.5, 2, 2, 3], \"textureOffset\": [0, 22]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"body6\",\n\t\t\t\"id\": \"body6\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -1, -9.5],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-1, 0, 8.5, 2, 1, 2], \"textureOffset\": [11, 0]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"body7\",\n\t\t\t\"id\": \"body7\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -1, -11.5],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-0.5, 0, 10.5, 1, 1, 2], \"textureOffset\": [13, 4]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"wing1\",\n\t\t\t\"id\": \"wing1\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -8, -1],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-5, 0, -0.5, 10, 8, 3], \"textureOffset\": [20, 0]},\n\t\t\t\t{\"coordinates\": [-2.5, 0.5, -2.5, 5, 5, 5], \"textureOffset\": [44, 10]},\n\t\t\t\t{\"coordinates\": [-3, 0, -3, 6, 6, 6], \"textureOffset\": [40, 20]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"wing2\",\n\t\t\t\"id\": \"wing2\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -4, -7],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-3, 0, 5.5, 6, 4, 3], \"textureOffset\": [20, 11]}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"part\": \"wing3\",\n\t\t\t\"id\": \"wing3\",\n\t\t\t\"invertAxis\": \"xy\",\n\t\t\t\"translate\": [0, -5, 1.5],\n\t\t\t\"boxes\": [\n\t\t\t\t{\"coordinates\": [-3, 0, -3, 6, 5, 2], \"textureOffset\": [20, 18]}\n\t\t\t]\n\t\t}\n\t]\n}"
  },
  {
    "path": "gm4_orb_of_ankou/assets/minecraft/optifine/mob/bat.properties",
    "content": "#gm4_orb_of_ankou:congealed_soul_shard\nskins.2=2\nname.2=regex:Congealed Soul Shard\\u00A7\n"
  },
  {
    "path": "gm4_orb_of_ankou/assets/minecraft/optifine/mob/endermite.properties",
    "content": "#gm4_orb_of_ankou:severed_soul\nskins.2=2\nname.2=regex:Severed Soul\\u00A7\n"
  },
  {
    "path": "gm4_orb_of_ankou/assets/minecraft/optifine/mob/silverfish.properties",
    "content": "#gm4_orb_of_ankou:living_orb\nskins.3=3\nname.3=regex:Living Orb\\u00A7\n"
  },
  {
    "path": "gm4_orb_of_ankou/assets/model_data.yaml",
    "content": "model_data:\n  - item: firework_star\n    reference: item/orb_of_ankou\n    template: generated_overlay\n  - item: [flint, black_dye]\n    template: pneuma\n    broadcast:\n      - reference: pneuma/aggressive\n      - reference: pneuma/agile\n      - reference: pneuma/anchoring\n      - reference: pneuma/bargaining\n      - reference: pneuma/bashing\n      - reference: pneuma/blasting\n      - reference: pneuma/blinding\n      - reference: pneuma/bounding\n      - reference: pneuma/bubbly\n      - reference: pneuma/conjuring\n      - reference: pneuma/dashing\n      - reference: pneuma/depriving\n      - reference: pneuma/draining\n      - reference: pneuma/enduring\n      - reference: pneuma/expeditious\n      - reference: pneuma/feathery\n      - reference: pneuma/gazing\n      - reference: pneuma/gliding\n      - reference: pneuma/hawkeye\n      - reference: pneuma/incombustible\n      - reference: pneuma/lifeless\n      - reference: pneuma/neutralizing\n      - reference: pneuma/phasing\n      - reference: pneuma/pricking\n      - reference: pneuma/retreating\n      - reference: pneuma/rushing\n      - reference: pneuma/scaling\n      - reference: pneuma/sniffing\n      - reference: pneuma/soaring\n      - reference: pneuma/synergetic\n      - reference: pneuma/vanishing\n      - reference: pneuma/venomous\n      - reference: pneuma/volatile\n      - reference: pneuma/withering\n      - reference: pneuma/striding\n      - reference: pneuma/freezing\n      - reference: pneuma/feigning\n      - reference: pneuma/shrieking\n      - reference: pneuma/tranquilizing\n      - reference: pneuma/debilitate\n  - item: swords\n    reference: shamir/corripio\n    template:\n      name: shamir\n      metal: bismuth\n      textures_path: gm4_metallurgy:item/shamir/bismuth\n  - item: golden_helmet\n    reference: entity/fire_sprite\n    template: vanilla\n  - item: black_dye\n    reference: gui/advancement/orb_of_ankou_soul_essence\n    template:\n      name: advancement\n      forward: item/essences/lifeless\n  - item: elytra\n    reference: gui/advancement/orb_of_ankou_soaring_pneuma\n    template:\n      name: advancement\n      forward: item/essences/soaring\n  - item: flint\n    reference: gui/advancement/orb_of_ankou_soul_shard\n    template:\n      name: advancement\n      forward: item/shards/lifeless\n  - item: flint_and_steel\n    reference: gui/advancement/orb_of_ankou_soul_forge\n    template: advancement\n  - item: nether_star\n    reference: gui/advancement/orb_of_ankou_all_pneumas\n    template: advancement\n  - item: firework_star\n    reference: gui/advancement/orb_of_ankou_max_orb\n    template:\n      name: advancement\n      forward: item/orb_of_ankou\n"
  },
  {
    "path": "gm4_orb_of_ankou/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.orb_of_ankou.all_pneumas.description,Few have wielded this much power\nadvancement.gm4.orb_of_ankou.all_pneumas.title,Heavy Artillery\nadvancement.gm4.orb_of_ankou.create_soul_forge.description,Light a Soul Forge\nadvancement.gm4.orb_of_ankou.create_soul_forge.title,A Dangerous Magic\nadvancement.gm4.orb_of_ankou.max_orb_of_ankou.description,Max out an Orb of Ankou\nadvancement.gm4.orb_of_ankou.max_orb_of_ankou.title,We're Full Here...\nadvancement.gm4.orb_of_ankou.obtain_soul_essence.description,Obtain a piece of a mob's soul\nadvancement.gm4.orb_of_ankou.obtain_soul_essence.title,A Small Price to Pay...\nadvancement.gm4.orb_of_ankou.obtain_soul_shard.description,Forge a Soul Shard\nadvancement.gm4.orb_of_ankou.obtain_soul_shard.title,Was it Worth the Sacrifice?\nadvancement.gm4.orb_of_ankou.soaring.description,Fly with the soaring pneuma\nadvancement.gm4.orb_of_ankou.soaring.title,I Believe I Can Fly!\nentity.gm4.congealed_shard,Congealed Soul Shard\\u00A7\nentity.gm4.fire_sprite,Fire Sprite\\u00A7\nentity.gm4.living_orb,Living Orb\\u00A7\nentity.gm4.possessed_shard,Possessed Soul Shard\\u00A7\nentity.gm4.severed_soul,Severed Soul\\u00A7\nentity.gm4.wandering_tear,Wandering Tear\\u00A7\nentity.gm4.withering_magic,Withering Magic\nitem.gm4.orb_of_ankou,Orb of Ankou\nitem.gm4.shamir.corripio,Corripio Shamir\nitem.gm4.soul_essence,Soul Essence\nitem.gm4.soul_shard,Soul Shard\ntext.gm4.orb_of_ankou.empty,Empty\ntext.gm4.orb_of_ankou.pneumas,Pneumas:\ntext.gm4.pneuma_aggressive,Aggressive\ntext.gm4.pneuma_agile,Agile\ntext.gm4.pneuma_anchoring,Anchoring\ntext.gm4.pneuma_bargaining,Bargaining\ntext.gm4.pneuma_bashing,Bashing\ntext.gm4.pneuma_blasting,Blasting\ntext.gm4.pneuma_blinding,Blinding\ntext.gm4.pneuma_bounding,Bounding\ntext.gm4.pneuma_bubbly,Bubbly\ntext.gm4.pneuma_conjuring,Conjuring\ntext.gm4.pneuma_dashing,Dashing\ntext.gm4.pneuma_depriving,Depriving\ntext.gm4.pneuma_draining,Draining\ntext.gm4.pneuma_enduring,Enduring\ntext.gm4.pneuma_expeditious,Expeditious\ntext.gm4.pneuma_feathery,Feathery\ntext.gm4.pneuma_feigning,Feigning\ntext.gm4.pneuma_freezing,Freezing\ntext.gm4.pneuma_gazing,Gazing\ntext.gm4.pneuma_gliding,Gliding\ntext.gm4.pneuma_hawkeye,Hawkeye\ntext.gm4.pneuma_incombustible,Incombustible\ntext.gm4.pneuma_lifeless,Lifeless\ntext.gm4.pneuma_neutralizing,Neutralizing\ntext.gm4.pneuma_phasing,Phasing\ntext.gm4.pneuma_pricking,Pricking\ntext.gm4.pneuma_retreating,Retreating\ntext.gm4.pneuma_rushing,Rushing\ntext.gm4.pneuma_scaling,Scaling\ntext.gm4.pneuma_shrieking,Shrieking\ntext.gm4.pneuma_sniffing,Sniffing\ntext.gm4.pneuma_soaring,Soaring\ntext.gm4.pneuma_striding,Striding\ntext.gm4.pneuma_synergetic,Synergetic\ntext.gm4.pneuma_tranquilizing,Tranquilizing\ntext.gm4.pneuma_debilitate,Debilitate\ntext.gm4.pneuma_vanishing,Vanishing\ntext.gm4.pneuma_venomous,Venomous\ntext.gm4.pneuma_volatile,Volatile\ntext.gm4.pneuma_withering,Withering\ntext.gm4.guidebook.module_desc.corripio_shamir,\"Harvest mob souls and condense them using forbidden nether magic to obtain mob abilities! Learn how to fly, or simply become turtule-man.\"\ntext.gm4.guidebook.corripio_shamir.description,Corripio extracts soul essence drops from mobs.\ntext.gm4.guidebook.corripio_shamir.usage,The Corripio Shamir is found on Bismuth Bands. It can be placed onto swords.\\n\\nKilling mobs will cause Soul Essences to drop very rarely. The drop rates are increased with the Looting enchantment.\ntext.gm4.guidebook.module_desc.orb_of_ankou,\"Harvest mob souls and condense them using forbidden nether magic to obtain mob abilities! Learn how to fly, or simply become turtule-man.\"\ntext.gm4.guidebook.orb_of_ankou.description,\"Mob powers can be obtained by collecting rare soul essences using the Corripio Shamir.\\n\\nThirteen essences are required to gain the powers of a mob, called a pneuma.\"\ntext.gm4.guidebook.orb_of_ankou.soul_forge,\"To gain powers of the Soul Essences, a Condensing Ritual must be performed in a Soul Forge.\\n\\nA Soul Forge can be made in the Nether by forming a 3x3 ring of obsidian then igniting soul fire inside the ring.\"\ntext.gm4.guidebook.orb_of_ankou.condensing_ritual,\"To create a Soul Shard, 13 of the same Soul Essence must be dropped into the forge along with some blaze powder and glowstone dust.\\n\\nExtinguishing the flame will create a Possesed Soul Shard, which should be killed.\"\ntext.gm4.guidebook.orb_of_ankou.condensing_ingredients,\"The required amount of glowstone dust and blaze powder is between 1 and 64, but differs in each world.\\n\\nExtra dust or powder will create the Shard, but spawn Fiery Sprites. Too little will cause the recipe to fail.\"\ntext.gm4.guidebook.orb_of_ankou.shard_usage,\"Holding the Shard in the offhand will grant the user with that pneuma's power, while lowering their attack damage 20% as a side-effect.\\n\\nAn Orb of Ankou can be crafted to negate the attack debuff and hold more pneumas.\"\ntext.gm4.guidebook.orb_of_ankou.orb_crafting,The Orb of Ankou can be crafted with the following recipe:\ntext.gm4.guidebook.orb_of_ankou.fusing_ritual,\"To fuse a Shard into an Orb, light a soul forge and drop the two items in, along with some ghast tears.\\n\\nWither particles will appear to indicate where wither roses should be placed to be absorbed.\"\ntext.gm4.guidebook.orb_of_ankou.fusing_ingredients,\"The required amount of ghast tears and wither roses is between 3 and 16, but differs in each world.\\n\\nExtra tears or roses will fuse the Shard, but wandering tears and a withering cloud will appear.\"\ntext.gm4.guidebook.orb_of_ankou.orb_usage,\"Similar to a Soul Shard, the Orb of Ankou functions when it is equipped in the offhand.\\n\\nAn orb of ankou can hold 4 pneumas, which will work concurrently when in the same orb.\"\ntext.gm4.guidebook.orb_of_ankou.defensive_pneumas,The following pneumas activate upon taking damage:\ntext.gm4.guidebook.orb_of_ankou.note.aggressive,Grants Strength when damaged\ntext.gm4.guidebook.orb_of_ankou.pneuma_list, - %1$s*\ntext.gm4.guidebook.orb_of_ankou.note.feigning,\"Grants Slowness, Resistance, Invisibility, and Regeneration when damaged below half health\"\ntext.gm4.guidebook.orb_of_ankou.note.incombustible,Grants Fire Resistance when damaged by fire\ntext.gm4.guidebook.orb_of_ankou.note.lifeless,Negates Poison effect and heals when damaged by Instant Damage effect\ntext.gm4.guidebook.orb_of_ankou.note.neutralizing,Negates Poison effect; Instant Damage effect deals less damage\ntext.gm4.pneuma_picking,Pricking\ntext.gm4.guidebook.orb_of_ankou.note.pricking,75% chance to deal 1-4 damage to the attacker (Thorns V)\ntext.gm4.guidebook.orb_of_ankou.note.retreating,Grants Speed and Weakness when damaged\ntext.gm4.guidebook.orb_of_ankou.note.volatile,Creates explosion if damaged below 1.5 hearts\ntext.gm4.guidebook.orb_of_ankou.offensive_pneumas,The following pneumas activate upon dealing damage:\ntext.gm4.guidebook.orb_of_ankou.note.blasting,Shoots fireballs when shooting a crossbow with blaze powder in the inventory\ntext.gm4.guidebook.orb_of_ankou.note.depriving,Applies Hunger to attacked targets; Applies Weakness to attacked mobs\ntext.gm4.guidebook.orb_of_ankou.note.freezing,Applies Slowness to arrows shot from bows\ntext.gm4.guidebook.orb_of_ankou.note.hawkeye,Doubles the damage of arrows shot from bows; Arrows shot from bows will have Piercing I\ntext.gm4.guidebook.orb_of_ankou.note.tranquilizing,Applies Poison to arrows shot from bows\ntext.gm4.guidebook.orb_of_ankou.note.debilitate,Applies Weakness to arrows shot from bows\ntext.gm4.guidebook.orb_of_ankou.note.venomous,Applies Poison to attacked target\ntext.gm4.guidebook.orb_of_ankou.note.withering,Applies Wither to attacked target\ntext.gm4.guidebook.orb_of_ankou.passive_pneumas,\"The following pneumas are passive, activating automatically:\"\ntext.gm4.guidebook.orb_of_ankou.note.agile,Prevents fall damage\ntext.gm4.guidebook.orb_of_ankou.note.anchoring,Grants 90% Knockback Resistance\ntext.gm4.guidebook.orb_of_ankou.note.bargaining,Grants Regeneration upon trading with villagers\ntext.gm4.guidebook.orb_of_ankou.note.bashing,\"Grants +70% Attack Damage, but -40% Attack Speed\"\ntext.gm4.guidebook.orb_of_ankou.note.bubbly,Grants 2 minutes of Water Breathing when submerged\ntext.gm4.guidebook.orb_of_ankou.note.enduring,\"Grants +8 Max Health, but -20% Speed\"\ntext.gm4.guidebook.orb_of_ankou.note.gliding,Grants Dolphin's Grace when swimming\ntext.gm4.guidebook.orb_of_ankou.note.striding,Temporarily converts lava sources into magma blocks upon stepping on them\ntext.gm4.guidebook.orb_of_ankou.note.synergetic,Grants Strength to tamed wolves and other Synergetic users\ntext.gm4.guidebook.orb_of_ankou.sneak_charge_pneumas,The following pneumas charge while sneaking then activate upon unsneaking:\ntext.gm4.guidebook.orb_of_ankou.note.bounding,Increasingly stronger Jump Boost\ntext.gm4.guidebook.orb_of_ankou.note.conjuring,Increasingly farther Evoker fang attack\ntext.gm4.guidebook.orb_of_ankou.note.dashing,Increasingly farther horizontal dash\ntext.gm4.guidebook.orb_of_ankou.note.draining,Increasingly farther Mining Fatigue AOE\ntext.gm4.guidebook.orb_of_ankou.note.expeditious,Increasingly farther random teleport\ntext.gm4.guidebook.orb_of_ankou.note.rushing,Increasingly faster and longer Speed burst\ntext.gm4.guidebook.orb_of_ankou.note.shrieking,\"Sonic boom 15 blocks far, dealing 6 hearts of damage\"\ntext.gm4.guidebook.orb_of_ankou.sneak_tap_pneumas,The following pneumas activate while sneaking:\ntext.gm4.guidebook.orb_of_ankou.note.blinding,Blindness AOE for 7 seconds\ntext.gm4.guidebook.orb_of_ankou.note.feathery,Grants Slow Falling for 7 seconds\ntext.gm4.guidebook.orb_of_ankou.note.gazing,Grants Night Vision for 30 seconds\ntext.gm4.guidebook.orb_of_ankou.note.soaring,Sneaking toggles the ability: Look up to ascend and down to descend\ntext.gm4.guidebook.orb_of_ankou.note.vanishing,Grants Invisibility for 90 seconds\ntext.gm4.guidebook.orb_of_ankou.sneak_hold_pneumas,The following pneumas activate while continuously sneaking:\ntext.gm4.guidebook.orb_of_ankou.note.phasing,Allows walking through 1-wide walls\ntext.gm4.guidebook.orb_of_ankou.note.scaling,Allows climbing up walls\ntext.gm4.guidebook.orb_of_ankou.note.sniffing,Sniffs up torchflowers and pitcher pods\n"
  },
  {
    "path": "gm4_orb_of_ankou/beet.yaml",
    "content": "id: gm4_orb_of_ankou\nname: Orb of Ankou\nversion: 1.9.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load:\n    - .\n    - ../gm4_metallurgy\n\npipeline:\n  - gm4_orb_of_ankou.generate_pneumas\n  - gm4_orb_of_ankou.pneuma_model_template\n  - gm4_metallurgy.shamir_model_template\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_player_motion\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_metallurgy: 1.8.0\n        lib_player_motion: 1.1.0\n      schedule_loops:\n        - main\n        - tick\n    website:\n      description: Harvest mob souls and condense them using forbidden nether magic to obtain mob abilities! Learn how to fly, or simply become turtule-man.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: rRP5afZM\n    wiki: https://wiki.gm4.co/wiki/Orb_of_Ankou\n    credits:\n      Creator:\n        - BPR\n      Icon Design:\n        - BPR\n    \n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4/advancement/all_pneumas.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"nether_star\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:gui/advancement/orb_of_ankou_all_pneumas\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.orb_of_ankou.all_pneumas.title\",\n      \"fallback\": \"Heavy Artillery\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.orb_of_ankou.all_pneumas.description\",\n      \"fallback\": \"Few have wielded this much power\",\n      \"color\": \"gray\"\n    },\n    \"frame\": \"challenge\"\n  },\n  \"parent\": \"gm4:soaring_pneuma\",\n  \"criteria\": {\n    \"aggressive_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"aggressive\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"agile_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"agile\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"anchoring_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"anchoring\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"bargaining_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"bargaining\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"bashing_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"bashing\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"blasting_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"blasting\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"blinding_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"blinding\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"bounding_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"bounding\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"bubbly_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"bubbly\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"conjuring_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"conjuring\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"depriving_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"depriving\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"draining_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"draining\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"enduring_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"enduring\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"expeditious_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"expeditious\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"feathery_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"feathery\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"gazing_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"gazing\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"gliding_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"gliding\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"hawkeye_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"hawkeye\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"incombustible_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"incombustible\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"lifeless_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"lifeless\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"neutralizing_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"neutralizing\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"phasing_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"phasing\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"pricking_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"pricking\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"retreating_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"retreating\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"rushing_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"rushing\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"scaling_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"scaling\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"soaring_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"soaring\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"synergetic_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"synergetic\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"vanishing_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"vanishing\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"venomous_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"venomous\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"volatile_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"volatile\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"withering_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"withering\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"freezing_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"freezing\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"striding_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"striding\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4/advancement/create_soul_forge.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"flint_and_steel\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:gui/advancement/orb_of_ankou_soul_forge\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.orb_of_ankou.create_soul_forge.title\",\n      \"fallback\": \"A Dangerous Magic\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.orb_of_ankou.create_soul_forge.description\",\n      \"fallback\": \"Light a Soul Forge\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:obtain_soul_essence\",\n  \"criteria\": {\n    \"create_soul_forge\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4/advancement/create_soul_shard.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"flint\",\n      \"components\": {\n        \"minecraft:enchantment_glint_override\": true,\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:gui/advancement/orb_of_ankou_soul_shard\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.orb_of_ankou.obtain_soul_shard.title\",\n      \"fallback\": \"Was it Worth the Sacrifice?\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.orb_of_ankou.obtain_soul_shard.description\",\n      \"fallback\": \"Forge a Soul Shard\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:create_soul_forge\",\n  \"criteria\": {\n    \"soul_shard\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:flint\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{item:\\\"soul_shard\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4/advancement/max_orb_of_ankou.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"firework_star\",\n      \"components\": {\n        \"minecraft:enchantment_glint_override\": true,\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:gui/advancement/orb_of_ankou_max_orb\"]},\n        \"minecraft:firework_explosion\": {\n          \"shape\": \"small_ball\",\n          \"colors\": [\n            13092807\n          ]\n        }\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.orb_of_ankou.max_orb_of_ankou.title\",\n      \"fallback\": \"We're Full Here...\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.orb_of_ankou.max_orb_of_ankou.description\",\n      \"fallback\": \"Max out an Orb of Ankou\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:create_soul_shard\",\n  \"criteria\": {\n    \"max_orb_of_ankou\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4/advancement/obtain_soul_essence.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"black_dye\",\n      \"components\": {\n        \"minecraft:enchantment_glint_override\": true,\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:gui/advancement/orb_of_ankou_soul_essence\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.orb_of_ankou.obtain_soul_essence.title\",\n      \"fallback\": \"A Small Price to Pay...\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.orb_of_ankou.obtain_soul_essence.description\",\n      \"fallback\": \"Obtain a piece of a mob's soul\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:metallurgy_cast\",\n  \"criteria\": {\n    \"soul_essence\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:black_dye\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{item:\\\"soul_essence\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4/advancement/soaring_pneuma.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"elytra\",\n      \"components\": {\n        \"minecraft:enchantment_glint_override\": true,\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:gui/advancement/orb_of_ankou_soaring_pneuma\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.orb_of_ankou.soaring.title\",\n      \"fallback\": \"I Believe I Can Fly!\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.orb_of_ankou.soaring.description\",\n      \"fallback\": \"Fly with the soaring pneuma\",\n      \"color\": \"gray\"\n    },\n    \"frame\": \"goal\"\n  },\n  \"parent\": \"gm4:create_soul_shard\",\n  \"criteria\": {\n    \"soaring_pneuma\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#gm4_orb_of_ankou:pneuma_container\",\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"soaring\\\"}]}}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_animi_shamir/function/mark_orb_of_ankou.mcfunction",
    "content": "# Marks Orbs of Ankou as tools for the animi shamir\n# run from #gm4_animi_shamir:mark_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'animi'}}] if items entity @s contents minecraft:firework_star[custom_data~{gm4_orb_of_ankou:{item:\"orb\"}}] run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_corripio_shamir/function/check_item_validity.mcfunction",
    "content": "# @s = band is trying to apply to\n# run from #metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'corripio'}}] if items entity @s contents #gm4_corripio_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_corripio_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n# run from metallurgy:casting/summon_band/bismuth via #gm4_metallurgy:summon_band/bismuth\n\nloot spawn ~ ~ ~ loot gm4_corripio_shamir:band\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_corripio_shamir/guidebook/corripio_shamir.json",
    "content": "{\n  \"id\": \"corripio_shamir\",\n  \"name\": \"Corripio Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"orb_of_ankou\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Corripio_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_corripio_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'corripio'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_corripio_weapon\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'corripio'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.corripio_shamir.description\",\n            \"fallback\": \"Corripio extracts soul essence drops from mobs.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_corripio_shamir\",\n          \"obtain_corripio_weapon\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.corripio_shamir.usage\",\n            \"fallback\": \"The Corripio Shamir is found on Bismuth Bands. It can be placed onto swords.\\n\\nKilling mobs will cause Soul Essences to drop very rarely. The drop rates are increased with the Looting enchantment.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_corripio_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:bismuth_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:shamir/corripio\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'corripio'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.corripio\",\n                                    \"fallback\": \"Corripio Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_corripio_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:swords\"\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_metallurgy/tags/function/check_item_validity.json",
    "content": "{\n  \"values\": [\n    \"gm4_animi_shamir:mark_orb_of_ankou\",\n    \"gm4_corripio_shamir:check_item_validity\"\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_metallurgy/tags/function/summon_band/bismuth.json",
    "content": "{\n  \"values\":[\n    \"gm4_corripio_shamir:summon_band\"\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/check_player/check_inventory.json",
    "content": "{\n  \"criteria\": {\n    \"change_inventory\": {\n      \"trigger\": \"minecraft:inventory_changed\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:update_tags/check_offhand\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/check_player/get_id.json",
    "content": "{\n  \"criteria\": {\n    \"join\": {\n      \"trigger\": \"minecraft:tick\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:update_tags/player_id\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/recipes/orb_of_ankou.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_orb_of_ankou:orb_of_ankou\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:netherite_scrap\",\n              \"minecraft:nether_star\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_orb_of_ankou:orb_of_ankou\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/damaged.json",
    "content": "{\n  \"criteria\": {\n    \"damaged\": {\n      \"trigger\": \"minecraft:entity_hurt_player\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:pneumas/advancement_triggers/player_damaged\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/fire_damaged.json",
    "content": "{\n  \"criteria\": {\n    \"fire_damaged\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"minecraft:is_fire\",\n                \"expected\": true\n              }\n            ]\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:pneumas/advancement_triggers/player_on_fire\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/hunger_attack.json",
    "content": "{\n  \"criteria\": {\n    \"player_attack_with_poision\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"damage\": {\n          \"source_entity\": {\n            \"equipment\": {\n              \"offhand\": {\n                \"items\": \"#gm4_orb_of_ankou:pneuma_container\",\n                \"predicates\": {\n                  \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"depriving\\\"}]}}\"\n                }\n              }\n            }\n          },\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"minecraft:is_explosion\",\n                \"expected\": false\n              },\n              {\n                \"id\": \"minecraft:is_fire\",\n                \"expected\": false\n              },\n              {\n                \"id\": \"minecraft:is_projectile\",\n                \"expected\": false\n              },\n              {\n                \"id\": \"minecraft:witch_resistant_to\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:pneumas/advancement_triggers/hunger_attack\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/magic_damaged_1.json",
    "content": "{\n  \"criteria\": {\n    \"harming_1_applied\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"minecraft:witch_resistant_to\",\n                \"expected\": true\n              }\n            ]\n          },\n          \"dealt\": {\n            \"max\": 6\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:pneumas/advancement_triggers/magic_damaged_1\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/magic_damaged_2.json",
    "content": "{\n  \"criteria\": {\n    \"harming_1_applied\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"minecraft:witch_resistant_to\",\n                \"expected\": true\n              }\n            ]\n          },\n          \"dealt\": {\n            \"min\": 6\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:pneumas/advancement_triggers/magic_damaged_2\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/magic_evoker_fang.json",
    "content": "{\n  \"criteria\": {\n    \"hurt_by_evoker_fang\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"minecraft:witch_resistant_to\",\n                \"expected\": true\n              }\n            ]\n          },\n          \"source_entity\": {\n            \"type\": \"minecraft:evoker\"\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:pneumas/advancement_triggers/magic_ignore\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/poison_attack.json",
    "content": "{\n  \"criteria\": {\n    \"player_attack_with_poision\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"damage\": {\n          \"source_entity\": {\n            \"equipment\": {\n              \"offhand\": {\n                \"items\": \"#gm4_orb_of_ankou:pneuma_container\",\n                \"predicates\": {\n                  \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"venomous\\\"}]}}\"\n                }\n              }\n            }\n          },\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"minecraft:is_explosion\",\n                \"expected\": false\n              },\n              {\n                \"id\": \"minecraft:is_fire\",\n                \"expected\": false\n              },\n              {\n                \"id\": \"minecraft:is_projectile\",\n                \"expected\": false\n              },\n              {\n                \"id\": \"minecraft:witch_resistant_to\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:pneumas/advancement_triggers/poison_attack\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/poison_effect.json",
    "content": "{\n  \"criteria\": {\n    \"poison_applied\": {\n      \"trigger\": \"minecraft:effects_changed\",\n      \"conditions\": {\n        \"effects\": {\n          \"minecraft:poison\": {\n            \"duration\": {\n              \"min\": 1\n            }\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:pneumas/advancement_triggers/affected_by_poison\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/shoot_crossbow.json",
    "content": "{\n  \"criteria\": {\n    \"crossbow_shot\": {\n      \"trigger\": \"minecraft:shot_crossbow\",\n      \"conditions\": {}\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:pneumas/advancement_triggers/shot_crossbow\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/traded.json",
    "content": "{\n  \"criteria\": {\n    \"trade_with_villager\": {\n      \"trigger\": \"minecraft:villager_trade\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:pneumas/advancement_triggers/player_traded\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/wither_attack.json",
    "content": "{\n  \"criteria\": {\n    \"player_attack_with_wither\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"damage\": {\n          \"source_entity\": {\n            \"equipment\": {\n              \"offhand\": {\n                \"items\": \"#gm4_orb_of_ankou:pneuma_container\",\n                \"predicates\": {\n                  \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{id:\\\"withering\\\"}]}}\"\n                }\n              }\n            }\n          },\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"minecraft:is_explosion\",\n                \"expected\": false\n              },\n              {\n                \"id\": \"minecraft:is_fire\",\n                \"expected\": false\n              },\n              {\n                \"id\": \"minecraft:is_projectile\",\n                \"expected\": false\n              },\n              {\n                \"id\": \"minecraft:witch_resistant_to\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:pneumas/advancement_triggers/wither_attack\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/wither_effect.json",
    "content": "{\n  \"criteria\": {\n    \"wither_applied\": {\n      \"trigger\": \"minecraft:effects_changed\",\n      \"conditions\": {\n        \"effects\": {\n          \"minecraft:wither\": {\n            \"duration\": {\n              \"min\": 1\n            }\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_orb_of_ankou:pneumas/advancement_triggers/affected_by_wither\"\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/init.mcfunction",
    "content": "# declare and initialise scoreboards and settings\nteam add gm4_hide_name\nteam modify gm4_hide_name nametagVisibility never\n\n# soul forge scoreboard stuff\nscoreboard objectives add gm4_count dummy\nscoreboard objectives add gm4_oa_forge dummy\nscoreboard objectives add gm4_oa_powder dummy\nscoreboard objectives add gm4_oa_glowstone dummy\nscoreboard objectives add gm4_oa_tears dummy\nscoreboard objectives add gm4_oa_roses dummy\nscoreboard objectives add gm4_oa_essence dummy\nscoreboard objectives add gm4_oa_fns minecraft.used:minecraft.flint_and_steel\n\nfunction gm4_orb_of_ankou:soul_forge/recipes/initiate_recipe_amounts\n\n# pneuma scoreboard stuff\nscoreboard objectives add gm4_oa_id dummy\nscoreboard objectives add gm4_pneuma_data dummy\nscoreboard objectives add gm4_oa_snk_num dummy\nscoreboard objectives add gm4_oa_marker dummy\nscoreboard objectives add gm4_oa_feign_t dummy\nscoreboard objectives add gm4_oa_sniff dummy\nscoreboard objectives add gm4_oa_jump_stop dummy\nscoreboard objectives add gm4_health health\nscoreboard objectives add gm4_oa_sneak minecraft.custom:minecraft.sneak_time\nscoreboard objectives add gm4_oa_swim minecraft.custom:minecraft.swim_one_cm\nscoreboard objectives add gm4_oa_bow_hawkeye minecraft.used:minecraft.bow\nscoreboard objectives add gm4_oa_bow_freezing minecraft.used:minecraft.bow\nscoreboard objectives add gm4_oa_bow_tranquilizing minecraft.used:minecraft.bow\nscoreboard objectives add gm4_oa_bow_debilitate minecraft.used:minecraft.bow\n\n# start module\nexecute unless score orb_of_ankou gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Orb of Ankou\"}\nexecute unless score orb_of_ankou gm4_earliest_version < orb_of_ankou gm4_modules run scoreboard players operation orb_of_ankou gm4_earliest_version = orb_of_ankou gm4_modules\nscoreboard players set orb_of_ankou gm4_modules 1\n\nschedule function gm4_orb_of_ankou:main 1t\nschedule function gm4_orb_of_ankou:tick 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/main.mcfunction",
    "content": "## SOUL FORGE ##\n\nexecute in the_nether run function gm4_orb_of_ankou:nether_main\n\n\n## PNEUMA STUFF ##\n\n# gazing\neffect give @a[gamemode=!spectator,tag=gm4_pneuma_gazing] night_vision 15 0 true\n\n# gliding\neffect give @a[gamemode=!spectator,tag=gm4_pneuma_gliding,scores={gm4_oa_swim=1..}] dolphins_grace 3 1 true\nscoreboard players reset @a gm4_oa_swim\n\n# soaring\nexecute as @a[tag=gm4_oa_soaring_off_ground,nbt={OnGround:1b}] run function gm4_orb_of_ankou:pneumas/soaring/remove_fall_protection\n\n# sniffing\nscoreboard players remove @a[scores={gm4_oa_sniff=1..}] gm4_oa_sniff 1\n\n# run player commands\nexecute as @a[gamemode=!spectator,tag=gm4_has_pneuma] run function gm4_orb_of_ankou:player\n\n# revert invulnerable item\nscoreboard players add @e[type=item,tag=gm4_oa_invulnerable] gm4_pneuma_data 1\nexecute as @e[type=item,tag=gm4_oa_invulnerable,scores={gm4_pneuma_data=2..}] run function gm4_orb_of_ankou:pneumas/revert_invulnerable_item\n\nschedule function gm4_orb_of_ankou:main 16t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/nether_main.mcfunction",
    "content": "# runs main functions in the nether\n# @s = none\n# located at world spawn, in the nether\n# run from main\n\n# check if player is in the nether\nexecute store result score nether_player gm4_oa_forge if entity @a[gamemode=!spectator,x=0,limit=1]\nexecute unless score nether_player gm4_oa_forge matches 1.. run return 0\n\n# mark soul altars as loaded if a player is nearby\nexecute store result score loaded_forge gm4_oa_forge at @e[type=armor_stand,x=0,tag=gm4_soul_forge] if entity @a[gamemode=!spectator,distance=..8,limit=1]\nexecute unless score loaded_forge gm4_oa_forge matches 1.. run return 0\n\n# destroy soul forge\nexecute as @e[type=armor_stand,x=0,tag=gm4_soul_forge] at @s unless block ~ ~ ~ soul_fire run function gm4_orb_of_ankou:soul_forge/destroy\n\n# soul forge visuals\nexecute as @e[type=armor_stand,x=0,tag=gm4_soul_forge] at @s if predicate gm4_orb_of_ankou:has_multiblock run function gm4_orb_of_ankou:soul_forge/process\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/nether_tick.mcfunction",
    "content": "# runs tick functions in the nether\n# @s = none\n# located at world spawn, in the nether\n# run from tick\n\n# creation\nexecute as @a[gamemode=!spectator,x=0,scores={gm4_oa_fns=1..}] at @s run function gm4_orb_of_ankou:soul_forge/used_flint_and_steel\n\n# check item before it burns\nexecute if score loaded_forge gm4_oa_forge matches 1.. at @e[type=armor_stand,x=0,tag=gm4_soul_forge] if predicate gm4_orb_of_ankou:has_multiblock align xyz as @e[type=item,tag=!gm4_oa_checked_item,dx=0,dy=0,dz=0] run function gm4_orb_of_ankou:soul_forge/recipes/check_item\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/player.mcfunction",
    "content": "# @s = all non-spectator players that has a pneuma equipped\n# run from main\n\n# bubbly\nexecute at @s[tag=gm4_pneuma_bubbly] anchored eyes positioned ^ ^ ^ unless predicate gm4_orb_of_ankou:in_water run effect give @s water_breathing 121 0 true\n\n# synergetic\nexecute at @s[tag=gm4_pneuma_synergetic] run function gm4_orb_of_ankou:pneumas/synergetic/apply\n\n# soaring\nexecute at @s[tag=gm4_oa_soaring_active] run function gm4_orb_of_ankou:pneumas/soaring/apply\n\n# disable jump revert\nscoreboard players remove @a[scores={gm4_oa_jump_stop=1..}] gm4_oa_jump_stop 1\nexecute as @a[scores={gm4_oa_jump_stop=1}] run attribute @s minecraft:jump_strength modifier remove gm4_orb_of_ankou:prevent_jump\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/affected_by_poison.mcfunction",
    "content": "# @s = any player who has the poison effect\n# run from advancement \"triggers/poison_effect\"\n\nadvancement revoke @s only gm4_orb_of_ankou:triggers/poison_effect\neffect clear @s[tag=gm4_pneuma_neutralizing] poison\neffect clear @s[tag=gm4_pneuma_lifeless] poison\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/affected_by_wither.mcfunction",
    "content": "# @s = any player who has the wither effect\n# run from advancement \"triggers/wither_effect\"\n\nadvancement revoke @s only gm4_orb_of_ankou:triggers/wither_effect\neffect clear @s[tag=gm4_pneuma_withering] wither\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/hunger_attack.mcfunction",
    "content": "# @s = any player who has hit an entity and has the depriving pneuma\n# run from advancement \"trigers/hunger_attack\"\n\nadvancement revoke @s only gm4_orb_of_ankou:triggers/hunger_attack\nexecute positioned ^ ^ ^2 run effect give @a[distance=..2.5,nbt={HurtTime:10s}] hunger 7 0\nexecute positioned ^ ^ ^2 run effect give @e[type=!player,tag=!smithed.strict,distance=..2.5,nbt={HurtTime:10s}] weakness 7 0\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/magic_damaged_1.mcfunction",
    "content": "# @s = any player who was hurt by magic that dealt <= 6 health\n# run from advancement \"triggers/magic_damaged_1\"\n\nadvancement revoke @s only gm4_orb_of_ankou:triggers/magic_damaged_1\ntag @s add gm4_oa_magic_1\ntag @s add gm4_oa_magic_damaged\nschedule function gm4_orb_of_ankou:pneumas/temp_tick/magic_damaged 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/magic_damaged_2.mcfunction",
    "content": "# @s = any player who was hurt by magic that dealt >= 6 health\n# run from advancement \"triggers/magic_damaged_2\"\n\nadvancement revoke @s only gm4_orb_of_ankou:triggers/magic_damaged_2\ntag @s add gm4_oa_magic_2\ntag @s add gm4_oa_magic_damaged\nschedule function gm4_orb_of_ankou:pneumas/temp_tick/magic_damaged 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/magic_ignore.mcfunction",
    "content": "# @s = any player who was hurt by an evoker fang\n# run from advancement \"triggers/magic_evoker_fang\"\n\nadvancement revoke @s only gm4_orb_of_ankou:triggers/magic_evoker_fang\ntag @s add gm4_oa_magic_ignore\ntag @s add gm4_oa_magic_damaged\nschedule function gm4_orb_of_ankou:pneumas/temp_tick/magic_damaged 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/player_damaged.mcfunction",
    "content": "# @s = any player who has been damaged\n# run from advancement \"triggers/damaged\"\n\nadvancement revoke @s only gm4_orb_of_ankou:triggers/damaged\n\nexecute if entity @s[tag=gm4_pneuma_retreating] run function gm4_orb_of_ankou:pneumas/retreating\n\neffect give @s[tag=gm4_pneuma_aggressive] strength 3 1 true\n\nexecute if entity @s[tag=gm4_pneuma_volatile] run function gm4_orb_of_ankou:pneumas/volatile\n\nexecute if entity @s[tag=gm4_pneuma_feigning,scores={gm4_health=..10}] run function gm4_orb_of_ankou:pneumas/feigning/apply\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/player_on_fire.mcfunction",
    "content": "# @s = any player who has been damaged by fire\n# run from advancement \"triggers/fire_damaged\"\n\nadvancement revoke @s only gm4_orb_of_ankou:triggers/fire_damaged\neffect give @s[tag=gm4_pneuma_incombustible] fire_resistance 15 0\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/player_traded.mcfunction",
    "content": "# @s = any player who has traded with a villager\n# run from advancement \"triggers/traded\"\n\nadvancement revoke @s only gm4_orb_of_ankou:triggers/traded\neffect give @s[tag=gm4_pneuma_bargaining] minecraft:regeneration 4 1\nxp add @s[tag=gm4_pneuma_bargaining] 50 points\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/poison_attack.mcfunction",
    "content": "# @s = any player who has hit an entity and has the venomous pneuma\n# run from advancement \"trigers/poison_attack\"\n\nadvancement revoke @s only gm4_orb_of_ankou:triggers/poison_attack\nexecute positioned ^ ^ ^2 run effect give @e[distance=..2.5,tag=!smithed.strict,nbt={HurtTime:10s}] poison 7 0\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/shot_crossbow.mcfunction",
    "content": "# @s = any player who has shot a crossbow\n# run from advancement \"trigers/shoot_crossbow\"\n\nadvancement revoke @s only gm4_orb_of_ankou:triggers/shoot_crossbow\nexecute if entity @s[tag=gm4_pneuma_blasting,nbt={Inventory:[{id:\"minecraft:blaze_powder\"}]}] if entity @e[type=minecraft:arrow,limit=1,distance=..2] run function gm4_orb_of_ankou:pneumas/blasting\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/wither_attack.mcfunction",
    "content": "# @s = any player who has hit an entity and has the withering pneuma\n# run from advancement \"trigers/wither_attack\"\n\nadvancement revoke @s only gm4_orb_of_ankou:triggers/wither_attack\nexecute positioned ^ ^ ^2 run effect give @e[distance=..2.5,tag=!smithed.strict,nbt={HurtTime:10s}] wither 8 1\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/blasting.mcfunction",
    "content": "# @s = player who shot a crossbow with blasting pneuma and blaze powder\n# run from advancement_triggers/shoot_crossbow\n\n# summon fireball at player's location\nsummon minecraft:small_fireball ~ ~1 ~ {Tags:[\"gm4_oa_fireball\"],Motion:[0.0,0.0,0.0]}\n\n# copy motion of arrow to fireball\ndata modify entity @e[type=small_fireball,tag=gm4_oa_fireball,distance=..2,limit=1] Motion set from entity @e[type=minecraft:arrow,limit=1,distance=..2] Motion\nkill @e[type=arrow,distance=..2,limit=1]\n\n# clear blaze powder from player\nclear @s[gamemode=!creative,gamemode=!spectator] minecraft:blaze_powder 1\n\n# make player who shot it the owner of the fireball\ndata modify entity @e[type=small_fireball,tag=gm4_oa_fireball,distance=..2,limit=1] Owner set from entity @s UUID\n\n#firecharge sound\nplaysound minecraft:item.firecharge.use player @a[distance=..15]\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/bounding.mcfunction",
    "content": "# @s = player with bounding pneuma who stopped sneaking\n# run from pneumas/sneak/stopped\n\neffect give @s[scores={gm4_oa_snk_num=10..19}] jump_boost 15 3 true\neffect give @s[scores={gm4_oa_snk_num=20..39}] jump_boost 15 5 true\neffect give @s[scores={gm4_oa_snk_num=40..59}] jump_boost 15 7 true\neffect give @s[scores={gm4_oa_snk_num=60..}] jump_boost 15 9 true\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/conjuring/prepare.mcfunction",
    "content": "# @s = player with conjuring pneuma who stopped sneaking\n# run from pneumas/sneak/stopped\n\nsummon armor_stand ~ ~ ~ {Invisible:1b,NoGravity:1b,Marker:1b,Small:1b,CustomName:\"Fang Thrower\",Tags:[\"gm4_oa_fang_thrower\",\"gm4_oa_new_fang\"],equipment:{feet:{id:\"minecraft:stick\",count:1}}}\ndata modify entity @e[type=minecraft:armor_stand,tag=gm4_oa_new_fang,distance=..0.001,limit=1] equipment.feet.components.\"minecraft:custom_data\".gm4_oa_conjuring set from entity @s UUID\ntp @e[type=armor_stand,tag=gm4_oa_new_fang,distance=..0.001,limit=1] ~ ~ ~ ~ 0\nscoreboard players set @s gm4_pneuma_data 0\nscoreboard players set @s[scores={gm4_oa_snk_num=10..19}] gm4_pneuma_data 6\nscoreboard players set @s[scores={gm4_oa_snk_num=20..39}] gm4_pneuma_data 9\nscoreboard players set @s[scores={gm4_oa_snk_num=40..59}] gm4_pneuma_data 12\nscoreboard players set @s[scores={gm4_oa_snk_num=60..}] gm4_pneuma_data 15\nscoreboard players operation @e[type=armor_stand,tag=gm4_oa_new_fang,distance=..0.001,limit=1] gm4_pneuma_data = @s gm4_pneuma_data\ntag @e[type=armor_stand,tag=gm4_oa_new_fang,distance=..0.001,limit=1] remove gm4_oa_new_fang\n\nschedule function gm4_orb_of_ankou:pneumas/conjuring/temp_tick 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/conjuring/summon_fangs.mcfunction",
    "content": "# @s = fang_thrower armor stand\n# run from pneumas/conjuring/throw\n\nsummon evoker_fangs ~ ~ ~ {Tags:[gm4_oa_fang]}\ndata modify entity @e[type=evoker_fangs,tag=gm4_oa_fang,limit=1,distance=..0.1] Owner set from entity @s equipment.feet.components.\"minecraft:custom_data\".gm4_oa_conjuring\ntag @e[type=evoker_fangs] remove gm4_oa_fang\n\ntag @a[distance=..1,gamemode=!creative,gamemode=!spectator] add gm4_oa_magic_ignore\ntag @a[distance=..1,gamemode=!creative,gamemode=!spectator] add gm4_oa_magic_damaged\nschedule function gm4_orb_of_ankou:pneumas/temp_tick/magic_damaged 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/conjuring/temp_tick.mcfunction",
    "content": "# @s = none\n# run from pneumas/conjuring/prepare\n\nexecute as @e[type=armor_stand,tag=gm4_oa_fang_thrower,scores={gm4_pneuma_data=1..}] at @s run function gm4_orb_of_ankou:pneumas/conjuring/throw\n\nexecute if entity @e[type=armor_stand,tag=gm4_oa_fang_thrower,scores={gm4_pneuma_data=1..},limit=1] run schedule function gm4_orb_of_ankou:pneumas/conjuring/temp_tick 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/conjuring/throw.mcfunction",
    "content": "# @s = fang_thrower armor stand\n# run from tick\n\ntp @s ^ ^ ^1\nexecute at @s run function gm4_orb_of_ankou:pneumas/conjuring/summon_fangs\nscoreboard players remove @s gm4_pneuma_data 1\nkill @s[scores={gm4_pneuma_data=..0}]\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/dashing/prepare.mcfunction",
    "content": "# @s = player with dashing pneuma who stopped sneaking\n# run from pneumas/sneak/stopped\n\nexecute rotated ~ 0 if block ^ ^0.9 ^.1 #gm4:no_collision if block ^ ^0.5 ^1.1 #gm4:no_collision run summon marker ^ ^0.5 ^1 {CustomName:\"Dashing Vector\",Tags:[\"gm4_oa_dash_vector\"]}\nscoreboard players operation $current gm4_oa_id = @s gm4_oa_id\n\n# store player pos\ndata modify storage gm4_oa_dashing:temp Pos set from entity @s Pos\nexecute store result score $target_x gm4_pneuma_data run data get storage gm4_oa_dashing:temp Pos[0] 1000\nexecute store result score $target_z gm4_pneuma_data run data get storage gm4_oa_dashing:temp Pos[2] 1000\n\n# store sneak count\nexecute if score @s gm4_oa_snk_num matches 10..19 run scoreboard players set $multiplier gm4_pneuma_data 8\nexecute if score @s gm4_oa_snk_num matches 20..39 run scoreboard players set $multiplier gm4_pneuma_data 14\nexecute if score @s gm4_oa_snk_num matches 40..59 run scoreboard players set $multiplier gm4_pneuma_data 18\nexecute if score @s gm4_oa_snk_num matches 60.. run scoreboard players set $multiplier gm4_pneuma_data 24\n\n# set motion\ntag @s add gm4_oa_dasher\nexecute as @e[type=marker,tag=gm4_oa_dash_vector,distance=..3,limit=1] run function gm4_orb_of_ankou:pneumas/dashing/set_motion\ntag @s remove gm4_oa_dasher\n\nplaysound minecraft:entity.player.small_fall player @a[distance=..8] ~ ~ ~ 0.7 0.6\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/dashing/set_motion.mcfunction",
    "content": "# @s = dash marker\n# located at player who started dashing\n# run from pneumas/dashing/prepare\n\n# get vector\ndata modify storage gm4_oa_dashing:temp Pos set from entity @s Pos\nexecute store result score $motion_x gm4_pneuma_data run data get storage gm4_oa_dashing:temp Pos[0] 1000\nexecute store result score $motion_z gm4_pneuma_data run data get storage gm4_oa_dashing:temp Pos[2] 1000\n\nscoreboard players operation $motion_x gm4_pneuma_data -= $target_x gm4_pneuma_data\nscoreboard players operation $motion_z gm4_pneuma_data -= $target_z gm4_pneuma_data\n\n# additional motion dependent on sneak count\nscoreboard players operation $motion_x gm4_pneuma_data *= $multiplier gm4_pneuma_data\nscoreboard players operation $motion_z gm4_pneuma_data *= $multiplier gm4_pneuma_data\n\n# set motion\nscoreboard players operation $x gm4_player_motion.api.launch = $motion_x gm4_pneuma_data\nscoreboard players set $y gm4_player_motion.api.launch 5200\nscoreboard players operation $z gm4_player_motion.api.launch = $motion_z gm4_pneuma_data\nexecute as @a[tag=gm4_oa_dasher,limit=1] run function #gm4_player_motion:launch_xyz\n\n## clean up\ndata remove storage gm4_oa_dashing:temp Pos\nkill @s\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/draining/apply_effect.mcfunction",
    "content": "# @s = players affected by draining pneuma\n# run from pneumas/draining/search\n\neffect give @s mining_fatigue 12 2\nexecute at @s run particle minecraft:elder_guardian ~ ~ ~ 0 0 0 1 1 force @s\nplaysound minecraft:entity.elder_guardian.curse player @s\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/draining/search.mcfunction",
    "content": "# @s = player with draining pneuma who stopped sneaking\n# run from pneumas/sneak/stopped\n\nexecute if score @s gm4_oa_snk_num matches 10..19 as @a[gamemode=!spectator,distance=0.001..16] run function gm4_orb_of_ankou:pneumas/draining/apply_effect\nexecute if score @s gm4_oa_snk_num matches 20..39 as @a[gamemode=!spectator,distance=0.001..32] run function gm4_orb_of_ankou:pneumas/draining/apply_effect\nexecute if score @s gm4_oa_snk_num matches 40..59 as @a[gamemode=!spectator,distance=0.001..48] run function gm4_orb_of_ankou:pneumas/draining/apply_effect\nexecute if score @s gm4_oa_snk_num matches 60.. as @a[gamemode=!spectator,distance=0.001..64] run function gm4_orb_of_ankou:pneumas/draining/apply_effect\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/expeditious/attempt.mcfunction",
    "content": "# @s = player with expeditious pneuma who stopped sneaking\n# run from pneumas/sneak/stopped\n\nexecute if score @s gm4_oa_snk_num matches ..9 run return fail\nscoreboard players set expeditious_attempt gm4_pneuma_data 0\nfunction gm4_orb_of_ankou:pneumas/expeditious/randomize\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/expeditious/get_pos.mcfunction",
    "content": "# @s = player with expeditious pneuma who stopped sneaking\n# run from pneumas/expeditious/randomize\n\n# check column for safe location\nscoreboard players set set_y gm4_pneuma_data 0\n$execute positioned ~$(x) ~5 ~$(z) run function gm4_orb_of_ankou:pneumas/expeditious/set_ypos\n\n# try another column (at most 12 times) if entire column was not safe\nscoreboard players add expeditious_attempt gm4_pneuma_data 1\nexecute unless score expeditious_attempt gm4_pneuma_data matches 12.. run function gm4_orb_of_ankou:pneumas/expeditious/randomize\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/expeditious/randomize.mcfunction",
    "content": "# @s = player with expeditious pneuma who stopped sneaking\n# run from pneumas/expeditious/attempt\n\n# get sneak-number-based distance\nexecute if score @s gm4_oa_snk_num matches 10..19 store result storage gm4_orb_of_ankou:temp pos.x int 1 run random value -4..4\nexecute if score @s gm4_oa_snk_num matches 10..19 store result storage gm4_orb_of_ankou:temp pos.z int 1 run random value -4..4\nexecute if score @s gm4_oa_snk_num matches 20..39 store result storage gm4_orb_of_ankou:temp pos.x int 1 run random value -8..8\nexecute if score @s gm4_oa_snk_num matches 20..39 store result storage gm4_orb_of_ankou:temp pos.z int 1 run random value -8..8\nexecute if score @s gm4_oa_snk_num matches 40..59 store result storage gm4_orb_of_ankou:temp pos.x int 1 run random value -12..12\nexecute if score @s gm4_oa_snk_num matches 40..59 store result storage gm4_orb_of_ankou:temp pos.z int 1 run random value -12..12\nexecute if score @s gm4_oa_snk_num matches 60.. store result storage gm4_orb_of_ankou:temp pos.x int 1 run random value -16..16\nexecute if score @s gm4_oa_snk_num matches 60.. store result storage gm4_orb_of_ankou:temp pos.z int 1 run random value -16..16\n\nfunction gm4_orb_of_ankou:pneumas/expeditious/get_pos with storage gm4_orb_of_ankou:temp pos\ndata remove storage gm4_orb_of_ankou:temp pos\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/expeditious/set_ypos.mcfunction",
    "content": "# @s = player with expeditious pneuma who stopped sneaking\n# located at a random distance from player\n# run from pneumas/expeditious/tp_aec\n\n# tp if block is safe\nexecute if block ~ ~ ~ #gm4:no_collision unless block ~ ~-1 ~ #gm4:no_collision run function gm4_orb_of_ankou:pneumas/expeditious/tp_player\n\n# check 1 block down\nscoreboard players add set_y gm4_pneuma_data 1\nexecute unless score set_y gm4_pneuma_data matches 11.. positioned ~ ~-1 ~ run function gm4_orb_of_ankou:pneumas/expeditious/set_ypos\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/expeditious/tp_player.mcfunction",
    "content": "# @s = player with expeditious pneuma who stopped sneaking\n# located at a safe block, random distance from player\n# run from pneumas/expeditious/set_ypos\n\n# prevent reroll\nscoreboard players set set_y gm4_pneuma_data 11\nscoreboard players set expeditious_attempt gm4_pneuma_data 12\n\n# move player\nexecute at @s run playsound minecraft:item.chorus_fruit.teleport player @a[distance=..15] ~ ~ ~ 1 1\nexecute at @s run particle minecraft:explosion ~ ~.3 ~ .3 .4 .3 2 0\ntp @s ~ ~ ~\nparticle minecraft:portal ~ ~.2 ~ 0 -1 0 3 20\n\n# compatibility with other modules\nfunction #gm4_orb_of_ankou:pneumas/expeditious/tp_player\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/feigning/apply.mcfunction",
    "content": "# @s = player with feigning pneuma who has been damaged and has less than 8 health\n# run from advancement_triggers/player_damaged\n\n# apply effects\neffect give @s invisibility 10 255 true\neffect give @s resistance 10 255 true\neffect give @s slowness 10 255 true\neffect give @s weakness 10 255 true\neffect give @s regeneration 10 0 false\nattribute @s minecraft:jump_strength modifier add gm4_orb_of_ankou:prevent_jump -1024 add_multiplied_total\nscoreboard players set @s gm4_oa_jump_stop 13\n\n# set data of hostile mobs\ntag @e[type=#gm4_orb_of_ankou:feigning_affected,distance=..50] add gm4_oa_feigning\nscoreboard players set @e[type=#gm4_orb_of_ankou:feigning_affected,tag=gm4_oa_feigning,distance=..50] gm4_oa_feign_t 0\nexecute as @e[type=#gm4_orb_of_ankou:feigning_affected,tag=gm4_oa_feigning,scores={gm4_oa_feign_t=0}] run attribute @s minecraft:follow_range modifier add minecraft:375cd73a-ea26-4ec8-b2a3-e999cfa3167e -1024 add_value\n\n# push nearby mobs away\ntag @s add gm4_feigning_player\nexecute as @e[type=#gm4_orb_of_ankou:feigning_affected,tag=gm4_oa_feigning,scores={gm4_oa_feign_t=0},distance=..2] run function gm4_orb_of_ankou:pneumas/feigning/move_away\ntag @a remove gm4_feigning_player\n\n# give mobs their follow range back\nschedule function gm4_orb_of_ankou:pneumas/temp_tick/feigning_revert 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/feigning/move_away.mcfunction",
    "content": "# @s = mob that is nearby a feigning player\n# run from pneumas/feigning/apply\n\n# get player pos\ndata modify storage gm4_orb_of_ankou:temp Pos set from entity @a[tag=gm4_feigning_player,limit=1] Pos\nexecute store result score $target_x gm4_pneuma_data run data get storage gm4_orb_of_ankou:temp Pos[0]\nexecute store result score $target_y gm4_pneuma_data run data get storage gm4_orb_of_ankou:temp Pos[1]\nexecute store result score $target_z gm4_pneuma_data run data get storage gm4_orb_of_ankou:temp Pos[2]\n\n# get vector\ndata modify storage gm4_orb_of_ankou:temp Pos set from entity @s Pos\nexecute store result score $motion_x gm4_pneuma_data run data get storage gm4_orb_of_ankou:temp Pos[0]\nexecute store result score $motion_y gm4_pneuma_data run data get storage gm4_orb_of_ankou:temp Pos[1]\nexecute store result score $motion_z gm4_pneuma_data run data get storage gm4_orb_of_ankou:temp Pos[2]\n\nscoreboard players operation $motion_x gm4_pneuma_data -= $target_x gm4_pneuma_data\nscoreboard players operation $motion_y gm4_pneuma_data -= $target_y gm4_pneuma_data\nscoreboard players operation $motion_z gm4_pneuma_data -= $target_z gm4_pneuma_data\n\n# set motion\nexecute store result entity @s Motion[0] double 1.0 run scoreboard players get $motion_x gm4_pneuma_data\nexecute store result entity @s Motion[1] double 1.0 run scoreboard players get $motion_y gm4_pneuma_data\nexecute store result entity @s Motion[2] double 1.0 run scoreboard players get $motion_z gm4_pneuma_data\n\n# clean up\nscoreboard players reset $motion_x gm4_pneuma_data\nscoreboard players reset $motion_y gm4_pneuma_data\nscoreboard players reset $motion_z gm4_pneuma_data\nscoreboard players reset $target_x gm4_pneuma_data\nscoreboard players reset $target_y gm4_pneuma_data\nscoreboard players reset $target_z gm4_pneuma_data\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/magic_damaged/check.mcfunction",
    "content": "# @s = player who took damage by magic\n# run from pneumas/temp_tick/magic_damaged\n\nexecute if entity @s[tag=gm4_has_pneuma,tag=!gm4_oa_magic_ignore,tag=gm4_oa_magic_1] run function gm4_orb_of_ankou:pneumas/magic_damaged/magic_1\nexecute if entity @s[tag=gm4_has_pneuma,tag=!gm4_oa_magic_ignore,tag=!gm4_oa_magic_1,tag=gm4_oa_magic_2] run function gm4_orb_of_ankou:pneumas/magic_damaged/magic_2\n\ntag @s remove gm4_oa_magic_damaged\ntag @s remove gm4_oa_magic_1\ntag @s remove gm4_oa_magic_2\ntag @s remove gm4_oa_magic_ignore\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/magic_damaged/magic_1.mcfunction",
    "content": "# @s = player with a pneuma who was damaged by magic of 6 or less health\n# run from pneumas/magic_damage/check\n\neffect give @s[tag=gm4_pneuma_neutralizing] instant_health 1 0 true\neffect give @s[tag=gm4_pneuma_lifeless] instant_health 1 1 true\neffect give @s[tag=gm4_pneuma_lifeless] regeneration 1 1 true\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/magic_damaged/magic_2.mcfunction",
    "content": "# @s = player with a pneuma who was damaged by magic of more than 6 health\n# run from pneumas/magic_damage/check\n\neffect give @s[tag=gm4_pneuma_neutralizing] instant_health 1 1 true\neffect give @s[tag=gm4_pneuma_lifeless] instant_health 1 2 true\neffect give @s[tag=gm4_pneuma_lifeless] regeneration 1 2 true\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/phasing/check_traversable.mcfunction",
    "content": "# @s = sneaking player with phasing pneuma\n#located 2 blocks in front of the player's feet\n# run from pneumas/sneak/check\n\nexecute at @s[y_rotation=-45..44,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~ ~ ~1 #gm4:no_collision if block ~ ~ ~2 #gm4:no_collision positioned ~ ~ ~2 run function gm4_orb_of_ankou:pneumas/phasing/tp\nexecute at @s[y_rotation=45..134,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~-1 ~ ~ #gm4:no_collision if block ~-2 ~ ~ #gm4:no_collision positioned ~-2 ~ ~ run function gm4_orb_of_ankou:pneumas/phasing/tp\nexecute at @s[y_rotation=135..224,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~ ~ ~-1 #gm4:no_collision if block ~ ~ ~-2 #gm4:no_collision positioned ~ ~ ~-2 run function gm4_orb_of_ankou:pneumas/phasing/tp\nexecute at @s[y_rotation=225..314,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~1 ~ ~ #gm4:no_collision if block ~2 ~ ~ #gm4:no_collision positioned ~2 ~ ~ run function gm4_orb_of_ankou:pneumas/phasing/tp\n\nexecute at @s[y_rotation=-45..44,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~ ~1 ~1 #gm4:no_collision if block ~ ~ ~2 #gm4:no_collision positioned ~ ~ ~2 run function gm4_orb_of_ankou:pneumas/phasing/tp\nexecute at @s[y_rotation=45..134,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~-1 ~1 ~ #gm4:no_collision if block ~-2 ~ ~ #gm4:no_collision positioned ~-2 ~ ~ run function gm4_orb_of_ankou:pneumas/phasing/tp\nexecute at @s[y_rotation=135..224,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~ ~1 ~-1 #gm4:no_collision if block ~ ~ ~-2 #gm4:no_collision positioned ~ ~ ~-2 run function gm4_orb_of_ankou:pneumas/phasing/tp\nexecute at @s[y_rotation=225..314,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~1 ~1 ~ #gm4:no_collision if block ~2 ~ ~ #gm4:no_collision positioned ~2 ~ ~ run function gm4_orb_of_ankou:pneumas/phasing/tp\n\ntag @s remove gm4_oa_phased\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/phasing/tp.mcfunction",
    "content": "# @s = sneaking player with phasing pneuma that has space to phase\n# run from pneumas/phasing/check_traversable\n\nscoreboard players reset @s gm4_oa_snk_num\n\nplaysound minecraft:entity.vex.ambient player @a[distance=..6] ~ ~ ~ 1 .7\nexecute at @s run particle minecraft:poof ~ ~ ~ 0 0 0 0 10\ntp @s ~ ~ ~\nparticle minecraft:poof ~ ~ ~ 0 0 0 0 10\ntag @s add gm4_oa_phased\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/retreating.mcfunction",
    "content": "# @s = player who took damage and has the retreating pneuma\n# run from advancement_triggers/player_damaged\n\neffect give @s speed 3 2 true\neffect give @s weakness 3 2 true\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/revert_invulnerable_item.mcfunction",
    "content": "# @s = invulnerable item after 32 ticks\n# run from main\n\ntag @s remove gm4_oa_invulnerable\ndata merge entity @s {Invulnerable:0b}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/rushing.mcfunction",
    "content": "# @s = player with rushing pneuma who stopped sneaking\n# run from pneumas/sneak/stopped\n\neffect give @s[scores={gm4_oa_snk_num=10..19}] speed 10 0 true\neffect give @s[scores={gm4_oa_snk_num=20..39}] speed 20 0 true\neffect give @s[scores={gm4_oa_snk_num=40..59}] speed 10 2 true\neffect give @s[scores={gm4_oa_snk_num=60..}] speed 20 2 true\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/shrieking/boom.mcfunction",
    "content": "# @s = entity hit by sonic boom\n# run from pneumas/shrieking/find_target\n\nscoreboard players set $target_found gm4_pneuma_data 1\n\nexecute if entity @s[type=player,gamemode=!creative,gamemode=!spectator] run function gm4_orb_of_ankou:pneumas/shrieking/boom_player\nexecute unless entity @s[type=player] run function gm4_orb_of_ankou:pneumas/shrieking/boom_mob\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/shrieking/boom_mob.mcfunction",
    "content": "# @s = mob hit by sonic boom\n# run from pneumas/shrieking/boom\n\n# apply new health\nexecute store result score $health gm4_pneuma_data run data get entity @s Health 100\nscoreboard players remove $health gm4_pneuma_data 1200\nexecute if score $health gm4_pneuma_data matches 1.. run execute store result entity @s Health float .01 run scoreboard players get $health gm4_pneuma_data\nexecute if score $health gm4_pneuma_data matches ..0 run kill @s\n\n# knockback mob\n## get player pos\ndata modify storage gm4_oa_shrieking:temp Pos set from entity @a[tag=gm4_oa_shrieker,limit=1] Pos\nexecute store result score $target_x gm4_pneuma_data run data get storage gm4_oa_shrieking:temp Pos[0]\nexecute store result score $target_z gm4_pneuma_data run data get storage gm4_oa_shrieking:temp Pos[2]\n\n## get vector\ndata modify storage gm4_oa_shrieking:temp Pos set from entity @s Pos\nexecute store result score $motion_x gm4_pneuma_data run data get storage gm4_oa_shrieking:temp Pos[0]\nexecute store result score $motion_z gm4_pneuma_data run data get storage gm4_oa_shrieking:temp Pos[2]\n\nscoreboard players operation $motion_x gm4_pneuma_data -= $target_x gm4_pneuma_data\nscoreboard players operation $motion_z gm4_pneuma_data -= $target_z gm4_pneuma_data\n\n## set motion\nexecute store result entity @s Motion[0] double 0.2 run scoreboard players get $motion_x gm4_pneuma_data\nexecute store result entity @s Motion[2] double 0.2 run scoreboard players get $motion_z gm4_pneuma_data\ndata modify entity @s Motion[1] set value 0.35d\n\n## clean up\ndata remove storage gm4_oa_shrieking:temp Pos\n\n# visuals\neffect give @s resistance 1 4 true\neffect give @s[type=#minecraft:undead] instant_health\neffect give @s[type=!#minecraft:undead] instant_damage\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/shrieking/boom_player.mcfunction",
    "content": "# @s = (survival/adventure) player hit by sonic boom\n# run from pneumas/shrieking/boom\n\ntag @s add gm4_oa_magic_ignore\ntag @s add gm4_oa_magic_damaged\nschedule function gm4_orb_of_ankou:pneumas/temp_tick/magic_damaged 1t\n\nexecute store result score $player_health gm4_pneuma_data run data get entity @s Health 100\nexecute if score $player_health gm4_pneuma_data matches ..1200 run function gm4_orb_of_ankou:pneumas/shrieking/player_death\n\neffect give @s instant_damage 1 1\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/shrieking/find_target.mcfunction",
    "content": "# @s = sonic_boomer marker\n# run from tick\n\nparticle minecraft:sonic_boom ~ ~ ~ 0 0 0 1 1\nscoreboard players set $target_found gm4_pneuma_data 0\nexecute positioned ~-0.5 ~-0.5 ~-0.5 as @e[type=!#gm4:non_living,tag=!gm4_oa_shrieker,dx=0.5,dy=0.5,dz=0.5] run function gm4_orb_of_ankou:pneumas/shrieking/boom\nscoreboard players add $ray gm4_pneuma_data 1\n\nexecute unless score $ray gm4_pneuma_data matches 15.. unless score $target_found gm4_pneuma_data matches 1.. positioned ^ ^ ^1 run function gm4_orb_of_ankou:pneumas/shrieking/find_target\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/shrieking/player_death.mcfunction",
    "content": "# @s = player who died from a sonic boom\n# run from pneumas/shrieking/boom_player\n\nexecute store result score $show_death_messages gm4_pneuma_data run gamerule show_death_messages\ngamerule show_death_messages false\ntellraw @a {\"translate\":\"death.attack.sonic_boom\",\"with\":[{\"selector\":\"@s\"}]}\nkill @s\nexecute if score $show_death_messages gm4_pneuma_data matches 1 run gamerule show_death_messages true\nscoreboard players reset $show_death_messages gm4_pneuma_data\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/shrieking/release.mcfunction",
    "content": "# @s = player with shrieking pneuma who stopped sneaking after 60 ticks\n# run from pneumas/sneak/stopped\n\ntag @s add gm4_oa_shrieker\nexecute anchored eyes run function gm4_orb_of_ankou:pneumas/shrieking/find_target\ntag @s remove gm4_oa_shrieker\n\nplaysound minecraft:entity.warden.sonic_boom player @a[distance=..16] ~ ~ ~ 1.3\nscoreboard players reset $target_found gm4_pneuma_data\nscoreboard players reset $ray gm4_pneuma_data\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/sneak/check.mcfunction",
    "content": "# @s = sneaking player with pneuma\n# run from tick\n\ntag @s add gm4_oa_sneaking\nscoreboard players add @s gm4_oa_snk_num 1\nexecute as @s[tag=gm4_sneak_pneuma] at @s run function gm4_orb_of_ankou:pneumas/sneak/sound\n\nexecute if score @s[tag=gm4_pneuma_shrieking] gm4_oa_snk_num matches 40 at @s run playsound minecraft:entity.warden.sonic_charge player @a[distance=..16] ~ ~ ~ 1.3\neffect give @s[tag=gm4_pneuma_vanishing] invisibility 90 0 true\nexecute at @s[tag=gm4_pneuma_blinding] run effect give @a[distance=..6,tag=!gm4_pneuma_blinding] blindness 7 1 false\neffect give @s[tag=gm4_pneuma_feathery] slow_falling 1 0 true\nexecute at @s[tag=gm4_pneuma_scaling] anchored eyes positioned ^ ^ ^1 align xyz unless block ~ ~ ~ #gm4:no_collision run effect give @s levitation 1 0 true\n\nexecute if entity @s[tag=gm4_pneuma_phasing] run function gm4_orb_of_ankou:pneumas/phasing/check_traversable\n\nexecute if entity @s[tag=gm4_pneuma_sniffing] at @s if block ~ ~-1 ~ #minecraft:sniffer_diggable_block run function gm4_orb_of_ankou:pneumas/sniffing\n\nexecute if entity @s[tag=gm4_pneuma_soaring,tag=!gm4_oa_soaring_toggled] run function gm4_orb_of_ankou:pneumas/soaring/toggle\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/sneak/sound.mcfunction",
    "content": "# @s = sneaking player with pneuma sneak ability\n# run from pneumas/sneak/check\n\nplaysound minecraft:block.note_block.cow_bell player @s[scores={gm4_oa_snk_num=10}] ~ ~ ~ 0.7 0.3\nplaysound minecraft:block.note_block.cow_bell player @a[scores={gm4_oa_snk_num=20}] ~ ~ ~ 0.9 0.6\nplaysound minecraft:block.note_block.cow_bell player @a[scores={gm4_oa_snk_num=40}] ~ ~ ~ 1.1 0.8\nplaysound minecraft:block.note_block.cow_bell player @a[scores={gm4_oa_snk_num=60}] ~ ~ ~ 1.3 1.2\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/sneak/stopped.mcfunction",
    "content": "# @s = sneaking player with pneuma that stopped sneaking\n# run from player\n\nexecute if score @s gm4_oa_snk_num matches 10.. as @s[tag=gm4_pneuma_bounding] run function gm4_orb_of_ankou:pneumas/bounding\nexecute if score @s gm4_oa_snk_num matches 10.. as @s[tag=gm4_pneuma_rushing] run function gm4_orb_of_ankou:pneumas/rushing\nexecute if score @s gm4_oa_snk_num matches 10.. as @s[tag=gm4_pneuma_conjuring] at @s run function gm4_orb_of_ankou:pneumas/conjuring/prepare\nexecute if score @s gm4_oa_snk_num matches 10.. as @s[tag=gm4_pneuma_draining] at @s run function gm4_orb_of_ankou:pneumas/draining/search\nexecute if score @s gm4_oa_snk_num matches 10.. as @s[tag=gm4_pneuma_expeditious] at @s run function gm4_orb_of_ankou:pneumas/expeditious/attempt\nexecute if score @s gm4_oa_snk_num matches 60.. as @s[tag=gm4_pneuma_shrieking] at @s run function gm4_orb_of_ankou:pneumas/shrieking/release\nexecute if score @s gm4_oa_snk_num matches 10.. as @s[tag=gm4_pneuma_dashing] at @s run function gm4_orb_of_ankou:pneumas/dashing/prepare\n\nscoreboard players set @s[scores={gm4_oa_sniff=..-1}] gm4_oa_sniff 0\n\ntag @s remove gm4_oa_sneaking\ntag @s remove gm4_oa_soaring_toggled\nscoreboard players reset @s gm4_oa_snk_num\n\ntag @s remove gm4_oa_phased\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/sniffing.mcfunction",
    "content": "# @s = player with sniffing pneuma who is sneaking\n# run from pneumas/sneak/check\n\nexecute if score @s gm4_oa_sniff matches 1.. run playsound minecraft:entity.sniffer.searching player @a[distance=..8] ~ ~ ~ 0.2 0.8\nexecute if score @s gm4_oa_sniff matches ..0 run playsound minecraft:entity.sniffer.searching player @a[distance=..8] ~ ~ ~ 0.4 1.4\nexecute if score @s gm4_oa_sniff matches ..-90 run playsound minecraft:entity.sniffer.scenting player @a[distance=..8] ~ ~ ~ 0.8 0.6\nexecute if score @s gm4_oa_sniff matches ..-100 if predicate gm4_orb_of_ankou:sniff_chance run scoreboard players set @s gm4_oa_sniff 601\n\nexecute if score @s gm4_oa_sniff matches 601 run loot spawn ~ ~ ~ loot minecraft:gameplay/sniffer_digging\nexecute if score @s gm4_oa_sniff matches 601 run playsound minecraft:block.grass.break player @a[distance=..8] ~ ~ ~ 0.8 1.4\nscoreboard players remove @s[scores={gm4_oa_sniff=601}] gm4_oa_sniff 1\nexecute unless score @s gm4_oa_sniff matches 1.. run scoreboard players remove @s gm4_oa_sniff 1\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/soaring/apply.mcfunction",
    "content": "# @s = player with soaring pneuma activated\n# run from main\n\nexecute if entity @s[tag=!gm4_oa_soaring_idle] run function gm4_orb_of_ankou:pneumas/soaring/idle\n\nexecute if entity @s[x_rotation=-90..-80] run function gm4_orb_of_ankou:pneumas/soaring/ascend\n\nexecute if entity @s[x_rotation=80..90] run function gm4_orb_of_ankou:pneumas/soaring/descend\n\neffect give @s slow_falling 3 0 true\ntag @s add gm4_oa_soaring_off_ground\nparticle minecraft:firework ~ ~ ~ .15 -.2 .15 0 5\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/soaring/ascend.mcfunction",
    "content": "# @s = player with soaring pneuma looking up\n# run from pneumas/soaring/apply\n\ntag @s remove gm4_oa_soaring_idle\neffect give @s levitation 2 3 true\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/soaring/descend.mcfunction",
    "content": "# @s = player with soaring pneuma looking down\n# run from pneumas/soaring/apply\n\ntag @s remove gm4_oa_soaring_idle\nattribute @s minecraft:gravity modifier remove gm4_orb_of_ankou:soaring_gravity\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/soaring/idle.mcfunction",
    "content": "# @s = player with soaring pneuma looking straight\n# run from pneumas/soaring/apply\n\neffect clear @s levitation\ntp @s\nattribute @s minecraft:gravity modifier add gm4_orb_of_ankou:soaring_gravity -0.08 add_value\ntag @s add gm4_oa_soaring_idle\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/soaring/remove_fall_protection.mcfunction",
    "content": "# @s = player that was previously soaring, and has landed \n# run from main\n\ntag @s remove gm4_oa_soaring_off_ground\nattribute @s minecraft:fall_damage_multiplier modifier remove gm4_orb_of_ankou:soaring_fall_protection\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/soaring/toggle.mcfunction",
    "content": "# @s = player with soaring pneuma that sneaked\n# run from pneumas/sneak/check\n\ntag @s[tag=gm4_oa_soaring_active] add gm4_oa_no_soaring\ntag @s remove gm4_oa_soaring_active\ntag @s[tag=!gm4_oa_no_soaring] add gm4_oa_soaring_active\ntag @s remove gm4_oa_no_soaring\nplaysound minecraft:entity.ender_dragon.flap player @s[tag=gm4_oa_soaring_active] ~ ~ ~ 0.4 1.6\nplaysound minecraft:entity.player.small_fall player @s[tag=!gm4_oa_soaring_active] ~ ~ ~ 0.4 1.6\nattribute @s[tag=gm4_oa_soaring_active] minecraft:fall_damage_multiplier modifier add gm4_orb_of_ankou:soaring_fall_protection -1024 add_value\nattribute @s[tag=!gm4_oa_soaring_active] minecraft:gravity modifier remove gm4_orb_of_ankou:soaring_gravity\n\ntag @s add gm4_oa_soaring_toggled\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/striding.mcfunction",
    "content": "# @s = player with striding pneuma who is above lava\n# run from pneumas/temp_tick/striding\n\nexecute align xyz run summon marker ~0.5 ~-1 ~0.5 {Tags:[\"gm4_oa_striding_block\"]}\nsetblock ~ ~-1 ~ magma_block\nschedule function gm4_orb_of_ankou:pneumas/temp_tick/striding_revert 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/synergetic/apply.mcfunction",
    "content": "# @s = players with synergetic pneuma\n# run from main\n\n# check if nearby wolves are owned by the player\nexecute as @e[type=wolf,tag=!smithed.entity,distance=..4] if data entity @s Owner run function gm4_orb_of_ankou:pneumas/synergetic/check_wolf\neffect give @e[type=wolf,distance=..4,scores={gm4_pneuma_data=0}] strength 5 0\nscoreboard players reset @e[type=wolf,distance=..4] gm4_pneuma_data\n\n# apply strength to other synergetic players\neffect give @a[gamemode=!spectator,distance=0.1..8,tag=gm4_pneuma_synergetic] strength 5 0\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/synergetic/check_wolf.mcfunction",
    "content": "# @s = wolves near a player with synergetic pneuma\n# located at the player with synergetic pneuma\n# run from pneumas/synergetic/apply\n\ndata modify storage gm4_orb_of_ankou:synergetic Owner set from entity @s Owner\nexecute store success score @s gm4_pneuma_data run data modify storage gm4_orb_of_ankou:synergetic Owner set from entity @p[distance=..0.1,tag=gm4_pneuma_synergetic] UUID\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/debilitate.mcfunction",
    "content": "# @s = none\n# run from update_tags/check_pneuma\n\nexecute unless entity @a[tag=gm4_pneuma_debilitate,limit=1] run return 0\nexecute unless entity @a[gamemode=!spectator,tag=gm4_pneuma_debilitate,scores={gm4_oa_bow_debilitate=1..},limit=1] run return run schedule function gm4_orb_of_ankou:pneumas/temp_tick/debilitate 1t\nexecute as @a[gamemode=!spectator,tag=gm4_pneuma_debilitate,scores={gm4_oa_bow_debilitate=1..}] at @s anchored eyes positioned ^ ^ ^2 run tag @e[type=arrow,distance=..2.5,limit=1] add gm4_oa_arrow\ndata merge entity @e[type=arrow,tag=gm4_oa_arrow,limit=1] {item: {components: {\"minecraft:potion_contents\": {custom_effects: [{duration: 600, show_icon: 1b, id: \"minecraft:weakness\"}]}}}}\ntag @e[type=arrow] remove gm4_oa_arrow\n\nscoreboard players reset @a gm4_oa_bow_debilitate\nschedule function gm4_orb_of_ankou:pneumas/temp_tick/debilitate 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/feigning_revert.mcfunction",
    "content": "# @s = none\n# run from pneumas/feigning\n\nscoreboard players add @e[type=#gm4_orb_of_ankou:feigning_affected,tag=gm4_oa_feigning] gm4_oa_feign_t 1\nexecute as @e[type=#gm4_orb_of_ankou:feigning_affected,tag=gm4_oa_feigning,scores={gm4_oa_feign_t=2..}] run attribute @s minecraft:follow_range modifier remove minecraft:375cd73a-ea26-4ec8-b2a3-e999cfa3167e\ntag @e[type=#gm4_orb_of_ankou:feigning_affected,scores={gm4_oa_feign_t=2..}] remove gm4_oa_feigning\nscoreboard players reset @e[type=#gm4_orb_of_ankou:feigning_affected,scores={gm4_oa_feign_t=2..}] gm4_oa_feign_t\nexecute if entity @e[type=#gm4_orb_of_ankou:feigning_affected,tag=gm4_oa_feigning,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/feigning_revert 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/freezing.mcfunction",
    "content": "# @s = none\n# run from update_tags/check_pneuma\n\nexecute unless entity @a[tag=gm4_pneuma_freezing,limit=1] run return 0\nexecute unless entity @a[gamemode=!spectator,tag=gm4_pneuma_freezing,scores={gm4_oa_bow_freezing=1..},limit=1] run return run schedule function gm4_orb_of_ankou:pneumas/temp_tick/freezing 1t\nexecute as @a[gamemode=!spectator,tag=gm4_pneuma_freezing,scores={gm4_oa_bow_freezing=1..}] at @s anchored eyes positioned ^ ^ ^2 run tag @e[type=arrow,distance=..2.5,limit=1] add gm4_oa_arrow\ndata merge entity @e[type=arrow,tag=gm4_oa_arrow,limit=1] {item: {components: {\"minecraft:potion_contents\": {custom_effects: [{duration: 600, show_icon: 1b, id: \"minecraft:slowness\"}]}}}}\ntag @e[type=arrow] remove gm4_oa_arrow\n\nscoreboard players reset @a gm4_oa_bow_freezing\nschedule function gm4_orb_of_ankou:pneumas/temp_tick/freezing 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/hawkeye.mcfunction",
    "content": "# @s = none\n# run from update_tags/check_pneuma\n\nexecute unless entity @a[tag=gm4_pneuma_hawkeye,limit=1] run return 0\nexecute unless entity @a[gamemode=!spectator,tag=gm4_pneuma_hawkeye,scores={gm4_oa_bow_hawkeye=1..},limit=1] run return run schedule function gm4_orb_of_ankou:pneumas/temp_tick/hawkeye 1t\nexecute as @a[gamemode=!spectator,tag=gm4_pneuma_hawkeye,scores={gm4_oa_bow_hawkeye=1..}] at @s anchored eyes positioned ^ ^ ^2 run tag @e[type=arrow,distance=..2.5,limit=1] add gm4_oa_arrow\nexecute as @e[type=arrow,tag=gm4_oa_arrow,limit=1] store result entity @s damage byte 2 run data get entity @s damage\ndata merge entity @e[type=arrow,tag=gm4_oa_arrow,limit=1] {PierceLevel:1b}\ntag @e[type=arrow] remove gm4_oa_arrow\n\nscoreboard players reset @a gm4_oa_bow_hawkeye\nschedule function gm4_orb_of_ankou:pneumas/temp_tick/hawkeye 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/magic_damaged.mcfunction",
    "content": "# @s = none\n# run from pneumas/advancement_triggers/magic_damaged_1 and pneumas/advancement_triggers/magic_damaged_2 and pneumas/advancement_triggers/magic_ignore\n\nexecute as @a[gamemode=!spectator,tag=gm4_oa_magic_damaged] run function gm4_orb_of_ankou:pneumas/magic_damaged/check\n\nexecute if entity @a[tag=gm4_oa_magic_damaged,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/magic_damaged 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/striding.mcfunction",
    "content": "# @s = none\n# run from update_tags/check_pneuma\n\nexecute as @a[gamemode=!spectator,tag=gm4_pneuma_striding] at @s if block ~ ~-1 ~ lava[level=0] run function gm4_orb_of_ankou:pneumas/striding\n\nexecute if entity @a[tag=gm4_pneuma_striding,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/striding 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/striding_revert.mcfunction",
    "content": "# @s = none\n# run from pneumas/striding\n\nscoreboard players add @e[type=marker,tag=gm4_oa_striding_block] gm4_oa_marker 1\nexecute at @e[type=marker,tag=gm4_oa_striding_block,scores={gm4_oa_marker=8..}] if block ~ ~ ~ magma_block run setblock ~ ~ ~ lava\nkill @e[type=marker,tag=gm4_oa_striding_block,scores={gm4_oa_marker=8..}]\n\nexecute if entity @e[type=marker,tag=gm4_oa_striding_block,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/striding_revert 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/tranquilizing.mcfunction",
    "content": "# @s = none\n# run from update_tags/check_pneuma\n\nexecute unless entity @a[tag=gm4_pneuma_tranquilizing,limit=1] run return 0\nexecute unless entity @a[gamemode=!spectator,tag=gm4_pneuma_tranquilizing,scores={gm4_oa_bow_tranquilizing=1..},limit=1] run return run schedule function gm4_orb_of_ankou:pneumas/temp_tick/tranquilizing 1t\nexecute as @a[gamemode=!spectator,tag=gm4_pneuma_tranquilizing,scores={gm4_oa_bow_tranquilizing=1..}] at @s anchored eyes positioned ^ ^ ^2 run tag @e[type=arrow,distance=..2.5,limit=1] add gm4_oa_arrow\ndata merge entity @e[type=arrow,tag=gm4_oa_arrow,limit=1] {item: {components: {\"minecraft:potion_contents\": {custom_effects: [{duration: 100, show_icon: 1b, id: \"minecraft:poison\"}]}}}}\ntag @e[type=arrow] remove gm4_oa_arrow\n\nscoreboard players reset @a gm4_oa_bow_tranquilizing\nschedule function gm4_orb_of_ankou:pneumas/temp_tick/tranquilizing 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/volatile.mcfunction",
    "content": "# @s = player with volatile pneuma who has been damaged\n# run from advancement_triggers/player_damaged\n\nexecute store result score @s gm4_pneuma_data run data get entity @s Health\ntag @e[type=item,distance=..5,nbt=!{Invulnerable:1b}] add gm4_oa_invulnerable\nexecute as @e[type=item,distance=..5,tag=gm4_oa_invulnerable] run data merge entity @s {Invulnerable:1b}\nexecute unless entity @a[gamemode=!spectator,distance=..6,predicate=gm4_metallurgy:defuse_active] if score @s[gamemode=!adventure] gm4_pneuma_data matches ..3 run summon creeper ~ ~ ~ {ExplosionRadius:1b,ignited:1b,Fuse:0s,CustomName:\"Volatile Player\"}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/create.mcfunction",
    "content": "# @s = player who used a flint and steel in the nether\n# located at fire block that player is looking at\n# run from soul_forge/used_flint_and_steel\n\nsummon armor_stand ~ ~ ~ {CustomName:\"gm4_soul_forge\",Tags:[\"gm4_no_edit\",\"gm4_soul_forge\"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,DisabledSlots:2039552,Pose:{Head:[200.0f,0.0f,0.0f]}}\n\nplaysound minecraft:entity.player.breath block @a[distance=..12] ~ ~0.5 ~ 1 0.5\nparticle minecraft:campfire_signal_smoke ~ ~0.7 ~ 0 2 0 0.05 10 force\nparticle minecraft:soul ~ ~0.7 ~ 0 2 0 0.05 10 force\nadvancement grant @s only gm4:create_soul_forge\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/destroy.mcfunction",
    "content": "# @s = soul forge without fire\n# run from main\n\n# store armor items into storage\ndata modify storage gm4_orb_of_ankou:temp equipment set from entity @s equipment\n\n# create a soul shard if valid ingredient count\nexecute if score @s gm4_oa_essence matches 13.. if score @s gm4_oa_powder >= required gm4_oa_powder if score @s gm4_oa_glowstone >= required gm4_oa_glowstone run function gm4_orb_of_ankou:soul_forge/outputs/create_shard\n\n# fuse soul shard into orb if valid ingredient count\nexecute if entity @s[tag=gm4_oa_has_orb,tag=gm4_oa_has_shard] if score @s gm4_oa_tears >= required gm4_oa_tears if score @s gm4_oa_roses >= required gm4_oa_roses run function gm4_orb_of_ankou:soul_forge/outputs/check_fuse\n\n# summon entities for extra ingredients\nexecute if score @s gm4_oa_powder matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_powder_sprite\nexecute if score @s gm4_oa_glowstone matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_glowstone_sprite\nexecute if score @s gm4_oa_tears matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_wandering_tear\nexecute if score @s gm4_oa_roses matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/withering_magic\nkill @e[type=marker,tag=gm4_oa_wither_rose_catcher,distance=..10]\n\n# summon endermites for extra essences stored inside the soul forge\nexecute if score @s gm4_oa_essence matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_extra_essence\n\n# if orb and shard weren't fused, summon entities for those extras\nexecute if entity @s[tag=gm4_oa_has_orb] run function gm4_orb_of_ankou:soul_forge/entities/summon_extra_orb\nexecute if entity @s[tag=gm4_oa_has_shard] run function gm4_orb_of_ankou:soul_forge/entities/summon_extra_shard\n\n#visuals\nplaysound minecraft:block.fire.extinguish block @a[distance=..12] ~ ~ ~ .5 .3\nparticle minecraft:cloud ~ ~0.5 ~ 0.3 0.3 0.3 0 20\n\ndata remove storage gm4_orb_of_ankou:temp equipment\nkill @s\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/fire_sprite.mcfunction",
    "content": "# @s = soul forge to spawn an fire sprite zombie\n# run from both soul_forge/entities/summon_powder_sprite and soul_forge/entities/summon_glowstone_sprite\n\n# spawn zombie\nsummon minecraft:zombie ~ ~0.2 ~ {Fire:1000000,Motion:[0.0,0.6,0.0],Silent:1b,CustomNameVisible:0b,DeathLootTable:\"gm4:empty\",Health:10.0f,IsBaby:1b,CanBreakDoors:0b,CanPickUpLoot:0b,Tags:[\"gm4_oa_unset\",\"gm4_oa_ignore\",\"gm4_oa_fire_sprite\"],CustomName:{\"translate\":\"entity.gm4.fire_sprite\",\"fallback\":\"Fire Sprite§\"},Team:\"gm4_hide_name\",equipment:{head:{id:\"minecraft:golden_helmet\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_orb_of_ankou:entity/fire_sprite\"]},\"minecraft:enchantment_glint_override\":true}}},drop_chances:{head:0F},active_effects:[{id:\"minecraft:invisibility\",amplifier:0b,duration:1000000,show_particles:0b}],attributes:[{id:\"minecraft:follow_range\",base:8},{id:\"minecraft:attack_damage\",base:1},{id:\"minecraft:attack_knockback\",base:0},{id:\"minecraft:spawn_reinforcements\",base:0}]}\n\n# randomize motion in x and z\nexecute as @e[type=zombie,tag=gm4_oa_unset,limit=1] run function gm4_orb_of_ankou:soul_forge/entities/set_data/randomize_motion\n\n# visuals\nplaysound minecraft:entity.blaze.hurt hostile @a[distance=..12] ~ ~ ~ 0.6 1.2\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/set_data/congealed_shard.mcfunction",
    "content": "# @s = new congealed shard bat\n# run from soul_forge/entities/summon_congealed_shard\n# and from soul_forge/entities/summon_extra_shard\n\n$loot replace entity @s weapon.mainhand loot gm4_orb_of_ankou:items/soul_shard/$(id)\ndata merge entity @s {CustomName:{\"translate\":\"entity.gm4.congealed_shard\",\"fallback\":\"Congealed Soul Shard§\"},CustomNameVisible:0b,Team:\"gm4_hide_name\",Health:2.0f,DeathLootTable:\"gm4:empty\",PersistenceRequired:1b,Tags:[\"gm4_oa_congealed_shard\",\"gm4_oa_ignore\",\"gm4_defused_bat\"],drop_chances:{mainhand:2.0f,offhand:1.0f},Motion:[0.0,0.6,0.0],active_effects:[{id:'minecraft:fire_resistance',amplifier:0b,duration:1000000,show_particles:0b}]}\nfunction gm4_orb_of_ankou:soul_forge/entities/set_data/randomize_motion\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/set_data/get_orb_pneuma.mcfunction",
    "content": "# @s = new living orb silverfish\n# run from soul_forge/entities/set_data/loop_orb_pneumas\n\n# get shard data from loot table\n$loot replace entity @s weapon.offhand loot gm4_orb_of_ankou:items/soul_shard/$(id)\ndata modify storage gm4_orb_of_ankou:temp shard set from entity @s equipment.offhand\nitem replace entity @s weapon.offhand with minecraft:air\n\n# set data of soul shard into orb of ankou\ndata modify storage gm4_orb_of_ankou:temp new_orb.components.\"minecraft:lore\" append from storage gm4_orb_of_ankou:temp shard.components.\"minecraft:lore\"[]\ndata modify storage gm4_orb_of_ankou:temp new_orb.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas append from storage gm4_orb_of_ankou:temp shard.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas[]\ndata modify storage gm4_orb_of_ankou:temp new_orb.components.\"minecraft:enchantments\" merge from storage gm4_orb_of_ankou:temp shard.components.\"minecraft:enchantments\"\ndata modify storage gm4_orb_of_ankou:temp new_orb.components.\"minecraft:attribute_modifiers\" append from storage gm4_orb_of_ankou:temp shard.components.\"minecraft:attribute_modifiers\"[]\ndata remove storage gm4_orb_of_ankou:temp new_orb.components.\"minecraft:attribute_modifiers\"[{id:\"gm4_orb_of_ankou:attack_damage\"}]\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/set_data/living_orb.mcfunction",
    "content": "# @s = new living orb silverfish\n# run from soul_forge/entities/summon_extra_orb\n# and from soul_forge/entities/summon_living_orb\n\n# set default data\ndata merge entity @s {CustomName:{\"translate\":\"entity.gm4.living_orb\",\"fallback\":\"Living Orb§\"},CustomNameVisible:0b,Team:\"gm4_hide_name\",Health:2.0f,DeathLootTable:\"gm4:empty\",PersistenceRequired:1b,Tags:[\"gm4_oa_unset\",\"gm4_oa_living_orb\",\"gm4_oa_ignore\"],drop_chances:{mainhand:2.0f,offhand:1.0f},Motion:[0.0,0.6,0.0],active_effects:[{id:\"minecraft:fire_resistance\",amplifier:0b,duration:1000000,show_particles:0b}]}\n\n# get pneuma count, return early if empty\nexecute store result score pneuma_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp current_orb.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas\nexecute if score pneuma_count gm4_oa_forge matches 0 run return run loot replace entity @s weapon.mainhand loot gm4_orb_of_ankou:items/orb_of_ankou\n\n# set up new orb\nloot replace entity @s weapon.offhand loot gm4_orb_of_ankou:items/orb_of_ankou\ndata modify storage gm4_orb_of_ankou:temp new_orb set from entity @s equipment.offhand\nitem replace entity @s weapon.offhand with minecraft:air\ndata merge storage gm4_orb_of_ankou:temp {new_orb:{components:{\"minecraft:lore\":[{\"translate\":\"text.gm4.orb_of_ankou.pneumas\",\"fallback\":\"Pneumas:\",\"italic\":false,\"color\":\"light_purple\"}],\"minecraft:firework_explosion\":{shape:\"small_ball\",colors:[I;]}}}}\n\n# get pneuma data from shard loot tables\nexecute store result score restore_pneuma_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp current_orb.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas\nfunction gm4_orb_of_ankou:soul_forge/entities/set_data/loop_orb_pneumas\ndata modify entity @s equipment.mainhand set from storage gm4_orb_of_ankou:temp new_orb\n\n# clean up\ndata remove storage gm4_orb_of_ankou:temp new_orb\ndata remove storage gm4_orb_of_ankou:temp current_orb\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/set_data/loop_orb_pneumas.mcfunction",
    "content": "# @s = new living orb silverfish\n# run from soul_forge/entities/set_data/living_orb\n\n# get next pneuma\nfunction gm4_orb_of_ankou:soul_forge/entities/set_data/get_orb_pneuma with storage gm4_orb_of_ankou:temp current_orb.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas[0]\ndata remove storage gm4_orb_of_ankou:temp current_orb.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas[0]\nscoreboard players remove restore_pneuma_count gm4_oa_forge 1\nexecute if score restore_pneuma_count gm4_oa_forge matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/set_data/loop_orb_pneumas\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/set_data/randomize_motion.mcfunction",
    "content": "# @s = newly spawned entity\n# run from soul_forge/entities/severed_soul, soul_forge_entities/fire_sprite, soul_forge/entities/congealed_shard, soul_forge/entites/living_orb, and soul_forge/outputs/fuse_pneuma\n\n# modify motion\nexecute store result entity @s Motion[0] double 0.01 run random value -25..25\nexecute store result entity @s Motion[2] double 0.01 run random value -25..25\n\n# mark as modified\ntag @s remove gm4_oa_unset\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/set_data/severed_soul.mcfunction",
    "content": "# @s = new severed soul endermite\n# run from soul_forge/entities/summon_extra_essence\n# and from soul_forge/entities/summon_failed_essence\n\n$loot replace entity @s weapon.mainhand loot gm4_orb_of_ankou:items/soul_essence/$(id)\ndata merge entity @s {CustomName:{\"translate\":\"entity.gm4.severed_soul\",\"fallback\":\"Severed Soul§\"},CustomNameVisible:0b,Team:\"gm4_hide_name\",Health:2.0f,DeathLootTable:\"gm4:empty\",PersistenceRequired:1b,Tags:[\"gm4_oa_unset\",\"gm4_oa_severed_soul\",\"gm4_oa_ignore\"],drop_chances:{mainhand:2.0f,offhand:1.0f},Motion:[0.0,0.6,0.0],active_effects:[{id:\"minecraft:fire_resistance\",amplifier:0b,duration:1000000,show_particles:0b}]}\nfunction gm4_orb_of_ankou:soul_forge/entities/set_data/randomize_motion\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_congealed_shard.mcfunction",
    "content": "# @s = soul shard item in a soul forge that already has an shard\n# run from both soul_forge/recipes/check_shard and soul_forge/recipes/add_shard\n\n# spawn bat\nexecute positioned ~ ~0.2 ~ summon bat run function gm4_orb_of_ankou:soul_forge/entities/set_data/congealed_shard with storage gm4_orb_of_ankou:temp Item.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas[-1]\n\n# visuals\nplaysound minecraft:entity.bat.hurt hostile @a[distance=..12] ~ ~ ~ 0.7 1\n\n# loop\nscoreboard players remove shard_count gm4_oa_forge 1\nexecute if score shard_count gm4_oa_forge matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_congealed_shard\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_extra_essence.mcfunction",
    "content": "# @s = soul forge without fire with extra essence in storage\n# run from soul_forge/destroy\n\n# summon endermite\nexecute positioned ~ ~0.2 ~ summon endermite run function gm4_orb_of_ankou:soul_forge/entities/set_data/severed_soul with storage gm4_orb_of_ankou:temp equipment.legs.components.\"minecraft:custom_data\".gm4_orb_of_ankou.stored_pneuma\n\n# visuals\nplaysound minecraft:entity.endermite.hurt hostile @a[distance=..12] ~ ~ ~ 0.7 1\n\n# loop\nscoreboard players remove @s gm4_oa_essence 1\nexecute if score @s gm4_oa_essence matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_extra_essence\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_extra_orb.mcfunction",
    "content": "# @s = soul forge without fire with extra orb in storage\n# run from soul_forge/destroy\n\n# spawn silverfish\ndata modify storage gm4_orb_of_ankou:temp current_orb set from storage gm4_orb_of_ankou:temp equipment.head\nexecute positioned ~ ~0.2 ~ summon silverfish run function gm4_orb_of_ankou:soul_forge/entities/set_data/living_orb\n\n# visuals\nplaysound minecraft:entity.silverfish.hurt hostile @a[distance=..12] ~ ~ ~ 0.7 1\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_extra_shard.mcfunction",
    "content": "# @s = soul forge without fire with extra shard in storage\n# run from soul_forge/destroy\n\n# spawn bat\nexecute positioned ~ ~0.2 ~ summon bat run function gm4_orb_of_ankou:soul_forge/entities/set_data/congealed_shard with storage gm4_orb_of_ankou:temp equipment.chest.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas[-1]\n\n# visuals\nplaysound minecraft:entity.bat.hurt hostile @a[distance=..12] ~ ~ ~ 0.7 1\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_failed_essence.mcfunction",
    "content": "# @s = soul forge without fire\n# run from soul_forge/destroy\n\n# summon endermite\nexecute positioned ~ ~0.2 ~ summon endermite run function gm4_orb_of_ankou:soul_forge/entities/set_data/severed_soul with storage gm4_orb_of_ankou:temp equipment.feet.components.\"minecraft:custom_data\".gm4_orb_of_ankou.stored_pneuma\n\n# loop\nscoreboard players remove failed_count gm4_oa_essence 1\nexecute if score failed_count gm4_oa_essence matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_failed_essence\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_glowstone_sprite.mcfunction",
    "content": "# @s = soul forge without fire with extra glowstone dust in storage\n# run from soul_forge/destroy\n\n# summon zombie\nfunction gm4_orb_of_ankou:soul_forge/entities/fire_sprite\n\n# loop\nscoreboard players remove @s gm4_oa_glowstone 1\nexecute if score @s gm4_oa_glowstone matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_glowstone_sprite\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_living_orb.mcfunction",
    "content": "# @s = orb of ankou item in a soul forge that already has an orb\n# run from both soul_forge/recipes/check_orb and soul_forge/recipes/add_orb\n\n# spawn silverfish\ndata modify storage gm4_orb_of_ankou:temp current_orb set from storage gm4_orb_of_ankou:temp Item\nexecute positioned ~ ~0.2 ~ summon silverfish run function gm4_orb_of_ankou:soul_forge/entities/set_data/living_orb\n\n# visuals\nplaysound minecraft:entity.silverfish.hurt hostile @a[distance=..12] ~ ~ ~ 0.7 1\n\n# loop\nscoreboard players remove orb_count gm4_oa_forge 1\nexecute if score orb_count gm4_oa_forge matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_living_orb\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_powder_sprite.mcfunction",
    "content": "# @s = soul forge without fire with extra blaze powder in storage\n# run from soul_forge/destroy\n\n# summon zombie\nfunction gm4_orb_of_ankou:soul_forge/entities/fire_sprite\n\n# loop\nscoreboard players remove @s gm4_oa_powder 1\nexecute if score @s gm4_oa_powder matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_powder_sprite\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_wandering_tear.mcfunction",
    "content": "# @s = soul forge without fire with extra ghast tears in storage\n# run from soul_forge/destroy\n\n# spawn vex\nsummon minecraft:vex ~ ~0.2 ~ {Silent:1b,Glowing:1b,CustomNameVisible:0b,life_ticks:1200,DeathLootTable:\"gm4:empty\",Tags:[\"gm4_oa_ignore\",\"gm4_oa_wandering_tear\"],CustomName:{\"translate\":\"entity.gm4.wandering_tear\",\"fallback\":\"Wandering Tear§\"},Team:\"gm4_hide_name\",active_effects:[{id:\"minecraft:invisibility\",amplifier:0b,duration:1000000,show_particles:0b}],attributes:[{id:\"minecraft:follow_range\",base:48},{id:\"minecraft:attack_damage\",base:3}]}\n\n# visuals\nplaysound minecraft:entity.vex.hurt hostile @a[distance=..12] ~ ~ ~ 0.6 1.2\n\n# loop\nscoreboard players remove @s gm4_oa_tears 1\nexecute if score @s gm4_oa_tears matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_wandering_tear\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/withering_magic.mcfunction",
    "content": "# @s = soul forge to spawn a withering magic cloud\n# run from both soul_forge/destroy\n\n# spawn area_effect_cloud\nsummon minecraft:area_effect_cloud ~ ~0.8 ~ {ReapplicationDelay:200,Radius:4f,RadiusPerTick:-0.001f,Duration:1800,potion_contents:{custom_effects:[{id:\"minecraft:wither\",amplifier:1b,duration:300}]},CustomName:{\"translate\":\"entity.gm4.withering_magic\",\"fallback\":\"Withering Magic\"}}\n\n# visuals\nplaysound minecraft:entity.wither.hurt hostile @a[distance=..12] ~ ~ ~ 0.6 1.2\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/outputs/check_fuse.mcfunction",
    "content": "# @s = soul forge without fire, that has an orb and shard\n# run from soul_forge/destroy\n\n# put orb into storage to compare pneumas\ndata modify storage gm4_orb_of_ankou:temp Orb set from storage gm4_orb_of_ankou:temp equipment.head\n\n# count the number of pneumas stored on the orb already\nexecute store result score pneuma_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp Orb.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas\n\n# check if the pneuma is present already in the array\nscoreboard players set valid_shard gm4_oa_forge 1\nexecute if score pneuma_count gm4_oa_forge matches 1.. store success score valid_shard gm4_oa_forge run data modify storage gm4_orb_of_ankou:temp Orb.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas[0] set from storage gm4_orb_of_ankou:temp equipment.chest.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas[]\n\nexecute if score valid_shard gm4_oa_forge matches 1 if score pneuma_count gm4_oa_forge matches 2.. store success score valid_shard gm4_oa_forge run data modify storage gm4_orb_of_ankou:temp Orb.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas[1] set from storage gm4_orb_of_ankou:temp equipment.chest.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas[]\n\nexecute if score valid_shard gm4_oa_forge matches 1 if score pneuma_count gm4_oa_forge matches 3.. store success score valid_shard gm4_oa_forge run data modify storage gm4_orb_of_ankou:temp Orb.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas[2] set from storage gm4_orb_of_ankou:temp equipment.chest.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas[]\n\n# if all the checks pass, fuse the shard with the orb\nexecute if score valid_shard gm4_oa_forge matches 1 run function gm4_orb_of_ankou:soul_forge/outputs/fuse_pneuma\n\ndata remove storage gm4_orb_of_ankou:temp Orb\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/outputs/create_shard.mcfunction",
    "content": "# @s = soul forge without fire, that has enough soul essences\n# run from soul_forge/destroy\n\n# spawn bat\nexecute summon bat run function gm4_orb_of_ankou:soul_forge/outputs/set_shard_loot with storage gm4_orb_of_ankou:temp equipment.legs.components.\"minecraft:custom_data\".gm4_orb_of_ankou.stored_pneuma\n\n# loop if extra sets of 13\nscoreboard players remove @s gm4_oa_essence 13\nscoreboard players operation @s gm4_oa_powder -= required gm4_oa_powder\nscoreboard players operation @s gm4_oa_glowstone -= required gm4_oa_glowstone\nexecute if score @s gm4_oa_essence matches 13.. if score @s gm4_oa_powder >= required gm4_oa_powder if score @s gm4_oa_glowstone >= required gm4_oa_glowstone run function gm4_orb_of_ankou:soul_forge/outputs/create_shard\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/outputs/fuse_pneuma.mcfunction",
    "content": "# @s = soul forge without fire, that has an orb and shard, unless the orb already has the pneuma\n# run from soul_forge/outputs/check_fuse\n\n# summon item\nsummon item ~ ~0.2 ~ {PickupDelay:40s,Glowing:1b,Item:{id:\"minecraft:firework_star\",count:1},Tags:[\"gm4_oa_unset\"],Motion:[0.0,0.4,0.0]}\n\n# restore data of stored orb\ndata modify storage gm4_orb_of_ankou:temp Item set from storage gm4_orb_of_ankou:temp equipment.head\n\n# set data of soul shard into orb of ankou\ndata modify storage gm4_orb_of_ankou:temp Item.components.\"minecraft:lore\"[0] set value {\"translate\":\"text.gm4.orb_of_ankou.pneumas\",\"fallback\":\"Pneumas:\",\"italic\":false,\"color\":\"light_purple\"}\n\ndata modify storage gm4_orb_of_ankou:temp Item.components.\"minecraft:lore\" append from storage gm4_orb_of_ankou:temp equipment.chest.components.\"minecraft:lore\"[]\ndata modify storage gm4_orb_of_ankou:temp Item.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas append from storage gm4_orb_of_ankou:temp equipment.chest.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas[]\ndata modify storage gm4_orb_of_ankou:temp Item.components.\"minecraft:enchantments\" merge from storage gm4_orb_of_ankou:temp equipment.chest.components.\"minecraft:enchantments\"\ndata modify storage gm4_orb_of_ankou:temp Item.components.\"minecraft:attribute_modifiers\" append from storage gm4_orb_of_ankou:temp equipment.chest.components.\"minecraft:attribute_modifiers\"[]\ndata remove storage gm4_orb_of_ankou:temp Item.components.\"minecraft:attribute_modifiers\"[{id:\"gm4_orb_of_ankou:attack_damage\"}]\n\n#custom color\nexecute if score pneuma_count gm4_oa_forge matches 0 run data merge storage gm4_orb_of_ankou:temp {Item:{components:{\"minecraft:firework_explosion\":{shape:\"small_ball\",colors:[I;]}}}}\ndata modify storage gm4_orb_of_ankou:temp Item.components.\"minecraft:firework_explosion\".colors append from storage gm4_orb_of_ankou:temp equipment.chest.components.\"minecraft:custom_data\".gm4_orb_of_ankou.stored_color[]\n\ndata modify entity @e[type=item,tag=gm4_oa_unset,limit=1] Item set from storage gm4_orb_of_ankou:temp Item\ndata remove storage gm4_orb_of_ankou:temp Item\n\n# play sound and particle\nplaysound minecraft:entity.evoker.prepare_summon block @a[distance=..12] ~ ~ ~ 0.6 1.2\nparticle minecraft:explosion ~ ~0.8 ~ 0 0 0 0 0\n\n# clear required ghast tears and wither roses\nscoreboard players operation @s gm4_oa_tears -= required gm4_oa_tears\nscoreboard players operation @s gm4_oa_roses -= required gm4_oa_roses\ntag @s remove gm4_oa_has_orb\ntag @s remove gm4_oa_has_shard\ntag @e[type=item] remove gm4_oa_unset\n\n# grant advancement\nexecute if score pneuma_count gm4_oa_forge matches 3.. run advancement grant @a[distance=..6] only gm4:max_orb_of_ankou\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/outputs/set_shard_loot.mcfunction",
    "content": "# @s = new soul shard bat\n# run from soul_forge/outputs/create_shard\n\n$loot replace entity @s armor.head loot gm4_orb_of_ankou:items/soul_shard/$(id)\ndata merge entity @s {CustomName:{\"translate\":\"entity.gm4.possessed_shard\",\"fallback\":\"Possessed Soul Shard§\"},CustomNameVisible:0b,Team:\"gm4_hide_name\",DeathLootTable:\"gm4:empty\",PersistenceRequired:1b,Health:2.0f,Tags:[\"gm4_oa_possessed_soul_shard\",\"gm4_oa_ignore\",\"gm4_defused_bat\"],active_effects:[{id:'minecraft:fire_resistance',amplifier:0b,duration:1000000,show_particles:0b}],drop_chances:{head:2F}}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/process.mcfunction",
    "content": "# @s = soul forge with multiblock\n# run from main\n\n# ambient particles\nparticle minecraft:soul_fire_flame ~ ~0.5 ~ 0.2 1 0.2 0.01 7\nparticle minecraft:soul ~ ~0.5 ~ 0.3 1 0.3 0.01 3\n\n# colored smoke for ingredients\nexecute if score @s gm4_oa_powder matches 1.. run particle minecraft:dust{color:[0.459,0.200,0.090],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force\nexecute if score @s gm4_oa_glowstone matches 1.. run particle minecraft:dust{color:[0.459,0.431,0.055],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force\nexecute if score @s gm4_oa_tears matches 1.. run particle minecraft:dust{color:[0.384,0.451,0.459],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force\nexecute if score @s gm4_oa_roses matches 1.. run particle minecraft:dust{color:[0.204,0.165,0.259],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force\nexecute if score @s gm4_oa_essence matches 1.. run particle minecraft:dust{color:[0.180,0.169,0.310],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force\nexecute if entity @s[tag=gm4_oa_has_orb] run particle minecraft:dust{color:[0.725,0.729,0.780],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force\nexecute if entity @s[tag=gm4_oa_has_shard] run particle minecraft:dust{color:[0.271,0.149,0.388],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force\n\n# wither rose consumption\nexecute if entity @s[tag=gm4_oa_has_orb,tag=gm4_oa_has_shard] run function gm4_orb_of_ankou:soul_forge/wither_roses/steps\n\n# wither rose particle line\nexecute as @e[type=marker,tag=gm4_oa_wither_particle] at @s run function gm4_orb_of_ankou:soul_forge/wither_roses/particle\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/ray.mcfunction",
    "content": "# @s = area effect cloud ray used to detect the fire block\n# run from soul_forge/used_flint_and_steel\n\nscoreboard players set $found gm4_count 0\nexecute store success score $found gm4_count align xyz positioned ~ ~ ~ if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_ray_loc\"]}\n\n# move forward\nscoreboard players add $ray gm4_count 1\ntp @s ^ ^ ^0.01\nexecute if score $ray gm4_count matches 0..500 at @s unless score $found gm4_count matches 1 run function gm4_orb_of_ankou:soul_forge/ray\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/ray_backup.mcfunction",
    "content": "# @s = area effect cloud ray used to detect the fire block\n# run from soul_forge/used_flint_and_steel\n\n# check blocks around the marker ray\nscoreboard players set $found gm4_count 0\nexecute store success score $found gm4_count align xyz positioned ~ ~ ~ if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_ray_loc\"]}\nexecute if score $found gm4_count matches 0 store success score $found gm4_count align xyz positioned ~ ~1 ~ if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_ray_loc\"]}\nexecute if score $found gm4_count matches 0 store success score $found gm4_count align xyz positioned ~ ~-1 ~ if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_ray_loc\"]}\nexecute if score $found gm4_count matches 0 store success score $found gm4_count align xyz positioned ~1 ~ ~ if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_ray_loc\"]}\nexecute if score $found gm4_count matches 0 store success score $found gm4_count align xyz positioned ~-1 ~ ~ if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_ray_loc\"]}\nexecute if score $found gm4_count matches 0 store success score $found gm4_count align xyz positioned ~ ~ ~1 if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_ray_loc\"]}\nexecute if score $found gm4_count matches 0 store success score $found gm4_count align xyz positioned ~ ~ ~-1 if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_ray_loc\"]}\n\n# move forward\nscoreboard players remove $ray gm4_count 1\ntp @s ^ ^ ^0.01\nexecute if score $ray gm4_count matches 0..500 at @s unless score $found gm4_count matches 1 run function gm4_orb_of_ankou:soul_forge/ray_backup\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_blaze_powder.mcfunction",
    "content": "# @s = blaze powder item in a soul forge\n# located at the position of the soul forge armor stand (align xyz)\n# run from soul_forge/recipes/check_item\n\ntag @s add gm4_oa_checked_item\nplaysound minecraft:entity.blaze.ambient block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 0.6\nparticle minecraft:cloud ~0.5 ~1.5 ~0.5 0.2 1 0.2 0.01 5\n\n# add item stack count to scoreboard storage\nexecute store result score add gm4_oa_powder run data get storage gm4_orb_of_ankou:temp Item.count\nscoreboard players operation @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] gm4_oa_powder += add gm4_oa_powder\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_first_soul_essence.mcfunction",
    "content": "# @s = soul essence item in a soul forge\n# located at the position of the soul forge armor stand (align xyz)\n# run from soul_forge/recipes/check_soul_essence\n\ndata modify storage gm4_orb_of_ankou:temp equipment.feet set from storage gm4_orb_of_ankou:temp Item\ndata modify storage gm4_orb_of_ankou:temp equipment.legs set from storage gm4_orb_of_ankou:temp Item\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_ghast_tear.mcfunction",
    "content": "# @s = ghast tear item in a soul forge\n# located at the position of the soul forge armor stand (align xyz)\n# run from soul_forge/recipes/check_item\n\ntag @s add gm4_oa_checked_item\nplaysound minecraft:entity.blaze.ambient block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 0.6\nparticle minecraft:cloud ~0.5 ~1.5 ~0.5 0.2 1 0.2 0.01 5\n\n# add item stack count to scoreboard storage\nexecute store result score add gm4_oa_tears run data get storage gm4_orb_of_ankou:temp Item.count\nscoreboard players operation @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] gm4_oa_tears += add gm4_oa_tears\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_glowstone_dust.mcfunction",
    "content": "# @s = glowstone dust item in a soul forge\n# located at the position of the soul forge armor stand (align xyz)\n# run from soul_forge/recipes/check_item\n\ntag @s add gm4_oa_checked_item\nplaysound minecraft:entity.blaze.ambient block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 0.6\nparticle minecraft:cloud ~0.5 ~1.5 ~0.5 0.2 1 0.2 0.01 5\n\n# add item stack count to scoreboard storage\nexecute store result score add gm4_oa_glowstone run data get storage gm4_orb_of_ankou:temp Item.count\nscoreboard players operation @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] gm4_oa_glowstone += add gm4_oa_glowstone\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_orb.mcfunction",
    "content": "# @s = orb of ankou item in a soul forge\n# located at the position of the soul forge armor stand (align xyz)\n# run from soul_forge/recipes/check_orb\n\ntag @s add gm4_oa_checked_item\nplaysound minecraft:entity.blaze.ambient block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 0.6\nparticle minecraft:cloud ~0.5 ~1.5 ~0.5 0.2 1 0.2 0.01 5\n\n# add single orb to forge storage\ndata modify storage gm4_orb_of_ankou:temp equipment.head set from storage gm4_orb_of_ankou:temp Item\ndata modify storage gm4_orb_of_ankou:temp equipment.head.count set value 1b\ntag @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] add gm4_oa_has_orb\n\n# convert extra orbs to living orbs\nexecute store result score orb_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp Item.count\nscoreboard players remove orb_count gm4_oa_forge 1\nexecute if score orb_count gm4_oa_forge matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_living_orb\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_shard.mcfunction",
    "content": "# @s = shard of ankou item in a soul forge\n# located at the position of the soul forge armor stand (align xyz)\n# run from both soul_forge/recipes/check_shard\n\ntag @s add gm4_oa_checked_item\nplaysound minecraft:entity.blaze.ambient block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 0.6\nparticle minecraft:cloud ~0.5 ~1.5 ~0.5 0.2 1 0.2 0.01 5\n\n# add single shard to forge storage\ndata modify storage gm4_orb_of_ankou:temp equipment.chest set from storage gm4_orb_of_ankou:temp Item\ndata modify storage gm4_orb_of_ankou:temp equipment.chest.count set value 1b\ntag @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] add gm4_oa_has_shard\n\n# convert extra shards to congealed shards\nexecute store result score shard_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp Item.count\nscoreboard players remove shard_count gm4_oa_forge 1\nexecute if score shard_count gm4_oa_forge matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_congealed_shard\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_soul_essence.mcfunction",
    "content": "# @s = soul essence item in a soul forge\n# located at the position of the soul forge armor stand (align xyz)\n# run from both soul_forge/recipes/add_first_soul_essence \n# and soul_forge/recipes/check_soul_essence\n\ntag @s add gm4_oa_checked_item\nplaysound minecraft:entity.blaze.ambient block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 0.6\nparticle minecraft:cloud ~0.5 ~1.5 ~0.5 0.2 1 0.2 0.01 5\n\n# add item stack count to scoreboard storage\nexecute store result score add gm4_oa_essence run data get storage gm4_orb_of_ankou:temp Item.count\nscoreboard players operation @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] gm4_oa_essence += add gm4_oa_essence\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/check_item.mcfunction",
    "content": "# @s = item in a soul forge\n# located at the position of the soul forge armor stand (align xyz)\n# run from tick\n\n# tag the armor soul forge\ntag @e[type=armor_stand,tag=gm4_soul_forge,limit=1,sort=nearest,distance=..1] add gm4_oa_selected_forge\ndata modify storage gm4_orb_of_ankou:temp equipment set from entity @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] equipment\n\n# if valid item, add it to the scoreboard storage\ndata modify storage gm4_orb_of_ankou:temp Item set from entity @s Item\nexecute if data storage gm4_orb_of_ankou:temp Item{id:\"minecraft:blaze_powder\"} run function gm4_orb_of_ankou:soul_forge/recipes/add_blaze_powder\nexecute unless entity @s[tag=gm4_oa_checked_item] if data storage gm4_orb_of_ankou:temp Item{id:\"minecraft:glowstone_dust\"} run function gm4_orb_of_ankou:soul_forge/recipes/add_glowstone_dust\nexecute unless entity @s[tag=gm4_oa_checked_item] if data storage gm4_orb_of_ankou:temp Item{id:\"minecraft:ghast_tear\"} run function gm4_orb_of_ankou:soul_forge/recipes/add_ghast_tear\n\nexecute unless entity @s[tag=gm4_oa_checked_item] if data storage gm4_orb_of_ankou:temp Item{id:\"minecraft:black_dye\",components:{\"minecraft:custom_data\":{gm4_orb_of_ankou:{item:\"soul_essence\"}}}} run function gm4_orb_of_ankou:soul_forge/recipes/check_soul_essence\nexecute unless entity @s[tag=gm4_oa_checked_item] if data storage gm4_orb_of_ankou:temp Item{id:\"minecraft:flint\",components:{\"minecraft:custom_data\":{gm4_orb_of_ankou:{item:\"soul_shard\"}}}} run function gm4_orb_of_ankou:soul_forge/recipes/check_shard\nexecute unless entity @s[tag=gm4_oa_checked_item] if data storage gm4_orb_of_ankou:temp Item{id:\"minecraft:firework_star\",components:{\"minecraft:custom_data\":{gm4_orb_of_ankou:{item:\"orb\"}}}} run function gm4_orb_of_ankou:soul_forge/recipes/check_orb\n\n# apply data modify to armor stand\ndata modify entity @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] equipment set from storage gm4_orb_of_ankou:temp equipment\ntag @e[type=armor_stand,tag=gm4_soul_forge] remove gm4_oa_selected_forge\ndata remove storage gm4_orb_of_ankou:temp equipment\n\n# play burn sound and kill item\nexecute unless entity @s[tag=gm4_oa_checked_item] run playsound minecraft:entity.generic.burn block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 1.5\nkill @s\ndata remove storage gm4_orb_of_ankou:temp Item\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/check_orb.mcfunction",
    "content": "# @s =  orb of ankou item in a soul forge\n# located at the position of the soul forge armor stand (align xyz)\n# run from soul_forge/recipes/check_item\n\n# check if an orb is already stored in the forge\nexecute as @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] store success score has_orb gm4_oa_forge if entity @s[tag=gm4_oa_has_orb]\n\n# check pneuma count of orb\nexecute store result score pneuma_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp Item.components.\"minecraft:custom_data\".gm4_orb_of_ankou.pneumas\nexecute if score pneuma_count gm4_oa_forge matches 4.. run scoreboard players set has_orb gm4_oa_forge 1\n\n# store orb if it doesn't have one stored already, summon living orb if an orb is already stored in the forge or the orb already has 4 or more pneumas\nexecute if score has_orb gm4_oa_forge matches 0 run function gm4_orb_of_ankou:soul_forge/recipes/add_orb\nexecute if score has_orb gm4_oa_forge matches 1 store result score orb_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp Item.count\nexecute if score has_orb gm4_oa_forge matches 1 run function gm4_orb_of_ankou:soul_forge/entities/summon_living_orb\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/check_shard.mcfunction",
    "content": "# @s =  soul shard item in a soul forge\n# located at the position of the soul forge armor stand (align xyz)\n# run from soul_forge/recipes/check_item\n\n# store shard if it doesn't have one stored already, summon congealed shard if an shard is already stored in the forge\nexecute as @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] store success score has_shard gm4_oa_forge if entity @s[tag=gm4_oa_has_shard]\n\nexecute if score has_shard gm4_oa_forge matches 0 run function gm4_orb_of_ankou:soul_forge/recipes/add_shard\nexecute if score has_shard gm4_oa_forge matches 1 store result score shard_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp Item.count\nexecute if score has_shard gm4_oa_forge matches 1 run function gm4_orb_of_ankou:soul_forge/entities/summon_congealed_shard\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/check_soul_essence.mcfunction",
    "content": "# @s =  soul essence item in a soul forge\n# located at the position of the soul forge armor stand (align xyz)\n# run from soul_forge/recipes/check_item\n\n# if forge has no stored essences set the essence\nexecute unless score @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] gm4_oa_essence matches 1.. run function gm4_orb_of_ankou:soul_forge/recipes/add_first_soul_essence\n\n# check if the essence is the same as the one stored in the forge\nexecute store success score invalid_essence gm4_oa_essence run data modify storage gm4_orb_of_ankou:temp equipment.feet.components.\"minecraft:custom_data\".gm4_orb_of_ankou.stored_pneuma set from storage gm4_orb_of_ankou:temp Item.components.\"minecraft:custom_data\".gm4_orb_of_ankou.stored_pneuma\ndata modify storage gm4_orb_of_ankou:temp equipment.feet.components set from storage gm4_orb_of_ankou:temp Item.components\ndata modify storage gm4_orb_of_ankou:temp equipment.legs.count set value 1b\n\n# if same essence, add it to the forge storage\nexecute if score invalid_essence gm4_oa_essence matches 0 run function gm4_orb_of_ankou:soul_forge/recipes/add_soul_essence\n\n# else summon endermites, number of endermites is equal to the count of items thrown\nexecute if score invalid_essence gm4_oa_essence matches 1 store result score failed_count gm4_oa_essence run data get storage gm4_orb_of_ankou:temp Item.count\nexecute if score invalid_essence gm4_oa_essence matches 1 run function gm4_orb_of_ankou:soul_forge/entities/summon_failed_essence\n\n# prepare for another essence to be checked\ndata modify storage gm4_orb_of_ankou:temp equipment.feet set from storage gm4_orb_of_ankou:temp equipment.legs\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/initiate_recipe_amounts.mcfunction",
    "content": "# no @s\n# at world spawn\n# called by init\n\n# initialise fixed values\nscoreboard players set modulo_1 gm4_oa_forge 64\nscoreboard players set modulo_2 gm4_oa_forge 14\nscoreboard players set divider gm4_oa_forge 17\n\n# copy seed to scoreboard\nexecute store result score seed gm4_oa_forge run seed\n\n# set blaze powder and flowstone dust to a digit of the seed\nscoreboard players operation required_blaze_powder gm4_oa_forge = seed gm4_oa_forge\nscoreboard players operation required_blaze_powder gm4_oa_forge /= divider gm4_oa_forge\nscoreboard players operation required_glowstone_dust gm4_oa_forge = required_blaze_powder gm4_oa_forge\nscoreboard players operation required_glowstone_dust gm4_oa_forge /= divider gm4_oa_forge\n\nscoreboard players operation required_ghast_tears gm4_oa_forge = required_glowstone_dust gm4_oa_forge\nscoreboard players operation required_ghast_tears gm4_oa_forge /= divider gm4_oa_forge\nscoreboard players operation required_wither_roses gm4_oa_forge = required_ghast_tears gm4_oa_forge\nscoreboard players operation required_wither_roses gm4_oa_forge /= divider gm4_oa_forge\n\n# scale down blaze powder and glowstone dust to 1-64 (mod64):\nscoreboard players operation required_blaze_powder gm4_oa_forge %= modulo_1 gm4_oa_forge\nscoreboard players operation required_glowstone_dust gm4_oa_forge %= modulo_1 gm4_oa_forge\nscoreboard players add required_blaze_powder gm4_oa_forge 1\nscoreboard players add required_glowstone_dust gm4_oa_forge 1\n\n# scale down ghost tears and wither roses to 3-16 (mod14 + 2)\nscoreboard players operation required_ghast_tears gm4_oa_forge %= modulo_2 gm4_oa_forge\nscoreboard players operation required_wither_roses gm4_oa_forge %= modulo_2 gm4_oa_forge\nscoreboard players add required_ghast_tears gm4_oa_forge 3\nscoreboard players add required_wither_roses gm4_oa_forge 3\n\n# store required values in individual scoreboards\nscoreboard players operation required gm4_oa_powder = required_blaze_powder gm4_oa_forge\nscoreboard players operation required gm4_oa_glowstone = required_glowstone_dust gm4_oa_forge\nscoreboard players operation required gm4_oa_tears = required_ghast_tears gm4_oa_forge\nscoreboard players operation required gm4_oa_roses = required_wither_roses gm4_oa_forge\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/used_flint_and_steel.mcfunction",
    "content": "# @s = player who used a flint and steel in the nether\n# run from tick\n\nsummon marker ~ ~ ~ {Tags:[\"gm4_soul_forge_ray\"]}\nexecute anchored eyes positioned ^ ^ ^ anchored feet run tp @e[type=marker,tag=gm4_soul_forge_ray,limit=1] ^ ^ ^ ~ ~\nscoreboard players set $ray gm4_count 0\nexecute as @e[type=marker,tag=gm4_soul_forge_ray,limit=1] at @s run function gm4_orb_of_ankou:soul_forge/ray\nexecute unless score $found gm4_count matches 1 anchored eyes positioned ^ ^ ^ anchored feet run tp @e[type=marker,tag=gm4_soul_forge_ray,limit=1] ^ ^ ^ ~ ~\nexecute unless score $found gm4_count matches 1 as @e[type=marker,tag=gm4_soul_forge_ray,limit=1] at @s run function gm4_orb_of_ankou:soul_forge/ray_backup\nexecute at @e[type=marker,tag=gm4_ray_loc,limit=1] if predicate gm4_orb_of_ankou:has_multiblock align xyz positioned ~0.5 ~ ~0.5 unless entity @e[type=armor_stand,tag=gm4_soul_forge,limit=1,distance=..1] run function gm4_orb_of_ankou:soul_forge/create\nkill @e[type=marker,tag=gm4_soul_forge_ray]\nkill @e[type=marker,tag=gm4_ray_loc]\nscoreboard players reset $ray gm4_count\nscoreboard players reset $found gm4_count\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/wither_roses/consume.mcfunction",
    "content": "# @s = soul forge with an orb and shard\n# located at the closest wither rose catcher that is Age:96\n# run from soul_forge/wither_roses/steps\n\nsetblock ~ ~ ~ lily_of_the_valley\nscoreboard players add @s gm4_oa_roses 1\n\n# playsound\nplaysound minecraft:entity.generic.eat block @a[distance=..12] ~ ~ ~ 0.7 0.75\nplaysound minecraft:block.grass.break block @a[distance=..12] ~ ~ ~ 0.6 1\nplaysound minecraft:entity.player.breath block @a[distance=..12] ~ ~ ~ 1 1.3\n\n# particle\nparticle minecraft:cloud ~ ~0.6 ~ 0 0.8 0 0 5\n\n# summon pretty entity line\nsummon marker ~ ~-1 ~ {Tags:[\"gm4_oa_wither_particle\",\"gm4_unrotated_particle_cloud\"],CustomName:\"Soul Forge Wither Particle\"}\nteleport @e[type=marker,tag=gm4_unrotated_particle_cloud,limit=1] ~ ~-1 ~ facing entity @s eyes\nteleport @e[type=marker,tag=gm4_unrotated_particle_cloud,limit=1] ~ ~1 ~\ntag @e[type=marker,tag=gm4_unrotated_particle_cloud] remove gm4_unrotated_particle_cloud\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/wither_roses/move_indicator.mcfunction",
    "content": "# @s = wither_rose_catcher marker at @s\n# run from soul_forge/wither_roses/summon_indicator\n\n\n# move the to the randomized position\n$tp ~$(x) ~1 ~$(z)\n\n# kill if not in air or on unsupported block\nexecute at @s if block ~ ~ ~ #gm4:no_collision unless block ~ ~-1 ~ #gm4:no_collision unless block ~ ~-1 ~ obsidian run tag @s add gm4_oa_rose_indicator_valid\nexecute if entity @s[tag=!gm4_oa_rose_indicator_valid] run return run kill @s\n\n# set data\ndata merge entity @s {CustomName:\"gm4_oa_wither_rose_catcher\",Tags:[\"gm4_oa_wither_rose_catcher\"]}\n\n# play sound to indicate\nexecute at @s run playsound minecraft:entity.wither.ambient block @a ~ ~ ~ 0.6 1.4\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/wither_roses/particle.mcfunction",
    "content": "# @s = wither decorative particle\n# run from soul_forge/process\n\nteleport ^ ^ ^0.4\nparticle minecraft:dust{color:[0.071,0.000,0.161],scale:1} ~ ~ ~ 0 0 0 .005 3\nparticle minecraft:dust{color:[0.475,0.639,0.443],scale:1} ~ ~ ~ 0 0 0 .005 1\nexecute positioned ~ ~-1 ~ if entity @e[type=armor_stand,tag=gm4_soul_forge,distance=..3] run kill @s\nscoreboard players add @s gm4_oa_marker 16\nkill @s[scores={gm4_oa_marker=200..}]\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/wither_roses/steps.mcfunction",
    "content": "# @s = soul forge that has an orb and a shard\n# run from soul_forge/process\n\n# slow clock\nscoreboard players add @s gm4_oa_forge 1\nscoreboard players reset @s[scores={gm4_oa_forge=10..}] gm4_oa_forge\n\n# every 160 ticks (8 seconds): spawn an indicator, wait 80 ticks (4 seconds) then consume the wither rose at that indicator if possible\nexecute if score @s gm4_oa_forge matches 2 run function gm4_orb_of_ankou:soul_forge/wither_roses/summon_indicator\nscoreboard players add @e[type=marker,tag=gm4_oa_wither_rose_catcher,distance=..10,limit=1,sort=nearest] gm4_oa_marker 16\nexecute if score @s gm4_oa_forge matches 8 at @e[type=marker,tag=gm4_oa_wither_rose_catcher,scores={gm4_oa_marker=112..},distance=..10,limit=1,sort=nearest] if block ~ ~ ~ wither_rose run function gm4_orb_of_ankou:soul_forge/wither_roses/consume\nkill @e[type=marker,tag=gm4_oa_wither_rose_catcher,scores={gm4_oa_marker=112..},distance=..10]\n\n# indicator particles\nexecute at @e[type=marker,tag=gm4_oa_wither_rose_catcher] run particle witch ~ ~ ~ 0 .2 0 0 7 normal\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/wither_roses/summon_indicator.mcfunction",
    "content": "# @s = soul forge with an orb and shard\n# run from soul_forge/wither_roses/steps\n\n#calculate random position\nexecute store result storage gm4_orb_of_ankou:temp pos.x int 1 run random value -6..6\nexecute store result storage gm4_orb_of_ankou:temp pos.z int 1 run random value -6..6\n\n#move the entity\nexecute summon marker run function gm4_orb_of_ankou:soul_forge/wither_roses/move_indicator with storage gm4_orb_of_ankou:temp pos\ndata remove storage gm4_orb_of_ankou:temp pos\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/tick.mcfunction",
    "content": "## SOUL FORGE ##\n\nexecute if score nether_player gm4_oa_forge matches 1.. in the_nether run function gm4_orb_of_ankou:nether_tick\n\n## PNEUMA STUFF ##\n\n# sneaking stuff\nexecute as @a[gamemode=!spectator,tag=gm4_has_pneuma,scores={gm4_oa_sneak=0},tag=gm4_oa_sneaking] run function gm4_orb_of_ankou:pneumas/sneak/stopped\nexecute as @a[gamemode=!spectator,tag=gm4_has_pneuma,scores={gm4_oa_sneak=1..}] run function gm4_orb_of_ankou:pneumas/sneak/check\nscoreboard players set @a gm4_oa_sneak 0\n\n# reset use tool scoreboards\nscoreboard players reset @a gm4_oa_fns\n\nschedule function gm4_orb_of_ankou:tick 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/update_tags/check_offhand.mcfunction",
    "content": "# @s = any player who has changed their inventory\n# run from advancement \"check_player/check_inventory\"\n\nadvancement revoke @s only gm4_orb_of_ankou:check_player/check_inventory\n\nexecute if entity @s[tag=gm4_has_pneuma] run function gm4_orb_of_ankou:update_tags/remove_tags\n\nexecute if entity @s[predicate=gm4_orb_of_ankou:has_pneuma] run function gm4_orb_of_ankou:update_tags/check_pneuma\n\nexecute as @s[tag=!gm4_pneuma_soaring,tag=gm4_oa_soaring_active] at @s run function gm4_orb_of_ankou:pneumas/soaring/toggle\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/update_tags/check_pneuma.mcfunction",
    "content": "# @s = any player who has a soul shard or orb of ankou in their offhand\n# run from update_tags/check_offhand\n\ntag @s add gm4_has_pneuma\n\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/aggressive] add gm4_pneuma_aggressive\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/bargaining] add gm4_pneuma_bargaining\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/blasting] add gm4_pneuma_blasting\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/blinding] add gm4_pneuma_blinding\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/bounding] add gm4_pneuma_bounding\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/bubbly] add gm4_pneuma_bubbly\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/conjuring] add gm4_pneuma_conjuring\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/dashing] add gm4_pneuma_dashing\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/draining] add gm4_pneuma_draining\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/expeditious] add gm4_pneuma_expeditious\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/feathery] add gm4_pneuma_feathery\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/feigning] add gm4_pneuma_feigning\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/freezing] add gm4_pneuma_freezing\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/gazing] add gm4_pneuma_gazing\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/gliding] add gm4_pneuma_gliding\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/hawkeye] add gm4_pneuma_hawkeye\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/incombustible] add gm4_pneuma_incombustible\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/lifeless] add gm4_pneuma_lifeless\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/neutralizing] add gm4_pneuma_neutralizing\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/phasing] add gm4_pneuma_phasing\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/retreating] add gm4_pneuma_retreating\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/rushing] add gm4_pneuma_rushing\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/scaling] add gm4_pneuma_scaling\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/shrieking] add gm4_pneuma_shrieking\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/sniffing] add gm4_pneuma_sniffing\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/soaring] add gm4_pneuma_soaring\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/striding] add gm4_pneuma_striding\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/synergetic] add gm4_pneuma_synergetic\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/tranquilizing] add gm4_pneuma_tranquilizing\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/debilitate] add gm4_pneuma_debilitate\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/vanishing] add gm4_pneuma_vanishing\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/volatile] add gm4_pneuma_volatile\ntag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/withering] add gm4_pneuma_withering\n\ntag @s[tag=gm4_pneuma_bounding] add gm4_sneak_pneuma\ntag @s[tag=gm4_pneuma_rushing] add gm4_sneak_pneuma\ntag @s[tag=gm4_pneuma_conjuring] add gm4_sneak_pneuma\ntag @s[tag=gm4_pneuma_expeditious] add gm4_sneak_pneuma\ntag @s[tag=gm4_pneuma_draining] add gm4_sneak_pneuma\ntag @s[tag=gm4_pneuma_shrieking] add gm4_sneak_pneuma\ntag @s[tag=gm4_pneuma_dashing] add gm4_sneak_pneuma\n\nscoreboard players reset @s gm4_oa_bow_hawkeye\nscoreboard players reset @s gm4_oa_bow_freezing\nscoreboard players reset @s gm4_oa_bow_tranquilizing\nscoreboard players reset @s gm4_oa_bow_debilitate\n\n# run tick functions\nexecute if entity @a[gamemode=!spectator,tag=gm4_pneuma_hawkeye,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/hawkeye 1t\nexecute if entity @a[gamemode=!spectator,tag=gm4_pneuma_freezing,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/freezing 1t\nexecute if entity @a[gamemode=!spectator,tag=gm4_pneuma_tranquilizing,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/tranquilizing 1t\nexecute if entity @a[gamemode=!spectator,tag=gm4_pneuma_debilitate,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/debilitate 1t\nexecute if entity @a[gamemode=!spectator,tag=gm4_pneuma_striding,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/striding 1t\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/update_tags/player_id.mcfunction",
    "content": "# gives a player a unique ID\n# @s = player that joined for the first time\n# located at @s\n# run from advancement \"check_player/get_id\"\n\nexecute store result score @s gm4_oa_id run scoreboard players add #max gm4_oa_id 1\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/update_tags/remove_tags.mcfunction",
    "content": "# @s = any player who has changed their inventory and has a pneuma tag\n# run from update_tags/check_offhand\n\ntag @s remove gm4_pneuma_aggressive\ntag @s remove gm4_pneuma_agile\ntag @s remove gm4_pneuma_bargaining\ntag @s remove gm4_pneuma_blasting\ntag @s remove gm4_pneuma_blinding\ntag @s remove gm4_pneuma_bounding\ntag @s remove gm4_pneuma_bubbly\ntag @s remove gm4_pneuma_conjuring\ntag @s remove gm4_pneuma_dashing\ntag @s remove gm4_pneuma_draining\ntag @s remove gm4_pneuma_expeditious\ntag @s remove gm4_pneuma_feathery\ntag @s remove gm4_pneuma_feigning\ntag @s remove gm4_pneuma_freezing\ntag @s remove gm4_pneuma_gazing\ntag @s remove gm4_pneuma_gliding\ntag @s remove gm4_pneuma_hawkeye\ntag @s remove gm4_pneuma_incombustible\ntag @s remove gm4_pneuma_lifeless\ntag @s remove gm4_pneuma_neutralizing\ntag @s remove gm4_pneuma_phasing\ntag @s remove gm4_pneuma_retreating\ntag @s remove gm4_pneuma_rushing\ntag @s remove gm4_pneuma_scaling\ntag @s remove gm4_pneuma_shrieking\ntag @s remove gm4_pneuma_sniffing\ntag @s remove gm4_pneuma_soaring\ntag @s remove gm4_pneuma_striding\ntag @s remove gm4_pneuma_synergetic\ntag @s remove gm4_pneuma_tranquilizing\ntag @s remove gm4_pneuma_debilitate\ntag @s remove gm4_pneuma_vanishing\ntag @s remove gm4_pneuma_volatile\ntag @s remove gm4_pneuma_withering\n\ntag @s remove gm4_sneak_pneuma\ntag @s remove gm4_has_pneuma\n\ntag @s remove gm4_oa_soaring_idle\ntag @s remove gm4_oa_soaring_toggled\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/guidebook/orb_of_ankou.json",
    "content": "{\n  \"id\": \"orb_of_ankou\",\n  \"name\": \"Orb of Ankou\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:flint_and_steel\"\n  },\n  \"criteria\": {\n    \"obtain_soul_essence\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:black_dye\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{item:\\\"soul_essence\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"create_soul_forge\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"player\",\n                \"advancements\": {\n                  \"gm4:create_soul_forge\": true\n                }\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_soul_shard\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:flint\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{item:\\\"soul_shard\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_nether_star\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:nether_star\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_empty_orb_of_ankou\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:firework_star\"\n            ],\n            \"components\": {\n              \"minecraft:firework_explosion\": {\n                \"shape\": \"small_ball\",\n                \"colors\": [\n                  13092807\n                ]\n              }\n            },\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{item:\\\"orb\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_filled_orb_of_ankou\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:firework_star\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{item:\\\"orb\\\",pneumas:[{}]}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.description\",\n            \"fallback\": \"Mob powers can be obtained by collecting rare soul essences using the Corripio Shamir.\\n\\nThirteen essences are required to gain the powers of a mob, called a pneuma.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"forge_creation\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_soul_essence\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.soul_forge\",\n            \"fallback\": \"To gain powers of the Soul Essences, a Condensing Ritual must be performed in a Soul Forge.\\n\\nA Soul Forge can be made in the Nether by forming a 3x3 ring of obsidian then igniting soul fire inside the ring.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"shard_creation\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"create_soul_forge\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.condensing_ritual\",\n            \"fallback\": \"To create a Soul Shard, 13 of the same Soul Essence must be dropped into the forge along with some blaze powder and glowstone dust.\\n\\nExtinguishing the flame will create a Possesed Soul Shard, which should be killed.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.condensing_ingredients\",\n            \"fallback\": \"The required amount of glowstone dust and blaze powder is between 1 and 64, but differs in each world.\\n\\nExtra dust or powder will create the Shard, but spawn Fiery Sprites. Too little will cause the recipe to fail.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"forge_creation\"\n      ]\n    },\n    {\n      \"name\": \"shard_usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_soul_shard\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.shard_usage\",\n            \"fallback\": \"Holding the Shard in the offhand will grant the user with that pneuma's power, while lowering their attack damage 20% as a side-effect.\\n\\nAn Orb of Ankou can be crafted to negate the attack debuff and hold more pneumas.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"shard_creation\"\n      ]\n    },\n    {\n      \"name\": \"orb_crafting\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_nether_star\"\n        ],\n        [\n          \"obtain_soul_shard\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.orb_crafting\",\n            \"fallback\": \"The Orb of Ankou can be crafted with the following recipe:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_orb_of_ankou:orb_of_ankou\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"shard_usage\"\n      ]\n    },\n    {\n      \"name\": \"orb_fusing\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_empty_orb_of_ankou\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.fusing_ritual\",\n            \"fallback\": \"To fuse a Shard into an Orb, light a soul forge and drop the two items in, along with some ghast tears.\\n\\nWither particles will appear to indicate where wither roses should be placed to be absorbed.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.fusing_ingredients\",\n            \"fallback\": \"The required amount of ghast tears and wither roses is between 3 and 16, but differs in each world.\\n\\nExtra tears or roses will fuse the Shard, but wandering tears and a withering cloud will appear.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"orb_crafting\"\n      ]\n    },\n    {\n      \"name\": \"orb_usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_filled_orb_of_ankou\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.orb_usage\",\n            \"fallback\": \"Similar to a Soul Shard, the Orb of Ankou functions when it is equipped in the offhand.\\n\\nAn orb of ankou can hold 4 pneumas, which will work concurrently when in the same orb.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"orb_fusing\"\n      ]\n    },\n    {\n      \"name\": \"pneuma_descriptions\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_soul_shard\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.defensive_pneumas\",\n            \"fallback\": \"The following pneumas activate upon taking damage:\"\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_aggressive\",\n                \"fallback\": \"Aggressive\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.aggressive\",\n                  \"fallback\": \"Grants Strength when damaged\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_feigning\",\n                \"fallback\": \"Feigning\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.feigning\",\n                  \"fallback\": \"Grants Slowness, Resistance, Invisibility, and Regeneration when damaged below half health\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_incombustible\",\n                \"fallback\": \"Incombustible\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.incombustible\",\n                  \"fallback\": \"Grants Fire Resistance when damaged by fire\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_lifeless\",\n                \"fallback\": \"Lifeless\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.lifeless\",\n                  \"fallback\": \"Negates Poison effect and heals when damaged by Instant Damage effect\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_neutralizing\",\n                \"fallback\": \"Neutralizing\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.neutralizing\",\n                  \"fallback\": \"Negates Poison effect; Instant Damage effect deals less damage\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_picking\",\n                \"fallback\": \"Pricking\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.pricking\",\n                  \"fallback\": \"75% chance to deal 1-4 damage to the attacker (Thorns V)\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_retreating\",\n                \"fallback\": \"Retreating\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.retreating\",\n                  \"fallback\": \"Grants Speed and Weakness when damaged\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_volatile\",\n                \"fallback\": \"Volatile\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.volatile\",\n                  \"fallback\": \"Creates explosion if damaged below 1.5 hearts\"\n                }\n              ]\n            }\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.offensive_pneumas\",\n            \"fallback\": \"The following pneumas activate upon dealing damage:\"\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_blasting\",\n                \"fallback\": \"Blasting\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.blasting\",\n                  \"fallback\": \"Shoots fireballs when shooting a crossbow with blaze powder in the inventory\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_debilitate\",\n                \"fallback\": \"Debilitate\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.debilitate\",\n                  \"fallback\": \"Applies Weakness to arrows shot from bows\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_depriving\",\n                \"fallback\": \"Depriving\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.depriving\",\n                  \"fallback\": \"Applies Hunger to attacked targets; Applies Weakness to attacked mobs\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_freezing\",\n                \"fallback\": \"Freezing\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.freezing\",\n                  \"fallback\": \"Applies Slowness to arrows shot from bows\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_hawkeye\",\n                \"fallback\": \"Hawkeye\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.hawkeye\",\n                  \"fallback\": \"Doubles the damage of arrows shot from bows; Arrows shot from bows will have Piercing I\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_tranquilizing\",\n                \"fallback\": \"Tranquilizing\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.tranquilizing\",\n                  \"fallback\": \"Applies Poison to arrows shot from bows\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_venomous\",\n                \"fallback\": \"Venomous\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.venomous\",\n                  \"fallback\": \"Applies Poison to attacked target\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_withering\",\n                \"fallback\": \"Withering\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.withering\",\n                  \"fallback\": \"Applies Wither to attacked target\"\n                }\n              ]\n            }\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.passive_pneumas\",\n            \"fallback\": \"The following pneumas are passive, activating automatically:\"\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_agile\",\n                \"fallback\": \"Agile\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.agile\",\n                  \"fallback\": \"Prevents fall damage\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_anchoring\",\n                \"fallback\": \"Anchoring\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.anchoring\",\n                  \"fallback\": \"Grants 90% Knockback Resistance\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_bargaining\",\n                \"fallback\": \"Bargaining\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.bargaining\",\n                  \"fallback\": \"Grants Regeneration upon trading with villagers\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_bashing\",\n                \"fallback\": \"Bashing\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.bashing\",\n                  \"fallback\": \"Grants +70% Attack Damage, but -40% Attack Speed\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_bubbly\",\n                \"fallback\": \"Bubbly\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.bubbly\",\n                  \"fallback\": \"Grants 2 minutes of Water Breathing when submerged\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_enduring\",\n                \"fallback\": \"Enduring\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.enduring\",\n                  \"fallback\": \"Grants +8 Max Health, but -20% Speed\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_gliding\",\n                \"fallback\": \"Gliding\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.gliding\",\n                  \"fallback\": \"Grants Dolphin's Grace when swimming\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_striding\",\n                \"fallback\": \"Striding\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.striding\",\n                  \"fallback\": \"Temporarily converts lava sources into magma blocks upon stepping on them\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_synergetic\",\n                \"fallback\": \"Synergetic\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.synergetic\",\n                  \"fallback\": \"Grants Strength to tamed wolves and other Synergetic users\"\n                }\n              ]\n            }\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.sneak_charge_pneumas\",\n            \"fallback\": \"The following pneumas charge while sneaking then activate upon unsneaking:\"\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_bounding\",\n                \"fallback\": \"Bounding\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.bounding\",\n                  \"fallback\": \"Increasingly stronger Jump Boost\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_conjuring\",\n                \"fallback\": \"Conjuring\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.conjuring\",\n                  \"fallback\": \"Increasingly farther Evoker fang attack\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_dashing\",\n                \"fallback\": \"Dashing\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.dashing\",\n                  \"fallback\": \"Increasingly farther horizontal dash\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_draining\",\n                \"fallback\": \"Draining\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.draining\",\n                  \"fallback\": \"Increasingly farther Mining Fatigue AOE\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_expeditious\",\n                \"fallback\": \"Expeditious\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.expeditious\",\n                  \"fallback\": \"Increasingly farther random teleport\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_rushing\",\n                \"fallback\": \"Rushing\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.rushing\",\n                  \"fallback\": \"Increasingly faster and longer Speed burst\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_shrieking\",\n                \"fallback\": \"Shrieking\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.shrieking\",\n                  \"fallback\": \"Sonic boom 15 blocks far, dealing 6 hearts of damage\"\n                }\n              ]\n            }\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.sneak_tap_pneumas\",\n            \"fallback\": \"The following pneumas activate while sneaking:\"\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_blinding\",\n                \"fallback\": \"Blinding\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.blinding\",\n                  \"fallback\": \"Blindness AOE for 7 seconds\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_feathery\",\n                \"fallback\": \"Feathery\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.feathery\",\n                  \"fallback\": \"Grants Slow Falling for 7 seconds\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_gazing\",\n                \"fallback\": \"Gazing\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.gazing\",\n                  \"fallback\": \"Grants Night Vision for 30 seconds\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_soaring\",\n                \"fallback\": \"Soaring\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.soaring\",\n                  \"fallback\": \"Sneaking toggles the ability: Look up to ascend and down to descend\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_vanishing\",\n                \"fallback\": \"Vanishing\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.vanishing\",\n                  \"fallback\": \"Grants Invisibility for 90 seconds\"\n                }\n              ]\n            }\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.sneak_hold_pneumas\",\n            \"fallback\": \"The following pneumas activate while continuously sneaking:\"\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_phasing\",\n                \"fallback\": \"Phasing\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.phasing\",\n                  \"fallback\": \"Allows walking through 1-wide walls\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_scaling\",\n                \"fallback\": \"Scaling\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.scaling\",\n                  \"fallback\": \"Allows climbing up walls\"\n                }\n              ]\n            }\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.orb_of_ankou.pneuma_list\",\n            \"fallback\": \" - %1$s*\",\n            \"with\": [\n              {\n                \"translate\": \"text.gm4.pneuma_sniffing\",\n                \"fallback\": \"Sniffing\"\n              }\n            ],\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.orb_of_ankou.note.sniffing\",\n                  \"fallback\": \"Sniffs up torchflowers and pitcher pods\"\n                }\n              ]\n            }\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/orb_of_ankou.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:firework_star\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:enchantment_glint_override\": true,\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:item/orb_of_ankou\"]},\n                                \"minecraft:firework_explosion\": {\n                                    \"shape\": \"small_ball\",\n                                    \"colors\": [\n                                        13092807\n                                    ]\n                                },\n                                \"minecraft:tooltip_display\": {\n                                    \"hidden_components\": [\n                                        \"minecraft:firework_explosion\"\n                                    ]\n                                },\n                                \"minecraft:rarity\": \"rare\",\n                                \"minecraft:damage_resistant\": {\n                                    \"types\": \"#minecraft:is_fire\"\n                                },\n                                \"minecraft:equippable\": {\n                                    \"slot\": \"offhand\"\n                                },\n                                \"minecraft:max_stack_size\": 1\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_orb_of_ankou:{item:'orb'},smithed:{ignore:{functionality:1b,crafting:1b}}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.orb_of_ankou\",\n                                \"fallback\": \"Orb of Ankou\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                [\n                                    {\n                                        \"translate\": \"text.gm4.orb_of_ankou.empty\",\n                                        \"fallback\": \"Empty\",\n                                        \"color\": \"gray\"\n                                    }\n                                ]\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/aggressive.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_aggressive\",\n                  \"fallback\": \"Aggressive\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/aggressive\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'aggressive'}],stored_color:[10682368],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/agile.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_agile\",\n                  \"fallback\": \"Agile\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/agile\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                },\n                {\n                  \"attribute\": \"minecraft:fall_damage_multiplier\",\n                  \"id\": \"gm4_orb_of_ankou:agile_fall_damage_multiplier\",\n                  \"amount\": -1024,\n                  \"operation\": \"add_value\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'agile'}],stored_color:[16769574],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/anchoring.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_anchoring\",\n                  \"fallback\": \"Anchoring\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/anchoring\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                },\n                {\n                  \"attribute\": \"minecraft:knockback_resistance\",\n                  \"id\": \"gm4_orb_of_ankou:anchoring_knockback_resistance\",\n                  \"amount\": 0.9,\n                  \"operation\": \"add_value\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'anchoring'}],stored_color:[1648550],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/bargaining.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_bargaining\",\n                  \"fallback\": \"Bargaining\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/bargaining\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'bargaining'}],stored_color:[1090333],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/bashing.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_bashing\",\n                  \"fallback\": \"Bashing\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/bashing\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                },\n                {\n                  \"attribute\": \"minecraft:attack_speed\",\n                  \"id\": \"gm4_orb_of_ankou:bashing_attack_speed\",\n                  \"amount\": -0.4,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                },\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:bashing_attack_damage\",\n                  \"amount\": 0.7,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'bashing'}],stored_color:[13181000],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/blasting.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_blasting\",\n                  \"fallback\": \"Blasting\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/blasting\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'blasting'}],stored_color:[16761136],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/blinding.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_blinding\",\n                  \"fallback\": \"Blinding\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/blinding\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'blinding'}],stored_color:[3809425],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/bounding.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_bounding\",\n                  \"fallback\": \"Bounding\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/bounding\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'bounding'}],stored_color:[7921776],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/bubbly.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_bubbly\",\n                  \"fallback\": \"Bubbly\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/bubbly\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'bubbly'}],stored_color:[5294074],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/conjuring.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_conjuring\",\n                  \"fallback\": \"Conjuring\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/conjuring\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'conjuring'}],stored_color:[2953835],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/dashing.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_dashing\",\n                  \"fallback\": \"Dashing\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/dashing\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'dashing'}],stored_color:[14735149],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/debilitate.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_debilitate\",\n                  \"fallback\": \"Debilitate\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/debilitate\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'debilitate'}],stored_color:[2304605],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/depriving.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_depriving\",\n                  \"fallback\": \"Depriving\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/depriving\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'depriving'}],stored_color:[13943899],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/draining.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_draining\",\n                  \"fallback\": \"Draining\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/draining\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'draining'}],stored_color:[6377247],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/enduring.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_enduring\",\n                  \"fallback\": \"Enduring\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/enduring\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                },\n                {\n                  \"attribute\": \"minecraft:max_health\",\n                  \"id\": \"gm4_orb_of_ankou:enduring_max_health\",\n                  \"amount\": 8,\n                  \"operation\": \"add_value\",\n                  \"slot\": \"offhand\"\n                },\n                {\n                  \"attribute\": \"minecraft:movement_speed\",\n                  \"id\": \"gm4_orb_of_ankou:enduring_movement_speed\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'enduring'}],stored_color:[5815552],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/expeditious.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_expeditious\",\n                  \"fallback\": \"Expeditious\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/expeditious\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'expeditious'}],stored_color:[14037247],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/feathery.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_feathery\",\n                  \"fallback\": \"Feathery\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/feathery\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'feathery'}],stored_color:[14806509],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/feigning.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_feigning\",\n                  \"fallback\": \"Feigning\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/feigning\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'feigning'}],stored_color:[16406506],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/freezing.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_freezing\",\n                  \"fallback\": \"Freezing\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/freezing\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'freezing'}],stored_color:[5559779],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/gazing.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_gazing\",\n                  \"fallback\": \"Gazing\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/gazing\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'gazing'}],stored_color:[6814213],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/gliding.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_gliding\",\n                  \"fallback\": \"Gliding\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/gliding\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'gliding'}],stored_color:[3108845],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/hawkeye.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_hawkeye\",\n                  \"fallback\": \"Hawkeye\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/hawkeye\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'hawkeye'}],stored_color:[15548437],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/incombustible.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_incombustible\",\n                  \"fallback\": \"Incombustible\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/incombustible\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'incombustible'}],stored_color:[15238935],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/lifeless.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_lifeless\",\n                  \"fallback\": \"Lifeless\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/lifeless\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'lifeless'}],stored_color:[12761127],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/neutralizing.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_neutralizing\",\n                  \"fallback\": \"Neutralizing\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/neutralizing\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'neutralizing'}],stored_color:[6365875],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/phasing.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_phasing\",\n                  \"fallback\": \"Phasing\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/phasing\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'phasing'}],stored_color:[11202779],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/pricking.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_pricking\",\n                  \"fallback\": \"Pricking\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/pricking\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_enchantments\",\n              \"enchantments\": {\n                \"minecraft:thorns\": 5\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'pricking'}],stored_color:[8375363],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/retreating.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_retreating\",\n                  \"fallback\": \"Retreating\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/retreating\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'retreating'}],stored_color:[13381501],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/rushing.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_rushing\",\n                  \"fallback\": \"Rushing\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/rushing\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'rushing'}],stored_color:[14245691],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/scaling.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_scaling\",\n                  \"fallback\": \"Scaling\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/scaling\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'scaling'}],stored_color:[8587519],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/shrieking.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_shrieking\",\n                  \"fallback\": \"Shrieking\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/shrieking\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'shrieking'}],stored_color:[831664],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/sniffing.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_sniffing\",\n                  \"fallback\": \"Sniffing\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/sniffing\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'sniffing'}],stored_color:[5482509],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/soaring.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_soaring\",\n                  \"fallback\": \"Soaring\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/soaring\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                },\n                {\n                  \"attribute\": \"minecraft:max_health\",\n                  \"id\": \"gm4_orb_of_ankou:soaring_max_health\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'soaring'}],stored_color:[9295344],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/striding.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_striding\",\n                  \"fallback\": \"Striding\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/striding\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'striding'}],stored_color:[15223575],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/synergetic.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_synergetic\",\n                  \"fallback\": \"Synergetic\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/synergetic\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'synergetic'}],stored_color:[15790159],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/tranquilizing.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_tranquilizing\",\n                  \"fallback\": \"Tranquilizing\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/tranquilizing\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'tranquilizing'}],stored_color:[5465649],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/vanishing.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_vanishing\",\n                  \"fallback\": \"Vanishing\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/vanishing\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'vanishing'}],stored_color:[8864176],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/venomous.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_venomous\",\n                  \"fallback\": \"Venomous\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/venomous\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'venomous'}],stored_color:[5424161],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/volatile.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_volatile\",\n                  \"fallback\": \"Volatile\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/volatile\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'volatile'}],stored_color:[2474538],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/withering.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:flint\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.pneuma_withering\",\n                  \"fallback\": \"Withering\",\n                  \"italic\": false,\n                  \"color\": \"blue\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:pneuma/withering\"]},\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.soul_shard\",\n                  \"fallback\": \"Soul Shard\"\n                },\n                \"minecraft:rarity\": \"common\",\n                \"minecraft:damage_resistant\": {\n                    \"types\": \"#minecraft:is_fire\"\n                },\n                \"minecraft:equippable\": {\n                  \"slot\": \"offhand\"\n                },\n                \"minecraft:max_stack_size\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_attributes\",\n              \"modifiers\": [\n                {\n                  \"attribute\": \"minecraft:attack_damage\",\n                  \"id\": \"gm4_orb_of_ankou:attack_damage\",\n                  \"amount\": -0.2,\n                  \"operation\": \"add_multiplied_base\",\n                  \"slot\": \"offhand\"\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_orb_of_ankou:{item:\\\"soul_shard\\\",pneumas:[{id:'withering'}],stored_color:[4067968],smithed:{ignore:{functionality:1b,crafting:1b}}}}\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/predicate/has_multiblock.json",
    "content": "{\n  \"condition\": \"minecraft:inverted\",\n  \"term\": {\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": 0,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": [\n                \"minecraft:obsidian\"\n              ]\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": 0,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": [\n                \"minecraft:obsidian\"\n              ]\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": 0,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": [\n                \"minecraft:obsidian\"\n              ]\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": 0,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": [\n                \"minecraft:obsidian\"\n              ]\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": 0,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": [\n                \"minecraft:obsidian\"\n              ]\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": 0,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": [\n                \"minecraft:obsidian\"\n              ]\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": 0,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": [\n                \"minecraft:obsidian\"\n              ]\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": 0,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": [\n                \"minecraft:obsidian\"\n              ]\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -1,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#minecraft:soul_fire_base_blocks\"\n            }\n          }\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/predicate/has_pneuma.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": \"#gm4_orb_of_ankou:pneuma_container\",\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{pneumas:[{}]}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/predicate/in_water.json",
    "content": "{\n  \"condition\": \"minecraft:location_check\",\n  \"predicate\": {\n    \"fluid\": {\n      \"fluids\": \"#minecraft:water\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/predicate/matching_id.json",
    "content": "{\n  \"condition\": \"minecraft:entity_scores\",\n  \"entity\": \"this\",\n  \"scores\": {\n    \"gm4_oa_id\": {\n      \"min\": {\n        \"type\": \"minecraft:score\",\n        \"target\": {\n          \"type\": \"minecraft:fixed\",\n          \"name\": \"$current\"\n        },\n        \"score\": \"gm4_oa_id\"\n      },\n      \"max\": {\n        \"type\": \"minecraft:score\",\n        \"target\": {\n          \"type\": \"minecraft:fixed\",\n          \"name\": \"$current\"\n        },\n        \"score\": \"gm4_oa_id\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/predicate/on_ground.json",
    "content": "{\n  \"condition\": \"minecraft:inverted\",\n  \"term\": {\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n      \"stepping_on\": {\n        \"block\": {\n          \"blocks\": \"#gm4:no_collision\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/predicate/sniff_chance.json",
    "content": "{\n  \"condition\": \"minecraft:random_chance\",\n  \"chance\": 0.05\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/recipe/orb_of_ankou.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"misc\",\n  \"pattern\": [\n    \"NCN\",\n    \"CSC\",\n    \"NCN\"\n  ],\n  \"key\": {\n    \"N\": \"minecraft:netherite_scrap\",\n    \"C\": \"minecraft:clay_ball\",\n    \"S\": \"minecraft:nether_star\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:firework_star\",\n    \"components\": {\n      \"minecraft:enchantment_glint_override\": true,\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_orb_of_ankou:item/orb_of_ankou\"]},\n      \"minecraft:firework_explosion\": {\n        \"shape\": \"small_ball\",\n        \"colors\": [\n          13092807\n        ]\n      },\n      \"minecraft:tooltip_display\": {\n        \"hidden_components\": [\n          \"minecraft:firework_explosion\"\n        ]\n      },\n      \"minecraft:rarity\": \"rare\",\n      \"minecraft:damage_resistant\": {\n        \"types\": \"#minecraft:is_fire\"\n      },\n      \"minecraft:equippable\": {\n        \"slot\": \"offhand\"\n      },\n      \"minecraft:max_stack_size\": 1,\n      \"minecraft:custom_data\": \"{gm4_orb_of_ankou:{item:'orb'}}\",\n      \"minecraft:item_name\": {\"translate\":\"item.gm4.orb_of_ankou\",\"fallback\":\"Orb of Ankou\"},\n      \"minecraft:lore\": [\n        {\"translate\":\"text.gm4.orb_of_ankou.empty\",\"fallback\":\"Empty\",\"color\":\"gray\"}\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/tags/entity_type/feigning_affected.json",
    "content": "{\n    \"values\": [\n        \"#gm4_orb_of_ankou:neutral\",\n        \"#gm4_orb_of_ankou:hostile\"\n    ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/tags/entity_type/hostile.json",
    "content": "{\n    \"values\": [\n        \"minecraft:blaze\",\n        \"minecraft:creeper\",\n        \"minecraft:drowned\",\n        \"minecraft:elder_guardian\",\n        \"minecraft:endermite\",\n        \"minecraft:evoker\",\n        \"minecraft:ghast\",\n        \"minecraft:guardian\",\n        \"minecraft:hoglin\",\n        \"minecraft:husk\",\n        \"minecraft:magma_cube\",\n        \"minecraft:phantom\",\n        \"minecraft:piglin_brute\",\n        \"minecraft:pillager\",\n        \"minecraft:ravager\",\n        \"minecraft:shulker\",\n        \"minecraft:silverfish\",\n        \"minecraft:skeleton\",\n        \"minecraft:slime\",\n        \"minecraft:stray\",\n        \"minecraft:vex\",\n        \"minecraft:vindicator\",\n        \"minecraft:witch\",\n        \"minecraft:wither\",\n        \"minecraft:wither_skeleton\",\n        \"minecraft:zombie_villager\",\n        \"minecraft:zombie\",\n        \"minecraft:zoglin\"\n    ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/tags/entity_type/neutral.json",
    "content": "{\n    \"values\": [\n        \"minecraft:bee\",\n        \"minecraft:cave_spider\",\n        \"minecraft:enderman\",\n        \"minecraft:goat\",\n        \"minecraft:iron_golem\",\n        \"minecraft:llama\",\n        \"minecraft:panda\",\n        \"minecraft:piglin\",\n        \"minecraft:polar_bear\",\n        \"minecraft:spider\",\n        \"minecraft:trader_llama\",\n        \"minecraft:wolf\",\n        \"minecraft:zombified_piglin\"\n    ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/tags/function/pneumas/expeditious/tp_player.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/data/gm4_orb_of_ankou/tags/item/pneuma_container.json",
    "content": "{\n    \"values\": [\n        \"minecraft:firework_star\",\n        \"minecraft:flint\"\n    ]\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/generate_pneumas.py",
    "content": "from beet import Context, Advancement, Function, LootTable, Predicate\nimport csv\nfrom typing import Any\n\nSUPPORTED_LOOTING = 10\n\nentities = {}\npneumas:list[str] = []\nupdated_csv = [['-Run beet to update columns 4-9'],[],['.Mob','.Soul Essence','Base','L I','L II','L III','.','K/E (L III)','K/S (L III)']]\n\ndef beet_default(ctx: Context):\n  \"\"\"Creates advancements, functions, and loot tables for each mob that the corripio shamir works on.\"\"\"\n  read_csv()\n  generate_corripio(ctx)\n  generate_pneuma_predicates(ctx)\n  generate_soul_essence_loot_tables(ctx)\n  \n\ndef generate_corripio(ctx: Context):\n  entity: Any\n  for entity in entities:\n    # Advancement to detect when a player kills the mob using a corripio shamir\n    ctx.data[f\"gm4_corripio_shamir:kill_entity/{entity}\"] = Advancement({\n      \"criteria\": {\n        \"requirement\": {\n          \"trigger\": \"minecraft:player_killed_entity\",\n          \"conditions\": {\n            \"entity\": [\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": { \"type\": f\"minecraft:{entity}\" }\n              },\n              *[{\n                \"condition\": \"minecraft:inverted\",\n                \"term\": {\n                  \"condition\": \"minecraft:entity_properties\",\n                  \"entity\": \"this\",\n                  \"predicate\": {\n                    \"nbt\": \"{Tags:[\\\"\" + tag + \"\\\"]}\"\n                  }\n                }\n              } for tag in [\"gm4_oa_ignore\", \"smithed.entity\"]],\n            ],\n            \"killing_blow\": { \"source_entity\": { \"equipment\": { \"mainhand\": {\n              \"predicates\": {\n                \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'corripio'}}\"\n              }\n            } } } }\n          }\n        }\n      },\n      \"rewards\": { \"function\": f\"gm4_corripio_shamir:kill_entity/{entity}\" }\n    })\n\n    # Function to summon the items and revoke the advancement\n    ctx.data[f\"gm4_corripio_shamir:kill_entity/{entity}\"] = Function([\n      f\"# run from advancement kill_entity/{entity}\",\n      f\"# @s = player who killed a {entity} using the corripio shamir\",\n      \"\",\n      f\"loot spawn ~ ~.3 ~ fish gm4_corripio_shamir:entities/{entity} ~ ~ ~ mainhand\",\n      \"execute as @e[type=item,distance=..1,nbt={Age:0s,Item:{tag:{gm4_orb_of_ankou:{item:\\\"soul_essence\\\"}}}}] run data merge entity @s {PickupDelay:0}\",\n      \"\",\n      f\"advancement revoke @s only gm4_corripio_shamir:kill_entity/{entity}\",\n    ])\n\n    # Loot table to drop the items\n    pools: Any = []\n    essence: Any = ''\n    for essence in entities[entity]:\n      pool: Any = {\n        \"rolls\": 1,\n        \"entries\": [{\n          \"type\": \"minecraft:loot_table\",\n          \"value\": f\"gm4_orb_of_ankou:items/soul_essence/{essence}\"\n        }]\n      }\n      pool[\"conditions\"] = [{\n        \"condition\": \"minecraft:table_bonus\",\n        \"enchantment\": \"minecraft:looting\",\n        \"chances\": []\n      }]\n      base_chance: Any = entities[entity][essence]\n      for i in range(SUPPORTED_LOOTING+1):\n        pool[\"conditions\"][0][\"chances\"].append(looting_chance(base_chance,i))\n      pools.append(pool)\n\n    ctx.data[f\"gm4_corripio_shamir:entities/{entity}\"] = LootTable({\n      \"type\": \"minecraft:fishing\",\n      \"pools\": pools\n    })\n\n\n\ndef generate_pneuma_predicates(ctx: Context):\n  pneuma: Any = \"\"\n  for pneuma in pneumas:\n    # Predicate to check if a player has a certain pneuma equipped\n    custom_data = \"{gm4_orb_of_ankou:{pneumas:[{id:'\"+ pneuma + \"'}]}}\"\n    ctx.data[f\"gm4_orb_of_ankou:pneuma_equipped/{pneuma}\"] = Predicate({\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"offhand\": {\n            \"items\": \"#gm4_orb_of_ankou:pneuma_container\",\n            \"predicates\": {\n              \"minecraft:custom_data\": custom_data\n            }\n          }\n        }\n      }\n    })\n\n\ndef looting_chance(base: float,lvl: int) -> float:\n  return min(1.0,round(base * (1 + (3 * (lvl**3))),6))\n\n\ndef generate_soul_essence_loot_tables(ctx: Context):\n  for pneuma in pneumas:\n    custom_data = \"{gm4_orb_of_ankou:{item:'soul_essence',stored_pneuma:{id:'\" + pneuma + \"'}},smithed:{ignore:{functionality:1b,crafting:1b}}}\"\n    ctx.data[f\"gm4_orb_of_ankou:items/soul_essence/{pneuma}\"] = LootTable({\n      \"type\": \"minecraft:generic\",\n      \"pools\": [\n        {\n          \"rolls\": 1,\n          \"entries\": [\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"minecraft:black_dye\",\n              \"functions\": [\n                {\n                  \"function\": \"minecraft:set_lore\",\n                  \"mode\": \"append\",\n                  \"lore\": [\n                    {\n                      \"translate\": f\"text.gm4.pneuma_{pneuma}\",\n                      \"fallback\": pneuma.replace(\"_\", \" \").title(),\n                      \"italic\": False,\n                      \"color\": \"blue\"\n                    }\n                  ]\n                },\n                {\n                  \"function\": \"minecraft:set_name\",\n                  \"target\": \"item_name\",\n                  \"name\": {\n                    \"translate\": \"item.gm4.soul_essence\",\n                    \"fallback\": \"Soul Essence\"\n                  }\n                },\n                {\n                  \"function\": \"minecraft:set_components\",\n                  \"components\": {\n                    \"minecraft:enchantment_glint_override\": True,\n                    \"minecraft:custom_model_data\": {\n                      \"strings\": [f\"gm4_orb_of_ankou:pneuma/{pneuma}\"]\n                    },\n                    \"minecraft:damage_resistant\": {\n                        \"types\": \"#minecraft:is_fire\"\n                    },\n                  }\n                },\n                {\n                  \"function\": \"minecraft:set_custom_data\",\n                  \"tag\": custom_data\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    })\n\n\ndef read_csv():\n  # read csv file\n  with open('gm4_orb_of_ankou/soul_essence.csv', mode ='r') as file:\n    csv_file = csv.reader(file)\n\n    # skip first 3 rows\n    next(csv_file)\n    next(csv_file)\n    next(csv_file)\n\n    for row in csv_file:\n      # get info\n      entity = row[0]\n      essence = row[1]\n      base_chance = float(row[2][0:-1])/100\n      if entity not in entities:\n        entities[entity] = {}\n      entities[entity][essence] = round(base_chance,6)\n      if essence not in pneumas:\n        pneumas.append(essence)\n      # calculate extra info\n      entry = [entity,essence,str(round(base_chance*100,4))+'%',str(round(base_chance*400,3))+'%',str(round(base_chance*2500,3))+'%',str(round(base_chance*8200,2))+'%','',str(round(1/(base_chance*82),1)),str(round(13/(base_chance*82),1))]\n      updated_csv.append(entry)\n\n  # update calculated info\n  with open('gm4_orb_of_ankou/soul_essence.csv', mode ='w', newline='') as file:\n    csv_file = csv.writer(file)\n\n    # skip first two rows\n    csv_file.writerows(updated_csv)\n"
  },
  {
    "path": "gm4_orb_of_ankou/mod.mcdoc",
    "content": "use ::java::world::entity::mob::EntityEquipment\nuse ::java::world::item::ItemStack\n\ndispatch minecraft:storage[gm4_orb_of_ankou:temp] to struct {\n  equipment?: EntityEquipment,\n  Item?: ItemStack,\n  Orb?: ItemStack,\n  Drop?: ItemStack,\n}\n"
  },
  {
    "path": "gm4_orb_of_ankou/pneuma_model_template.py",
    "content": "from typing import Literal\nfrom beet import Model, NamespaceProxy, Context\nfrom gm4.plugins.resource_pack import ModelData, TemplateOptions\nfrom gm4.utils import MapOption\n\ndef beet_default(ctx: Context):\n    pass\n\nclass PneumaTemplate(TemplateOptions):\n    \"\"\"model template to generate the models for shards and essences\"\"\"\n    name: Literal[\"pneuma\"] = \"pneuma\"\n\n    def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]):\n        pneuma = config.reference.split(\"/\")[-1] # eg agile, anchoring ect...\n        shard = models_container[f\"gm4_orb_of_ankou:item/shards/{pneuma}\"] = Model({\n            \"parent\": \"item/generated\",\n            \"textures\": {\n                \"layer0\": f\"gm4_orb_of_ankou:item/shards/{pneuma}\"\n            }\n        })\n        essence = models_container[f\"gm4_orb_of_ankou:item/essences/{pneuma}\"] = Model({\n            \"parent\": \"item/generated\",\n            \"textures\": {\n                \"layer0\": f\"gm4_orb_of_ankou:item/essences/{pneuma}\"\n            }\n        })\n        config.model = MapOption({\n            \"flint\": f\"gm4_orb_of_ankou:item/shards/{pneuma}\",\n            \"black_dye\": f\"gm4_orb_of_ankou:item/essences/{pneuma}\"\n        })\n        return [shard, essence]\n"
  },
  {
    "path": "gm4_orb_of_ankou/soul_essence.csv",
    "content": "-Run beet to update columns 4-9\r\n\r\n.Mob,.Soul Essence,Base,L I,L II,L III,.,K/E (L III),K/S (L III)\r\nallay,retreating,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\nallay,soaring,0.015%,0.06%,0.375%,1.23%,,81.3,1056.9\r\narmadillo,enduring,0.1%,0.4%,2.5%,8.2%,,12.2,158.5\r\narmadillo,retreating,0.04%,0.16%,1.0%,3.28%,,30.5,396.3\r\naxolotl,bubbly,0.06%,0.24%,1.5%,4.92%,,20.3,264.2\r\naxolotl,feigning,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\naxolotl,gliding,0.04%,0.16%,1.0%,3.28%,,30.5,396.3\r\naxolotl,synergetic,0.08%,0.32%,2.0%,6.56%,,15.2,198.2\r\nbat,gazing,0.3%,1.2%,7.5%,24.6%,,4.1,52.8\r\nbat,soaring,0.02%,0.08%,0.5%,1.64%,,61.0,792.7\r\nbee,soaring,0.004%,0.016%,0.1%,0.33%,,304.9,3963.4\r\nbee,venomous,0.02%,0.08%,0.5%,1.64%,,61.0,792.7\r\nblaze,blasting,0.002%,0.008%,0.05%,0.16%,,609.8,7926.8\r\nblaze,feathery,0.0017%,0.007%,0.043%,0.14%,,717.4,9325.7\r\nblaze,incombustible,0.0019%,0.008%,0.048%,0.16%,,641.8,8344.0\r\nblaze,soaring,0.0013%,0.005%,0.033%,0.11%,,938.1,12195.1\r\nbogged,hawkeye,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7\r\nbogged,lifeless,0.004%,0.016%,0.1%,0.33%,,304.9,3963.4\r\nbogged,tranquilizing,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7\r\nbreeze,agile,0.04%,0.16%,1.0%,3.28%,,30.5,396.3\r\nbreeze,bounding,0.04%,0.16%,1.0%,3.28%,,30.5,396.3\r\ncamel,dashing,0.025%,0.1%,0.625%,2.05%,,48.8,634.1\r\ncamel,retreating,0.04%,0.16%,1.0%,3.28%,,30.5,396.3\r\ncamel_husk,dashing,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\ncamel_husk,lifeless,0.035%,0.14%,0.875%,2.87%,,34.8,453.0\r\ncamel_husk,retreating,0.045%,0.18%,1.125%,3.69%,,27.1,352.3\r\ncat,agile,0.05%,0.2%,1.25%,4.1%,,24.4,317.1\r\ncat,gazing,0.1%,0.4%,2.5%,8.2%,,12.2,158.5\r\ncat,retreating,0.04%,0.16%,1.0%,3.28%,,30.5,396.3\r\ncave_spider,scaling,0.0027%,0.011%,0.068%,0.22%,,451.7,5871.7\r\ncave_spider,venomous,0.0023%,0.009%,0.058%,0.19%,,530.2,6892.9\r\nchicken,feathery,0.009%,0.036%,0.225%,0.74%,,135.5,1761.5\r\nchicken,retreating,0.02%,0.08%,0.5%,1.64%,,61.0,792.7\r\ncod,bubbly,0.06%,0.24%,1.5%,4.92%,,20.3,264.2\r\ncod,gliding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1\r\ncow,retreating,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\ncreeper,volatile,0.003%,0.012%,0.075%,0.25%,,406.5,5284.6\r\ndolphin,bubbly,0.14%,0.56%,3.5%,11.48%,,8.7,113.2\r\ndolphin,gliding,0.12%,0.48%,3.0%,9.84%,,10.2,132.1\r\ndonkey,bounding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1\r\ndrowned,bubbly,0.015%,0.06%,0.375%,1.23%,,81.3,1056.9\r\ndrowned,lifeless,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7\r\nelder_guardian,bubbly,1.2%,4.8%,30.0%,98.4%,,1.0,13.2\r\nelder_guardian,draining,1.1%,4.4%,27.5%,90.2%,,1.1,14.4\r\nelder_guardian,enduring,0.97%,3.88%,24.25%,79.54%,,1.3,16.3\r\nelder_guardian,gliding,1.2%,4.8%,30.0%,98.4%,,1.0,13.2\r\nender_dragon,anchoring,0.6%,2.4%,15.0%,49.2%,,2.0,26.4\r\nender_dragon,bashing,0.6%,2.4%,15.0%,49.2%,,2.0,26.4\r\nender_dragon,blasting,0.7%,2.8%,17.5%,57.4%,,1.7,22.6\r\nender_dragon,enduring,0.5%,2.0%,12.5%,41.0%,,2.4,31.7\r\nender_dragon,soaring,0.05%,0.2%,1.25%,4.1%,,24.4,317.1\r\nenderman,aggressive,0.006%,0.024%,0.15%,0.49%,,203.3,2642.3\r\nenderman,expeditious,0.0025%,0.01%,0.062%,0.21%,,487.8,6341.5\r\nenderman,gazing,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7\r\nendermite,synergetic,0.09%,0.36%,2.25%,7.38%,,13.6,176.2\r\nevoker,conjuring,0.02%,0.08%,0.5%,1.64%,,61.0,792.7\r\nfox,bounding,0.07%,0.28%,1.75%,5.74%,,17.4,226.5\r\nfox,gazing,0.1%,0.4%,2.5%,8.2%,,12.2,158.5\r\nfox,retreating,0.1%,0.4%,2.5%,8.2%,,12.2,158.5\r\nfrog,bubbly,0.09%,0.36%,2.25%,7.38%,,13.6,176.2\r\nfrog,gliding,0.08%,0.32%,2.0%,6.56%,,15.2,198.2\r\nfrog,retreating,0.04%,0.16%,1.0%,3.28%,,30.5,396.3\r\nghast,blasting,0.02%,0.08%,0.5%,1.64%,,61.0,792.7\r\nghast,incombustible,0.025%,0.1%,0.625%,2.05%,,48.8,634.1\r\nghast,soaring,0.009%,0.036%,0.225%,0.74%,,135.5,1761.5\r\ngiant,enduring,0.7%,2.8%,17.5%,57.4%,,1.7,22.6\r\nglow_squid,bubbly,0.17%,0.68%,4.25%,13.94%,,7.2,93.3\r\nglow_squid,gliding,0.15%,0.6%,3.75%,12.3%,,8.1,105.7\r\ngoat,aggressive,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\ngoat,bounding,0.08%,0.32%,2.0%,6.56%,,15.2,198.2\r\ngoat,retreating,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\ngoat,rushing,0.04%,0.16%,1.0%,3.28%,,30.5,396.3\r\nguardian,bubbly,0.0035%,0.014%,0.088%,0.29%,,348.4,4529.6\r\nguardian,gliding,0.003%,0.012%,0.075%,0.25%,,406.5,5284.6\r\nguardian,pricking,0.002%,0.008%,0.05%,0.16%,,609.8,7926.8\r\nhappy_ghast,soaring,0.003%,0.012%,0.075%,0.25%,,406.5,5284.6\r\nhoglin,anchoring,0.02%,0.08%,0.5%,1.64%,,61.0,792.7\r\nhoglin,bashing,0.025%,0.1%,0.625%,2.05%,,48.8,634.1\r\nhorse,bounding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1\r\nhusk,depriving,0.07%,0.28%,1.75%,5.74%,,17.4,226.5\r\nhusk,lifeless,0.012%,0.048%,0.3%,0.98%,,101.6,1321.1\r\nillusioner,blinding,0.2%,0.8%,5.0%,16.4%,,6.1,79.3\r\nillusioner,vanishing,0.2%,0.8%,5.0%,16.4%,,6.1,79.3\r\niron_golem,agile,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4\r\niron_golem,anchoring,0.02%,0.08%,0.5%,1.64%,,61.0,792.7\r\niron_golem,bashing,0.007%,0.028%,0.175%,0.57%,,174.2,2264.8\r\niron_golem,enduring,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4\r\nllama,aggressive,0.05%,0.2%,1.25%,4.1%,,24.4,317.1\r\nmagma_cube,agile,0.016%,0.064%,0.4%,1.31%,,76.2,990.9\r\nmagma_cube,bounding,0.016%,0.064%,0.4%,1.31%,,76.2,990.9\r\nmagma_cube,incombustible,0.012%,0.048%,0.3%,0.98%,,101.6,1321.1\r\nmooshroom,retreating,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\nmule,bounding,0.09%,0.36%,2.25%,7.38%,,13.6,176.2\r\nnautilus,bubbly,0.07%,0.28%,1.75%,5.74%,,17.4,226.5\r\nnautilus,gliding,0.06%,0.24%,1.5%,4.92%,,20.3,264.2\r\nnautilus,dashing,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4\r\nocelot,agile,0.07%,0.28%,1.75%,5.74%,,17.4,226.5\r\nocelot,gazing,0.08%,0.32%,2.0%,6.56%,,15.2,198.2\r\npanda,aggressive,0.1%,0.4%,2.5%,8.2%,,12.2,158.5\r\nparrot,feathery,0.1%,0.4%,2.5%,8.2%,,12.2,158.5\r\nparrot,soaring,0.07%,0.28%,1.75%,5.74%,,17.4,226.5\r\nparched,hawkeye,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4\r\nparched,lifeless,0.012%,0.048%,0.3%,0.98%,,101.6,1321.1\r\nparched,debilitate,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4\r\nphantom,feathery,0.02%,0.08%,0.5%,1.64%,,61.0,792.7\r\nphantom,lifeless,0.02%,0.08%,0.5%,1.64%,,61.0,792.7\r\nphantom,soaring,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7\r\npig,retreating,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\npiglin,aggressive,0.02%,0.08%,0.5%,1.64%,,61.0,792.7\r\npiglin,rushing,0.018%,0.072%,0.45%,1.48%,,67.8,880.8\r\npiglin,synergetic,0.02%,0.08%,0.5%,1.64%,,61.0,792.7\r\npiglin_brute,enduring,0.08%,0.32%,2.0%,6.56%,,15.2,198.2\r\npiglin_brute,rushing,0.1%,0.4%,2.5%,8.2%,,12.2,158.5\r\npiglin_brute,synergetic,0.09%,0.36%,2.25%,7.38%,,13.6,176.2\r\npillager,rushing,0.0028%,0.011%,0.07%,0.23%,,435.5,5662.0\r\npolar_bear,aggressive,0.6%,2.4%,15.0%,49.2%,,2.0,26.4\r\npolar_bear,synergetic,0.65%,2.6%,16.25%,53.3%,,1.9,24.4\r\npufferfish,bubbly,0.065%,0.26%,1.625%,5.33%,,18.8,243.9\r\npufferfish,gliding,0.06%,0.24%,1.5%,4.92%,,20.3,264.2\r\npufferfish,pricking,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\npufferfish,venomous,0.025%,0.1%,0.625%,2.05%,,48.8,634.1\r\nrabbit,bounding,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\nrabbit,retreating,0.04%,0.16%,1.0%,3.28%,,30.5,396.3\r\nravager,anchoring,0.1%,0.4%,2.5%,8.2%,,12.2,158.5\r\nravager,bashing,0.08%,0.32%,2.0%,6.56%,,15.2,198.2\r\nravager,enduring,0.09%,0.36%,2.25%,7.38%,,13.6,176.2\r\nsalmon,bubbly,0.06%,0.24%,1.5%,4.92%,,20.3,264.2\r\nsalmon,gliding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1\r\nsheep,retreating,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\nshulker,anchoring,0.05%,0.2%,1.25%,4.1%,,24.4,317.1\r\nshulker,enduring,0.06%,0.24%,1.5%,4.92%,,20.3,264.2\r\nshulker,expeditious,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\nsilverfish,phasing,0.015%,0.06%,0.375%,1.23%,,81.3,1056.9\r\nsilverfish,synergetic,0.02%,0.08%,0.5%,1.64%,,61.0,792.7\r\nsilverfish,vanishing,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4\r\nskeleton,hawkeye,0.004%,0.016%,0.1%,0.33%,,304.9,3963.4\r\nskeleton,lifeless,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7\r\nskeleton_horse,bounding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1\r\nskeleton_horse,lifeless,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\nslime,bounding,0.009%,0.036%,0.225%,0.74%,,135.5,1761.5\r\nsniffer,retreating,0.06%,0.24%,1.5%,4.92%,,20.3,264.2\r\nsniffer,sniffing,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\nsnow_golem,aggressive,0.035%,0.14%,0.875%,2.87%,,34.8,453.0\r\nspider,scaling,0.003%,0.012%,0.075%,0.25%,,406.5,5284.6\r\nsquid,blinding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1\r\nsquid,bubbly,0.12%,0.48%,3.0%,9.84%,,10.2,132.1\r\nsquid,gliding,0.1%,0.4%,2.5%,8.2%,,12.2,158.5\r\nstray,freezing,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7\r\nstray,hawkeye,0.0045%,0.018%,0.112%,0.37%,,271.0,3523.0\r\nstray,lifeless,0.0055%,0.022%,0.137%,0.45%,,221.7,2882.5\r\nstrider,incombustible,0.025%,0.1%,0.625%,2.05%,,48.8,634.1\r\nstrider,retreating,0.04%,0.16%,1.0%,3.28%,,30.5,396.3\r\nstrider,striding,0.017%,0.068%,0.425%,1.39%,,71.7,932.6\r\ntadpole,bubbly,0.07%,0.28%,1.75%,5.74%,,17.4,226.5\r\ntadpole,gliding,0.06%,0.24%,1.5%,4.92%,,20.3,264.2\r\ntrader_llama,aggressive,0.5%,2.0%,12.5%,41.0%,,2.4,31.7\r\ntropical_fish,bubbly,0.07%,0.28%,1.75%,5.74%,,17.4,226.5\r\ntropical_fish,gliding,0.065%,0.26%,1.625%,5.33%,,18.8,243.9\r\nturtle,anchoring,0.06%,0.24%,1.5%,4.92%,,20.3,264.2\r\nturtle,bubbly,0.1%,0.4%,2.5%,8.2%,,12.2,158.5\r\nturtle,enduring,0.06%,0.24%,1.5%,4.92%,,20.3,264.2\r\nturtle,gliding,0.08%,0.32%,2.0%,6.56%,,15.2,198.2\r\nvex,phasing,0.012%,0.048%,0.3%,0.98%,,101.6,1321.1\r\nvex,soaring,0.003%,0.012%,0.075%,0.25%,,406.5,5284.6\r\nvillager,bargaining,0.04%,0.16%,1.0%,3.28%,,30.5,396.3\r\nvindicator,rushing,0.008%,0.032%,0.2%,0.66%,,152.4,1981.7\r\nwandering_trader,bargaining,0.83%,3.32%,20.75%,68.06%,,1.5,19.1\r\nwandering_trader,vanishing,0.56%,2.24%,14.0%,45.92%,,2.2,28.3\r\nwarden,anchoring,0.5%,2.0%,12.5%,41.0%,,2.4,31.7\r\nwarden,bashing,0.45%,1.8%,11.25%,36.9%,,2.7,35.2\r\nwarden,enduring,0.4%,1.6%,10.0%,32.8%,,3.0,39.6\r\nwarden,incombustible,0.35%,1.4%,8.75%,28.7%,,3.5,45.3\r\nwarden,shrieking,0.2%,0.8%,5.0%,16.4%,,6.1,79.3\r\nwitch,neutralizing,0.015%,0.06%,0.375%,1.23%,,81.3,1056.9\r\nwither,enduring,0.045%,0.18%,1.125%,3.69%,,27.1,352.3\r\nwither,lifeless,0.05%,0.2%,1.25%,4.1%,,24.4,317.1\r\nwither,soaring,0.02%,0.08%,0.5%,1.64%,,61.0,792.7\r\nwither,withering,0.3%,1.2%,7.5%,24.6%,,4.1,52.8\r\nwither_skeleton,lifeless,0.012%,0.048%,0.3%,0.98%,,101.6,1321.1\r\nwither_skeleton,rushing,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\nwither_skeleton,withering,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4\r\nwolf,aggressive,0.07%,0.28%,1.75%,5.74%,,17.4,226.5\r\nwolf,synergetic,0.1%,0.4%,2.5%,8.2%,,12.2,158.5\r\nzoglin,aggressive,0.05%,0.2%,1.25%,4.1%,,24.4,317.1\r\nzoglin,anchoring,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\nzoglin,bashing,0.04%,0.16%,1.0%,3.28%,,30.5,396.3\r\nzoglin,incombustible,0.04%,0.16%,1.0%,3.28%,,30.5,396.3\r\nzoglin,lifeless,0.06%,0.24%,1.5%,4.92%,,20.3,264.2\r\nzombie,lifeless,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7\r\nzombie_nautilus,bubbly,0.21%,0.84%,5.25%,17.22%,,5.8,75.5\r\nzombie_nautilus,gliding,0.18%,0.72%,4.5%,14.76%,,6.8,88.1\r\nzombie_nautilus,dashing,0.09%,0.36%,2.25%,7.38%,,13.6,176.2\r\nzombie_nautilus,lifeless,0.15%,0.6%,3.75%,12.3%,,8.1,105.7\r\nzombie_horse,bounding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1\r\nzombie_horse,lifeless,0.03%,0.12%,0.75%,2.46%,,40.7,528.5\r\nzombie_villager,lifeless,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4\r\nzombified_piglin,aggressive,0.006%,0.024%,0.15%,0.49%,,203.3,2642.3\r\nzombified_piglin,incombustible,0.0048%,0.019%,0.12%,0.39%,,254.1,3302.8\r\nzombified_piglin,lifeless,0.0055%,0.022%,0.137%,0.45%,,221.7,2882.5\r\nzombified_piglin,rushing,0.0037%,0.015%,0.093%,0.3%,,329.6,4284.8\r\n"
  },
  {
    "path": "gm4_particles_pack/README.md",
    "content": "# Particles Pack<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nFill your world with beautiful particles by attaching them to armour stands.<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Requires the base [Better Armour Stands]($dynamicLink:gm4_better_armour_stands) data pack\r\n- Allows a variety of particles such as bubble, cloud and drip\r\n- When a particle is applied, the armour stand will become invisible\r\n- Holding a book and quill with \"visible\" written will highlight nearby invisible stands.\r\n\r\nRead more about all the options on the [Wiki](https://wiki.gm4.co/Better_Armour_Stands/Particles_Pack).\r\n"
  },
  {
    "path": "gm4_particles_pack/beet.yaml",
    "content": "id: gm4_particles_pack\nname: Particles Pack\nversion: 1.8.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n      required:\n        gm4_better_armour_stands: 2.6.0\n    website:\n      description: Fireflies to flames, add some pezazz to your projects! Allows you to turn Armour Stands into particle sources that you control!\n      recommended:\n        - gm4_poses_pack\n      notes: []\n    modrinth:\n      project_id: hqLgWYiS\n    video: https://www.youtube.com/watch?v=ZBqmGpAXqmw&t=238s\n    wiki: https://wiki.gm4.co/wiki/Particles_Pack\n    credits:\n      Creator:\n        - Sparks\n      Updated by:\n        - Misode\n        - kindabland\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_particles_pack/data/gm4_better_armour_stands/tags/function/apply_book.json",
    "content": "{\n  \"values\": [\n    \"gm4_particles_pack:apply_book\"\n  ]\n}\n"
  },
  {
    "path": "gm4_particles_pack/data/gm4_better_armour_stands/tags/function/default.json",
    "content": "{\n  \"values\": [\n    \"gm4_particles_pack:default\"\n  ]\n}\n"
  },
  {
    "path": "gm4_particles_pack/data/gm4_particles_pack/function/apply_book.mcfunction",
    "content": "# @s = armor_stand to be modified\n# at @s\n# run from gm4_better_armour_stands:book/process\n\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"heart\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 1\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"flame\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 2\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"barrier\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 3\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"fireflies\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 4\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"growing\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 7\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"drip\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 8\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"winter\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 9\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"blossom\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 10\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"autumn\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 11\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"spring\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 12\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"ash\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 13\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"lava\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 14\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"fiesta\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 15\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"ender\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 16\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"enchant\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 17\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"note\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 18\n\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"cloud\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 100\nexecute if data storage gm4_better_armour_stands:temp {pages:[{raw:\"bubbles\"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 101\n\nexecute if score @s gm4_particle matches 100.. run kill @e[type=area_effect_cloud,tag=gm4_particles_pack_cloud,distance=..1,limit=1,sort=nearest]\nexecute if score @s gm4_particle matches 100 run summon area_effect_cloud ~ ~ ~ {Duration:-1,Radius:1,RadiusOnUse:0,custom_particle:{type:\"minecraft:cloud\"},Tags:[\"gm4_particles_pack_cloud\"]}\nexecute if score @s gm4_particle matches 101 run summon area_effect_cloud ~ ~ ~ {Duration:-1,Radius:1,RadiusOnUse:0,custom_particle:{type:\"minecraft:bubble\"},Tags:[\"gm4_particles_pack_cloud\"]}\n\ndata merge entity @s[scores={gm4_particle=1..}] {Invisible:1b,NoGravity:1b}\n"
  },
  {
    "path": "gm4_particles_pack/data/gm4_particles_pack/function/default.mcfunction",
    "content": "# @s = armor_stand\n# at @s\n# run from gm4_better_armour_stands:default/check\n\nexecute if score @s gm4_particle matches 100.. run kill @e[type=area_effect_cloud,tag=gm4_particles_pack_cloud,distance=..1,limit=1,sort=nearest]\nscoreboard players reset @s gm4_particle\n"
  },
  {
    "path": "gm4_particles_pack/data/gm4_particles_pack/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_particle dummy\n\nexecute unless score particles_pack gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Particles Pack\"}\nexecute unless score particles_pack gm4_earliest_version < particles_pack gm4_modules run scoreboard players operation particles_pack gm4_earliest_version = particles_pack gm4_modules\nscoreboard players set particles_pack gm4_modules 1\n\nschedule function gm4_particles_pack:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_particles_pack/data/gm4_particles_pack/function/main.mcfunction",
    "content": "execute as @e[type=armor_stand,scores={gm4_particle=1..}] at @s run function gm4_particles_pack:particle\nexecute as @e[type=area_effect_cloud,tag=gm4_particles_pack_cloud] at @s unless entity @e[type=armor_stand,scores={gm4_particle=100..},distance=..1] run kill @s\n\nschedule function gm4_particles_pack:main 16t\n"
  },
  {
    "path": "gm4_particles_pack/data/gm4_particles_pack/function/particle.mcfunction",
    "content": "# @s = armor_stand with a particle score\n# at @s\n# run from main\n\nexecute if score @s gm4_particle matches 1 run particle minecraft:heart ~ ~.2 ~ .2 0 .2 0 1\nexecute if score @s gm4_particle matches 2 run particle minecraft:flame ~ ~.15 ~ 0 0 0 0 1 force\nexecute if score @s gm4_particle matches 3 run particle minecraft:block_marker{block_state:\"minecraft:barrier\"} ~ ~.5 ~ 0 0 0 0 1\nexecute if score @s gm4_particle matches 4 run particle minecraft:end_rod ~ ~ ~ 10 10 10 0 8 force\nexecute if score @s gm4_particle matches 7 run particle minecraft:happy_villager ~ ~.3 ~ 2 .2 2 0 1\nexecute if score @s gm4_particle matches 8 run particle minecraft:dripping_water ~ ~1 ~ 0.04 0 0.04 1 1\nexecute if score @s gm4_particle matches 9 run particle minecraft:falling_dust{block_state:\"minecraft:snow\"} ~ ~4 ~ 2 1 2 0 5\nexecute if score @s gm4_particle matches 10 run particle minecraft:cherry_leaves ~ ~4 ~ 2 1 2 0 3\nexecute if score @s gm4_particle matches 11 run particle minecraft:tinted_leaves{color:[0.788,0.369,0.047,1.00]} ~ ~4 ~ 2 1 2 0 1\nexecute if score @s gm4_particle matches 11 run particle minecraft:tinted_leaves{color:[0.980,0.753,0.000,1.00]} ~ ~4 ~ 2 1 2 0 1\nexecute if score @s gm4_particle matches 11 run particle minecraft:tinted_leaves{color:[0.722,0.145,0.027,1.00]} ~ ~4 ~ 2 1 2 0 1\nexecute if score @s gm4_particle matches 12 run particle minecraft:falling_dust{block_state:\"minecraft:lime_wool\"} ~ ~4 ~ 2 1 2 0 5\nexecute if score @s gm4_particle matches 13 run particle minecraft:falling_dust{block_state:\"minecraft:black_wool\"} ~ ~4 ~ 2 1 2 0 5\nexecute if score @s gm4_particle matches 14 run particle minecraft:lava ~ ~ ~ 2 0 2 0 5\nexecute if score @s gm4_particle matches 15 run particle minecraft:totem_of_undying ~ ~4 ~ 2 1 2 0 5\nexecute if score @s gm4_particle matches 16 run particle minecraft:portal ~ ~ ~ 0 0 0 1 5\nexecute if score @s gm4_particle matches 17 run particle minecraft:enchant ~ ~ ~ 0 0 0 1 5\nexecute if score @s gm4_particle matches 18 run particle minecraft:note ~ ~.5 ~ .2 .2 .2 1 1\n"
  },
  {
    "path": "gm4_particles_pack/data/gm4_particles_pack/guidebook/particles_pack.json",
    "content": "{\n  \"id\": \"particles_pack\",\n  \"name\": \"Particles Pack\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"better_armour_stands\",\n  \"icon\": {\n    \"id\": \"minecraft:armor_stand\"\n  },\n  \"criteria\": {\n    \"modify_armor_stand\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"player\",\n                \"advancements\": {\n                  \"gm4:better_armour_stands\": true\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"modify_armor_stand\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.particles_pack.description\",\n            \"fallback\": \"The following codes will turn the armour stand into an invisible particle emitter:\"\n          },\n          {\n            \"text\": \"\\n\\n- \"\n          },\n          {\n            \"text\": \"autumn\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"autumn\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"blossom\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"blossom\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"spring\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"spring\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"winter\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"winter\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"barrier\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"barrier\"\n            }\n          }\n        ],\n        [\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"bubbles\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"bubbles\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"cloud\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"cloud\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"drip\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"drip\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"enchant\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"enchant\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"ender\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"ender\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"fiesta\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"fiesta\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"fireflies\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"fireflies\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"flame\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"flame\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"growing\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"growing\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"heart\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"heart\"\n            }\n          }\n        ],\n        [\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"lava\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"lava\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"note\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"note\"\n            }\n          },\n          {\n            \"text\": \"\\n- \"\n          },\n          {\n            \"text\": \"ash\",\n            \"hover_event\": {\n              \"action\": \"show_text\",\n              \"value\": [\n                {\n                  \"translate\": \"text.gm4.guidebook.better_armour_stands.copy_code\",\n                  \"fallback\": \"Click to copy\",\n                  \"color\": \"dark_gray\",\n                  \"italic\": true\n                }\n              ]\n            },\n            \"click_event\": {\n              \"action\": \"copy_to_clipboard\",\n              \"value\": \"ash\"\n            }\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_particles_pack/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.particles_pack,\"Fireflies to flames, add some pezazz to your projects! Allows you to turn Armour Stands into particle sources that you control!\"\ntext.gm4.guidebook.particles_pack.description,The following codes will turn the armour stand into an invisible particle emitter:\n"
  },
  {
    "path": "gm4_percurro_shamir/README.md",
    "content": "# Percurro Shamir<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nGet a better hit on your target by being teleported behind it!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- All attacking items (Swords/Axes/Trident/Mace) can have the Shamir applied\r\n- When attacking a target the player is teleported 6 blocks behind the target and the target is made to face the player\r\n- Builds on Gamemode 4's comprehensive extension to enchantments, [Metallurgy]($dynamicLink:gm4_metallurgy)\r\n"
  },
  {
    "path": "gm4_percurro_shamir/assets/translations.csv",
    "content": "key,en_us\nitem.gm4.shamir.percurro,Percurro Shamir\ntext.gm4.guidebook.module_desc.percurro_shamir,Adds the 'Percurro' Shamir to Metallurgy! Weapons with Percurro let you teleport past your enemies in the blink of an eye!\ntext.gm4.guidebook.percurro_shamir.description,Percurro teleports the user behind their target when attacking.\ntext.gm4.guidebook.percurro_shamir.usage,\"The Percurro Shamir is found on Curie's Bismium Bands. It can be placed onto swords, axes, and tridents.\\n\\nAttacking a mob teleports the user up to 6 blocks behind the target, turning to face the target.\"\n"
  },
  {
    "path": "gm4_percurro_shamir/beet.yaml",
    "content": "id: gm4_percurro_shamir\nname: Percurro Shamir\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: ../gm4_metallurgy\n\npipeline:\n  - gm4_metallurgy.shamir_model_template\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_metallurgy: 1.8.0\n    model_data:\n      - item: weapons\n        reference: shamir/percurro\n        template:\n          name: shamir\n          metal: curies_bismium\n          textures_path: gm4_metallurgy:item/shamir/curies_bismium\n    website:\n      description: Adds the 'Percurro' Shamir to Metallurgy! Weapons with Percurro let you teleport past your enemies in the blink of an eye!\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: MrSTch8u\n    wiki: https://wiki.gm4.co/wiki/Metallurgy/Percurro_Shamir\n    credits:\n      Creator:\n        - Bloo\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json",
    "content": "{\n    \"values\": [\n      \"gm4_percurro_shamir:check_item_validity\"\n    ]\n  }\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_metallurgy/tags/function/summon_band/curies_bismium.json",
    "content": "{\n    \"values\":[\n      \"gm4_percurro_shamir:summon_band\"\n    ]\n  }\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/advancement/use.json",
    "content": "{\n  \"rewards\": {\n    \"function\": \"gm4_percurro_shamir:search_destination\"\n  },\n  \"criteria\": {\n    \"hit_entity\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"damage\": {\n          \"source_entity\": {\n            \"equipment\": {\n              \"mainhand\": {\n                \"predicates\": {\n                  \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:'percurro'}}\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_item_validity.mcfunction",
    "content": "#@s = band is trying to apply to\n#run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'percurro'}}] if items entity @s contents #gm4_percurro_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_0.mcfunction",
    "content": "# @s = player hitting a mob with a percurro shamir\n# at ^ ^ ^4\n# run from teleport\n\n# check 1x8x1 cube around target\nexecute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport\nexecute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~1 ~ run function gm4_percurro_shamir:check_teleport_destination/y_1\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_1.mcfunction",
    "content": "# @s = player hitting a mob with a percurro shamir\n# at ^ ^ ^4\n# run from teleport\n\n# check 1x8x1 cube around target\nexecute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport\nexecute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~1 ~ run function gm4_percurro_shamir:check_teleport_destination/y_2\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_2.mcfunction",
    "content": "# @s = player hitting a mob with a percurro shamir\n# at ^ ^ ^4\n# run from teleport\n\n# check 1x8x1 cube around target\nexecute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport\nexecute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~1 ~ run function gm4_percurro_shamir:check_teleport_destination/y_3\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_3.mcfunction",
    "content": "# @s = player hitting a mob with a percurro shamir\n# at ^ ^ ^4\n# run from teleport\n\n# check 1x8x1 cube around target\nexecute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport\nexecute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~1 ~ run function gm4_percurro_shamir:check_teleport_destination/y_4\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_4.mcfunction",
    "content": "# @s = player hitting a mob with a percurro shamir\n# at ^ ^ ^4\n# run from teleport\n\n# check 1x8x1 cube around target\nexecute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport\nexecute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~-5 ~ run function gm4_percurro_shamir:check_teleport_destination/y_n1\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_n1.mcfunction",
    "content": "# @s = player hitting a mob with a percurro shamir\n# at ^ ^ ^4\n# run from teleport\n\n# check 1x8x1 cube around target\nexecute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport\nexecute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~-1 ~ run function gm4_percurro_shamir:check_teleport_destination/y_n2\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_n2.mcfunction",
    "content": "# @s = player hitting a mob with a percurro shamir\n# at ^ ^ ^4\n# run from teleport\n\n# check 1x8x1 cube around target\nexecute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport\nexecute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~-1 ~ run function gm4_percurro_shamir:check_teleport_destination/y_n3\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_n3.mcfunction",
    "content": "# @s = player hitting a mob with a percurro shamir\n# at ^ ^ ^4\n# run from teleport\n\n# check 1x8x1 cube around target\nexecute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport\nexecute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination run playsound minecraft:item.shield.break player @s ~ ~ ~ 0.4 0.4\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/function/init.mcfunction",
    "content": "execute unless score percurro_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Percurro Shamir\"}\nexecute unless score percurro_shamir gm4_earliest_version < percurro_shamir gm4_modules run scoreboard players operation percurro_shamir gm4_earliest_version = percurro_shamir gm4_modules\nscoreboard players set percurro_shamir gm4_modules 1\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/function/search_destination.mcfunction",
    "content": "# @s = player hitting a mob with a percurro shamir\n# at @s\n# run from advancement gm4_percurro_shamir:use\n\n# place temporary departion marker\nsummon minecraft:area_effect_cloud ~ ~ ~ {Tags:[\"gm4_percurro_depart\"],Duration:1,custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\n\n# search for valid destination and teleport\nexecute positioned ^ ^ ^6 run function gm4_percurro_shamir:check_teleport_destination/y_0\n\n# visuals\nparticle minecraft:campfire_cosy_smoke ~ ~ ~ .1 1 .1 0.03 20\n\n# revoke advancement\nadvancement revoke @s only gm4_percurro_shamir:use\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/aluminium via #gm4_metallurgy:summon_band/curies_bismium\n\nloot spawn ~ ~ ~ loot gm4_percurro_shamir:band\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/function/teleport.mcfunction",
    "content": "# @s = player hitting a mob with a percurro shamir\n# at ^ ^ ^4\n# run from any one of the functions in  check_teleport_destination/\n\n# teleport to target coordinate\ntp @s ~ ~ ~\n\n# adjust facing\nexecute at @s facing entity @e[type=area_effect_cloud,tag=gm4_percurro_depart,limit=1] eyes run tp @s ~ ~ ~ ~ ~\n\n# remove marker area_effect_cloud\nkill @e[type=area_effect_cloud,tag=gm4_percurro_depart]\n\n# visuals and sounds\nparticle minecraft:campfire_cosy_smoke ~ ~ ~ .1 1 .1 0.03 3\nplaysound minecraft:entity.illusioner.cast_spell master @s ~ ~ ~ 1 1.2\nplaysound minecraft:entity.illusioner.cast_spell master @a[distance=0.01..6] ~ ~ ~ 1 1\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/guidebook/percurro_shamir.json",
    "content": "{\n  \"id\": \"percurro_shamir\",\n  \"name\": \"Percurro Shamir\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"metallurgy\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_percurro_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'percurro'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_percurro_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'percurro'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.percurro_shamir.description\",\n            \"fallback\": \"Percurro teleports the user behind their target when attacking.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_percurro_shamir\",\n          \"obtain_percurro_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.percurro_shamir.usage\",\n            \"fallback\": \"The Percurro Shamir is found on Curie's Bismium Bands. It can be placed onto swords, axes, and tridents.\\n\\nAttacking a mob teleports the user up to 6 blocks behind the target, turning to face the target.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:curies_bismium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_percurro_shamir:shamir/percurro\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'percurro'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.percurro\",\n                                    \"fallback\": \"Percurro Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/tags/block/valid_destination.json",
    "content": "{\n  \"values\": [\n    \"#gm4:no_collision\",\n    \"#minecraft:fence_gates\",\n    \"#minecraft:fences\",\n    \"#minecraft:leaves\",\n    \"#minecraft:trapdoors\",\n    \"#minecraft:walls\",\n    \"minecraft:brewing_stand\",\n    \"minecraft:cobweb\",\n    \"minecraft:comparator\",\n    \"minecraft:end_rod\",\n    \"minecraft:iron_bars\",\n    \"minecraft:repeater\",\n    \"minecraft:snow\"\n  ]\n}\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:axes\",\n    \"#minecraft:swords\",\n    \"minecraft:mace\",\n    \"minecraft:trident\"\n  ]\n}\n"
  },
  {
    "path": "gm4_percurro_shamir/data/gm4_percurro_shamir/test/attack_player.mcfunction",
    "content": "# @template gm4:test_platform_large\n# @dummy ~1.5 ~1 ~1.5\n# @optional\n\nexecute positioned ~3.5 ~1 ~2.5 run dummy PercurroVictim spawn\nexecute at @s run tp @s ~ ~ ~ facing entity PercurroVictim\nitem replace entity @s weapon.mainhand with iron_sword[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:\"percurro\"}}]\nawait delay 3s\ndummy @s attack PercurroVictim\n\nawait delay 1t\n\nexecute positioned ~6 ~1 ~3 run assert entity @s[dx=1,dy=1,dz=1]\nassert entity @s[y_rotation=110..120,x_rotation=-10..10]\n"
  },
  {
    "path": "gm4_phantom_scarecrows/README.md",
    "content": "# Phantom Scarecrows<!--$headerTitle--><!--$pmc:delete-->\n\nDo you regret that phantoms were added to the game but don't want to change any gamerules? This modular data pack lets you create phantom scarecrows that shoot homing fireqorkd projectiles at nearby phantoms to protect your base! <!--$pmc:headerSize-->\n\n<img src=\"images/phantom_scarecrows.webp\" alt=\"Phantom Scarecrow firing missile\" height=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- Equipping a skull of an undead mob (Skeleton, Zombie or Wither Skeleton) to an armour stand along with a chestplate enchanted with a curse (Vanishing or Binding) will transform the armour stand into a Phantom Scarecrow.\n- When a phantom flies within 25 blocks of the scarecrow, a homing firework will be fired towards the targeted phantom that will kill it in one shot.\n- Adds one new custom advancement for getting struck by a homing phantom missile.\n"
  },
  {
    "path": "gm4_phantom_scarecrows/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.phantom_scarecrows.title,Not so smart defenses\nadvancement.gm4.phantom_scarecrows.description,Get hit by a Phantom Scarecrow\ntext.gm4.guidebook.module_desc.phantom_scarecrows,Set up Scarecrows that shoot homing rockets at Phantoms!\ntext.gm4.guidebook.phantom_scarecrows.creation,Placing a skull or zombie head on an armour stand and equipping it with a cursed chestplate will transform it into a phantom scarecrow.\ntext.gm4.guidebook.phantom_scarecrows.usage,\"Phantom scarecrows will shoot fireworks at phantoms above them.\\n\\nPhantoms shot by these projectiles will instantly die, but if the firework projectile hits a block, it will explode.\"\n"
  },
  {
    "path": "gm4_phantom_scarecrows/beet.yaml",
    "content": "id: gm4_phantom_scarecrows\nname: Phantom Scarecrows\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops:\n        - main\n        - tick\n    model_data:\n      - item: firework_rocket\n        reference: gui/advancement/phantom_scarecrows\n        template: advancement\n    website:\n      description: Set up Scarecrows that shoot homing rockets at Phantoms!\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: OQYrrgEP\n    wiki: https://wiki.gm4.co/wiki/Phantom_Scarecrows\n    credits:\n      Creator:\n        - Bloo\n      Inspired by:\n        - Chopper2112\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_phantom_scarecrows/data/gm4/advancement/phantom_scarecrows.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:firework_rocket\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_phantom_scarecrows:gui/advancement/phantom_scarecrows\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.phantom_scarecrows.title\",\n      \"fallback\": \"Not so smart defenses\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.phantom_scarecrows.description\",\n      \"fallback\": \"Get hit by a Phantom Scarecrow\",\n      \"color\": \"gray\"\n    },\n    \"hidden\": true\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"phantom_scarecrows_hurt\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/aim.mcfunction",
    "content": "# @s = @e[type=area_effect_cloud,tag=gm4_phantom_scarecrow_rocket]\n# at @s\n# ran from pulse_check\n\n#homing\nexecute anchored eyes facing entity @e[type=minecraft:phantom,tag=!smithed.entity,limit=1,sort=nearest] eyes run tp @s ~ ~ ~ ~ ~\nexecute at @s run function gm4_phantom_scarecrows:propulsion\n"
  },
  {
    "path": "gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/create.mcfunction",
    "content": "# @s = armor stand with cursed chestplate\n# at world spawn\n# ran from creation_checks\n\n#initialise scoreboard and add tags\ntag @s add gm4_phantom_scarecrow\ntag @s add gm4_no_edit\ntag @s add smithed.entity\nscoreboard players add @s gm4_ps_time 0\nscoreboard players set @s gm4_entity_version 1\n#lock slots\ndata merge entity @s {Invisible:0b,Invulnerable:0b,DisabledSlots:2039583,ShowArms:1b,Pose:{LeftArm:[346f,0f,274f],RightArm:[350f,0f,85f]}}\n"
  },
  {
    "path": "gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/explode.mcfunction",
    "content": "# @s = @e[type=area_effect_cloud,tag=gm4_phantom_scarecrow_rocket] with phantom within 0.5 blocks\n# at @s\n# ran from propulsion\n\n#generate random color\nexecute store result score color gm4_ps_time run random value 0..2\n\n#explosion\nexecute if score color gm4_ps_time matches 0 run summon minecraft:firework_rocket ~ ~ ~ {Silent:1b,LifeTime:0,FireworksItem:{id:\"minecraft:firework_rocket\",count:1,components:{\"minecraft:fireworks\":{explosions:[{shape:\"small_ball\",has_twinkle:1b,has_trail:0b,colors:[7211016],fade_colors:[3671815]}]}}}}\n\nexecute if score color gm4_ps_time matches 1 run summon minecraft:firework_rocket ~ ~ ~ {Silent:1b,LifeTime:0,FireworksItem:{id:\"minecraft:firework_rocket\",count:1,components:{\"minecraft:fireworks\":{explosions:[{shape:\"small_ball\",has_twinkle:1b,has_trail:0b,colors:[4018687],fade_colors:[7382527]}]}}}}\n\nexecute if score color gm4_ps_time matches 2 run summon minecraft:firework_rocket ~ ~ ~ {Silent:1b,LifeTime:0,FireworksItem:{id:\"minecraft:firework_rocket\",count:1,components:{\"minecraft:fireworks\":{explosions:[{shape:\"small_ball\",has_twinkle:1b,has_trail:0b,colors:[16773153],fade_colors:[15531886]}]}}}}\n\n#advancement\nadvancement grant @a[distance=..3,gamemode=!spectator] only gm4:phantom_scarecrows\n\nkill @e[type=phantom,distance=..0.5,limit=1,sort=nearest]\n#kill other rockets within explosion radius\nkill @e[type=area_effect_cloud,tag=gm4_phantom_scarecrow_rocket,distance=..3]\nkill @s\n"
  },
  {
    "path": "gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_ps_time dummy\nscoreboard objectives add gm4_entity_version dummy\n\nexecute unless score phantom_scarecrows gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Phantom Scarecrows\"}\nexecute unless score phantom_scarecrows gm4_earliest_version < phantom_scarecrows gm4_modules run scoreboard players operation phantom_scarecrows gm4_earliest_version = phantom_scarecrows gm4_modules\nscoreboard players set phantom_scarecrows gm4_modules 1\n\nschedule function gm4_phantom_scarecrows:main 1t\nschedule function gm4_phantom_scarecrows:tick 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/main.mcfunction",
    "content": "#creation\nexecute as @e[type=armor_stand,tag=!smithed.entity,tag=!gm4_phantom_scarecrow] if items entity @s armor.chest *[enchantments~[{enchantments:\"#minecraft:curse\"}]] if items entity @s armor.head #gm4_phantom_scarecrows:skulls run function gm4_phantom_scarecrows:create\n\n#launch cooldown\nscoreboard players add @e[type=armor_stand,tag=gm4_phantom_scarecrow,scores={gm4_ps_time=..4}] gm4_ps_time 1\nexecute as @e[type=armor_stand,tag=gm4_phantom_scarecrow,scores={gm4_ps_time=5..}] at @s positioned ~ ~20 ~ if entity @e[type=phantom,distance=..25] positioned ~ ~-18.5 ~ run function gm4_phantom_scarecrows:shoot\n\nschedule function gm4_phantom_scarecrows:main 16t\n"
  },
  {
    "path": "gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/propulsion.mcfunction",
    "content": "# @s = @e[type=area_effect_cloud,tag=gm4_phantom_scarecrow_rocket]\n# at @s (updated after rotation)\n# ran from aim\n\n#move rocket forwards\ntp ^ ^ ^.8\nparticle firework ~ ~ ~ 0 0 0 0 1 force\nexecute at @s unless block ~ ~ ~ #gm4:no_collision run function gm4_phantom_scarecrows:explode\nexecute at @s if entity @e[type=phantom,tag=!smithed.entity,distance=..0.5] run function gm4_phantom_scarecrows:explode\n"
  },
  {
    "path": "gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/shoot.mcfunction",
    "content": "# @s = @e[type=armor_stand,tag=gm4_phantom_scarecrow,scores={gm4_ps_time=5..}]\n# at @s\n# ran from main\n\nsummon area_effect_cloud ~ ~ ~ {Radius:0.0f,Tags:[\"gm4_phantom_scarecrow_rocket\"],Duration:50,custom_particle:{type:\"minecraft:block\",block_state:{Name:\"minecraft:air\"}}}\nplaysound minecraft:entity.firework_rocket.launch block @a ~ ~ ~ 2 1\nscoreboard players set @s gm4_ps_time 0\n"
  },
  {
    "path": "gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/tick.mcfunction",
    "content": "#controll rockets if any exist\nexecute as @e[type=area_effect_cloud,tag=gm4_phantom_scarecrow_rocket] at @s run function gm4_phantom_scarecrows:aim\n\nschedule function gm4_phantom_scarecrows:tick 1t\n"
  },
  {
    "path": "gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/guidebook/phantom_scarecrows.json",
    "content": "{\n  \"id\": \"phantom_scarecrows\",\n  \"name\": \"Phantom Scarecrows\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:skeleton_skull\"\n  },\n  \"criteria\": {\n    \"obtain_skull\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:skeleton_skull\",\n              \"minecraft:zombie_head\",\n              \"minecraft:wither_skeleton_skull\"\n            ]\n          }\n        ]\n      }\n    },\n    \"find_phantom_scarecrow\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"player\",\n                \"looking_at\": {\n                  \"type\": \"minecraft:armor_stand\",\n                  \"nbt\": \"{Tags:[\\\"gm4_phantom_scarecrow\\\"]}\"\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"creation\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_skull\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.phantom_scarecrows.creation\",\n            \"fallback\": \"Placing a skull or zombie head on an armour stand and equipping it with a cursed chestplate will transform it into a phantom scarecrow.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"find_phantom_scarecrow\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.phantom_scarecrows.usage\",\n            \"fallback\": \"Phantom scarecrows will shoot fireworks at phantoms above them.\\n\\nPhantoms shot by these projectiles will instantly die, but if the firework projectile hits a block, it will explode.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"creation\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/tags/item/skulls.json",
    "content": "{\n  \"values\": [\n    \"minecraft:wither_skeleton_skull\",\n    \"minecraft:skeleton_skull\",\n    \"minecraft:zombie_head\"\n  ]\n}\n"
  },
  {
    "path": "gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/test/kill_phantom.mcfunction",
    "content": "# @template gm4:test_platform_large\n# @timeout 150\n\nsummon armor_stand ~4.5 ~1 ~2.5\nexecute positioned ~4.5 ~1 ~2.5 run item replace entity @e[type=armor_stand,dx=0] armor.chest with minecraft:iron_chestplate[enchantments={binding_curse:1}]\nexecute positioned ~4.5 ~1 ~2.5 run item replace entity @e[type=armor_stand,dx=0] armor.head with minecraft:wither_skeleton_skull\n\nawait delay 1s\n\nassert entity @e[type=armor_stand,tag=gm4_phantom_scarecrow] inside\n\nsummon phantom ~6.5 ~2.5 ~1.5 {Tags:[gm4_test_phantom]}\n\nawait not entity @e[type=phantom,tag=gm4_test_phantom,distance=..20]\n"
  },
  {
    "path": "gm4_pig_tractors/README.md",
    "content": "# Pig Tractors<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nPig are great at eating food, so they should be great at farming.<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Pigs when driven over fully grown crops will harvest and replant them with available seeds\r\n- Holding a hoe will till the soil below the pig.\r\n- Tilling soil using a pig has a chance to pull up items such as mushrooms or golden apples.\r\n"
  },
  {
    "path": "gm4_pig_tractors/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.pig_tractors.title,Oink Tractors\nadvancement.gm4.pig_tractors.description,Till some ground by holding a hoe on a Pig Tractor!\ntext.gm4.guidebook.module_desc.pig_tractors,\"Ride pigs through fields to quickly harvest and plant crops! Who knows, maybe you will even dig up some useful things in the process.\"\ntext.gm4.guidebook.pig_tractors.tilling,\"Riding a pig while holding a hoe will till grass, dirt, or coarse dirt below the pig, with a chance to drop some loot.\"\ntext.gm4.guidebook.pig_tractors.harvesting,\"Driving over crops with a Pig Tractor will harvest them.\\n\\nIf the farmer has seeds or crops in their inventory, the crops will be automatically replanted.\"\ntext.gm4.guidebook.pig_tractors.planting_on_empty,\"Driving over empty farmland will plant any crops in the farmer's inventory, prioritizing crops in hand.\"\n"
  },
  {
    "path": "gm4_pig_tractors/beet.yaml",
    "content": "id: gm4_pig_tractors\nname: Pig Tractors\nversion: 1.9.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    website:\n      description: Ride pigs through fields to quickly harvest and plant crops! Who knows, maybe you will even dig up some useful things in the process.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: 8lN3MtcQ\n    model_data:\n      - item: saddle\n        reference: gui/advancement/pig_tractors\n        template: advancement\n    video: https://www.youtube.com/watch?v=7i0WFHUfBXs\n    wiki: https://wiki.gm4.co/wiki/Pig_Tractors\n    credits:\n      Creator:\n        - Bloo\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4/advancement/pig_tractors.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"saddle\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_pig_tractors:gui/advancement/pig_tractors\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.pig_tractors.title\",\n      \"fallback\": \"Oink Tractors\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.pig_tractors.description\",\n      \"fallback\": \"Till some ground by holding a hoe on a Pig Tractor!\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"ride_pig_tractor\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/advancement/block_detection/air.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:tick\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:any_of\",\n                        \"terms\": [\n                            {\n                                \"condition\": \"minecraft:entity_properties\",\n                                \"entity\": \"this\",\n                                \"predicate\": {\n                                    \"equipment\": {\n                                        \"mainhand\": {\n                                            \"items\": \"#gm4_pig_tractors:hoes\"\n                                        }\n                                    }\n                                }\n                            },\n                            {\n                                \"condition\": \"minecraft:entity_properties\",\n                                \"entity\": \"this\",\n                                \"predicate\": {\n                                    \"equipment\": {\n                                        \"offhand\": {\n                                            \"items\": \"#gm4_pig_tractors:hoes\"\n                                        }\n                                    }\n                                }\n                            }\n                        ]\n                    },\n                    {\n                        \"condition\": \"minecraft:reference\",\n                        \"name\": \"gm4_pig_tractors:player/vehicle/pig/in_air\"\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_pig_tractors:till/select_position\"\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/advancement/block_detection/beetroots.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:enter_block\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:reference\",\n                        \"name\": \"gm4_pig_tractors:player/vehicle/pig/in_farmland\"\n                    }\n                ],\n                \"block\": \"minecraft:beetroots\",\n                \"state\": {\n                    \"age\": \"3\"\n                }\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_pig_tractors:harvest/beetroots\"\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/advancement/block_detection/carrots.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:enter_block\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:reference\",\n                        \"name\": \"gm4_pig_tractors:player/vehicle/pig/in_farmland\"\n                    }\n                ],\n                \"block\": \"minecraft:carrots\",\n                \"state\": {\n                    \"age\": \"7\"\n                }\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_pig_tractors:harvest/carrots\"\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/advancement/block_detection/empty_farmland.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:tick\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:reference\",\n                        \"name\": \"gm4_pig_tractors:player/vehicle/pig/in_farmland\"\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_pig_tractors:harvest/empty_farmland\"\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/advancement/block_detection/potatoes.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:enter_block\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:reference\",\n                        \"name\": \"gm4_pig_tractors:player/vehicle/pig/in_farmland\"\n                    }\n                ],\n                \"block\": \"minecraft:potatoes\",\n                \"state\": {\n                    \"age\": \"7\"\n                }\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_pig_tractors:harvest/potatoes\"\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/advancement/block_detection/wheat.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:enter_block\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:reference\",\n                        \"name\": \"gm4_pig_tractors:player/vehicle/pig/in_farmland\"\n                    }\n                ],\n                \"block\": \"minecraft:wheat\",\n                \"state\": {\n                    \"age\": \"7\"\n                }\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_pig_tractors:harvest/wheat\"\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/beetroots.mcfunction",
    "content": "# Confirms the block type and selects it for harvesting\n# @s = player on a pig tractor on farmland\n# at @s\n# run from advancement gm4_pig_tractors:block_detection/beetroots\n\n# revoke\nadvancement revoke @s only gm4_pig_tractors:block_detection/beetroots\n\n# check for targeted block\nexecute align xyz positioned ~0.5 ~ ~0.5 if block ~ ~ ~ minecraft:beetroots[age=3] run function gm4_pig_tractors:harvest/block/beetroots\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/block/beetroots.mcfunction",
    "content": "# Harvests beetroot and tries to replant it\n# @s = player on a pig tractor on farmland\n# at @s\n# run from advancement gm4_pig_tractors:block_detection/beetroots\n\n# destroy crop\nsetblock ~ ~ ~ air destroy\n\n# item magnet\nfunction gm4_pig_tractors:utility/item_magnet\n\n# try to replant beetroot if the player isn't holding a seed\nscoreboard players set $planted_successfully gm4_pig_tractors 0\nexecute unless predicate gm4_pig_tractors:player/equipment/holding_seeds run function gm4_pig_tractors:plant/item/beetroot_seeds\n\n# plant other crop if beetroot seed planting failed\nexecute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/select_type\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/block/carrots.mcfunction",
    "content": "# Harvests carrots and tries to replant it\n# @s = player on a pig tractor on farmland\n# at @s\n# run from advancement gm4_pig_tractors:block_detection/carrots\n\n# destroy crop\nsetblock ~ ~ ~ air destroy\n\n# item magnet\nfunction gm4_pig_tractors:utility/item_magnet\n\n# try to replant carrot if the player isn't holding a seed\nscoreboard players set $planted_successfully gm4_pig_tractors 0\nexecute unless predicate gm4_pig_tractors:player/equipment/holding_seeds run function gm4_pig_tractors:plant/item/carrot\n\n# plant other crop if carrot planting failed\nexecute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/select_type\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/block/potatoes.mcfunction",
    "content": "# Harvests potato and tries to replant it\n# @s = player on a pig tractor on farmland\n# at @s\n# run from advancement gm4_pig_tractors:block_detection/potatoes\n\n# destroy crop\nsetblock ~ ~ ~ air destroy\n\n# item magnet\nfunction gm4_pig_tractors:utility/item_magnet\n\n# try to replant potato if the player isn't holding a seed\nscoreboard players set $planted_successfully gm4_pig_tractors 0\nexecute unless predicate gm4_pig_tractors:player/equipment/holding_seeds run function gm4_pig_tractors:plant/item/potato\n\n# plant other crop if potato planting failed\nexecute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/select_type\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/block/wheat.mcfunction",
    "content": "# Harvests wheat and tries to replant it\n# @s = player on a pig tractor on farmland\n# at @s\n# run from advancement gm4_pig_tractors:block_detection/wheat\n\n# destroy crop\nsetblock ~ ~ ~ air destroy\n\n# item magnet\nfunction gm4_pig_tractors:utility/item_magnet\n\n# try to replant wheat seeds if the player isn't holding a seed\nscoreboard players set $planted_successfully gm4_pig_tractors 0\nexecute unless predicate gm4_pig_tractors:player/equipment/holding_seeds run function gm4_pig_tractors:plant/item/wheat_seeds\n\n# plant other crop if wheat seed planting failed\nexecute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/select_type\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/carrots.mcfunction",
    "content": "# Confirms the block type and selects it for harvesting\n# @s = player on a pig tractor on farmland\n# at @s\n# run from advancement gm4_pig_tractors:block_detection/carrots\n\n# revoke\nadvancement revoke @s only gm4_pig_tractors:block_detection/carrots\n\n# check for targeted block\nexecute align xyz positioned ~0.5 ~ ~0.5 if block ~ ~ ~ minecraft:carrots[age=7] run function gm4_pig_tractors:harvest/block/carrots\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/empty_farmland.mcfunction",
    "content": "# Confirms the block type and selects it for harvesting\n# @s = player on a pig tractor on farmland\n# at @s\n# run from advancement gm4_pig_tractors:block_detection/empty_farmland\n\n# revoke\nadvancement revoke @s only gm4_pig_tractors:block_detection/empty_farmland\n\n# place fresh crop\nexecute align xyz positioned ~0.5 ~ ~0.5 if block ~ ~ ~ #gm4_pig_tractors:replaceable run function gm4_pig_tractors:plant/select_type"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/potatoes.mcfunction",
    "content": "# Confirms the block type and selects it for harvesting\n# @s = player on a pig tractor on farmland\n# at @s\n# run from advancement gm4_pig_tractors:block_detection/potatoes\n\n# revoke\nadvancement revoke @s only gm4_pig_tractors:block_detection/potatoes\n\n# check for targeted block\nexecute align xyz positioned ~0.5 ~ ~0.5 if block ~ ~ ~ minecraft:potatoes[age=7] run function gm4_pig_tractors:harvest/block/potatoes\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/wheat.mcfunction",
    "content": "# Confirms the block type and selects it for harvesting\n# @s = player on a pig tractor on farmland\n# at @s\n# run from advancement gm4_pig_tractors:block_detection/wheat\n\n# revoke\nadvancement revoke @s only gm4_pig_tractors:block_detection/wheat\n\n# check for targeted block\nexecute align xyz positioned ~0.5 ~ ~0.5 if block ~ ~ ~ minecraft:wheat[age=7] run function gm4_pig_tractors:harvest/block/wheat\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/init.mcfunction",
    "content": "execute unless score pig_tractors gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Pig Tractors\"}\nexecute unless score pig_tractors gm4_earliest_version < pig_tractors gm4_modules run scoreboard players operation pig_tractors gm4_earliest_version = pig_tractors gm4_modules\nscoreboard players set pig_tractors gm4_modules 1\n\nscoreboard objectives add gm4_pig_tractors dummy\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/plant/block/beetroots.mcfunction",
    "content": "# places a beetroot plant\n# @s = player requesting beetroot planting\n# at item planting location\n# run from gm4_pig_tractors:plant/item/beetroot_seeds\n\n# place block\nsetblock ~ ~ ~ beetroots destroy\n\n# sound\nplaysound minecraft:block.grass.place block @a[distance=..9] ~ ~ ~ 0.6 0.6\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/plant/block/carrots.mcfunction",
    "content": "# places a carrot plant\n# @s = player requesting carrot planting\n# at item planting location\n# run from gm4_pig_tractors:plant/item/carrot\n\n# place block\nsetblock ~ ~ ~ carrots destroy\n\n# sound\nplaysound minecraft:block.grass.place block @a[distance=..9] ~ ~ ~ 0.6 0.6\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/plant/block/potatoes.mcfunction",
    "content": "# places a potato plant\n# @s = player requesting potato planting\n# at item planting location\n# run from gm4_pig_tractors:plant/item/potato\n\n# place block\nsetblock ~ ~ ~ potatoes destroy\n\n# sound\nplaysound minecraft:block.grass.place block @a[distance=..9] ~ ~ ~ 0.6 0.6\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/plant/block/wheat.mcfunction",
    "content": "# places a wheat plant\n# @s = player requesting wheat planting\n# at item planting location\n# run from gm4_pig_tractors:plant/item/wheat_seeds\n\n# place block\nsetblock ~ ~ ~ wheat destroy\n\n# sound\nplaysound minecraft:block.grass.place block @a[distance=..9] ~ ~ ~ 0.6 0.6\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/plant/item/beetroot_seeds.mcfunction",
    "content": "# uses beetroot from the players inventory and plants it\n# @s = player requesting beetroot planting\n# at item planting location\n# run from gm4_pig_tractors:plant/use_mainhand_seeds and gm4_pig_tractors:plant/use_offhand_seeds and gm4_pig_tractors:plant/use_predefined_order and gm4_pig_tractors:harvest/block/\n# sets fake player flag $planted_successfully in gm4_pig_tractors to 1 if planting was successful, to 0 otherwise\n\n# remove seed from player\nexecute if entity @s[gamemode=!creative] store success score $planted_successfully gm4_pig_tractors run clear @s beetroot_seeds 1\nexecute if entity @s[gamemode=creative] store success score $planted_successfully gm4_pig_tractors run clear @s beetroot_seeds 0\n\n# plant if player had seed\nexecute if score $planted_successfully gm4_pig_tractors matches 1 run function gm4_pig_tractors:plant/block/beetroots\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/plant/item/carrot.mcfunction",
    "content": "# uses carrot from the players inventory and plants it\n# @s = player requesting carrot planting\n# at item planting location\n# run from gm4_pig_tractors:plant/use_mainhand_seeds and gm4_pig_tractors:plant/use_offhand_seeds and gm4_pig_tractors:plant/use_predefined_order and gm4_pig_tractors:harvest/block/\n# sets fake player flag $planted_successfully in gm4_pig_tractors to 1 if planting was successful, to 0 otherwise\n\n# remove seed from player\nexecute if entity @s[gamemode=!creative] store success score $planted_successfully gm4_pig_tractors run clear @s carrot 1\nexecute if entity @s[gamemode=creative] store success score $planted_successfully gm4_pig_tractors run clear @s carrot 0\n\n# plant if player had seed\nexecute if score $planted_successfully gm4_pig_tractors matches 1 run function gm4_pig_tractors:plant/block/carrots\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/plant/item/potato.mcfunction",
    "content": "# uses potato from the players inventory and plants it\n# @s = player requesting potato planting\n# at item planting location\n# run from gm4_pig_tractors:plant/use_mainhand_seeds and gm4_pig_tractors:plant/use_offhand_seeds and gm4_pig_tractors:plant/use_predefined_order and gm4_pig_tractors:harvest/block/\n# sets fake player flag $planted_successfully in gm4_pig_tractors to 1 if planting was successful, to 0 otherwise\n\n# remove seed from player\nexecute if entity @s[gamemode=!creative] store success score $planted_successfully gm4_pig_tractors run clear @s potato 1\nexecute if entity @s[gamemode=creative] store success score $planted_successfully gm4_pig_tractors run clear @s potato 0\n\n# plant if player had seed\nexecute if score $planted_successfully gm4_pig_tractors matches 1 run function gm4_pig_tractors:plant/block/potatoes\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/plant/item/wheat_seeds.mcfunction",
    "content": "# uses wheat from the players inventory and plants it\n# @s = player requesting wheat planting\n# at item planting location\n# run from gm4_pig_tractors:plant/use_mainhand_seeds and gm4_pig_tractors:plant/use_offhand_seeds and gm4_pig_tractors:plant/use_predefined_order and gm4_pig_tractors:harvest/block/\n# sets fake player flag $planted_successfully in gm4_pig_tractors to 1 if planting was successful, to 0 otherwise\n\n# remove seed from player\nexecute if entity @s[gamemode=!creative] store success score $planted_successfully gm4_pig_tractors run clear @s wheat_seeds 1\nexecute if entity @s[gamemode=creative] store success score $planted_successfully gm4_pig_tractors run clear @s wheat_seeds 0\n\n# plant if player had seed\nexecute if score $planted_successfully gm4_pig_tractors matches 1 run function gm4_pig_tractors:plant/block/wheat\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/plant/select_type.mcfunction",
    "content": "# Decides which seed to use upon replanting\n# @s = player on a pig tractor\n# at planting location of seed\n# run from functions in gm4_pig_tractors:till/blocks/\n\n# fake player for if-else\nscoreboard players set $pulled_seeds gm4_pig_tractors 0\n\n# check if player is holding seeds in mainhand\nexecute if predicate gm4_pig_tractors:player/equipment/mainhand/seeds run function gm4_pig_tractors:plant/use_mainhand_seeds\n\n# check if player is holding seeds in offhand\nexecute if score $pulled_seeds gm4_pig_tractors matches 0 if predicate gm4_pig_tractors:player/equipment/offhand/seeds run function gm4_pig_tractors:plant/use_offhand_seeds\n\n# otherwise, use predefined order\nexecute if score $pulled_seeds gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/use_predefined_order\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/plant/use_mainhand_seeds.mcfunction",
    "content": "# reads item id from mainhand and plants seeds depending on type\n# @s = player on pig tractor queued for replanting\n# at location of seeds to be planted\n# run from gm4_pig_tractors:plant/select_type\n\n# test type\nexecute if predicate gm4_pig_tractors:player/equipment/mainhand/beetroot_seeds run function gm4_pig_tractors:plant/item/beetroot_seeds\nexecute if predicate gm4_pig_tractors:player/equipment/mainhand/carrot run function gm4_pig_tractors:plant/item/carrot\nexecute if predicate gm4_pig_tractors:player/equipment/mainhand/potato run function gm4_pig_tractors:plant/item/potato\nexecute if predicate gm4_pig_tractors:player/equipment/mainhand/wheat_seeds run function gm4_pig_tractors:plant/item/wheat_seeds\n\n# set fake player\nscoreboard players set $pulled_seeds gm4_pig_tractors 1\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/plant/use_offhand_seeds.mcfunction",
    "content": "# reads item id from offhand and plants seeds depending on type\n# @s = player on pig tractor queued for replanting\n# at location of seeds to be planted\n# run from gm4_pig_tractors:plant/select_type\n\n# test type\nexecute if predicate gm4_pig_tractors:player/equipment/offhand/beetroot_seeds run function gm4_pig_tractors:plant/item/beetroot_seeds\nexecute if predicate gm4_pig_tractors:player/equipment/offhand/carrot run function gm4_pig_tractors:plant/item/carrot\nexecute if predicate gm4_pig_tractors:player/equipment/offhand/potato run function gm4_pig_tractors:plant/item/potato\nexecute if predicate gm4_pig_tractors:player/equipment/offhand/wheat_seeds run function gm4_pig_tractors:plant/item/wheat_seeds\n\n# set fake player\nscoreboard players set $pulled_seeds gm4_pig_tractors 1\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/plant/use_predefined_order.mcfunction",
    "content": "# tries to use seed from the inventory using a alphabetical order\n# @s = player on pig tractor queued for replanting\n# at location of seeds to be planted\n# run from gm4_pig_tractors:plant/select_type\n\nfunction gm4_pig_tractors:plant/item/beetroot_seeds\nexecute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/item/carrot\nexecute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/item/potato\nexecute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/item/wheat_seeds\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/till/block/coarse_dirt.mcfunction",
    "content": "# Applies a tilling action to coarse_dirt\n# @s = player on a pig tractor\n# at block being tilled\n# run from gm4_pig_tractors:till/select_type\n\n# place new block\nsetblock ~ ~ ~ farmland[moisture=7] replace\n\n# chance to spawn additional loot\nloot spawn ~ ~1 ~ loot gm4_pig_tractors:till/coarse_dirt\n\n# item magnet\nfunction gm4_pig_tractors:utility/item_magnet\n\n# sound\nplaysound minecraft:item.hoe.till player @s ~ ~ ~ 0.8 1\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/till/block/dirt.mcfunction",
    "content": "# Applies a tilling action to dirt\n# @s = player on a pig tractor\n# at block being tilled\n# run from gm4_pig_tractors:till/select_type\n\n# place new block\nsetblock ~ ~ ~ farmland[moisture=7] replace\n\n# chance to spawn additional loot\nloot spawn ~ ~1 ~ loot gm4_pig_tractors:till/dirt\n\n# item magnet\nfunction gm4_pig_tractors:utility/item_magnet\n\n# sound\nplaysound minecraft:item.hoe.till player @s ~ ~ ~ 0.8 1\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/till/block/grass_block.mcfunction",
    "content": "# Applies a tilling action to grass_block\n# @s = player on a pig tractor\n# at block being tilled\n# run from gm4_pig_tractors:till/select_type\n\n# place new block\nsetblock ~ ~ ~ farmland[moisture=7] replace\n\n# chance to spawn additional loot\nloot spawn ~ ~1 ~ loot gm4_pig_tractors:till/grass_block\n\n# item magnet\nfunction gm4_pig_tractors:utility/item_magnet\n\n# sound\nplaysound minecraft:item.hoe.till player @s ~ ~ ~ 0.8 1\n\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/till/select_position.mcfunction",
    "content": "# Selects a block to be tilled and tills it\n# @s = player on a pig tractor in a replaceable block\n# at @s\n# run from advancement gm4_pig_tractors:block_detection/air\n\n# revoke\nadvancement revoke @s only gm4_pig_tractors:block_detection/air\n\n# check for targeted block\nexecute align xyz positioned ~0.5 ~-1 ~0.5 if block ~ ~ ~ #gm4_pig_tractors:tillable if block ~ ~1 ~ #gm4_pig_tractors:replaceable run function gm4_pig_tractors:till/select_type\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/till/select_type.mcfunction",
    "content": "# Decides what to do when tilling a block\n# @s = player on a pig tractor\n# at block below the pig, aligned to block center in xz and block bottom in z\n# run from gm4_pig_tractors:till/select_position\n\n# destroy top block (this is a replaceable block, by function call)\nsetblock ~ ~1 ~ air destroy\n\n# dirt\nexecute if block ~ ~ ~ dirt run function gm4_pig_tractors:till/block/dirt\n\n# grass\nexecute if block ~ ~ ~ grass_block run function gm4_pig_tractors:till/block/grass_block\n\n# coarse dirt\nexecute if block ~ ~ ~ coarse_dirt run function gm4_pig_tractors:till/block/coarse_dirt\n\n# award advancement\nadvancement grant @s only gm4:pig_tractors\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/function/utility/item_magnet.mcfunction",
    "content": "# Teleports nearby items to the player\n# @s = player on a pig tractor that has just harvested somthing\n# at @s\n# run from functions in gm4_pig_tractors:harvest/block/ and gm4_pig_tractors:till/block/\n\n# search items\ntag @e[type=item,distance=..3] add gm4_pig_tractors_item\n\n# decrease pickup delay\nexecute as @e[type=item,tag=gm4_pig_tractors_item] run data modify entity @s PickupDelay set value 0\n\n# teleport items\ntp @e[type=item,tag=gm4_pig_tractors_item] @s\n\n# detag\ntag @e[type=item] remove gm4_pig_tractors_item\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/guidebook/pig_tractors.json",
    "content": "{\n  \"id\": \"pig_tractors\",\n  \"name\": \"Pig Tractors\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:iron_hoe\"\n  },\n  \"criteria\": {\n    \"ride_pig\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"vehicle\": {\n                \"type\": \"minecraft:pig\"\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"vehicle\": {\n                  \"type\": \"minecraft:pig\",\n                  \"nbt\": \"{NoAI:1b}\"\n                }\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"till_soil\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"player\",\n                \"advancements\": {\n                  \"gm4:pig_tractors\": true\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"ride_pig\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.pig_tractors.tilling\",\n            \"fallback\": \"Riding a pig while holding a hoe will till grass, dirt, or coarse dirt below the pig, with a chance to drop some loot.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"till_soil\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.pig_tractors.harvesting\",\n            \"fallback\": \"Driving over crops with a Pig Tractor will harvest them.\\n\\nIf the farmer has seeds or crops in their inventory, the crops will be automatically replanted.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.pig_tractors.planting_on_empty\",\n            \"fallback\": \"Driving over empty farmland will plant any crops in the farmer's inventory, prioritizing crops in hand.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"description\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/loot_table/till/coarse_dirt.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 50,\n                    \"name\": \"minecraft:bone\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 200,\n                    \"name\": \"minecraft:clay_ball\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": 1\n                        },\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": {\n                                \"type\": \"minecraft:binomial\",\n                                \"n\": 3,\n                                \"p\": 0.87\n                            },\n                            \"add\": true\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 300,\n                    \"name\": \"minecraft:gravel\"\n                },\n                {\n                    \"type\": \"minecraft:empty\",\n                    \"weight\": 3000\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/loot_table/till/dirt.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 110,\n                    \"name\": \"minecraft:bone\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 110,\n                    \"name\": \"minecraft:red_mushroom\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 180,\n                    \"name\": \"minecraft:brown_mushroom\"\n                },\n                {\n                    \"type\": \"minecraft:empty\",\n                    \"weight\": 3000\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/loot_table/till/grass_block.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 4,\n                    \"name\": \"minecraft:golden_apple\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 8,\n                    \"name\": \"minecraft:golden_carrot\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 12,\n                    \"name\": \"minecraft:beetroot\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 12,\n                    \"name\": \"minecraft:carrot\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 12,\n                    \"name\": \"minecraft:poisonous_potato\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 12,\n                    \"name\": \"minecraft:potato\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 50,\n                    \"name\": \"minecraft:bone\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 50,\n                    \"name\": \"minecraft:red_mushroom\"\n                },\n                {\n                    \"type\": \"minecraft:item\",\n                    \"weight\": 260,\n                    \"name\": \"minecraft:brown_mushroom\"\n                },\n                {\n                    \"type\": \"minecraft:empty\",\n                    \"weight\": 3000\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/holding_seeds.json",
    "content": "{\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n        {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_pig_tractors:player/equipment/mainhand/seeds\"\n        },\n        {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_pig_tractors:player/equipment/offhand/seeds\"\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/mainhand/beetroot_seeds.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"mainhand\": {\n                \"items\": [\n                    \"minecraft:beetroot_seeds\"\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/mainhand/carrot.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"mainhand\": {\n                \"items\": [\n                    \"minecraft:carrot\"\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/mainhand/potato.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"mainhand\": {\n                \"items\": [\n                    \"minecraft:potato\"\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/mainhand/seeds.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"mainhand\": {\n                \"items\": \"#gm4_pig_tractors:seeds\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/mainhand/wheat_seeds.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"mainhand\": {\n                \"items\": [\n                    \"minecraft:wheat_seeds\"\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/offhand/beetroot_seeds.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"offhand\": {\n                \"items\": [\n                    \"minecraft:beetroot_seeds\"\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/offhand/carrot.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"offhand\": {\n                \"items\": [\n                    \"minecraft:carrot\"\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/offhand/potato.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"offhand\": {\n                \"items\": [\n                    \"minecraft:potato\"\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/offhand/seeds.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"offhand\": {\n                \"items\": \"#gm4_pig_tractors:seeds\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/offhand/wheat_seeds.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"offhand\": {\n                \"items\": [\n                    \"minecraft:wheat_seeds\"\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/vehicle/pig/in_air.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n      \"vehicle\": {\n        \"type\": \"minecraft:pig\",\n        \"location\": {\n          \"block\": {\n            \"blocks\": \"#gm4_pig_tractors:replaceable\"\n          }\n        }\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:inverted\",\n    \"term\": {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"vehicle\": {\n          \"nbt\": \"{Tags:[\\\"smithed.entity\\\"]}\"\n        }\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/vehicle/pig/in_farmland.json",
    "content": "[\n    {\n        \"condition\": \"minecraft:entity_properties\",\n        \"entity\": \"this\",\n        \"predicate\": {\n            \"vehicle\": {\n                \"type\": \"minecraft:pig\",\n                \"location\": {\n                    \"block\": {\n                        \"blocks\": [\n                            \"minecraft:farmland\"\n                        ]\n                    }\n                }\n            }\n        }\n    },\n    {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n                \"vehicle\": {\n                    \"nbt\": \"{Tags:[\\\"smithed.entity\\\"]}\"\n                }\n            }\n        }\n    }\n]\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/tags/block/replaceable.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:air\",\n        \"#gm4:foliage\"\n    ]\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/tags/block/tillable.json",
    "content": "{\n    \"values\": [\n        \"minecraft:coarse_dirt\",\n        \"minecraft:dirt\",\n        \"minecraft:grass_block\"\n    ]\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/tags/item/hoes.json",
    "content": "{\n    \"values\": [\n        \"minecraft:diamond_hoe\",\n        \"minecraft:golden_hoe\",\n        \"minecraft:iron_hoe\",\n        \"minecraft:netherite_hoe\",\n        \"minecraft:stone_hoe\",\n        \"minecraft:wooden_hoe\"\n    ]\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/tags/item/seeds.json",
    "content": "{\n    \"values\": [\n        \"minecraft:beetroot_seeds\",\n        \"minecraft:carrot\",\n        \"minecraft:potato\",\n        \"minecraft:wheat_seeds\"\n    ]\n}\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/test/harvest_carrots.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1.5 ~1 ~0.5\n\nsetblock ~1 ~ ~1 farmland\nsetblock ~1 ~1 ~1 carrots[age=7]\nsummon pig ~1.5 ~1 ~1.5 {equipment:{saddle:{id:\"minecraft:saddle\"}}}\ndummy @s use entity @e[type=pig,distance=..4,limit=1]\n\nawait block ~1 ~1 ~1 carrots[age=0]\nassert items entity @s container.* minecraft:carrot\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/test/plant_carrots.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1.5 ~1 ~0.5\n\nsetblock ~1 ~ ~1 farmland\nsummon pig ~1.5 ~1 ~1.5 {equipment:{saddle:{id:\"minecraft:saddle\"}}}\ndummy @s use entity @e[type=pig,distance=..4,limit=1]\ngive @s carrot\n\nawait not items entity @s container.* minecraft:carrot\nassert block ~1 ~1 ~1 carrots[age=0]\n"
  },
  {
    "path": "gm4_pig_tractors/data/gm4_pig_tractors/test/till_soil.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1.5 ~1 ~0.5\n\nsetblock ~1 ~ ~1 grass_block\nsummon pig ~1.5 ~1 ~1.5\nitem replace entity @s weapon.mainhand with saddle\ndummy @s use entity @e[type=pig,distance=..4,limit=1]\ndummy @s use entity @e[type=pig,distance=..4,limit=1]\nitem replace entity @s weapon.offhand with iron_hoe\n\nawait block ~1 ~ ~1 farmland\n"
  },
  {
    "path": "gm4_podzol_rooting_soil/README.md",
    "content": "# Podzol Rooting Soil<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nAllow your saplings to... plant themselves!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Any sapling now will auto-plant when on Podzol for a while\r\n- The time taken for a sapling to be rooted in soil is random and affected by random tick speed\r\n- Can be used to improve tree farm automation\r\n"
  },
  {
    "path": "gm4_podzol_rooting_soil/beet.yaml",
    "content": "id: gm4_podzol_rooting_soil\nname: Podzol Rooting Soil\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    schedule_loops: [main]\n    website:\n      description: Allows saplings to self-plant when on Podzol. The perfect choice for auto-treefarms!\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: keFbZ5iO\n    wiki: https://wiki.gm4.co/wiki/Podzol_Rooting_Soil\n    credits:\n      Creator:\n        - Bloo\n      Updated by:\n        - Misode\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/function/init.mcfunction",
    "content": "# init\nscoreboard objectives add gm4_podzol_data dummy\nscoreboard players set #100 gm4_podzol_data 100\nscoreboard players set #200 gm4_podzol_data 200\n\n# base\nexecute unless score podzol_rooting_soil gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Podzol Rooting Soil\"}\nexecute unless score podzol_rooting_soil gm4_earliest_version < podzol_rooting_soil gm4_modules run scoreboard players operation podzol_rooting_soil gm4_earliest_version = podzol_rooting_soil gm4_modules\nscoreboard players set podzol_rooting_soil gm4_modules 1\n\nschedule function gm4_podzol_rooting_soil:main 10t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/function/main.mcfunction",
    "content": "# function loops on a 20-second (400t or 0.05Hz) cycle\nschedule function gm4_podzol_rooting_soil:main 400t\n\n# query random tick speed\nexecute store result score random_tick_speed gm4_podzol_data run gamerule random_tick_speed\n\n# prepare lööp\nscoreboard players add last_uuid gm4_podzol_data 11\nscoreboard players operation last_uuid gm4_podzol_data %= #200 gm4_podzol_data\n\n# get sapling items\nexecute as @e[type=item,predicate=gm4_podzol_rooting_soil:plantable_on_ground] at @s run function gm4_podzol_rooting_soil:process_item\n"
  },
  {
    "path": "gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/function/place_block.mcfunction",
    "content": "# macro function with $(id) being the item/block id of the sapling\n# run from plant\n\n$setblock ~ ~ ~ $(id) destroy\n"
  },
  {
    "path": "gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/function/plant.mcfunction",
    "content": "# @s = sapling item on podzol and within air-like block that has passed the randomizer\n# at @s\n# called from gm4_podzol_rooting_soil:process_item\n\n# place sapling block\nfunction gm4_podzol_rooting_soil:place_block with entity @s Item\n\n# plant custom sapling\nexecute if items entity @s contents *[custom_data~{gm4_podzol_rooting_soil:{}}] run function #gm4_podzol_rooting_soil:plant_custom_sapling\n\n# sounds and visuals\nexecute align xyz positioned ~.5 ~.5 ~.5 run particle minecraft:happy_villager ~ ~ ~ .3 .3 .3 1 10 normal\nplaysound minecraft:block.chorus_flower.grow block @a[distance=..6] ~ ~ ~ 0.2 0.8\n\n# remove sapling item\nitem modify entity @s contents {function:\"minecraft:set_count\",count:-1,add:true}\n"
  },
  {
    "path": "gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/function/process_item.mcfunction",
    "content": "# @s = sapling item\n# at world spawn\n# called from gm4_podzol_rooting_soil:main\n\n# get own uuid into scoreboard and scale into range\nexecute store result score current_uuid gm4_podzol_data run data get entity @s UUID[0]\nscoreboard players operation current_uuid gm4_podzol_data %= #100 gm4_podzol_data\n\n# copy into target and shift by random_tick_speed\nscoreboard players operation compared_value gm4_podzol_data = current_uuid gm4_podzol_data\nscoreboard players operation compared_value gm4_podzol_data *= random_tick_speed gm4_podzol_data\n\n# compare\nexecute if score compared_value gm4_podzol_data >= last_uuid gm4_podzol_data at @s if block ~ ~-1 ~ minecraft:podzol if block ~ ~ ~ #gm4_podzol_rooting_soil:sapling_replaceable run function gm4_podzol_rooting_soil:plant\n\n# force plant if about to despawn and if the previous randomizer test failed\nexecute store result score age gm4_podzol_data run data get entity @s Age\nexecute unless score compared_value gm4_podzol_data >= last_uuid gm4_podzol_data if score age gm4_podzol_data matches 5399.. at @s if block ~ ~-1 ~ minecraft:podzol if block ~ ~ ~ #gm4_podzol_rooting_soil:sapling_replaceable run function gm4_podzol_rooting_soil:plant\n\n# clean up\nscoreboard players operation last_uuid gm4_podzol_data += current_uuid gm4_podzol_data\nscoreboard players operation last_uuid gm4_podzol_data %= #200 gm4_podzol_data\nscoreboard players reset compared_value gm4_podzol_data\nscoreboard players reset current_uuid gm4_podzol_data\nscoreboard players reset age gm4_podzol_data\n"
  },
  {
    "path": "gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/guidebook/podzol_rooting_soil.json",
    "content": "{\n  \"id\": \"podzol_rooting_soil\",\n  \"name\": \"Podzol Rooting Soil\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:spruce_sapling\"\n  },\n  \"criteria\": {\n    \"obtain_sapling\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:saplings\"\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_sapling\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.podzol_rooting_soil.description\",\n            \"fallback\": \"Saplings dropped on podzol will replant themselves over time.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/predicate/plantable_on_ground.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"flags\": {\n      \"is_on_ground\": true\n    },\n    \"slots\": {\n      \"contents\": {\n        \"items\": \"#gm4_podzol_rooting_soil:plantable\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/tags/block/sapling_replaceable.json",
    "content": "{\n    \"values\": [\n        \"#gm4:replaceable\",\n        \"#gm4:foliage\"\n    ]\n}\n"
  },
  {
    "path": "gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/tags/function/plant_custom_sapling.json",
    "content": "{\n  \"values\":[]\n}\n"
  },
  {
    "path": "gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/tags/item/plantable.json",
    "content": "{\n  \"values\": [\n    \"minecraft:acacia_sapling\",\n    \"minecraft:birch_sapling\",\n    \"minecraft:cherry_sapling\",\n    \"minecraft:dark_oak_sapling\",\n    \"minecraft:jungle_sapling\",\n    \"minecraft:mangrove_propagule\",\n    \"minecraft:oak_sapling\",\n    \"minecraft:pale_oak_sapling\",\n    \"minecraft:spruce_sapling\"\n  ]\n}\n"
  },
  {
    "path": "gm4_podzol_rooting_soil/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.podzol_rooting_soil,Allows saplings to self-plant when on Podzol. The perfect choice for auto-treefarms!\ntext.gm4.guidebook.podzol_rooting_soil.description,Saplings dropped on podzol will replant themselves over time.\n"
  },
  {
    "path": "gm4_potion_liquids/README.md",
    "content": "# Potion Liquids<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nAllows you store compactly store your potions in a Liquid Tank.<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Extends the features of the Gamemode 4 [Liquid Tanks]($dynamicLink:gm4_liquid_tanks) data pack\r\n- Allows potions in a Liquid Tank and interactions from using the tank\r\n- An unextended potion will fill 1/3 a bucket. An extended potion will fill 1 bucket.\r\n- Allows the \"Milking\" of Shulkers for floating and Witches for a variety of potions\r\n\r\nRead the [Wiki](https://wiki.gm4.co/Liquid_Tanks/Potion_Liquids) for more interactions.\r\n"
  },
  {
    "path": "gm4_potion_liquids/beet.yaml",
    "content": "id: gm4_potion_liquids\nname: Potion Liquids\nversion: 1.10.X\n\ndata_pack:\n  load: .\n\nrequire:\n  - bolt\n\npipeline:\n  - gm4_liquid_tanks.override_formatting\n  - gm4_liquid_tanks.bolt_liquid_wrappers\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_brewing\n\nmeta:\n  bolt:\n    entrypoint: \n      - gm4_potion_liquids:main\n  gm4:\n    versioning:\n      required:\n        gm4_liquid_tanks: 3.1.0\n        lib_brewing: 1.5.0\n    model_data:\n      - item: potion\n        reference: gui/advancement/potion_liquids\n        template: advancement\n    website:\n      description: Adds the ability to store potions in Liquid Tanks! You can also use a potion by walking beneath a potion-filled Liquid Tank.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: Z08l0oKH\n    video: https://www.youtube.com/watch?v=qa9lcbii1BE\n    wiki: https://wiki.gm4.co/wiki/Liquid_Tanks/Potion_Liquids\n    credits:\n      Creator:\n        - SpecialBuilder32\n      Updated by:\n        - SpecialBuilder32\n      Textures by:\n        - Vilder50\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4/advancement/potion_liquids.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"potion\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_potion_liquids:gui/advancement/potion_liquids\"]},\n        \"minecraft:potion_contents\": {\n          \"custom_color\": 13631487\n        }\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.potion_liquids.title\",\n      \"fallback\": \"Fizzy Lifting Drink\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.potion_liquids.description\",\n      \"fallback\": \"Come on in, the air's fine\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:liquid_tanks_create\",\n  \"criteria\": {\n    \"consume_floating_potion\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_potion_liquids:{potion:'floating'}}\"\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_brewing/tags/function/insert/lingering.json",
    "content": "{\n    \"values\": [\n        \"gm4_potion_liquids:brewing_stand/lingering\"\n    ]\n}\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_brewing/tags/function/insert/splash.json",
    "content": "{\n    \"values\": [\n        \"gm4_potion_liquids:brewing_stand/splash\"\n    ]\n}\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_liquid_tanks/tags/function/util_above.json",
    "content": "{\n    \"values\":[\n      \"gm4_potion_liquids:util_above\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/function/brewing_stand/lingering.mcfunction",
    "content": "# @s = brewing stand marker with a custom splash potion to be converted to a lingering potion\n# run from #gm4_brewing:insert/lingering\n\nloot spawn ~ ~ ~ loot gm4_potion_liquids:technical/brewing_stand/lingering\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/function/brewing_stand/splash.mcfunction",
    "content": "# @s = brewing stand marker with a custom potion to be converted to a splash potion\n# run from #gm4_brewing:insert/splash\n\nloot spawn ~ ~ ~ loot gm4_potion_liquids:technical/brewing_stand/splash\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/function/init.mcfunction",
    "content": "execute unless score potion_liquids gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Potion Liquids\"}\nexecute unless score potion_liquids gm4_earliest_version < potion_liquids gm4_modules run scoreboard players operation potion_liquids gm4_earliest_version = potion_liquids gm4_modules\nscoreboard players set potion_liquids gm4_modules 1\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/function/util/random_witch_init.mcfunction",
    "content": "#@s = liquid tank to be initialized to random potion\n#run from potion_liquids:util/witch\n\nexecute store result score $random_witch_init gm4_lt_util run random value 0..3\n\nexecute if score $random_witch_init gm4_lt_util matches 0 run function gm4_potion_liquids:liquid_init/regeneration\nexecute if score $random_witch_init gm4_lt_util matches 1 run function gm4_potion_liquids:liquid_init/swiftness\nexecute if score $random_witch_init gm4_lt_util matches 2 run function gm4_potion_liquids:liquid_init/fire_resistance\nexecute if score $random_witch_init gm4_lt_util matches 3 run function gm4_potion_liquids:liquid_init/harming\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/function/util/shulker.mcfunction",
    "content": "#@s = shulker above liquid tank\n#run from potion_liquids:util_above\n\nscoreboard players add @s gm4_lt_util 1\n\n#init empty tanks\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_potion_liquids:liquid_init/floating\n\n#add potion to tank\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_floating,distance=..8] if score @s gm4_lt_value matches ..299 run scoreboard players add @s gm4_lt_value 1\n\n#reset score after 5 mins\nexecute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/function/util/witch.mcfunction",
    "content": "#@s = witch above liquid tank\n#run from potion_liquids:util_above\n\nscoreboard players add @s gm4_lt_util 1\n\n#init empty tanks to random potion\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_potion_liquids:util/random_witch_init\n\n#add potion to tank\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_regeneration,distance=..8] if score @s gm4_lt_value matches ..29 run scoreboard players add @s gm4_lt_value 1\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_swiftness,distance=..8] if score @s gm4_lt_value matches ..29 run scoreboard players add @s gm4_lt_value 1\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_fire_resistance,distance=..8] if score @s gm4_lt_value matches ..29 run scoreboard players add @s gm4_lt_value 1\nexecute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_harming,distance=..8] if score @s gm4_lt_value matches ..29 run scoreboard players add @s gm4_lt_value 1\n\n#reset score after 5 mins\nexecute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/function/util_above.mcfunction",
    "content": "# @s = tank with entity above it positioned ~ ~1 ~\n# run from liquid_tanks:process via #gm4_liquid_tanks:util_above\n\ntag @s add gm4_processing_tank\n\n# shulker\nexecute as @e[dx=0,type=shulker,tag=!smithed.entity] run function gm4_potion_liquids:util/shulker\n\n# witch\nexecute as @e[dx=0,type=witch,tag=!smithed.entity] run function gm4_potion_liquids:util/witch\n\ntag @s remove gm4_processing_tank\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/guidebook/potion_liquids.json",
    "content": "{\n  \"id\": \"potion_liquids\",\n  \"name\": \"Potion Liquids\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"liquid_tanks\",\n  \"icon\": {\n    \"id\": \"minecraft:potion\",\n    \"components\": {\n      \"minecraft:potion_contents\": \"minecraft:swiftness\"\n    }\n  },\n  \"criteria\": {\n    \"obtain_liquid_tank\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"liquid_tank\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_potion\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:potion\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_liquid_tank\"\n        ],\n        [\n          \"obtain_potion\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.potion_liquids.description\",\n            \"fallback\": \"Potions can be stored in liquid tanks; extended potions count as a three potions.\\n\\nPotions can be taken out by putting a bottle in the tank, but tanks will not output extended potions.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.potion_liquids.mob_effects_and_shulkers\",\n            \"fallback\": \"Mobs under a potion tank will gain the potion effect from that tank.\\n\\nShulkers on an empty or levitation potion tank will fill it with Levitation potion liquid.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.potion_liquids.witches\",\n            \"fallback\": \"Witches on an empty tank will fill it with Regeneration, Fire Resistance, Speed, or Instant Damage potion liquid.\\n\\nThey will also fill pre-existing potion tanks with those four potions.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/loot_table/floating_potion.json",
    "content": "{\n    \"type\": \"generic\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"potion\",\n                    \"functions\": [\n                        {\n                            \"function\": \"set_components\",\n                            \"components\": {\n                                \"minecraft:potion_contents\": {\n                                    \"custom_color\": 13631487,\n                                    \"custom_effects\": [\n                                        {\n                                            \"id\": \"minecraft:levitation\",\n                                            \"amplifier\": 2,\n                                            \"duration\": 900\n                                        }\n                                    ]\n                                }\n                            }\n                        },\n                        {\n                            \"function\": \"set_custom_data\",\n                            \"tag\": \"{gm4_potion_liquids:{potion:'floating'}}\"\n                        },\n                        {\n                            \"function\": \"set_name\",\n                            \"target\": \"custom_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.floating_potion\",\n                                \"fallback\": \"Potion of Floating\",\n                                \"italic\": false\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/loot_table/lingering_floating_potion.json",
    "content": "{\n    \"type\": \"generic\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"lingering_potion\",\n                    \"functions\": [\n                        {\n                            \"function\": \"set_components\",\n                            \"components\": {\n                                \"minecraft:potion_contents\": {\n                                    \"custom_color\": 13631487,\n                                    \"custom_effects\": [\n                                        {\n                                            \"id\": \"minecraft:levitation\",\n                                            \"amplifier\": 2,\n                                            \"duration\": 225\n                                        }\n                                    ]\n                                },\n                                \"minecraft:tooltip_display\": {\n                                    \"hidden_components\": [\n                                        \"minecraft:potion_contents\"\n                                    ]\n                                }\n                            }\n                        },\n                        {\n                            \"function\": \"set_custom_data\",\n                            \"tag\": \"{gm4_potion_liquids:{potion:'floating'}}\"\n                        },\n                        {\n                            \"function\": \"set_name\",\n                            \"target\": \"custom_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.lingering_floating_potion\",\n                                \"fallback\": \"Lingering Potion of Floating\",\n                                \"italic\": false\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                [\n                                    {\n                                        \"translate\": \"potion.withDuration\",\n                                        \"with\": [\n                                            {\n                                                \"translate\": \"potion.withAmplifier\",\n                                                \"with\": [\n                                                    {\n                                                        \"translate\": \"effect.minecraft.levitation\"\n                                                    },\n                                                    {\n                                                        \"translate\": \"potion.potency.2\"\n                                                    }\n                                                ]\n                                            },\n                                            \"0:11\"\n                                        ],\n                                        \"color\": \"red\",\n                                        \"italic\": false\n                                    }\n                                ]\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/loot_table/splash_floating_potion.json",
    "content": "{\n    \"type\": \"generic\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"item\",\n                    \"name\": \"splash_potion\",\n                    \"functions\": [\n                        {\n                            \"function\": \"set_components\",\n                            \"components\": {\n                                \"minecraft:potion_contents\": {\n                                    \"custom_color\": 13631487,\n                                    \"custom_effects\": [\n                                        {\n                                            \"id\": \"minecraft:levitation\",\n                                            \"amplifier\": 2,\n                                            \"duration\": 900\n                                        }\n                                    ]\n                                }\n                            }\n                        },\n                        {\n                            \"function\": \"set_custom_data\",\n                            \"tag\": \"{gm4_potion_liquids:{potion:'floating'}}\"\n                        },\n                        {\n                            \"function\": \"set_name\",\n                            \"target\": \"custom_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.splash_floating_potion\",\n                                \"fallback\": \"Splash Potion of Floating\",\n                                \"italic\": false\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/loot_table/technical/brewing_stand/lingering.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:alternatives\",\n                    \"children\": [\n                        {\n                            \"type\": \"minecraft:loot_table\",\n                            \"value\": \"gm4_potion_liquids:lingering_floating_potion\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:entity_properties\",\n                                    \"entity\": \"this\",\n                                    \"predicate\": {\n                                        \"nbt\": \"{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{gm4_potion_liquids:{potion:'floating'}}}}}}}\"\n                                    }\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"functions\": [\n                {\n                    \"function\": \"minecraft:set_custom_data\",\n                    \"tag\": \"{gm4_custom_potion:1b}\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/loot_table/technical/brewing_stand/splash.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:alternatives\",\n                    \"children\": [\n                        {\n                            \"type\": \"minecraft:loot_table\",\n                            \"value\": \"gm4_potion_liquids:splash_floating_potion\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:entity_properties\",\n                                    \"entity\": \"this\",\n                                    \"predicate\": {\n                                        \"nbt\": \"{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{gm4_potion_liquids:{potion:'floating'}}}}}}}\"\n                                    }\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"functions\": [\n                {\n                    \"function\": \"minecraft:set_custom_data\",\n                    \"tag\": \"{gm4_custom_potion:1b}\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_potion_liquids/data/gm4_potion_liquids/modules/main.bolt",
    "content": "from gm4_liquid_tanks:liquid_wrappers import Liquid\nfrom functools import partial\nfrom gm4.plugins.player_heads import Skin\nimport numpy as np\nfrom PIL import Image, ImageChops, ImageColor\n\npotion_liquid = Liquid(capacity=300)\nbase_potion = potion_liquid.standard_unit('glass_bottle', 1, f_name=\"base_potion\")\npotion_liquid.standard_unit('glass_bottle', 3, f_name=\"long_potion\") # register standard unit\nlong_potion = partial(potion_liquid.item_drain, output='glass_bottle', value=3) # long potions cannot be filled\n\nfrom beet import JsonFile\neffect_colors = JsonFile(source_path=\"gm4_potion_liquids/effect_colors.json\").data\n\nclass_defs = {}\n\nuntinted_skin = Skin(source_path=\"gm4_potion_liquids/untint_skin.png\")\n\nfrom csv import DictReader\nwith open(\"gm4_potion_liquids/potion_definitions.csv\", \"r\") as csvfile:\n    potion_def_reader = DictReader(csvfile)\n    for row in potion_def_reader:\n        if row[\"potion_id\"] in (\"water\"):\n            continue # skip this potion type\n        \n        class_key = (row[\"effect_id\"], row[\"effect_amplifier\"])\n        if row[\"effect_id\"]==\"\": # effect-less potions each get their own tank type\n            class_key = (row[\"potion_id\"])\n        # setup new liquid type if necessary and add to the dict\n        if class_key not in class_defs:\n            # @potion_liquid # we execute the class decorator later after setting up all the bolt stuff\n            class PotionLiquidClass:\n                id = row[\"potion_id\"].removeprefix(\"long_\")\n                name = row[\"potion_id\"].removeprefix(\"long_\").replace(\"_\",\" \").title()+\" Potion\"\n\n                _generators = []\n            if row[\"potion_id\"].startswith(\"strong\"):\n                PotionLiquidClass.skin = \"liquids/\"+row[\"potion_id\"].removeprefix(\"strong_\")\n\n            potion_liquid.struc = PotionLiquidClass # programatically going around the decorators is odd,\n                                                    # so we manually set this here so the handler \n                                                    # knows the right classdef to put mcfunction into\n            potion_liquid.init()\n\n            class_defs[class_key] = PotionLiquidClass\n        this_potion_class = class_defs[class_key]\n        potion_liquid.struc = this_potion_class\n\n        # add this potion to the liquid type\n        if row[\"potion_id\"].startswith(\"long\"):\n            this_potion_unit = long_potion\n        else:\n            this_potion_unit = base_potion\n        this_potion_unit(f\"minecraft:potion[potion_contents={{potion:\\\"{row['potion_id']}\\\"}}]\")\n\n        # add this potion's util_below feature\n        if not row[\"potion_id\"].startswith(\"long\") and not row[\"effect_id\"]==\"\":\n            def dispense_potion(row):\n                effects = row[\"effect_id\"].split(\"+\")\n                amplifiers = map(int, row[\"effect_amplifier\"].split(\"+\"))\n                inline_predicate = {\n                    \"condition\":\"minecraft:entity_properties\",\n                    \"entity\":\"this\",\n                    \"predicate\":{\n                        \"effects\":{}\n                        # {   e:{} for e in effects  } # dict comprehension not supported by bolt\n                    }\n                }\n                for e in effects:\n                    inline_predicate[\"predicate\"][\"effects\"][e] = {}\n\n                m, s = row[\"effect_duration\"].split(\":\")\n                duration = max(int(m)*60 + round(float(s)), 1)\n                execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0]\n                    unless entity @s[gamemode=spectator]\n                    unless predicate inline_predicate\n                    run function f\"gm4_potion_liquids:util/dispense/{row[\"potion_id\"]}\":\n                        for e, a in zip(effects, amplifiers):\n                            effect give @s e duration (a-1)\n                        scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1\n                        playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\n            potion_liquid.util_below(partial(dispense_potion, row))\n        \n        # create this potion's skin texture if needed\n        skin_id = this_potion_class.id.removeprefix(\"strong_\").removeprefix(\"long_\")\n        if skin_id not in ctx.data[\"gm4_potion_liquids\"][Skin].generate_tree()[\"liquids\"]:\n            # compute the potion color for any mixed potions (a weighted average of their colors)\n            tint_colors = np.empty(shape=(3,0))\n            for effect_id in row[\"effect_id\"].split(\"+\"):\n                rgb = np.array(ImageColor.getrgb(effect_colors[effect_id][0])).reshape((-1,1))\n                tint_colors = np.append(tint_colors, rgb, axis=1)\n            tint_weights = list(map(int, row[\"effect_amplifier\"].split(\"+\")))\n            tint_color = tuple(map(int, np.average(tint_colors, weights=tint_weights, axis=1)))\n            # print('#%02x%02x%02x' % tint_color)\n\n            tint_image = Image.new(\"RGBA\", untinted_skin.image.size, tint_color)\n            ctx.data[f\"gm4_potion_liquids:liquids/{skin_id}\"] = Skin(ImageChops.multiply(tint_image, untinted_skin.image))\n\n# apply the liquid tanks decorator wrapper\nfor liquid_class in class_defs.values():\n    potion_liquid(liquid_class)\n\n\n# Potions added by this module\npotion_liquid.struc = Liquid # return decorator to normal operation\n@potion_liquid\nclass FloatingPotion:\n    id = \"floating\"\n    name = \"Floating Potion\"\n\n    potion_liquid.init()\n    @base_potion(\"minecraft:potion[custom_data~{gm4_potion_liquids:{potion:'floating'}}]\")\n    def floating_potion():\n        loot replace entity 344d47-4-4-4-f04ce104d weapon.mainhand loot gm4_potion_liquids:floating_potion\n\n    @potion_liquid.util_below\n    def dispense_float_potion():\n        execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0]\n            unless entity @s[gamemode=spectator]\n            unless predicate {\n                    \"condition\":\"minecraft:entity_properties\",\n                    \"entity\":\"this\",\n                    \"predicate\":{\"effects\":{\"levitation\":{}}}\n                }\n            run function gm4_potion_liquids:util/dispense/floating:\n                effect give @s levitation 45 2\n                scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1\n                playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\n"
  },
  {
    "path": "gm4_potion_liquids/effect_colors.json",
    "content": "{\n    \"\": [\"#385DC6\", 3694022],\n    \"absorption\": [\"#2552A5\", 2445989],\n    \"bad_omen\": [\"#0B6138\", 745784],\n    \"blindness\": [\"#1F1F23\", 2039587],\n    \"conduit_power\": [\"#1DC2D1\", 1950417],\n    \"darkness\": [\"#292721\", 2696993],\n    \"dolphins_grace\": [\"#88A3BE\", 8954814],\n    \"fire_resistance\": [\"#FF9900\", 16750848],\n    \"glowing\": [\"#94A061\", 9740385],\n    \"haste\": [\"#D9C043\", 14270531],\n    \"health_boost\": [\"#F87D23\", 16284963],\n    \"hero_of_the_village\": [\"#44FF44\", 4521796],\n    \"hunger\": [\"#587653\", 5797459],\n    \"infested\": [\"#8C9B8C\", 9214860],\n    \"instant_damage\": [\"#A9656A\", 11101546],\n    \"instant_health\": [\"#F82423\", 16262179],\n    \"invisibility\": [\"#F6F6F6\", 16185078],\n    \"jump_boost\": [\"#FDFF84\", 16646020],\n    \"levitation\": [\"#CEFFFF\", 13565951],\n    \"luck\": [\"#59C106\", 5882118],\n    \"mining_fatigue\": [\"#4A4217\", 4866583],\n    \"nausea\": [\"#551D4A\", 5578058],\n    \"night_vision\": [\"#C2FF66\", 12779366],\n    \"oozing\": [\"#99FFA3\", 10092451],\n    \"poison\": [\"#87A363\" ,8889187],\n    \"raid_omen\": [\"#DE4058\", 14565464],\n    \"regeneration\": [\"#CD5CAB\", 13458603],\n    \"resistance\": [\"#9146F0\", 9520880],\n    \"saturation\": [\"#F82423\", 16262179],\n    \"slow_falling\": [\"#F3CFB9\", 15978425],\n    \"slowness\": [\"#8BAFE0\", 9154528],\n    \"speed\": [\"#33EBFF\", 3402751],\n    \"strength\": [\"#FFC700\", 16762624],\n    \"trial_omen\": [\"#16A6A6\", 1484454],\n    \"unluck\": [\"#C0A44D\", 12624973],\n    \"water_breathing\": [\"#98DAC0\", 10017472],\n    \"weakness\": [\"#484D48\", 4738376],\n    \"weaving\": [\"#78695A\", 7891290],\n    \"wind_charged\": [\"#BDC9FF\", 12438015],\n    \"wither\": [\"#736156\", 7561558]\n}\n \n"
  },
  {
    "path": "gm4_potion_liquids/potion_definitions.csv",
    "content": "potion_id,\"effect_id\",\"effect_amplifier\",\"effect_duration\"\nawkward,,1,\nfire_resistance,fire_resistance,1,3:00\nharming,instant_damage,1,0:00\nhealing,instant_health,1,0:00\ninfested,infested,1,3:00\ninvisibility,invisibility,1,3:00\nleaping,jump_boost,1,3:00\nlong_fire_resistance,fire_resistance,1,8:00\nlong_invisibility,invisibility,1,8:00\nlong_leaping,jump_boost,1,8:00\nlong_night_vision,night_vision,1,8:00\nlong_poison,poison,1,1:30\nlong_regeneration,regeneration,1,1:30\nlong_slow_falling,slow_falling,1,4:00\nlong_slowness,slowness,1,4:00\nlong_strength,strength,1,8:00\nlong_swiftness,speed,1,8:00\nlong_turtle_master,slowness+resistance,4+3,0:40\nlong_water_breathing,water_breathing,1,8:00\nlong_weakness,weakness,1,4:00\nluck,luck,1,5:00\nmundane,,1,\nnight_vision,night_vision,1,3:00\noozing,oozing,1,3:00\npoison,poison,1,0:45\nregeneration,regeneration,1,0:45\nslow_falling,slow_falling,1,1:30\nslowness,slowness,1,1:30\nstrength,strength,1,3:00\nstrong_harming,instant_damage,2,0:00\nstrong_healing,instant_health,2,0:00\nstrong_leaping,jump_boost,2,1:30\nstrong_poison,poison,2,0:21.6\nstrong_regeneration,regeneration,2,0:22.5\nstrong_slowness,slowness,4,0:20\nstrong_strength,strength,2,1:30\nstrong_swiftness,speed,2,1:30\nstrong_turtle_master,slowness+resistance,5+4,0:20\nswiftness,speed,1,3:00\nthick,,1,\nturtle_master,slowness+resistance,4+3,0:20\nwater,,1,\nwater_breathing,water_breathing,1,3:00\nweakness,weakness,1,1:30\nweaving,weaving,1,3:00\nwind_charged,wind_charged,1,3:00\n"
  },
  {
    "path": "gm4_potion_liquids/translations.csv",
    "content": "key,en_us\nadvancement.gm4.potion_liquids.description,\"Come on in, the air's fine\"\nadvancement.gm4.potion_liquids.title,Fizzy Lifting Drink\ncontainer.gm4.liquid_tank.fire_resistance,Fire Resistance Potion Tank\ncontainer.gm4.liquid_tank.floating,Floating Potion Tank\ncontainer.gm4.liquid_tank.harming,Harming Potion Tank\ncontainer.gm4.liquid_tank.healing,Healing Potion Tank\ncontainer.gm4.liquid_tank.invisibility,Invisibility Potion Tank\ncontainer.gm4.liquid_tank.leaping,Leaping Potion Tank\ncontainer.gm4.liquid_tank.luck,Luck Potion Tank\ncontainer.gm4.liquid_tank.night_vision,Night Vision Potion Tank\ncontainer.gm4.liquid_tank.poison,Poison Potion Tank\ncontainer.gm4.liquid_tank.regeneration,Regeneration Potion Tank\ncontainer.gm4.liquid_tank.slow_falling,Slow Falling Potion Tank\ncontainer.gm4.liquid_tank.slowness,Slowness Potion Tank\ncontainer.gm4.liquid_tank.strength,Strength Potion Tank\ncontainer.gm4.liquid_tank.strong_harming,Strong Harming Potion Tank\ncontainer.gm4.liquid_tank.strong_healing,Strong Healing Potion Tank\ncontainer.gm4.liquid_tank.strong_leaping,Strong Leaping Potion Tank\ncontainer.gm4.liquid_tank.strong_turtle_master,Strong Turtle Master Potion Tank\ncontainer.gm4.liquid_tank.strong_poison,Strong Poison Potion Tank\ncontainer.gm4.liquid_tank.strong_regeneration,Strong Regeneration Potion Tank\ncontainer.gm4.liquid_tank.strong_slowness,Strong Slowness Potion Tank\ncontainer.gm4.liquid_tank.strong_strength,Strong Strength Potion Tank\ncontainer.gm4.liquid_tank.strong_swiftness,Strong Swiftness Potion Tank\ncontainer.gm4.liquid_tank.swiftness,Swiftness Potion Tank\ncontainer.gm4.liquid_tank.turtle_master,Turtle Master Potion Tank\ncontainer.gm4.liquid_tank.water_breathing,Water Breathing Potion Tank\ncontainer.gm4.liquid_tank.weakness,Weakness Potion Tank\nitem.gm4.floating_potion,Potion of Floating\nitem.gm4.lingering_floating_potion,Lingering Potion of Floating\nitem.gm4.splash_floating_potion,Splash Potion of Floating\ntext.gm4.guidebook.module_desc.potion_liquids,Adds the ability to store potions in Liquid Tanks! You can also use a potion by walking beneath a potion-filled Liquid Tank.\ntext.gm4.guidebook.potion_liquids.description,\"Potions can be stored in liquid tanks; extended potions count as a three potions.\\n\\nPotions can be taken out by putting a bottle in the tank, but tanks will not output extended potions.\"\ntext.gm4.guidebook.potion_liquids.mob_effects_and_shulkers,Mobs under a potion tank will gain the potion effect from that tank.\\n\\nShulkers on an empty or levitation potion tank will fill it with Levitation potion liquid.\ntext.gm4.guidebook.potion_liquids.witches,\"Witches on an empty tank will fill it with Regeneration, Fire Resistance, Speed, or Instant Damage potion liquid.\\n\\nThey will also fill pre-existing potion tanks with those four potions.\"\ncontainer.gm4.liquid_tank.awkward,Awkward Potion Tank\ncontainer.gm4.liquid_tank.infested,Infested Potion Tank\ncontainer.gm4.liquid_tank.mundane,Mundane Potion Tank\ncontainer.gm4.liquid_tank.oozing,Oozing Potion Tank\ncontainer.gm4.liquid_tank.thick,Thick Potion Tank\ncontainer.gm4.liquid_tank.weaving,Weaving Potion Tank\ncontainer.gm4.liquid_tank.wind_charged,Wind Charged Potion Tank\n"
  },
  {
    "path": "gm4_reeling_rods/README.md",
    "content": "# Reeling Rods<!--$headerTitle--><!--$pmc:delete-->\n\nReel in more than just fish with these rods. Yoink the chest from the chest boat, deal some damage, and more! <!--$pmc:headerSize-->\n\n<img src=\"images/reeling_rods.webp\" alt=\"A player using Reeling on a Chest Minecart, a Sheep, and an Enderman\" width=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- All fishing rods have extra abilities when hooking Paintings, Item Frames, Leash Knots, Shulkers and End Crystals. Hooking any entity will also dismount them from their vehicle.\n\nAdds 2 fishing rod enchantments, Reeling and Barbed.\n- Reeling revolves around stealing from entities. Pull the chest from chest boats and so much more!\n- Barbed turns a fishing rod into a lethal weapon. With 5 levels, it applies a scratching damage to the hooked mob and then bleeding damage.\n"
  },
  {
    "path": "gm4_reeling_rods/beet.yaml",
    "content": "id: gm4_reeling_rods\nname: Reeling Rods\nversion: 1.1.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - generate_files\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_hooked_entity\n\nrequire:\n  - bolt\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_hooked_entity: 1.0.0\n    website:\n      description: Steal Villager's wares, scratch up your foes! Fishing rods have never been more useful!\n      recommended: \n        - gm4_end_fishing\n        - gm4_live_catch\n      notes: []\n      search_keywords: \n        - barbed\n        - fishing\n        - enchantment\n    modrinth:\n      project_id: MWPuloVL\n    smithed:\n      pack_id: gm4_reeling_rods\n    planetminecraft:\n      uid: 6733043\n    wiki: https://wiki.gm4.co/wiki/Reeling_Rods\n    credits:\n      Creators:\n        - runcows\n        - Bloo\n      Icon Design:\n        - runcows\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_hooked_entity/tags/function/on_hooked_entity.json",
    "content": "{\n  \"values\": [\n    \"gm4_reeling_rods:hooked_entity/select_type\"\n  ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_hooked_entity/tags/function/pre_hook_on_player.json",
    "content": "{\n  \"values\": [\n    \"gm4_reeling_rods:get_player_data\"\n  ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json",
    "content": "{\n    \"description\": {\n        \"translate\": \"gm4.reeling_rods.enchantment.barbed\",\n        \"fallback\": \"Barbed\"\n    },\n    \"exclusive_set\": \"gm4_reeling_rods:reeling\",\n    \"supported_items\": \"minecraft:fishing_rod\",\n    \"primary_items\": \"minecraft:fishing_rod\",\n    \"weight\": 1,\n    \"max_level\": 5,\n    \"min_cost\": {\n        \"base\": 1,\n        \"per_level_above_first\": 10\n    },\n    \"max_cost\": {\n        \"base\": 51,\n        \"per_level_above_first\": 10\n    },\n    \"anvil_cost\": 1,\n    \"slots\": [\n        \"any\"\n    ],\n    \"effects\": {}\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json",
    "content": "{\n    \"description\": {\n        \"translate\": \"gm4.reeling_rods.enchantment.reeling\",\n        \"fallback\": \"Reeling\"\n    },\n    \"exclusive_set\": \"gm4_reeling_rods:barbed\",\n    \"supported_items\": \"minecraft:fishing_rod\",\n    \"primary_items\": \"minecraft:fishing_rod\",\n    \"weight\": 1,\n    \"max_level\": 1,\n    \"min_cost\": {\n        \"base\": 20,\n        \"per_level_above_first\": 0\n    },\n    \"max_cost\": {\n        \"base\": 70,\n        \"per_level_above_first\": 0\n    },\n    \"anvil_cost\": 8,\n    \"slots\": [\n        \"any\"\n    ],\n    \"effects\": {}\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction",
    "content": "# Applies the barbed damage to the hooked entity\n# @s = hooked entity\n# at bobber position\n# with {damage}\n# run from hooked_entity/select_type\n\n# immediate damage (amount scales with enchantment level)\nexecute store result score $show_death_messages gm4_reeling_rods.barbed_damage_timer run gamerule show_death_messages\ngamerule show_death_messages false\n$damage @s $(damage) cactus by @p[tag=gm4_hooked_entity.player]\nplaysound minecraft:entity.player.attack.crit player @a[distance=..16] ~ ~ ~ 1 1.82\n\n# handle death (@e only selects entities which are alive)\n# | this is of importance for entities which display death messages or re-spawn\ntag @s add gm4_reeling_rods.victim\nexecute if entity @s[type=#gm4_reeling_rods:support_death_message] at @s unless entity @e[type=#gm4_reeling_rods:support_death_message,tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_scratch_death\n\n# if the victim is still alive, schedule bleeding damage\nexecute at @s if entity @e[tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/schedule_bleeding\n\n# reset scores, gamerule and tag\ntag @s remove gm4_reeling_rods.victim\nexecute if score $show_death_messages gm4_reeling_rods.barbed_damage_timer matches 1 run gamerule show_death_messages true\nscoreboard players reset $show_death_messages gm4_reeling_rods.barbed_damage_timer\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/bleed.mcfunction",
    "content": "# updates the bleeding timer\n# @s = entity recently hit by a barbed fishing rod\n# at @s\n# run from barbed/find_affected\n\n# advance timer\nscoreboard players add @s gm4_reeling_rods.barbed_damage_timer 1\n\n# clear if timer exceeds 3s\nexecute if score @s gm4_reeling_rods.barbed_damage_timer matches 61.. run return run function gm4_reeling_rods:barbed/clear\n\n# return unless phase of timer is 0\nscoreboard players operation $phase gm4_reeling_rods.barbed_damage_timer = @s gm4_reeling_rods.barbed_damage_timer\nscoreboard players operation $phase gm4_reeling_rods.barbed_damage_timer %= @s gm4_reeling_rods.barbed_damage_period\nexecute unless score $phase gm4_reeling_rods.barbed_damage_timer matches 0 run return fail\n\n# find attacker \n# | tags attacker with gm4_reeling_rods.barbed_attacker\n# | sets $found_attacker gm4_reeling_rods.barbed_attacker_uuid0\nexecute summon snowball run function gm4_reeling_rods:barbed/find_attacker\n\n# prepare to handle player death\nexecute store result score $show_death_messages gm4_reeling_rods.barbed_damage_timer run gamerule show_death_messages\ngamerule show_death_messages false\n\n# apply damage\n# | if the attacker was found, attribute it to the attacker, if not do not attribute it to anyone\n# | use cactus damage type as it has no knockback and respects armor\n# | print custom death message to obscure cactus death message\nexecute if score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 matches 1.. run damage @s 2 cactus by @p[tag=gm4_reeling_rods.barbed_attacker]\nexecute unless score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 matches 1.. run damage @s 2 cactus\nplaysound minecraft:block.pointed_dripstone.drip_lava neutral @a[distance=..6] ~ ~ ~ 1 1.8\nexecute anchored eyes run particle damage_indicator ^ ^ ^ .2 .2 .2 0 3\nexecute anchored eyes run particle damage_indicator ^ ^ ^1 .5 .5 .5 0 8 normal @s\n\n# handle death (@e only selects entities which are alive)\n# | this is of importance for entities which display death messages or re-spawn\ntag @s add gm4_reeling_rods.victim\nexecute if entity @s[type=#gm4_reeling_rods:support_death_message] at @s unless entity @e[type=#gm4_reeling_rods:support_death_message,tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_bleeding_death\ntag @s remove gm4_reeling_rods.victim\nexecute if score $show_death_messages gm4_reeling_rods.barbed_damage_timer matches 1 run gamerule show_death_messages true\nscoreboard players reset $show_death_messages gm4_reeling_rods.barbed_damage_timer\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/clear.mcfunction",
    "content": "# stops bleeding damage\n# @s = entity recently hit by a barbed fishing rod\n# at @s\n# run from barbed/bleed, barbed/on_bleeding_death, and barbed/on_scratch_death\n\nscoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid0\nscoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid1\nscoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid2\nscoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid3\nscoreboard players reset @s gm4_reeling_rods.barbed_damage_period\nscoreboard players reset @s gm4_reeling_rods.barbed_damage_timer\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_affected.mcfunction",
    "content": "# initiates bleeding damage on affected entities, de-schedules if no more entities are affected\n# @s = undefined\n# at undefined\n# scheduled from barbed/schedule_bleeding and self\n\n# apply barbed damage\nexecute as @e[scores={gm4_reeling_rods.barbed_damage_timer=0..}] at @s run function gm4_reeling_rods:barbed/bleed\n\n# reschedule if there are still barbed entities\nexecute if entity @e[scores={gm4_reeling_rods.barbed_damage_timer=0..},limit=1] run schedule function gm4_reeling_rods:barbed/find_affected 1t replace\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_attacker.mcfunction",
    "content": "# locates the attacker, as commands do not accept int-array formatted strings in macros\n# @s = temporary snowball\n# at location of snowball\n# run from barbed/bleed\n\n# build uuid array\ndata modify storage gm4_reeling_rods:temp barbed_attacker_uuid set value [I;0,0,0,0]\nexecute store result storage gm4_reeling_rods:temp barbed_attacker_uuid[0] int 1 run scoreboard players get @s gm4_reeling_rods.barbed_attacker_uuid0\nexecute store result storage gm4_reeling_rods:temp barbed_attacker_uuid[1] int 1 run scoreboard players get @s gm4_reeling_rods.barbed_attacker_uuid1\nexecute store result storage gm4_reeling_rods:temp barbed_attacker_uuid[2] int 1 run scoreboard players get @s gm4_reeling_rods.barbed_attacker_uuid2\nexecute store result storage gm4_reeling_rods:temp barbed_attacker_uuid[3] int 1 run scoreboard players get @s gm4_reeling_rods.barbed_attacker_uuid3\n\n# move uuid to snowball\ndata modify entity @s Owner set from storage gm4_reeling_rods:temp barbed_attacker_uuid\n\n# tag owner\nscoreboard players set $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 0\nexecute on origin store success score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 run tag @s add gm4_reeling_rods.barbed_attacker\n\n# remove snowball\nkill @s\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction",
    "content": "# handles entities bleeding to death\n# @s = entity who died by bleeding to death from barbed damage\n# at @s\n# run from barbed/bleed\n\n# death message\nexecute if entity @s[type=player] run tellraw @a [\"\",{\"translate\":\"text.gm4.reeling_rods.death.bleeding\",\"fallback\":\"%s succumbed to their injuries\",with:[{\"selector\":\"@s\"}]}]\nexecute unless entity @s[type=player] on owner run tag @s add gm4_reeling_rods.owner\nexecute unless entity @s[type=player] run tellraw @p[tag=gm4_reeling_rods.owner] [\"\",{\"translate\":\"text.gm4.reeling_rods.death.bleeding\",\"fallback\":\"%s succumbed to their injuries\",with:[{\"selector\":\"@s\"}]}]\nexecute unless entity @s[type=player] on owner run tag @s remove gm4_reeling_rods.owner\n\n# reset barbed state\nfunction gm4_reeling_rods:barbed/clear\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_scratch_death.mcfunction",
    "content": "# handles entities scratched to death\n# @s = entity who died by immediate damage from a barbed rod\n# at @s\n# run from barbed/apply\n\n# death message\nexecute if entity @s[type=player] run tellraw @a [\"\",{\"translate\":\"text.gm4.reeling_rods.death.scratch\",\"fallback\":\"%s was scratched to death by %s\",with:[{\"selector\":\"@s\"},{\"selector\":\"@p[tag=gm4_hooked_entity.player]\"}]}]\nexecute unless entity @s[type=player] on owner run tag @s add gm4_reeling_rods.owner\nexecute unless entity @s[type=player] run tellraw @p[tag=gm4_reeling_rods.owner] [\"\",{\"translate\":\"text.gm4.reeling_rods.death.scratch\",\"fallback\":\"%s was scratched to death by %s\",with:[{\"selector\":\"@s\"},{\"selector\":\"@p[tag=gm4_hooked_entity.player]\"}]}]\nexecute unless entity @s[type=player] on owner run tag @s remove gm4_reeling_rods.owner\n\n# reset barbed state\nfunction gm4_reeling_rods:barbed/clear\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/schedule_bleeding.mcfunction",
    "content": "# schedules bleeding damage for the entity that was just hit by barbed\n# @s = entity just hit by barbed that has not died from the immediate damage\n# at bobber position\n# run from barbed/apply\n\n# store attacker uuid and period\ndata modify storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid set from entity @a[limit=1,tag=gm4_hooked_entity.player] UUID\nexecute store result score @s gm4_reeling_rods.barbed_attacker_uuid0 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[0]\nexecute store result score @s gm4_reeling_rods.barbed_attacker_uuid1 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[1]\nexecute store result score @s gm4_reeling_rods.barbed_attacker_uuid2 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[2]\nexecute store result score @s gm4_reeling_rods.barbed_attacker_uuid3 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[3]\nexecute store result score @s gm4_reeling_rods.barbed_damage_period run data get storage gm4_reeling_rods:temp enchanted.barbed.period\n\n# initiate timer\nscoreboard players set @s gm4_reeling_rods.barbed_damage_timer 0\nschedule function gm4_reeling_rods:barbed/find_affected 1t replace\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/get_execution_pos.mcfunction",
    "content": "# stores position of a newly summoned marker and kills it\n# @s = new marker\n# at @s \n# run from get_motion_to_player and reeling/enderman/action\n\ndata modify storage gm4_reeling_rods:temp position set from entity @s Pos\nkill @s\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/get_lookup.mcfunction",
    "content": "# Adds a value from the lookup table to Y motion\n# with {lookup_key}\n# run from get_motion_to_player\n\n$scoreboard players operation $motionY gm4_reeling_rods.math += $$(lookup_key) gm4_reeling_rods.lookup\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction",
    "content": "# Gets motion vector to launch entity to player. X and Z motion is 10% the block distance between the player and current position. Y motion uses the sum of the squares of position deltas as a lookup table key, the value of which is added to the Y position delta to get the Y motion.\n# @s = entity with items to be yoinked\n# at bobber in @s (most of the time)\n# run from pull_items\n\ndata modify storage gm4_reeling_rods:temp item_data.Motion set value [0d,0d,0d]\n\n# Store current position\nexecute summon marker run function gm4_reeling_rods:get_execution_pos\n# | position stored in storage gm4_reeling_rods:temp position\nexecute store result score $currentX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[0] 1\nexecute store result score $currentY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[1] 1\nexecute store result score $currentZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[2] 1\n\n# Player postion is stored in $motionX... ect from player/find_hooked_entity\n\n# Get distance from current position to player\nscoreboard players operation $motionX gm4_reeling_rods.math -= $currentX gm4_reeling_rods.math \nscoreboard players operation $motionY gm4_reeling_rods.math -= $currentY gm4_reeling_rods.math \nscoreboard players operation $motionZ gm4_reeling_rods.math -= $currentZ gm4_reeling_rods.math \n\n# store Motion, y to be edited after\nexecute store result storage gm4_reeling_rods:temp item_data.Motion[0] double 0.1 run scoreboard players get $motionX gm4_reeling_rods.math\nexecute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0.1 run scoreboard players get $motionY gm4_reeling_rods.math\nexecute store result storage gm4_reeling_rods:temp item_data.Motion[2] double 0.1 run scoreboard players get $motionZ gm4_reeling_rods.math\n\n# Square the distances on each axis\nscoreboard players operation $motionX gm4_reeling_rods.math *= $motionX gm4_reeling_rods.math \nscoreboard players operation $motionY gm4_reeling_rods.math *= $motionY gm4_reeling_rods.math \nscoreboard players operation $motionZ gm4_reeling_rods.math *= $motionZ gm4_reeling_rods.math \n\n# Add the squares\nscoreboard players operation $lookup_key gm4_reeling_rods.math = $motionX gm4_reeling_rods.math\nscoreboard players operation $lookup_key gm4_reeling_rods.math += $motionY gm4_reeling_rods.math\nexecute store result storage gm4_reeling_rods:temp lookup_key int 1 \\\n  run scoreboard players operation $lookup_key gm4_reeling_rods.math += $motionZ gm4_reeling_rods.math\n\n# Get Y motion, scaled up to match the squared values of before\nexecute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Motion[1] 100\n\n# Add looked up value to motionY above\nfunction gm4_reeling_rods:get_lookup with storage gm4_reeling_rods:temp\n\n# Store the Completed motionY\nexecute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0.01 run scoreboard players get $motionY gm4_reeling_rods.math\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/get_player_data.mcfunction",
    "content": "# Gets data for later logic\n# @s = player who fished\n# at @s\n# run from #gm4_hooked_entity:pre_hook_on_player\n\nexecute store success score $adventure gm4_reeling_rods.math if entity @s[gamemode=adventure]\ndata remove storage gm4_reeling_rods:temp enchanted\nexecute if predicate gm4_reeling_rods:holding_reeling_rod run data modify storage gm4_reeling_rods:temp enchanted.reeling set value 1\nexecute if predicate gm4_reeling_rods:holding_barbed_rod/level_1 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 31,damage:3}\nexecute if predicate gm4_reeling_rods:holding_barbed_rod/level_2 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 26,damage:6}\nexecute if predicate gm4_reeling_rods:holding_barbed_rod/level_3 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 21,damage:9}\nexecute if predicate gm4_reeling_rods:holding_barbed_rod/level_4 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 16,damage:12}\nexecute if predicate gm4_reeling_rods:holding_barbed_rod/level_5 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 11,damage:15}\ndata modify storage gm4_reeling_rods:temp player_data.Pos set from entity @s Pos\nexecute store result score $motionX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[0] 1\nexecute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[1] 1\nexecute store result score $motionZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[2] 1\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/end_crystal.mcfunction",
    "content": "# Action for hooked end_crystal\n# @s = end_crystal\n# at bobber in @s\n# run from hooked_entity/select_type\n\ndamage @s 1 minecraft:player_attack by @p[tag=gm4_hooked_entity.player]\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/is_passenger.mcfunction",
    "content": "# checks if @s is a passenger\n# @s = entity to check\n# at @s\n# run from hooked_entity/select_type\n\nreturn run execute on vehicle if entity @s\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/item_frame.mcfunction",
    "content": "# Action for hooked item frame or glow item frame\n# @s = item frame or glow item frame\n# at bobber in @s\n# with {type}\n# run from hooked_entity/select_type\n\n# fail if fixed\nexecute if data entity @s {Fixed:1b} run return fail\n\n$data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"$(type)\",count:1}\ndata modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Item\nexecute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:pull_items\nexecute unless data entity @s Item run return run kill @s\ndata remove entity @s Item\n\n$execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:\"$(type)\"}}} \\\n  run return run playsound minecraft:entity.item_frame.break neutral @a[distance=..16] ~ ~ ~\n\nplaysound minecraft:entity.item_frame.remove_item neutral @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/action.mcfunction",
    "content": "# Action for hooked leash knot\n# @s = leash knot\n# at bobber in @s\n# run from hooked_entity/select_type\n\ntag @s add gm4_reeling_rods.leash_knot\n\n# distance=..12 is leash distance\nexecute at @s as @e[type=#gm4_reeling_rods:leashable,distance=..12] \\\n  if function gm4_reeling_rods:hooked_entity/leash_knot/leaded_by_knot \\\n  run function gm4_reeling_rods:hooked_entity/leash_knot/change_leader\n\nkill @s\n\nexecute at @p[tag=gm4_reeling_rods.player] run playsound minecraft:item.lead.tied neutral @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/change_leader.mcfunction",
    "content": "# Changes a leashed entities leader from a leash knot to a tagged player\n# @s = entity leaded to leash knot\n# at leash knot\n# run from hooked_entity/leash_knot/action\n\ndata remove entity @s leash\ndata modify entity @s leash.UUID set from entity @p[tag=gm4_hooked_entity.player] UUID\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/leaded_by_knot.mcfunction",
    "content": "# Checks if an entity is leashed by the knot in question\n# @s = a leashable entity\n# at owner\n# run from hooked_entity/leash_knot/action\n\nreturn run execute on leasher if entity @s[tag=gm4_reeling_rods.leash_knot]\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/painting.mcfunction",
    "content": "# Action for hooked painting\n# @s = painting\n# at bobber in @s\n# run from hooked_entity/select_type\n\ndata modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:painting\",count:1}\nexecute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:pull_items\n\nkill @s\nplaysound minecraft:entity.painting.break neutral @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction",
    "content": "# Dispatch function for logic on hooked entity\n# @s = hooked entity\n# at bobber in entity\n# run from #gm4_hooked_entity:on_hooked_entity\n\n# fails\nexecute if score $adventure gm4_reeling_rods.math matches 1 run return fail\nexecute if entity @s[type=#gm4_reeling_rods:ignore] run return fail\nexecute if entity @s[tag=smithed.entity] run return fail\nexecute if data entity @s {Invulnerable:1b} run return fail\n\n# apply barbed damage\nexecute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless entity @s[type=player,gamemode=creative] \\\n  run function gm4_reeling_rods:barbed/apply with storage gm4_reeling_rods:temp enchanted.barbed\nexecute if data storage gm4_reeling_rods:temp enchanted.barbed if entity @s[type=minecraft:tnt_minecart] \\\n  run return run data modify entity @s fuse set value 0s\n\nraw # non-dismountable entities\nfor entity in ctx.meta['non_dismountable_entities']:\n    if entity['needs_reeling'].as_bool():\n        execute if entity @s[type=entity['id']] run return run execute if data storage gm4_reeling_rods:temp enchanted.reeling run function entity['function']\n    else:\n        execute if entity @s[type=entity['id']] run return run function entity['function']\n\nraw # dismounting logic\nexecute if function gm4_reeling_rods:hooked_entity/is_passenger run return run ride @s dismount\n\nraw # dismountable entities\nfor entity in ctx.meta['dismountable_entities']:\n    if entity['needs_reeling'].as_bool():\n        execute if entity @s[type=entity['id']] run return run execute if data storage gm4_reeling_rods:temp enchanted.reeling run function entity['function']\n    else:\n        execute if entity @s[type=entity['id']] run return run function entity['function']\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/shulker.mcfunction",
    "content": "# Action for hooked shulker\n# @s = shulker\n# at bobber in @s\n# run from hooked_entity/select_type\n\nexecute at @s facing entity @a[tag=gm4_hooked_entity.player,distance=..33,limit=1] eyes if block ^ ^ ^1 #gm4:replaceable run tp @s ^ ^ ^1\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction",
    "content": "execute unless score reeling_rods gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Reeling Rods\"}\nexecute unless score reeling_rods gm4_earliest_version < reeling_rods gm4_modules run scoreboard players operation reeling_rods gm4_earliest_version = reeling_rods gm4_modules\nscoreboard players set reeling_rods gm4_modules 1\n\nscoreboard objectives add gm4_reeling_rods.math dummy\nscoreboard objectives add gm4_reeling_rods.lookup dummy\nscoreboard objectives add gm4_reeling_rods.barbed_damage_timer dummy\nscoreboard objectives add gm4_reeling_rods.barbed_damage_period dummy\nscoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid0 dummy\nscoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid1 dummy\nscoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid2 dummy\nscoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid3 dummy\n\n# set_lookup_table is generated in generate_files.py\nfunction gm4_reeling_rods:set_lookup_table\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction",
    "content": "# Separates an entity that needs it\n# @s = entity with items to be yoinked\n# at bobber in @s (most of the time)\n# run from hooked_entity/* & reeling/* & reeling/*/action & reeling/stealable/steal_slot/*\n\nfunction gm4_reeling_rods:get_motion_to_player\nfunction gm4_reeling_rods:summon_item with storage gm4_reeling_rods:temp\n\nexecute unless data entity @s Items[] run return 0\n\n# Entities with Items tag\ndata modify storage gm4_reeling_rods:temp motion_vector set from storage gm4_reeling_rods:temp item_data.Motion\nfunction gm4_reeling_rods:reeling/empty_container_entity\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/bee.mcfunction",
    "content": "# Action for reeled bee\n# @s = bee\n# at bobber in @s\n# run from hooked_entity/select_type\n\n# fail if no nectar\nexecute unless data entity @s {HasNectar:1b} run return fail\n\n# Steal\ndata modify storage gm4_reeling_rods:temp item_data set value {}\ndata modify entity @s HasNectar set value 0b\ndata modify entity @s angry_at set from entity @p[tag=gm4_hooked_entity.player] UUID\nexecute store result score $anger_end_time gm4_reeling_rods.math run time query gametime\nscoreboard players add $anger_end_time gm4_reeling_rods.math 300\nexecute store result entity @s anger_end_time long 1 run scoreboard players get $anger_end_time gm4_reeling_rods.math\ndata modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:honeycomb\",count:1}\nfunction gm4_reeling_rods:pull_items\n\nplaysound entity.bee.hurt neutral @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/action.mcfunction",
    "content": "# Action for reeled chest_boat\n# @s = chest_boat type\n# at bobber in @s\n# with {boat_type}\n# run from hooked_entity/select_type\n\n# steal\ndata modify storage gm4_reeling_rods:temp item_data set value {}\ndata modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s\nexecute positioned ~ ~0.3 ~ run function gm4_reeling_rods:pull_items\n\n# replace with boat\ndata remove storage gm4_reeling_rods:temp entity_data.UUID\ndata remove storage gm4_reeling_rods:temp entity_data.Passengers\n$data modify storage gm4_reeling_rods:temp entity_type set value \"$(boat_type)\"\nexecute at @s run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp\nexecute at @s on passengers run function gm4_reeling_rods:reeling/chest_boat/passenger_transfer\ntp @s ~ -1000 ~\n\nplaysound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/passenger_transfer.mcfunction",
    "content": "# transfer old passenger to new boat\n# @s = passengers of chest boat type\n# at old chest boat type\n# run from reeling/chest_boat/action\n\nride @s dismount\nride @s mount @e[type=#minecraft:boat,distance=..0.00001,limit=1]\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chested_horse.mcfunction",
    "content": "# Action for reeled #gm4_reeling_rods:chested_horse\n# @s = #gm4_reeling_rods:chested_horse\n# at bobber in @s\n# run from hooked_entity/select_type\n\n# chest, then saddle\nexecute unless function gm4_reeling_rods:reeling/stealable/steal_slot/chested_horse \\\n  run function gm4_reeling_rods:reeling/stealable/steal_slot/saddle\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/empty_container_entity.mcfunction",
    "content": "# Loops through Items[] and creates an item entity for each item, setting a slightly random motion\n# @s = entity with an Items[] tag\n# at @s\n# run from pull_items\n\n# Assumptions\n# | storage gm4_reeling_rods:temp motion_vector is a Motion[] vector that reaches player\n# | in storage gm4_reeling_rods:temp entity_data is an Items[] array of item data objects\n\n# pull item data to be processed\ndata modify storage gm4_reeling_rods:temp item_data.Item set from storage gm4_reeling_rods:temp entity_data.Items[0]\n\n# randomize motion slightly....\nexecute store result score $motionX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp motion_vector[0] 100\nexecute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp motion_vector[1] 100\nexecute store result score $motionZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp motion_vector[2] 100\nexecute store result score $randomX gm4_reeling_rods.math run random value -10..10\nexecute store result score $randomY gm4_reeling_rods.math run random value 0..10\nexecute store result score $randomZ gm4_reeling_rods.math run random value -10..10\nexecute store result storage gm4_reeling_rods:temp item_data.Motion[0] double 0.006 run \\\n  scoreboard players operation $motionX gm4_reeling_rods.math += $randomX gm4_reeling_rods.math\nexecute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0.006 run \\\n  scoreboard players operation $motionY gm4_reeling_rods.math += $randomY gm4_reeling_rods.math\nexecute store result storage gm4_reeling_rods:temp item_data.Motion[2] double 0.006 run \\\n  scoreboard players operation $motionZ gm4_reeling_rods.math += $randomZ gm4_reeling_rods.math\n# scale 0.01 for same magnitude as main item, currently 0.006 to be slower\n\n# summon item with data\nfunction gm4_reeling_rods:summon_item with storage gm4_reeling_rods:temp\n\n# remove processed item\ndata remove storage gm4_reeling_rods:temp entity_data.Items[0]\n\n# run again if needed\nexecute if data storage gm4_reeling_rods:temp entity_data.Items[] run function gm4_reeling_rods:reeling/empty_container_entity\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/enderman/action.mcfunction",
    "content": "# Action for reeled enderman\n# @s = enderman\n# at bobber in @s\n# run from hooked_entity/select_type\n\n# fail if no held block\nexecute unless data entity @s carriedBlockState run return fail\n\n## determine summon location\n# | bobber sits at 80% up the hitbox, we want 30% up from the feet for the held block, which is also 50% of the hitbox height down from the bobber\n# | this works out to taking 62.5% of the height from feet to bobber, and going down from the bobber that far\n# | we can achieve this by dividing a 100x scaled up difference of feet and bobber height by 16\n\n# bobber height\nexecute summon marker run function gm4_reeling_rods:get_execution_pos\n# | position stored in storage gm4_reeling_rods:temp position\nexecute store result score $bobberY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[1] 100\n\n# feet height\nexecute at @s summon marker run function gm4_reeling_rods:get_execution_pos\n# | position stored in storage gm4_reeling_rods:temp position\nexecute store result score $feetY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[1] 100\n\nscoreboard players operation $bobberY gm4_reeling_rods.math -= $feetY gm4_reeling_rods.math\n\nscoreboard players set #16 gm4_reeling_rods.math 16\nexecute store result storage gm4_reeling_rods:temp displacement float 0.1 \\\n  run scoreboard players operation $bobberY gm4_reeling_rods.math /= #16 gm4_reeling_rods.math\n\n# use this as a macro for the falling block displacement\nfunction gm4_reeling_rods:reeling/enderman/falling_block with storage gm4_reeling_rods:temp\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/enderman/falling_block.mcfunction",
    "content": "# Steal falling block of the enderman's held block\n# @s = enderman\n# at bobber in @s\n# with {displacement}\n# run from reeling/enderman/action\n\ndata modify storage gm4_reeling_rods:temp entity_data set value {}\n$execute positioned ~ ~-$(displacement) ~ run function gm4_reeling_rods:get_motion_to_player\n# | motion vector stored in gm4_reeling_rods:temp item_data.Motion\ndata modify storage gm4_reeling_rods:temp entity_type set value \"minecraft:falling_block\"\ndata modify storage gm4_reeling_rods:temp entity_data.Motion set from storage gm4_reeling_rods:temp item_data.Motion\ndata modify storage gm4_reeling_rods:temp entity_data.BlockState set from entity @s carriedBlockState\ndata remove entity @s carriedBlockState\n$execute positioned ~ ~-$(displacement) ~ run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/llama.mcfunction",
    "content": "# Action for reeled llama or trader llama\n# @s = llama or trader llama\n# at bobber in @s\n# run from hooked_entity/select_type\n\n# chest, then carpet\nexecute unless function gm4_reeling_rods:reeling/stealable/steal_slot/chested_horse \\\n  run function gm4_reeling_rods:reeling/stealable/steal_slot/body\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart.mcfunction",
    "content": "# Action for reeled *_minecart\n# @s = *_minecart\n# at bobber in @s\n# with {block}\n# run from hooked_entity/select_type\n\n# fail if passengers\nexecute if data entity @s Passengers run return fail\n\n# steal\ndata modify storage gm4_reeling_rods:temp item_data set value {}\n$data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"$(block)\",count:1}\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s\nfunction gm4_reeling_rods:pull_items\n\n# replace with minecart\ndata remove storage gm4_reeling_rods:temp entity_data.UUID\ndata modify storage gm4_reeling_rods:temp entity_type set value \"minecraft:minecart\"\nexecute at @s run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp\ntp @s ~ -1000 ~\n\nplaysound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom.mcfunction",
    "content": "# Action for reeled mooshroom\n# @s = mooshroom\n# at bobber in @s\n# run from hooked_entity/select_type\n\n# fails\nexecute unless data entity @s {Age:0} run return fail\nexecute if data entity @s Passengers run return fail\n\n# steal\ndata modify storage gm4_reeling_rods:temp item_data set value {}\nexecute if data entity @s {Type:\"red\"} run data modify storage gm4_reeling_rods:temp item_data.Item.id set value \"minecraft:red_mushroom\"\nexecute if data entity @s {Type:\"brown\"} run data modify storage gm4_reeling_rods:temp item_data.Item.id set value \"minecraft:brown_mushroom\"\ndata modify storage gm4_reeling_rods:temp item_data.Item.count set value 5\nfunction gm4_reeling_rods:pull_items\n\n# replace with cow\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s\ndata remove storage gm4_reeling_rods:temp entity_data.UUID\ndata modify storage gm4_reeling_rods:temp entity_type set value \"minecraft:cow\"\nexecute at @s run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp\ntp @s ~ -1000 ~\n\nplaysound entity.mooshroom.shear neutral @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/sheep.mcfunction",
    "content": "# Action for reeled sheep\n# @s = sheep\n# at bobber in @s\n# run from hooked_entity/select_type\n\n# fail if sheared\nexecute if data entity @s {Sheared:1} run return fail\n\n# steal\ndata modify entity @s Sheared set value true\ndata modify storage gm4_reeling_rods:temp item_data set value {}\nexecute if data entity @s {Color:0b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:white_wool\",count:1}\nexecute if data entity @s {Color:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:orange_wool\",count:1}\nexecute if data entity @s {Color:2b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:magenta_wool\",count:1}\nexecute if data entity @s {Color:3b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:light_blue_wool\",count:1}\nexecute if data entity @s {Color:4b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:yellow_wool\",count:1}\nexecute if data entity @s {Color:5b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:lime_wool\",count:1}\nexecute if data entity @s {Color:6b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:pink_wool\",count:1}\nexecute if data entity @s {Color:7b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:gray_wool\",count:1}\nexecute if data entity @s {Color:8b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:light_gray_wool\",count:1}\nexecute if data entity @s {Color:9b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:cyan_wool\",count:1}\nexecute if data entity @s {Color:10b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:purple_wool\",count:1}\nexecute if data entity @s {Color:11b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:blue_wool\",count:1}\nexecute if data entity @s {Color:12b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:brown_wool\",count:1}\nexecute if data entity @s {Color:13b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:green_wool\",count:1}\nexecute if data entity @s {Color:14b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:red_wool\",count:1}\nexecute if data entity @s {Color:15b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:black_wool\",count:1}\nfunction gm4_reeling_rods:pull_items\n\nplaysound minecraft:entity.sheep.shear neutral @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/snow_golem.mcfunction",
    "content": "# Action for reeled snow_golem\n# @s = snow_golem\n# at bobber in @s\n# run from hooked_entity/select_type\n\n# fail if no Pumpkin\nexecute unless data entity @s {Pumpkin:1b} run return fail\n\n# steal\ndata modify storage gm4_reeling_rods:temp item_data set value {}\ndata modify entity @s Pumpkin set value 0b\ndata modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:carved_pumpkin\",count:1}\nfunction gm4_reeling_rods:pull_items\n\nplaysound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/mainhand.mcfunction",
    "content": "# Break Mainhand Slot\n# @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from reeling/stealable/steal_slot/mainhand\n\nitem replace entity @s weapon.mainhand with minecraft:air\nplaysound minecraft:entity.item.break neutral @a[distance=..16] ~ ~ ~\nreturn fail\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/check_drop_chance.mcfunction",
    "content": "# checks drop chance against random\n# run from reeling/stealable/steal_slot/*\n\nexecute store result score $rand gm4_reeling_rods.math run random value 1..1000\nexecute if score $rand gm4_reeling_rods.math <= $drop_chance gm4_reeling_rods.math run return 1\nreturn fail\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_1.mcfunction",
    "content": "# Checks slots to steal\n# @s = #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from reeling/stealable/steal_equipment\n\n# 1\nexecute if items entity @s weapon.mainhand * \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand\n# 3\nexecute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head\n# 5\nexecute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs\n# 2\nexecute if items entity @s weapon.offhand * \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand\n# 4\nexecute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest\n# 6\nexecute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet\n\nreturn fail\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_2.mcfunction",
    "content": "# Checks slots to steal\n# @s = #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from reeling/stealable/steal_equipment\n\n# 2\nexecute if items entity @s weapon.offhand * \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand\n# 4\nexecute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest\n# 6\nexecute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet\n# 1\nexecute if items entity @s weapon.mainhand * \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand\n# 3\nexecute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head\n# 5\nexecute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs\n\nreturn fail\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_3.mcfunction",
    "content": "# Checks slots to steal\n# @s = #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from reeling/stealable/steal_equipment\n\n# 3\nexecute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head\n# 5\nexecute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs\n# 2\nexecute if items entity @s weapon.offhand * \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand\n# 4\nexecute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest\n# 6\nexecute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet\n# 1\nexecute if items entity @s weapon.mainhand * \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand\n\nreturn fail\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_4.mcfunction",
    "content": "# Checks slots to steal\n# @s = #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from reeling/stealable/steal_equipment\n\n# 4\nexecute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest\n# 6\nexecute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet\n# 1\nexecute if items entity @s weapon.mainhand * \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand\n# 3\nexecute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head\n# 5\nexecute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs\n# 2\nexecute if items entity @s weapon.offhand * \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand\n\nreturn fail\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_5.mcfunction",
    "content": "# Checks slots to steal\n# @s = #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from reeling/stealable/steal_equipment\n\n# 5\nexecute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs\n# 2\nexecute if items entity @s weapon.offhand * \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand\n# 4\nexecute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest\n# 6\nexecute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet\n# 1\nexecute if items entity @s weapon.mainhand * \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand\n# 3\nexecute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head\n\nreturn fail\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_6.mcfunction",
    "content": "# Checks slots to steal\n# @s = #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from reeling/stealable/steal_equipment\n\n# 6\nexecute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet\n# 1\nexecute if items entity @s weapon.mainhand * \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand\n# 3\nexecute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head\n# 5\nexecute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs\n# 2\nexecute if items entity @s weapon.offhand * \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand\n# 4\nexecute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={\"minecraft:binding_curse\":1}] \\\n  run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest\n\nreturn fail\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_body_and_saddle.mcfunction",
    "content": "# Action for reeled #gm4_reeling_rods:steal_body_and_saddle\n# @s = #gm4_reeling_rods:steal_body_and_saddle\n# at bobber in @s\n# run from hooked_entity/select_type\n\n# body, then saddle\nexecute unless function gm4_reeling_rods:reeling/stealable/steal_slot/body \\\n  run function gm4_reeling_rods:reeling/stealable/steal_slot/saddle\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_equipment.mcfunction",
    "content": "# Pick an order to check equipment slots for stealing\n# @s = #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from hooked_entity/select_type & reeling/villager/action\n\nexecute store result score $order gm4_reeling_rods.math run random value 1..6\n\nexecute if score $order gm4_reeling_rods.math matches 1 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_1\nexecute if score $order gm4_reeling_rods.math matches 2 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_2\nexecute if score $order gm4_reeling_rods.math matches 3 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_3\nexecute if score $order gm4_reeling_rods.math matches 4 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_4\nexecute if score $order gm4_reeling_rods.math matches 5 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_5\nexecute if score $order gm4_reeling_rods.math matches 6 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_6\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_hand.mcfunction",
    "content": "# Pick an order to check hand slots for stealing\n# @s = #gm4_reeling_rods:steal_hand\n# at bobber in @s\n# run from hooked_entity/select_type\n\nexecute store result score $mainhand_first gm4_reeling_rods.math run random value 0..1\n\nexecute if score $mainhand_first gm4_reeling_rods.math matches 1 if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand\nexecute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand\nexecute if score $mainhand_first gm4_reeling_rods.math matches 0 if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand\n\nreturn fail\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/body.mcfunction",
    "content": "# Steal Body\n# @s = wolf, llama or horse\n# at bobber in @s\n# run from hooked_entity/select_type & reeling/llama & reeling/stealable/steal_body_and_saddle\n\n# fails\nexecute unless data entity @s equipment.body run return fail\nexecute if data entity @s {drop_chances:{body:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance\n\n# steal slot\ndata modify storage gm4_reeling_rods:temp item_data set value {}\ndata modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body\nfunction gm4_reeling_rods:pull_items\nitem replace entity @s armor.body with minecraft:air\n\nplaysound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~\nreturn 8\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction",
    "content": "# Steal Chest\n# @s = #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from reeling/stealable/order/equipment_*\n\n# fail if 0% drop chance\nexecute if data entity @s {drop_chances:{chest:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance\n\n# steal slot\ndata modify storage gm4_reeling_rods:temp item_data.Item set value {}\ndata modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.chest\ndata modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s\nfunction gm4_reeling_rods:pull_items\nitem replace entity @s armor.chest with minecraft:air\n\nplaysound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~\nreturn 4\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chested_horse.mcfunction",
    "content": "# Steal Chested Horse chest and items inside\n# @s = #gm4_reeling_rods:chested_horse or llama / trader llama\n# at bobber in @s\n# run from reeling/llama & reeling/chested_horse\n\n# fail if not chested horse\nexecute unless data entity @s {ChestedHorse:1b} run return fail\n\n# steal slot\ndata modify storage gm4_reeling_rods:temp item_data set value {}\ndata modify storage gm4_reeling_rods:temp item_data.Item set value {id:\"minecraft:chest\",count:1}\ndata modify storage gm4_reeling_rods:temp entity_data set from entity @s\nfunction gm4_reeling_rods:pull_items\ndata modify entity @s ChestedHorse set value 0b\n\nplaysound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~\nreturn 9\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction",
    "content": "# Steal Feet\n# @s = #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from reeling/stealable/order/equipment_*\n\n# fail if 0% drop chance\nexecute if data entity @s {drop_chances:{feet:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance\n\n# steal slot\ndata modify storage gm4_reeling_rods:temp item_data.Item set value {}\ndata modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.feet\ndata modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s\nfunction gm4_reeling_rods:pull_items\nitem replace entity @s armor.feet with minecraft:air\n\nplaysound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~\nreturn 6\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction",
    "content": "# Steal Head\n# @s = #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from reeling/stealable/order/equipment_*\n\n# fail if 0% drop chance\nexecute if data entity @s {drop_chances:{head:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance\n\n# steal slot\ndata modify storage gm4_reeling_rods:temp item_data.Item set value {}\ndata modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.head\ndata modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s\nfunction gm4_reeling_rods:pull_items\nitem replace entity @s armor.head with minecraft:air\n\nplaysound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~\nreturn 3\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction",
    "content": "# Steal Legs\n# @s = #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from reeling/stealable/order/equipment_*\n\n# fail if 0% drop chance\nexecute if data entity @s {drop_chances:{legs:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance\n\n# steal slot\ndata modify storage gm4_reeling_rods:temp item_data.Item set value {}\ndata modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.legs\ndata modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s\nfunction gm4_reeling_rods:pull_items\nitem replace entity @s armor.legs with minecraft:air\n\nplaysound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~\nreturn 5\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction",
    "content": "# Steal Mainhand\n# @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from reeling/stealable/order/* and reeling/stealable/steal_hand\n\n## drop chance fail conditions\n# to use default drop chances, we'd use 85 here as 8.5%, but we're setting it to 11.5% to match looting 3 chances\nscoreboard players set $drop_chance gm4_reeling_rods.math 115\nexecute if data entity @s drop_chances.mainhand store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.mainhand 1000\n# villager and vex should ignore 0% drop chance on mainhand, otherwise fail if 0%\nexecute if entity @s[type=!vex,type=!villager] if score $drop_chance gm4_reeling_rods.math matches 0 run return run function gm4_reeling_rods:reeling/stealable/zero_chance\n# drowned holding trident needs to roll chance\nexecute if entity @s[type=drowned] if items entity @s weapon.mainhand trident \\\n  unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \\\n  run return run function gm4_reeling_rods:reeling/stealable/break_slot/mainhand\n\n## steal slot\ndata modify storage gm4_reeling_rods:temp item_data.Item set value {}\n# need SelectedItem to work with players since players don't use equipment.mainhand\ndata modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SelectedItem\ndata modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.mainhand\ndata modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s\nfunction gm4_reeling_rods:pull_items\nitem replace entity @s weapon.mainhand with minecraft:air\n\nplaysound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~\nreturn 1\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction",
    "content": "# Steal Offhand\n# @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment\n# at bobber in @s\n# run from reeling/stealable/order/* and reeling/stealable/steal_hand\n\n# fail if 0% drop chance\nexecute if data entity @s {drop_chances:{offhand:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance\n\n## steal slot\ndata modify storage gm4_reeling_rods:temp item_data.Item set value {}\ndata modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.offhand\ndata modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s\nfunction gm4_reeling_rods:pull_items\nitem replace entity @s weapon.offhand with minecraft:air\n\nplaysound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~\nreturn 2\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/saddle.mcfunction",
    "content": "# Steal Saddle\n# @s = #gm4_reeling_rods:steal_saddle\n# at bobber in @s\n# run from hooked_entity/select_type and reeling/stealable/steal_body_and_saddle\n\n# fails\nexecute unless data entity @s equipment.saddle run return fail\nexecute if data entity @s {drop_chances:{saddle:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance\n\n# steal slot\ndata modify storage gm4_reeling_rods:temp item_data set value {}\ndata modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle\nfunction gm4_reeling_rods:pull_items\nitem replace entity @s saddle with minecraft:air\n\nplaysound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~\nreturn 7\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/zero_chance.mcfunction",
    "content": "# slot has a 0% drop chance, play sound and fail\n# at @s\n# run from reeling/stealable/steal_slot/*\n\nplaysound minecraft:item.spyglass.stop_using neutral @a[distance=16] ~ ~ ~\nreturn fail\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/summon_entity.mcfunction",
    "content": "# Summons a generic entity with data\n# @s = entity that was hooked\n# at @s (unless run from enderman)\n# with {entity_type, entity_data}\n# run from reeling/chest_boat/action and reeling/{minecart|mooshroom} and reeling/enderman/falling_block\n\n$summon $(entity_type) ~ ~ ~ $(entity_data)\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/action.mcfunction",
    "content": "# Action for reeled villager\n# @s = villager\n# at bobber in @s\n# run from hooked_entity/select_type\n\n# store mainhand data for a potential trade steal\ndata modify storage gm4_reeling_rods:temp entity_data set value {}\ndata modify storage gm4_reeling_rods:temp entity_data.mainhand set from entity @s equipment.mainhand\n\n# try to steal\nexecute store result score $slot gm4_reeling_rods.math run function gm4_reeling_rods:reeling/stealable/steal_equipment\n# if not mainhand, return\nexecute unless score $slot gm4_reeling_rods.math matches 1 run return fail\n\n## mainhand stolen (TRADED ITEM)\n\n# find trade and sell it out\nfunction gm4_reeling_rods:reeling/villager/sell_out with storage gm4_reeling_rods:temp entity_data\n\n# add 20 \"major_negative\" gossip of the player to the villager\ndata modify storage gm4_reeling_rods:temp entity_data.gossip.Target set from entity @p[tag=gm4_hooked_entity.player] UUID\nfunction gm4_reeling_rods:reeling/villager/add_gossip with storage gm4_reeling_rods:temp entity_data.gossip\n\n# feedback\nparticle minecraft:angry_villager ~ ~ ~ 0.3 0.3 0.3 20 3\nplaysound minecraft:entity.villager.hurt neutral @a[distance=..16] ~ ~ ~\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/add_gossip.mcfunction",
    "content": "# adds a \"major_negaive\" gossip of the player to the villager\n# @s = villager\n# at bobber in @s\n# with {Target}\n# run from reeling/villager/action\n\n$execute store success score $success gm4_reeling_rods.math run \\\n  data modify storage gm4_reeling_rods:temp entity_data.gossip merge from entity @s Gossips[{Type:\"major_negative\",Target:$(Target)}]\n\nexecute unless score $success gm4_reeling_rods.math matches 1 run data modify storage gm4_reeling_rods:temp entity_data.gossip merge value {Type:\"major_negative\",Value:0}\n\nexecute store result score $gossip_value gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp entity_data.gossip.Value\nexecute unless score $gossip_value gm4_reeling_rods.math matches ..80 run scoreboard players set $gossip_value gm4_reeling_rods.math 100\nexecute if score $gossip_value gm4_reeling_rods.math matches ..80 run scoreboard players add $gossip_value gm4_reeling_rods.math 20\nexecute store result storage gm4_reeling_rods:temp entity_data.gossip.Value int 1 run scoreboard players get $gossip_value gm4_reeling_rods.math\ndata modify entity @s Gossips append from storage gm4_reeling_rods:temp entity_data.gossip\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/sell_out.mcfunction",
    "content": "# sells out a trade\n# @s = villager\n# at bobber in @s\n# with {mainhand}\n# run from reeling/villager/action\n\n# for some reason on the first item after a restock?? it fails to set uses, but succeeds after that? This double set doesn't fix that though\n# | needs more investigation\n$data modify entity @s Offers.Recipes[{sell:$(mainhand)}] merge value {uses:0}\n$data modify entity @s Offers.Recipes[{sell:$(mainhand)}].uses set from entity @s Offers.Recipes[{sell:$(mainhand)}].maxUses\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction",
    "content": "# Summons item with data\n# @s = entity with items to be yoinked\n# at bobber in @s (most of the time)\n# run from pull_items & reeling/empty_container_entity\n\n$summon minecraft:item ~ ~ ~ $(item_data)\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json",
    "content": "{\n  \"id\": \"reeling_rods\",\n  \"name\": \"Reeling Rods\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:fishing_rod\"\n  },\n  \"criteria\": {\n    \"obtain_fishing_rod\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:fishing_rod\"\n          }\n        ]\n      }\n    },\n    \"obtain_reeling_rod\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:fishing_rod\",\n            \"predicates\": {\n              \"minecraft:enchantments\": [\n                {\n                  \"enchantments\": \"gm4_reeling_rods:reeling\"\n                }\n              ]\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_barbed_rod\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:fishing_rod\",\n            \"predicates\": {\n              \"minecraft:enchantments\": [\n                {\n                  \"enchantments\": \"gm4_reeling_rods:barbed\"\n                }\n              ]\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_reeling_book\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:enchanted_book\",\n            \"predicates\": {\n              \"minecraft:stored_enchantments\": [\n                {\n                  \"enchantments\": \"gm4_reeling_rods:reeling\"\n                }\n              ]\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_barbed_book\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:enchanted_book\",\n            \"predicates\": {\n              \"minecraft:stored_enchantments\": [\n                {\n                  \"enchantments\": \"gm4_reeling_rods:barbed\"\n                }\n              ]\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_fishing_rod\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.reeling_rods.description\",\n            \"fallback\": \"Fishing rods can be useful tools for (accidental) home re-decoration: Paintings and Item Frames can be ripped of walls, whilst leashes and Shulkers are moved around with ease.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"reeling\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_reeling_rod\",\n          \"obtain_reeling_book\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.reeling_rods.reeling\",\n            \"fallback\": \"When enchanted with Reeling, a fishing rod becomes a sneaky tool for disassembly and thievery. Take a Villager's wares or un-boat a chest boat chest.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"barbed\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_barbed_rod\",\n          \"obtain_barbed_book\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.reeling_rods.barbed\",\n            \"fallback\": \"Barbed turns a fishing rod into a lethal weapon. Throw your bobber at foes to scratch them up! Higher levels cause more damage over time.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_1.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"slots\": {\n            \"weapon.*\": {\n                \"predicates\": {\n                    \"minecraft:enchantments\": [\n                        {\n                            \"enchantments\": \"gm4_reeling_rods:barbed\",\n                            \"levels\": 1\n                        }\n                    ]\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_2.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"slots\": {\n            \"weapon.*\": {\n                \"predicates\": {\n                    \"minecraft:enchantments\": [\n                        {\n                            \"enchantments\": \"gm4_reeling_rods:barbed\",\n                            \"levels\": 2\n                        }\n                    ]\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_3.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"slots\": {\n            \"weapon.*\": {\n                \"predicates\": {\n                    \"minecraft:enchantments\": [\n                        {\n                            \"enchantments\": \"gm4_reeling_rods:barbed\",\n                            \"levels\": 3\n                        }\n                    ]\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_4.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"slots\": {\n            \"weapon.*\": {\n                \"predicates\": {\n                    \"minecraft:enchantments\": [\n                        {\n                            \"enchantments\": \"gm4_reeling_rods:barbed\",\n                            \"levels\": 4\n                        }\n                    ]\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_5.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"slots\": {\n            \"weapon.*\": {\n                \"predicates\": {\n                    \"minecraft:enchantments\": [\n                        {\n                            \"enchantments\": \"gm4_reeling_rods:barbed\",\n                            \"levels\": 5\n                        }\n                    ]\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_reeling_rod.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"weapon.*\": {\n        \"predicates\": {\n          \"minecraft:enchantments\": [\n            {\n              \"enchantments\": \"gm4_reeling_rods:reeling\"\n            }\n          ]\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/chested_horse.json",
    "content": "{\n  \"values\": [\n    \"minecraft:donkey\",\n    \"minecraft:mule\"\n  ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json",
    "content": "{\n  \"values\": [\n    \"minecraft:breeze_wind_charge\",\n    \"minecraft:command_block_minecart\",\n    \"minecraft:falling_block\",\n    \"minecraft:fireball\",\n    \"minecraft:item\",\n    \"minecraft:shulker_bullet\",\n    \"minecraft:spawner_minecart\",\n    \"minecraft:tnt\",\n    \"minecraft:wind_charge\"\n  ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:boat\",\n        \"#gm4:chest_boats\",\n        \"#gm4_reeling_rods:llamas\",\n        \"#gm4_reeling_rods:steal_saddle\",\n        \"minecraft:allay\",\n        \"minecraft:armadillo\",\n        \"minecraft:axolotl\",\n        \"minecraft:bee\",\n        \"minecraft:camel\",\n        \"minecraft:camel_husk\",\n        \"minecraft:cat\",\n        \"minecraft:chicken\",\n        \"minecraft:copper_golem\",\n        \"minecraft:cow\",\n        \"minecraft:dolphin\",\n        \"minecraft:donkey\",\n        \"minecraft:fox\",\n        \"minecraft:frog\",\n        \"minecraft:glow_squid\",\n        \"minecraft:goat\",\n        \"minecraft:happy_ghast\",\n        \"minecraft:hoglin\",\n        \"minecraft:horse\",\n        \"minecraft:iron_golem\",\n        \"minecraft:mooshroom\",\n        \"minecraft:mule\",\n        \"minecraft:nautilus\",\n        \"minecraft:ocelot\",\n        \"minecraft:parrot\",\n        \"minecraft:polar_bear\",\n        \"minecraft:rabbit\",\n        \"minecraft:sheep\",\n        \"minecraft:sniffer\",\n        \"minecraft:snow_golem\",\n        \"minecraft:squid\",\n        \"minecraft:wolf\",\n        \"minecraft:zoglin\",\n        \"minecraft:zombie_nautilus\"\n    ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/llamas.json",
    "content": "{\n  \"values\": [\n    \"minecraft:llama\",\n    \"minecraft:trader_llama\"\n  ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_body.json",
    "content": "{\n  \"values\": [\n    \"minecraft:happy_ghast\",\n    \"minecraft:wolf\"\n  ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_body_and_saddle.json",
    "content": "{\n  \"values\": [\n    \"minecraft:horse\",\n    \"minecraft:nautilus\",\n    \"minecraft:zombie_horse\",\n    \"minecraft:zombie_nautilus\"\n  ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_equipment.json",
    "content": "{\n  \"values\": [\n    \"minecraft:armor_stand\",\n    \"minecraft:bogged\",\n    \"minecraft:drowned\",\n    \"minecraft:husk\",\n    \"minecraft:mannequin\",\n    \"minecraft:parched\",\n    \"minecraft:piglin\",\n    \"minecraft:piglin_brute\",\n    \"minecraft:player\",\n    \"minecraft:skeleton\",\n    \"minecraft:stray\",\n    \"minecraft:wither_skeleton\",\n    \"minecraft:zombie\",\n    \"minecraft:zombie_villager\",\n    \"minecraft:zombified_piglin\"\n  ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json",
    "content": "{\n  \"values\": [\n    \"minecraft:allay\",\n    \"minecraft:copper_golem\",\n    \"minecraft:fox\",\n    \"minecraft:illusioner\",\n    \"minecraft:panda\",\n    \"minecraft:pillager\",\n    \"minecraft:vex\",\n    \"minecraft:vindicator\",\n    \"minecraft:wandering_trader\",\n    \"minecraft:witch\"\n  ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_saddle.json",
    "content": "{\n  \"values\": [\n    \"minecraft:camel\",\n    \"minecraft:camel_husk\",\n    \"minecraft:pig\",\n    \"minecraft:skeleton_horse\",\n    \"minecraft:strider\",\n    \"minecraft:zombie_horse\"\n  ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/support_death_message.json",
    "content": "{\n    \"values\": [\n        \"minecraft:cat\",\n        \"minecraft:parrot\",\n        \"minecraft:player\",\n        \"minecraft:wolf\"\n    ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/data/minecraft/tags/enchantment/non_treasure.json",
    "content": "{\n    \"values\": [\n        \"gm4_reeling_rods:reeling\",\n        \"gm4_reeling_rods:barbed\"\n    ]\n}\n"
  },
  {
    "path": "gm4_reeling_rods/entities.csv",
    "content": "id,needs_reeling,can_dismount,function\n#gm4_reeling_rods:chested_horse,TRUE,TRUE,\"gm4_reeling_rods:reeling/chested_horse\"\n#gm4_reeling_rods:llamas,TRUE,TRUE,\"gm4_reeling_rods:reeling/llama\"\n#gm4_reeling_rods:steal_body,TRUE,TRUE,\"gm4_reeling_rods:reeling/stealable/steal_slot/body\"\n#gm4_reeling_rods:steal_body_and_saddle,TRUE,TRUE,\"gm4_reeling_rods:reeling/stealable/steal_body_and_saddle\"\n#gm4_reeling_rods:steal_equipment,TRUE,TRUE,\"gm4_reeling_rods:reeling/stealable/steal_equipment\"\n#gm4_reeling_rods:steal_hand,TRUE,TRUE,\"gm4_reeling_rods:reeling/stealable/steal_hand\"\n#gm4_reeling_rods:steal_saddle,TRUE,TRUE,\"gm4_reeling_rods:reeling/stealable/steal_slot/saddle\"\nminecraft:bee,TRUE,TRUE,\"gm4_reeling_rods:reeling/bee\"\nminecraft:enderman,TRUE,TRUE,\"gm4_reeling_rods:reeling/enderman/action\"\nminecraft:mooshroom,TRUE,TRUE,\"gm4_reeling_rods:reeling/mooshroom\"\nminecraft:sheep,TRUE,TRUE,\"gm4_reeling_rods:reeling/sheep\"\nminecraft:snow_golem,TRUE,TRUE,\"gm4_reeling_rods:reeling/snow_golem\"\nminecraft:villager,TRUE,TRUE,\"gm4_reeling_rods:reeling/villager/action\"\nminecraft:chest_minecart,TRUE,FALSE,\"gm4_reeling_rods:reeling/minecart {block:'minecraft:chest'}\"\nminecraft:furnace_minecart,TRUE,FALSE,\"gm4_reeling_rods:reeling/minecart {block:'minecraft:furnace'}\"\nminecraft:hopper_minecart,TRUE,FALSE,\"gm4_reeling_rods:reeling/minecart {block:'minecraft:hopper'}\"\nminecraft:tnt_minecart,TRUE,FALSE,\"gm4_reeling_rods:reeling/minecart {block:'minecraft:tnt'}\"\nminecraft:acacia_chest_boat,TRUE,FALSE,\"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:acacia_boat'}\"\nminecraft:bamboo_chest_raft,TRUE,FALSE,\"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:bamboo_raft'}\"\nminecraft:birch_chest_boat,TRUE,FALSE,\"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:birch_boat'}\"\nminecraft:cherry_chest_boat,TRUE,FALSE,\"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:cherry_boat'}\"\nminecraft:dark_oak_chest_boat,TRUE,FALSE,\"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:dark_oak_boat'}\"\nminecraft:jungle_chest_boat,TRUE,FALSE,\"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:jungle_boat'}\"\nminecraft:mangrove_chest_boat,TRUE,FALSE,\"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:mangrove_boat'}\"\nminecraft:oak_chest_boat,TRUE,FALSE,\"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:oak_boat'}\"\nminecraft:pale_oak_chest_boat,TRUE,FALSE,\"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:pale_oak_boat'}\"\nminecraft:spruce_chest_boat,TRUE,FALSE,\"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:spruce_boat'}\"\nminecraft:shulker,FALSE,TRUE,\"gm4_reeling_rods:hooked_entity/shulker\"\nminecraft:end_crystal,FALSE,FALSE,\"gm4_reeling_rods:hooked_entity/end_crystal\"\nminecraft:glow_item_frame,FALSE,FALSE,\"gm4_reeling_rods:hooked_entity/item_frame {type:'minecraft:glow_item_frame'}\"\nminecraft:item_frame,FALSE,FALSE,\"gm4_reeling_rods:hooked_entity/item_frame {type:'minecraft:item_frame'}\"\nminecraft:leash_knot,FALSE,FALSE,\"gm4_reeling_rods:hooked_entity/leash_knot/action\"\nminecraft:painting,FALSE,FALSE,\"gm4_reeling_rods:hooked_entity/painting\"\n"
  },
  {
    "path": "gm4_reeling_rods/generate_files.py",
    "content": "from beet import Context, Function\nimport math\nfrom pathlib import Path\nfrom gm4.utils import CSV, CSVRow\nfrom itertools import product \n\ndef beet_default(ctx: Context):\n    \"\"\"\n        - generates set_lookup_table.mcfunction\n        - reads csv to ctx.meta for hooked_entity/select_type.mcfunction\n    \"\"\"\n    create_lookup_file(ctx)\n\n    entity_list =  CSV.from_file(Path('gm4_reeling_rods','entities.csv'))\n    dismountable_entities: list[CSVRow] = []\n    non_dismountable_entities: list[CSVRow] = []\n    for entity_type in entity_list:\n        if entity_type['can_dismount'].as_bool():\n            dismountable_entities.append(entity_type)\n            continue\n        non_dismountable_entities.append(entity_type)\n    ctx.meta['dismountable_entities'] = dismountable_entities\n    ctx.meta['non_dismountable_entities'] = non_dismountable_entities\n\ndef create_lookup_file(ctx: Context):\n    ctx.data[\"gm4_reeling_rods:set_lookup_table\"] = Function(  \n        [  \n            f\"scoreboard players set ${key} gm4_reeling_rods.lookup {value}\"  \n            for key, value in {  \n                (x**2 + y**2 + z**2): int(  \n                    100 * (0.08 * math.sqrt(math.sqrt(x**2 + y**2 + z**2)))  \n                )  \n                for x, y, z in product(range(0, 34), range(0, 34), range(0, 34))  \n            }.items() if math.sqrt(key) <= 33\n        ]\n    )\n"
  },
  {
    "path": "gm4_reeling_rods/mod.mcdoc",
    "content": "use ::java::util::BlockState\nuse ::java::world::item::ItemStack\nuse ::java::world::entity::AnyEntity\nuse ::java::world::entity::mob::breedable::villager::ReputationPart\n\ndispatch minecraft:storage[gm4_reeling_rods:temp] to struct {\n  bit_data?: struct {\n    bit_score: string,\n    bit: string,\n    UUID?: #[uuid] int[] @ 4,\n  },\n  position?: [double] @ 3,\n  item_data?: struct {\n    Item?: (ItemStack | struct {}),\n    Motion?: [double] @ 3,\n    PickupDelay?: short,\n  },\n  lookup_key?: int,\n  motion_vector?: [double] @ 3,\n  barbed_attacker_uuid?: #[uuid] int[] @ 4,\n  enchanted?: struct {\n    barbed?: struct {\n      attacker_uuid?: #[uuid] int[] @ 4,\n      period?: int,\n      damage?: int,\n    },\n    reeling?: int,\n  },\n  player_data?: struct {\n    Pos: [double] @ 3,\n  },\n  entity_data?: struct {\n    Items?: [ItemStack],\n    UUID?: #[uuid] int[] @ 4,\n    Passengers?: [AnyEntity],\n    Motion?: [double] @ 3,\n    BlockState?: BlockState,\n    mainhand?: ItemStack,\n    gossip?: struct {\n      Target?: #[uuid] int[] @ 4,\n      Type?: ReputationPart,\n      Value?: int,\n    },\n  },\n  entity_type?: #[id=\"entity_type\"] string,\n  displacement?: float,\n}\n\ndispatch minecraft:storage[gm4_reeling_rods:players] to struct {\n  [string]: struct {\n    [#[match_regex=\"bit_\\\\d+\"] string]: string,\n  },\n}\n"
  },
  {
    "path": "gm4_reeling_rods/translations.csv",
    "content": "key,en_us\ngm4.reeling_rods.enchantment.reeling,\"Reeling\"\ngm4.reeling_rods.enchantment.barbed,\"Barbed\"\ntext.gm4.reeling_rods.death.bleeding,\"%s succumbed to their injuries\"\ntext.gm4.reeling_rods.death.scratch,\"%s was scratched to death by %s\"\ntext.gm4.guidebook.module_desc.reeling_rods,\"Steal Villager's wares, scratch up your foes! Fishing rods have never been more useful!\"\ntext.gm4.guidebook.reeling_rods.description,\"Fishing rods can be useful tools for (accidental) home re-decoration: Paintings and Item Frames can be ripped of walls, whilst leashes and Shulkers are moved around with ease.\"\ntext.gm4.guidebook.reeling_rods.reeling,\"When enchanted with Reeling, a fishing rod becomes a sneaky tool for disassembly and thievery. Take a Villager's wares or un-boat a chest boat chest.\"\ntext.gm4.guidebook.reeling_rods.barbed,\"Barbed turns a fishing rod into a lethal weapon. Throw your bobber at foes to scratch them up! Higher levels cause more damage over time.\"\n"
  },
  {
    "path": "gm4_rope_ladders/README.md",
    "content": "# Rope Ladders<!--$headerTitle--><!--$pmc:delete-->\n\nEver wanted to place unsupported ladders? This modular data pack allows you to extend the possibilities of your building by allowing ladders to be extended downward, even floating in the air. <!--$pmc:headerSize-->\n\n<img src=\"images/rope_ladder_chasm.png\" alt=\"A rope ladder hanging in a chasm\" height=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- Players can extend ladders downward by using a ladder item on one end of a pillar of ladders.\n- When the player breaks a hanging ladder it will break all the ladders below.\n- If the top of a ladder is broken, then the entire stack will be \"pulled up\" for easy item collection.\n"
  },
  {
    "path": "gm4_rope_ladders/beet.yaml",
    "content": "id: gm4_rope_ladders\nname: Rope Ladders\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: \n        - main\n        - tick\n    model_data:\n      - item: ladder\n        reference: gui/advancement/rope_ladders\n        template: advancement\n    website:\n      description: Climbing downward has never been easier!\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: wN3RC3Zr\n    smithed:\n      pack_id: gm4_rope_ladders\n    wiki: https://wiki.gm4.co/wiki/Rope_Ladders\n    credits:\n      Creator:\n        - Modulorium\n      Updated By:\n        - runcows\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4/advancement/rope_ladders.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"ladder\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_rope_ladders:gui/advancement/rope_ladders\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.rope_ladders.title\",\n      \"fallback\": \"How's It Hanging?\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.rope_ladders.description\",\n      \"fallback\": \"Place a Rope Ladder\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"impossible\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/advancement/id_init.json",
    "content": "{\n  \"criteria\": {\n    \"no_score\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_scores\",\n              \"entity\": \"this\",\n              \"scores\": {\n                \"gm4_rol_id\": {}\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_rope_ladders:player/set_id\"\n  }\n}\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/advancement/right_click_detection.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:player_interacted_with_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_rope_ladders:holding_ladder\"\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"minecraft:player\",\n                \"gamemode\": [\n                  \"survival\",\n                  \"creative\"\n                ]\n              }\n            }\n          }\n        ],\n        \"entity\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type\": \"minecraft:interaction\"\n            }\n          },\n          {\n            \"condition\": \"minecraft:entity_scores\",\n            \"entity\": \"this\",\n            \"scores\": {\n              \"gm4_rol_id\": {}\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_rope_ladders:mechanics/ladder_placement/interact_right_click_detection\"\n  }\n}\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/init.mcfunction",
    "content": "execute unless score rope_ladders gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Rope Ladders\"}\nexecute unless score rope_ladders gm4_earliest_version < rope_ladders gm4_modules run scoreboard players operation rope_ladders gm4_earliest_version = rope_ladders gm4_modules\nscoreboard players set rope_ladders gm4_modules 1\n\nscoreboard objectives add gm4_rol_data dummy\nscoreboard objectives add gm4_rol_break_ladder minecraft.mined:minecraft.ladder\nscoreboard objectives add gm4_rol_id dummy\n\n\nschedule function gm4_rope_ladders:main 10t\nschedule function gm4_rope_ladders:tick 11t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/main.mcfunction",
    "content": "\nschedule function gm4_rope_ladders:main 16t\n\n# execute as player\nexecute as @a at @s run function gm4_rope_ladders:player/as\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/break_floating_ladders/break_ladder.mcfunction",
    "content": "# breaks the ladder because it is floating\n# @s = ladder item that was broken by player\n# at location of a ladder\n# run from gm4_rope_ladders:mechanics/break_floating_ladders/scan_column/loop\n\n# set scoreboard\nscoreboard players add $ladder_broken gm4_rol_data 1\n\n# audio\nplaysound minecraft:block.scaffolding.fall ambient @a[distance=..15] ~ ~ ~ 1 .5\n\n# break ladder and drop item\nfill ~ ~ ~ ~ ~ ~ air replace ladder[waterlogged=false]\nfill ~ ~ ~ ~ ~ ~ water replace ladder[waterlogged=true]\nloot spawn ~ ~ ~ loot minecraft:blocks/ladder\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/break_floating_ladders/scan_column/init.mcfunction",
    "content": "# begins a scan downward breaking floating ladders as it goes\n# @s = ladder item that was broken by player\n# align xyz positioned ~.5 ~-1 ~.5\n# run from gm4_rope_ladders:player/broke_ladder\n\n# set ladder drop mode\nexecute unless block ~ ~2 ~ ladder run scoreboard players set $rope_drop_mode gm4_rol_data 1\nexecute if block ~ ~2 ~ ladder run scoreboard players set $rope_drop_mode gm4_rol_data 2\n\n# set ladder direction\nscoreboard players set $rope_drop_direction gm4_rol_data 0\nexecute if block ~ ~ ~ ladder[facing=south] run scoreboard players set $rope_drop_direction gm4_rol_data 1\nexecute if block ~ ~ ~ ladder[facing=north] run scoreboard players set $rope_drop_direction gm4_rol_data 2\nexecute if block ~ ~ ~ ladder[facing=east] run scoreboard players set $rope_drop_direction gm4_rol_data 3\nexecute if block ~ ~ ~ ladder[facing=west] run scoreboard players set $rope_drop_direction gm4_rol_data 4\n\n# check for valid ladder placement location\nscoreboard players set $loop gm4_rol_data 0\nexecute anchored eyes run function gm4_rope_ladders:mechanics/break_floating_ladders/scan_column/loop\n\n# teleport all ladder items to top\nexecute if score $rope_drop_mode gm4_rol_data matches 1 if score $rope_drop_direction gm4_rol_data matches 1 if block ~ ~2 ~-1 #gm4:replaceable run tp @e[type=item,distance=..64,predicate=gm4_rope_ladders:is_ladder_item,nbt={Age:0s}] ~ ~2 ~-1\nexecute if score $rope_drop_mode gm4_rol_data matches 1 if score $rope_drop_direction gm4_rol_data matches 2 if block ~ ~2 ~1 #gm4:replaceable run tp @e[type=item,distance=..64,predicate=gm4_rope_ladders:is_ladder_item,nbt={Age:0s}] ~ ~2 ~1\nexecute if score $rope_drop_mode gm4_rol_data matches 1 if score $rope_drop_direction gm4_rol_data matches 3 if block ~-1 ~2 ~ #gm4:replaceable run tp @e[type=item,distance=..64,predicate=gm4_rope_ladders:is_ladder_item,nbt={Age:0s}] ~-1 ~2 ~\nexecute if score $rope_drop_mode gm4_rol_data matches 1 if score $rope_drop_direction gm4_rol_data matches 4 if block ~1 ~2 ~ #gm4:replaceable run tp @e[type=item,distance=..64,predicate=gm4_rope_ladders:is_ladder_item,nbt={Age:0s}] ~1 ~2 ~\nexecute if score $rope_drop_mode gm4_rol_data matches 1 if score $rope_drop_direction gm4_rol_data matches 1..4 as @e[type=item,distance=..64,predicate=gm4_rope_ladders:is_ladder_item,nbt={Age:0s}] run data modify entity @s Motion set value []\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/break_floating_ladders/scan_column/loop.mcfunction",
    "content": "# scans downward breaking floating ladders as it goes\n# @s = ladder item that was broken by player\n# align xyz positioned ~.5 ~-1 ~.5, moving downward\n# run from gm4_rope_ladders:mechanics/break_floating_ladders/scan_column/init\n\n# reset scoreboard\nscoreboard players set $ladder_broken gm4_rol_data 0\n\n# detect if ladder can be broken\nexecute if block ~ ~ ~ ladder[facing=east] unless block ~-1 ~ ~ #gm4:full_collision run function gm4_rope_ladders:mechanics/break_floating_ladders/break_ladder\nexecute if block ~ ~ ~ ladder[facing=west] unless block ~1 ~ ~ #gm4:full_collision run function gm4_rope_ladders:mechanics/break_floating_ladders/break_ladder\nexecute if block ~ ~ ~ ladder[facing=south] unless block ~ ~ ~-1 #gm4:full_collision run function gm4_rope_ladders:mechanics/break_floating_ladders/break_ladder\nexecute if block ~ ~ ~ ladder[facing=north] unless block ~ ~ ~1 #gm4:full_collision run function gm4_rope_ladders:mechanics/break_floating_ladders/break_ladder\n\n# loop\nscoreboard players add $loop gm4_rol_data 1\nexecute if score $loop gm4_rol_data matches 0..511 unless score $ladder_broken gm4_rol_data matches 0 if block ~ ~-1 ~ ladder positioned ~ ~-1 ~ run function gm4_rope_ladders:mechanics/break_floating_ladders/scan_column/loop\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/ladder_placement/find_ladder.mcfunction",
    "content": "# @s = interacted rcd\n# at player that interacts with a rcd interaction while holding ladder\n# run from function: gm4_rope_ladders:mechanics/ladder_placement/interact_right_click_detection\n\n# fail if different gametime\nexecute store result score $gametime gm4_rol_data run time query gametime\nexecute store result score $check_gametime gm4_rol_data run data get entity @s interaction.timestamp 1\n\ndata remove entity @s interaction\nexecute unless score $gametime gm4_rol_data = $check_gametime gm4_rol_data run return fail\n\n# continue\nexecute at @s align xyz positioned ~.5 ~ ~.5 run function gm4_rope_ladders:mechanics/ladder_placement/scan_column\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/ladder_placement/interact_right_click_detection.mcfunction",
    "content": "# @s = player that interacts with a rcd interaction while holding ladder\n# at @s\n# run from advancement: gm4_rope_ladders:right_click_detection\n\n# revoke advancement\nadvancement revoke @s only gm4_rope_ladders:right_click_detection\n\n# reset\nscoreboard players set $ladder_placed gm4_rol_data 0\nscoreboard players set $loop gm4_rol_data 0\n\n# find ladder block\nexecute as @e[type=interaction,tag=gm4_rol_rcd_ladder,distance=..8] if data entity @s interaction run function gm4_rope_ladders:mechanics/ladder_placement/find_ladder\n\n# successful place\nexecute if score $ladder_placed gm4_rol_data matches 1 run function gm4_rope_ladders:mechanics/ladder_placement/successful_place\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/ladder_placement/place_ladder.mcfunction",
    "content": "# places a ladder when the scan finds a valid location\n# @s = interacted rcd\n# at location of valid spot for ladder placement\n# run from function: gm4_rope_ladders:mechanics/ladder_placement/scan_column\n\n# set scorebaord\nscoreboard players set $ladder_placed gm4_rol_data 1\n\n# break block\nexecute unless block ~ ~ ~ #gm4:water run setblock ~ ~ ~ air destroy\nexecute if block ~ ~ ~ #gm4:water run setblock ~ ~ ~ water destroy\n\n# place ladder\nexecute unless block ~ ~ ~ #gm4:water run clone ~ ~1 ~ ~ ~1 ~ ~ ~ ~\nexecute if block ~ ~ ~ #gm4:water run function gm4_rope_ladders:mechanics/ladder_placement/place_water_ladder\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/ladder_placement/place_water_ladder.mcfunction",
    "content": "# places a ladder when the scan finds a valid location (in water)\n# @s = interacted rcd\n# at location of valid spot for ladder placement (in water)\n# run from function: gm4_rope_ladders:mechanics/ladder_placement/place_ladder\n\n# place water ladder\nexecute if block ~ ~1 ~ ladder[facing=south] run setblock ~ ~ ~ ladder[facing=south,waterlogged=true]\nexecute if block ~ ~1 ~ ladder[facing=north] run setblock ~ ~ ~ ladder[facing=north,waterlogged=true]\nexecute if block ~ ~1 ~ ladder[facing=east] run setblock ~ ~ ~ ladder[facing=east,waterlogged=true]\nexecute if block ~ ~1 ~ ladder[facing=west] run setblock ~ ~ ~ ladder[facing=west,waterlogged=true]\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/ladder_placement/scan_column.mcfunction",
    "content": "# scans downward until it finds a valid location to place a ladder\n# @s = interacted rcd\n# at location of ladder block, moving downward\n# run from function: gm4_rope_ladders:mechanics/ladder_placement/find_ladder and self\n\n# detect if ladder placement is valid\nexecute if block ~ ~ ~ #gm4:replaceable run return run function gm4_rope_ladders:mechanics/ladder_placement/place_ladder\n\n# loop\nscoreboard players add $loop gm4_rol_data 1\nexecute if score $loop gm4_rol_data matches 0..511 if block ~ ~-1 ~ #gm4_rope_ladders:ladder_scan positioned ~ ~-1 ~ run function gm4_rope_ladders:mechanics/ladder_placement/scan_column\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/ladder_placement/successful_place.mcfunction",
    "content": "# effects after a sucessful place\n# @s = player that interacts with a rcd interaction while holding ladder\n# at @s\n# run from function: gm4_rope_ladders:mechanics/ladder_placement/interact_right_click_detection\n\n# sound\nplaysound minecraft:block.ladder.place ambient @a[distance=..15] ~ ~ ~\n\n# remove 1 ladder from players hand\nexecute store success score $mainhand gm4_rol_data if items entity @s weapon.mainhand ladder\nexecute if score $mainhand gm4_rol_data matches 1 run item modify entity @s[gamemode=!creative] weapon.mainhand {\"function\": \"minecraft:set_count\",\"count\": -1,\"add\": true}\nexecute if score $mainhand gm4_rol_data matches 1 run swing @s mainhand\nexecute if score $mainhand gm4_rol_data matches 0 run item modify entity @s[gamemode=!creative] weapon.offhand {\"function\": \"minecraft:set_count\",\"count\": -1,\"add\": true}\nexecute if score $mainhand gm4_rol_data matches 0 run swing @s offhand\n\n# grant advancement\nadvancement grant @s only gm4:rope_ladders\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/right_click_detection/detect_ladder_raycast/found.mcfunction",
    "content": "# executes at the nearest ladder block in front of the player\n# @s = player holding ladder\n# at position of ladder block, align xyz positioned ~.5 ~ ~.5\n# run from function: gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/ray\n\n# store player id\nscoreboard players operation $player gm4_rol_id = @s gm4_rol_id\n\n# visuals\nexecute if block ~ ~ ~ ladder[facing=south] positioned ~ ~ ~-0.35 run function gm4_rope_ladders:mechanics/right_click_detection/display_particles\nexecute if block ~ ~ ~ ladder[facing=north] positioned ~ ~ ~0.35 run function gm4_rope_ladders:mechanics/right_click_detection/display_particles\nexecute if block ~ ~ ~ ladder[facing=west] positioned ~0.35 ~ ~ run function gm4_rope_ladders:mechanics/right_click_detection/display_particles\nexecute if block ~ ~ ~ ladder[facing=east] positioned ~-0.35 ~ ~ run function gm4_rope_ladders:mechanics/right_click_detection/display_particles\n\n# spawn rcd\nexecute if block ~ ~ ~ ladder[facing=south] positioned ~ ~ ~-0.39 positioned ~ ~-0.05 ~ unless entity @e[type=interaction,tag=gm4_rol_rcd_ladder,distance=..0.1] positioned ~ ~0.05 ~ summon interaction run function gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/create_rcd\nexecute if block ~ ~ ~ ladder[facing=north] positioned ~ ~ ~0.39 positioned ~ ~-0.05 ~ unless entity @e[type=interaction,tag=gm4_rol_rcd_ladder,distance=..0.1] positioned ~ ~0.05 ~ summon interaction run function gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/create_rcd\nexecute if block ~ ~ ~ ladder[facing=west] positioned ~0.39 ~ ~ positioned ~ ~-0.05 ~ unless entity @e[type=interaction,tag=gm4_rol_rcd_ladder,distance=..0.1] positioned ~ ~0.05 ~ summon interaction run function gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/create_rcd\nexecute if block ~ ~ ~ ladder[facing=east] positioned ~-0.39 ~ ~ positioned ~ ~-0.05 ~ unless entity @e[type=interaction,tag=gm4_rol_rcd_ladder,distance=..0.1] positioned ~ ~0.05 ~ summon interaction run function gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/create_rcd\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/right_click_detection/detect_ladder_raycast/ray.mcfunction",
    "content": "# raycasts from the players head that moves forward until it finds a ladder block\n# @s = player holding ladder\n# at @s anchored eyes, moving forward\n# run from function: gm4_rope_ladders/data/gm4_rope_ladders/function/player/holding_ladder\n\n# detect if player sees ladder\nexecute if block ~ ~ ~ ladder align xyz positioned ~.5 ~ ~.5 if block ~ ~-1 ~ #gm4:replaceable run return run function gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/found\nexecute if block ~ ~ ~ ladder align xyz positioned ~.5 ~ ~.5 unless block ~ ~1 ~ ladder run return run function gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/found\n\n# loop\nscoreboard players add $ray gm4_rol_data 1\nexecute if score $ray gm4_rol_data matches 0..30 positioned ^ ^ ^.1 run function gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/ray\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/right_click_detection/display_particles.mcfunction",
    "content": "# displays particles based on the rotation of the ladder block\n# @s = player holding ladder\n# at position of ladder block, align xyz positioned ~.5 ~ ~.5 (varies based on rotation)\n# run from function: gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/found\n\n# visuals\nparticle wax_on ~ ~0.2 ~ 0 0 0 .01 3\nparticle wax_on ~ ~0.5 ~ 0 0 0 .01 3\nparticle wax_on ~ ~0.8 ~ 0 0 0 .01 3\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/right_click_detection/rcd_manager/create_rcd.mcfunction",
    "content": "# sets up an interaction that handles right click detection\n# @s = new interaction\n# at position of ladder block, align xyz positioned ~.5 ~ ~.5 (varies based on rotation)\n# run from function: gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/found\n\n# init\ndata merge entity @s {width:0.2f,height:1.05f,Tags:[\"gm4_rol_rcd_ladder\",\"smithed.entity\",\"smithed.strict\"]}\nscoreboard players operation @s gm4_rol_id = $player gm4_rol_id\n\n# start loop\nfunction gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/loop\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/right_click_detection/rcd_manager/loop.mcfunction",
    "content": "# loops as long as a rcd interaction exists\n# @s = unspecified\n# at unspecified\n# run from function: gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/create_rcd and self\n\n# reset scoreboard\nscoreboard players remove $rcd_found gm4_rol_data 1\n\n# execute as rcd\nexecute as @e[type=interaction,tag=gm4_rol_rcd_ladder] at @s run function gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/process\n\n# loop\nexecute if score $rcd_found gm4_rol_data matches -9.. run schedule function gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/loop 10t\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/right_click_detection/rcd_manager/process.mcfunction",
    "content": "# processes the rcd interaction so that it is despawned when unneeded\n# @s = gm4_rol_rcd_ladder interaction\n# at @s\n# run from function: gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/loop\n\n# kill rcd if uneeded\nexecute unless entity @a[tag=gm4_rol_holding_ladder,distance=..5,limit=1] run return run kill @s\nexecute unless block ~ ~ ~ ladder run return run kill @s\nexecute if block ~ ~-1 ~ ladder unless block ~ ~1 ~ #minecraft:air run return run kill @s\n\n# kill if multiple interaction with the same id, which therefore belong to the same player\nscoreboard players set $duplicate_exists gm4_rol_data 0\nscoreboard players operation $check_id gm4_rol_id = @s gm4_rol_id\nexecute as @e[type=interaction,tag=gm4_rol_rcd_ladder,distance=0.1..16] if score @s gm4_rol_id = $check_id gm4_rol_id run scoreboard players set $duplicate_exists gm4_rol_data 1\nexecute if score $duplicate_exists gm4_rol_data matches 1 run return run kill @s\n\n# keep alive\nscoreboard players set $rcd_found gm4_rol_data 1\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/player/as.mcfunction",
    "content": "# @s = player\n# at @s\n# run from function: gm4_rope_ladders:main\n\n# tag\ntag @s remove gm4_rol_holding_ladder\n\n# check if player is holding rope ladder\nexecute if entity @s[gamemode=!adventure] if predicate gm4_rope_ladders:holding_ladder run function gm4_rope_ladders:player/holding_ladder\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/player/broke_ladder.mcfunction",
    "content": "# @s = player that broke a ladder\n# at @s\n# run from gm4_rope_ladders:tick\n\n# reset scoreboard\nscoreboard players reset @s gm4_rol_break_ladder\n\n# execute as the broken ladder item\nexecute if entity @s[gamemode=!creative,gamemode=!spectator] as @e[type=item,distance=..7,limit=1,predicate=gm4_rope_ladders:is_ladder_item,nbt={Age:0s},sort=nearest] at @s if block ~ ~ ~ #gm4:replaceable if block ~ ~-1 ~ ladder align xyz positioned ~.5 ~-1 ~.5 run function gm4_rope_ladders:mechanics/break_floating_ladders/scan_column/init\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/player/holding_ladder.mcfunction",
    "content": "# @s = player holding ladder\n# at @s\n# run from function: gm4_rope_ladders:player/as\n\n# tag\ntag @s add gm4_rol_holding_ladder\n\n# check for ladder\nscoreboard players set $ray gm4_rol_data 0 \nexecute anchored eyes positioned ^ ^ ^ run function gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/ray\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/player/set_id.mcfunction",
    "content": "# @s = player\n# at @s\n# run from advancement: gm4_rope_ladders:id_init\n\n# revoke to handle username changes\nadvancement revoke @s only gm4_rope_ladders:id_init\n\nexecute store result score @s gm4_rol_id run scoreboard players add $next gm4_rol_id 1\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/function/tick.mcfunction",
    "content": "\nschedule function gm4_rope_ladders:tick 1t\n\n# check if player broke ladder\nexecute as @a if score @s gm4_rol_break_ladder matches 1.. at @s run function gm4_rope_ladders:player/broke_ladder\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/guidebook/rope_ladders.json",
    "content": "{\n  \"id\": \"rope_ladders\",\n  \"name\": \"Rope Ladders\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:ladder\"\n  },\n  \"criteria\": {\n    \"place_ladder\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:ladder\"\n                ]\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.rope_ladders.description\",\n            \"fallback\": \"Ladders can be placed on other ladders to extend the ladder downward.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"place_ladder\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.rope_ladders.extend_downwards\",\n            \"fallback\": \"Looking at a ladder while holding ladders will cause particles to appear. Placing ladders on this particle will extend the ladder downwards.\\n\\nRope ladders will break if there are no other ladders above them.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.rope_ladders.breaking\",\n            \"fallback\": \"Breaking a ladder at the top of a rope ladder will break all other rope ladders below, causing the items to appear at the top of the ladder that was broken.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/predicate/holding_ladder.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"mainhand\": {\n            \"items\": [\n              \"minecraft:ladder\"\n            ]\n          }\n        }\n      }\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"offhand\": {\n            \"items\": [\n              \"minecraft:ladder\"\n            ]\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/predicate/is_ladder_item.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"items\": \"minecraft:ladder\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_rope_ladders/data/gm4_rope_ladders/tags/block/ladder_scan.json",
    "content": "{\n  \"values\": [\n    \"#gm4:replaceable\",\n    \"minecraft:ladder\"\n  ]\n}\n"
  },
  {
    "path": "gm4_rope_ladders/translations.csv",
    "content": "key,en_us\nadvancement.gm4.rope_ladders.title,How's It Hanging?\nadvancement.gm4.rope_ladders.description,Place a Rope Ladder\ntext.gm4.guidebook.module_desc.rope_ladders,Climbing downward has never been easier!\ntext.gm4.guidebook.rope_ladders.description,Ladders can be placed on other ladders to extend the ladder downward.\ntext.gm4.guidebook.rope_ladders.extend_downwards,Looking at a ladder while holding ladders will cause particles to appear. Placing ladders on this particle will extend the ladder downwards.\\n\\nRope ladders will break if there are no other ladders above them.\ntext.gm4.guidebook.rope_ladders.breaking,\"Breaking a ladder at the top of a rope ladder will break all other rope ladders below, causing the items to appear at the top of the ladder that was broken.\"\n"
  },
  {
    "path": "gm4_scuba_gear/README.md",
    "content": "# SCUBA Gear<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nEase ocean exploration with craftable scuba gear!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Adds the Wetsuit and Flippers which aids players in underwater movement.\r\n- When wearing Flippers on land, players are given a slowness debuff.\r\n- Adds the SCUBA Tank which adds 4 minutes of submerged air time.\r\n- Adds the SCUBA Helmet which hastens underwater mining.\r\n"
  },
  {
    "path": "gm4_scuba_gear/assets/gm4_scuba_gear/equipment/scuba.json",
    "content": "{\n  \"layers\": {\n    \"humanoid\": [\n      {\n        \"texture\": \"gm4_scuba_gear:scuba\"\n      },\n      {\n        \"dyeable\": {\n          \"color_when_undyed\": 2321353\n        },\n        \"texture\": \"gm4_scuba_gear:scuba_overlay\"\n      }\n    ],\n    \"humanoid_leggings\": [\n      {\n        \"texture\": \"gm4_scuba_gear:scuba\"\n      },\n      {\n        \"dyeable\": {\n          \"color_when_undyed\": 2321353\n        },\n        \"texture\": \"gm4_scuba_gear:scuba_overlay\"\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/assets/gm4_scuba_gear/items/flippers.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"gm4_scuba_gear:item/flippers\",\n    \"tints\": [\n      {\n        \"type\": \"minecraft:dye\",\n        \"default\": -14455863\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/assets/gm4_scuba_gear/items/scuba_helmet.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"gm4_scuba_gear:item/scuba_helmet\"\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/assets/gm4_scuba_gear/items/scuba_tank.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"gm4_scuba_gear:item/scuba_tank\"\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/assets/gm4_scuba_gear/items/wetsuit.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"gm4_scuba_gear:item/wetsuit\",\n    \"tints\": [\n      {\n        \"type\": \"minecraft:dye\",\n        \"default\": -14455863\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/assets/gm4_scuba_gear/models/item/flippers.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"gm4_scuba_gear:item/flippers\",\n    \"layer1\": \"gm4_scuba_gear:item/flippers_overlay\"\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/assets/gm4_scuba_gear/models/item/scuba_helmet.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"gm4_scuba_gear:item/scuba_helmet\"\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/assets/gm4_scuba_gear/models/item/scuba_tank.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"gm4_scuba_gear:item/scuba_tank\"\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/assets/gm4_scuba_gear/models/item/wetsuit.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"gm4_scuba_gear:item/wetsuit\",\n    \"layer1\": \"gm4_scuba_gear:item/wetsuit_overlay\"\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/assets/gm4_scuba_gear/optifine/cit/flippers.properties",
    "content": "type=armor\nmatchItems=leather_boots\ntexture.leather_layer_1=flippers_layer_1\ntexture.leather_layer_1_overlay=flippers_layer_1_overlay\nnbt.CustomModelData=$item/flippers\n"
  },
  {
    "path": "gm4_scuba_gear/assets/gm4_scuba_gear/optifine/cit/scuba_tank.properties",
    "content": "type=armor\nmatchItems=golden_chestplate\ntexture.gold_layer_1=scuba_tank_layer_1\nnbt.CustomModelData=$item/scuba_tank\n"
  },
  {
    "path": "gm4_scuba_gear/assets/translations.csv",
    "content": "key,en_us\nitem.gm4.flippers,Flippers\nitem.gm4.scuba_helmet,SCUBA Helmet\nitem.gm4.scuba_tank,SCUBA Tank\nitem.gm4.wetsuit,Wetsuit\nadvancement.gm4.scuba_gear.title,Things Are Going Swimmingly!\nadvancement.gm4.scuba_gear.description,Suit up with a full set of SCUBA gear\ntext.gm4.guidebook.module_desc.scuba_gear,Ease ocean exploration with craftable scuba gear!\ntext.gm4.guidebook.scuba_gear.description,SCUBA Gear can be crafted to aid in ocean travel.\\n\\nCopper and dried kelp are main components for each piece.\ntext.gm4.guidebook.scuba_gear.crafting_flippers,Flippers can be crafted with the following recipe:\ntext.gm4.guidebook.scuba_gear.crafting_scuba_helmet,The SCUBA Helmet can be crafted with the following recipe:\ntext.gm4.guidebook.scuba_gear.crafting_scuba_tank,The SCUBA Tank can be crafted with the following recipe:\ntext.gm4.guidebook.scuba_gear.crafting_wetsuit,The Wetsuit can be crafted with the following recipe:\ntext.gm4.guidebook.scuba_gear.usage_flippers,\"Flippers allow the user to swim much faster, but land traversal is greatly slowed.\"\ntext.gm4.guidebook.scuba_gear.usage_wetsuit,\"The Wetsuit allows the user to swim up or down much faster, and maintains their current depth.\"\ntext.gm4.guidebook.scuba_gear.usage_scuba_tank,Wearing the scuba tank adds 4 minutes of underwater breathing time.\ntext.gm4.guidebook.scuba_gear.usage_scuba_helmet,Wearing the scuba helmet increases underwater mining speed by 6 times.\nitem.modifiers.gm4.scuba_gear.in_water,\"When in Water:\"\nitem.modifiers.gm4.scuba_gear.on_land,\"When on Land:\"\nitem.modifiers.gm4.scuba_gear.neutral_buoyancy,\"Neutral Buoyancy\"\nitem.modifiers.gm4.scuba_gear.vertical_swimming_speed,\"Vertical Swimming Speed\"\n"
  },
  {
    "path": "gm4_scuba_gear/beet.yaml",
    "content": "id: gm4_scuba_gear\nname: SCUBA Gear\nversion: 2.1.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    website:\n      description: Ease ocean exploration with craftable scuba gear!\n      recommended:\n        - gm4_sunken_treasure\n      notes:\n        - This data pack requires you to use the Gamemode 4 resource pack! Restart the server/world after adding this data pack!\n    modrinth:\n      project_id: 6AVYWZgD\n    wiki: https://wiki.gm4.co/wiki/SCUBA_Gear\n    credits:\n      Creator:\n        - BPR\n      Updated by:\n        - TheEpyonProject\n      Textures by:\n        - BPR\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4/advancement/scuba_gear.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:leather_helmet\",\n      \"components\": {\n        \"minecraft:item_model\": \"gm4_scuba_gear:scuba_helmet\"\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.scuba_gear.title\",\n      \"fallback\": \"Things Are Going Swimmingly!\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.scuba_gear.description\",\n      \"fallback\": \"Suit up with a full set of SCUBA gear\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"all_gear_equipped\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_scuba_gear:all_gear_equipped\"\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/advancement/recipes/flippers.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"gm4_scuba_gear:flippers\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    },\n    \"in_deep_water\": {\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_scuba_gear:in_deep_water\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:location\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"in_deep_water\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_scuba_gear:flippers\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/advancement/recipes/scuba_helmet.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"gm4_scuba_gear:scuba_helmet\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    },\n    \"in_deep_water\": {\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_scuba_gear:in_deep_water\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:location\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"in_deep_water\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_scuba_gear:scuba_helmet\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/advancement/recipes/scuba_tank.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"gm4_scuba_gear:scuba_tank\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    },\n    \"in_deep_water\": {\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_scuba_gear:in_deep_water\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:location\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"in_deep_water\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_scuba_gear:scuba_tank\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/advancement/recipes/wetsuit.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"gm4_scuba_gear:wetsuit\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    },\n    \"in_deep_water\": {\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_scuba_gear:in_deep_water\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:location\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"in_deep_water\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_scuba_gear:wetsuit\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/enchantment/flippers.json",
    "content": "{\n  \"description\": \"\",\n  \"supported_items\": \"minecraft:leather_boots\",\n  \"weight\": 1,\n  \"max_level\": 1,\n  \"min_cost\": {\n    \"base\": 0,\n    \"per_level_above_first\": 0\n  },\n  \"max_cost\": {\n    \"base\": 0,\n    \"per_level_above_first\": 0\n  },\n  \"anvil_cost\": 0,\n  \"slots\": [\n    \"feet\"\n  ],\n  \"effects\": {\n    \"minecraft:location_changed\": [\n      {\n        \"requirements\": {\n          \"condition\": \"minecraft:entity_properties\",\n          \"entity\": \"this\",\n          \"predicate\": {\n            \"location\": {\n              \"fluid\": {\n                \"fluids\": \"#minecraft:water\"\n              }\n            }\n          }\n        },\n        \"effect\": {\n          \"type\": \"minecraft:attribute\",\n          \"attribute\": \"minecraft:movement_speed\",\n          \"id\": \"gm4_scuba_gear:flippers/on_land\",\n          \"amount\": 0.25,\n          \"operation\": \"add_multiplied_base\"\n        }\n      },\n      {\n        \"requirements\": {\n          \"condition\": \"minecraft:inverted\",\n          \"term\": {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"fluid\": {\n                  \"fluids\": \"#minecraft:water\"\n                }\n              }\n            }\n          }\n        },\n        \"effect\": {\n          \"type\": \"minecraft:attribute\",\n          \"attribute\": \"minecraft:movement_speed\",\n          \"id\": \"gm4_scuba_gear:flippers/on_land\",\n          \"amount\": -0.25,\n          \"operation\": \"add_multiplied_base\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/enchantment/wetsuit.json",
    "content": "{\n  \"description\": \"\",\n  \"supported_items\": \"minecraft:leather_leggings\",\n  \"weight\": 1,\n  \"max_level\": 1,\n  \"min_cost\": {\n    \"base\": 0,\n    \"per_level_above_first\": 0\n  },\n  \"max_cost\": {\n    \"base\": 0,\n    \"per_level_above_first\": 0\n  },\n  \"anvil_cost\": 0,\n  \"slots\": [\n    \"legs\"\n  ],\n  \"effects\": {\n    \"minecraft:tick\": [\n      {\n        \"requirements\": [\n          {\n            \"condition\": \"minecraft:all_of\",\n            \"terms\": [\n              {\n                \"condition\": \"minecraft:inverted\",\n                \"term\": {\n                  \"condition\": \"minecraft:location_check\",\n                  \"predicate\": {\n                    \"fluid\": {\n                      \"fluids\": \"#minecraft:water\"\n                    }\n                  }\n                }\n              },\n              {\n                \"condition\": \"minecraft:entity_scores\",\n                \"entity\": \"this\",\n                \"scores\": {\n                  \"gm4_sg_buoyancy\": {\n                    \"min\": -1,\n                    \"max\": 1\n                  }\n                }\n              }\n            ]\n          }\n        ],\n        \"effect\": {\n          \"type\": \"minecraft:run_function\",\n          \"function\": \"gm4_scuba_gear:wetsuit_buoyancy/clear\"\n        }\n      },\n      {\n        \"requirements\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"fluid\": {\n                \"fluids\": \"#minecraft:water\"\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:any_of\",\n            \"terms\": [\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"type_specific\": {\n                    \"type\": \"minecraft:player\",\n                    \"input\": {\n                      \"jump\": false,\n                      \"sneak\": false\n                    }\n                  }\n                }\n              },\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"type_specific\": {\n                    \"type\": \"minecraft:player\",\n                    \"input\": {\n                      \"jump\": true,\n                      \"sneak\": true\n                    }\n                  }\n                }\n              }\n            ]\n          },\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_scores\",\n              \"entity\": \"this\",\n              \"scores\": {\n                \"gm4_sg_buoyancy\": 0\n              }\n            }\n          }\n        ],\n        \"effect\": {\n          \"type\": \"minecraft:run_function\",\n          \"function\": \"gm4_scuba_gear:wetsuit_buoyancy/neutral\"\n        }\n      },\n      {\n        \"requirements\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"fluid\": {\n                \"fluids\": \"#minecraft:water\"\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_scores\",\n              \"entity\": \"this\",\n              \"scores\": {\n                \"gm4_sg_buoyancy\": -1\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"minecraft:player\",\n                \"input\": {\n                  \"jump\": false,\n                  \"sneak\": true\n                }\n              }\n            }\n          }\n        ],\n        \"effect\": {\n          \"type\": \"minecraft:run_function\",\n          \"function\": \"gm4_scuba_gear:wetsuit_buoyancy/negative\"\n        }\n      },\n      {\n        \"requirements\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"fluid\": {\n                \"fluids\": \"#minecraft:water\"\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_scores\",\n              \"entity\": \"this\",\n              \"scores\": {\n                \"gm4_sg_buoyancy\": 1\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"minecraft:player\",\n                \"input\": {\n                  \"jump\": true,\n                  \"sneak\": false\n                }\n              }\n            }\n          }\n        ],\n        \"effect\": {\n          \"type\": \"minecraft:run_function\",\n          \"function\": \"gm4_scuba_gear:wetsuit_buoyancy/positive\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_sg_buoyancy dummy\n\nexecute unless score scuba_gear gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Scuba Gear\"}\nexecute unless score scuba_gear gm4_earliest_version < scuba_gear gm4_modules run scoreboard players operation scuba_gear gm4_earliest_version = scuba_gear gm4_modules\nscoreboard players set scuba_gear gm4_modules 1\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/function/wetsuit_buoyancy/clear.mcfunction",
    "content": "# removes wetsuit attributes when out of water\n# @s = player wearing wetsuit\n# located at @s\n# run from enchant, gm4_scuba_gear:enchantment/wetsuit\n\nitem modify entity @s armor.legs gm4_scuba_gear:wetsuit_buoyancy/clear\n\nscoreboard players reset @s gm4_sg_buoyancy\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/function/wetsuit_buoyancy/negative.mcfunction",
    "content": "# increases player gravity when actively sinking\n# @s = player wearing wetsuit, sneak input\n# located at @s, in water\n# run from enchant, gm4_scuba_gear:enchantment/wetsuit\n\nitem modify entity @s armor.legs gm4_scuba_gear:wetsuit_buoyancy/negative\n\nscoreboard players set @s gm4_sg_buoyancy -1\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/function/wetsuit_buoyancy/neutral.mcfunction",
    "content": "# negates player gravity to maintain vertical position\n# @s = player wearing wetsuit, not sneak or jump input \n# located at @s, in water\n# run from enchant, gm4_scuba_gear:enchantment/wetsuit\n\nitem modify entity @s armor.legs gm4_scuba_gear:wetsuit_buoyancy/neutral\n\nscoreboard players set @s gm4_sg_buoyancy 0\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/function/wetsuit_buoyancy/positive.mcfunction",
    "content": "# decreases player gravity when actively ascending\n# @s = player wearing wetsuit, jump input\n# located at @s, in water\n# run from enchant, gm4_scuba_gear:enchantment/wetsuit\n\nitem modify entity @s armor.legs gm4_scuba_gear:wetsuit_buoyancy/positive\n\nscoreboard players set @s gm4_sg_buoyancy 1\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/guidebook/scuba_gear.json",
    "content": "{\n  \"id\": \"scuba_gear\",\n  \"name\": \"SCUBA Gear\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:horn_coral\"\n  },\n  \"criteria\": {\n    \"obtain_copper\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:copper_ingot\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_dried_kelp\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:dried_kelp\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_scuba_helmet\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_scuba_gear:{item:\\\"helmet\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_scuba_tank\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:leather_chestplate\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_scuba_gear:{item:\\\"tank\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_wetsuit\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:leather_leggings\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_scuba_gear:{item:\\\"wetsuit\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_flippers\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:leather_boots\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_scuba_gear:{item:\\\"flippers\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.scuba_gear.description\",\n            \"fallback\": \"SCUBA Gear can be crafted to aid in ocean travel.\\n\\nCopper and dried kelp are main components for each piece.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"crafting_flippers\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_dried_kelp\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.scuba_gear.crafting_flippers\",\n            \"fallback\": \"Flippers can be crafted with the following recipe:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_scuba_gear:flippers\"\n          }\n        ] \n      ]\n    },\n    {\n      \"name\": \"crafting_wetsuit\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_dried_kelp\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.scuba_gear.crafting_wetsuit\",\n            \"fallback\": \"The Wetsuit can be crafted with the following recipe:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_scuba_gear:wetsuit\"\n          }\n        ] \n      ]\n    },\n    {\n      \"name\": \"crafting_scuba_helmet\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_copper\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.scuba_gear.crafting_scuba_helmet\",\n            \"fallback\": \"The SCUBA Helmet can be crafted with the following recipe:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_scuba_gear:scuba_helmet\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"crafting_scuba_tank\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_copper\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.scuba_gear.crafting_scuba_tank\",\n            \"fallback\": \"The SCUBA Tank can be crafted with the following recipe:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_scuba_gear:scuba_tank\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage_flippers\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_flippers\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.scuba_gear.usage_flippers\",\n            \"fallback\": \"Flippers allow the user to swim much faster, but land traversal is greatly slowed.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage_wetsuit\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_wetsuit\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.scuba_gear.usage_wetsuit\",\n            \"fallback\": \"The Wetsuit allows the user to swim up or down much faster, and maintains their current depth.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage_scuba_tank\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_scuba_tank\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.scuba_gear.usage_scuba_tank\",\n            \"fallback\": \"Wearing the scuba tank adds 4 minutes of underwater breathing time.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage_scuba_helmet\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_scuba_helmet\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.scuba_gear.usage_scuba_helmet\",\n            \"fallback\": \"Wearing the scuba helmet increases underwater mining speed by 6 times.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/item_modifier/wetsuit_buoyancy/clear.json",
    "content": "{\n  \"function\": \"minecraft:set_attributes\",\n  \"modifiers\": [\n    {\n      \"attribute\": \"minecraft:gravity\",\n      \"id\": \"gm4_scuba_gear:wetsuit_buoyancy\",\n      \"amount\": 0,\n      \"operation\": \"add_value\",\n      \"slot\": \"legs\"\n    }\n  ],\n  \"replace\": false\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/item_modifier/wetsuit_buoyancy/negative.json",
    "content": "{\n  \"function\": \"minecraft:set_attributes\",\n  \"modifiers\": [\n    {\n      \"attribute\": \"minecraft:gravity\",\n      \"id\": \"gm4_scuba_gear:wetsuit_buoyancy\",\n      \"amount\": -1.2,\n      \"operation\": \"add_multiplied_total\",\n      \"slot\": \"legs\"\n    }\n  ],\n  \"replace\": false\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/item_modifier/wetsuit_buoyancy/neutral.json",
    "content": "{\n  \"function\": \"minecraft:set_attributes\",\n  \"modifiers\": [\n    {\n      \"attribute\": \"minecraft:gravity\",\n      \"id\": \"gm4_scuba_gear:wetsuit_buoyancy\",\n      \"amount\": -1,\n      \"operation\": \"add_multiplied_total\",\n      \"slot\": \"legs\"\n    }\n  ],\n  \"replace\": false\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/item_modifier/wetsuit_buoyancy/positive.json",
    "content": "{\n  \"function\": \"minecraft:set_attributes\",\n  \"modifiers\": [\n    {\n      \"attribute\": \"minecraft:gravity\",\n      \"id\": \"gm4_scuba_gear:wetsuit_buoyancy\",\n      \"amount\": 1.2,\n      \"operation\": \"add_multiplied_total\",\n      \"slot\": \"legs\"\n    }\n  ],\n  \"replace\": false\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/loot_table/items/flippers.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:leather_boots\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.flippers\",\n                  \"fallback\": \"Flippers\"\n                },\n                \"minecraft:attribute_modifiers\": [\n                  {\n                    \"type\": \"minecraft:armor\",\n                    \"id\": \"minecraft:generic.armor\",\n                    \"amount\": 1,\n                    \"operation\": \"add_value\",\n                    \"slot\": \"feet\"\n                  },\n                  {\n                    \"type\": \"minecraft:water_movement_efficiency\",\n                    \"id\": \"gm4_scuba_gear:flippers/water_movement_efficiency\",\n                    \"amount\": 1,\n                    \"operation\": \"add_value\",\n                    \"slot\": \"feet\"\n                  }\n                ],\n                \"minecraft:custom_data\": {\n                  \"gm4_scuba_gear\": {\n                    \"item\": \"flippers\"\n                  }\n                },\n                \"minecraft:item_model\": \"gm4_scuba_gear:flippers\",\n                \"minecraft:enchantable\": {\n                  \"value\": 8\n                },\n                \"minecraft:enchantments\": {\n                  \"gm4_scuba_gear:flippers\": 1\n                },\n                \"minecraft:enchantment_glint_override\": false,\n                \"minecraft:equippable\": {\n                  \"slot\": \"feet\",\n                  \"asset_id\": \"gm4_scuba_gear:scuba\"\n                },\n                \"minecraft:max_damage\": 156,\n                \"minecraft:lore\": [\n                  {\n                    \"translate\": \"item.modifiers.gm4.scuba_gear.on_land\",\n                    \"fallback\": \"When on Land:\",\n                    \"color\": \"gray\",\n                    \"italic\": false\n                  },\n                  {\n                    \"translate\": \"attribute.modifier.take.1\",\n                    \"with\": [\n                      \"25\",\n                      {\n                        \"translate\": \"attribute.name.generic.movement_speed\",\n                        \"fallback\": \"Speed\"\n                      }\n                    ],\n                    \"color\": \"red\",\n                    \"italic\": false\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/loot_table/items/scuba_helmet.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:leather_helmet\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.scuba_helmet\",\n                  \"fallback\": \"SCUBA Helmet\"\n                },\n                \"minecraft:attribute_modifiers\": [\n                  {\n                    \"type\": \"minecraft:armor\",\n                    \"id\": \"minecraft:armor.helmet\",\n                    \"slot\": \"head\",\n                    \"amount\": 3,\n                    \"operation\": \"add_value\"\n                  },\n                  {\n                    \"type\": \"minecraft:submerged_mining_speed\",\n                    \"id\": \"gm4_scuba_gear:scuba_helmet/submerged_mining_speed\",\n                    \"slot\": \"head\",\n                    \"amount\": 5,\n                    \"operation\": \"add_multiplied_total\"\n                  }\n                ],\n                \"minecraft:custom_data\": {\n                  \"gm4_scuba_gear\": {\n                    \"item\": \"helmet\"\n                  }\n                },\n                \"!minecraft:enchantable\": {},\n                \"minecraft:equippable\": {\n                  \"slot\": \"head\",\n                  \"asset_id\": \"gm4_scuba_gear:scuba\",\n                  \"camera_overlay\": \"gm4_scuba_gear:misc/scuba_helmet\"\n                },\n                \"minecraft:max_damage\": 132,\n                \"minecraft:max_stack_size\": 1,\n                \"minecraft:item_model\": \"gm4_scuba_gear:scuba_helmet\",\n                \"minecraft:rarity\": \"common\"\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/loot_table/items/scuba_tank.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:leather_chestplate\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.scuba_tank\",\n                  \"fallback\": \"SCUBA Tank\"\n                },\n                \"minecraft:attribute_modifiers\": [\n                  {\n                    \"type\": \"minecraft:armor\",\n                    \"slot\": \"chest\",\n                    \"id\": \"gm4_scuba_gear:tank_armor\",\n                    \"amount\": 4,\n                    \"operation\": \"add_value\"\n                  },\n                  {\n                    \"type\": \"minecraft:oxygen_bonus\",\n                    \"id\": \"gm4_scuba_gear:tank/oxygen_bonus\",\n                    \"amount\": 16,\n                    \"operation\": \"add_value\",\n                    \"slot\": \"chest\"\n                  }\n                ],\n                \"minecraft:custom_data\": {\n                  \"gm4_scuba_gear\": {\n                    \"item\": \"tank\"\n                  }\n                },\n                \"minecraft:item_model\": \"gm4_scuba_gear:scuba_tank\",\n                \"!minecraft:enchantable\": {},\n                \"minecraft:equippable\": {\n                  \"slot\": \"chest\",\n                  \"asset_id\": \"gm4_scuba_gear:scuba\"\n                },\n                \"minecraft:max_damage\": 192,\n                \"minecraft:tooltip_display\": {\n                  \"hidden_components\": [\n                    \"minecraft:dyed_color\"\n                  ]\n                }\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/loot_table/items/wetsuit.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:leather_leggings\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:item_name\": {\n                  \"translate\": \"item.gm4.wetsuit\",\n                  \"fallback\": \"Wetsuit\"\n                },\n                \"minecraft:custom_data\": {\n                  \"gm4_scuba_gear\": {\n                    \"item\": \"wetsuit\"\n                  }\n                },\n                \"minecraft:item_model\": \"gm4_scuba_gear:wetsuit\",\n                \"minecraft:equippable\": {\n                  \"slot\": \"legs\",\n                  \"asset_id\": \"gm4_scuba_gear:scuba\",\n                  \"equip_sound\": \"minecraft:intentionally_empty\"\n                },\n                \"minecraft:enchantments\": {\n                  \"gm4_scuba_gear:wetsuit\": 1\n                },\n                \"minecraft:enchantment_glint_override\": false,\n                \"minecraft:max_damage\": 180,\n                \"!minecraft:enchantable\": {},\n                \"minecraft:lore\": [\n                  {\n                    \"translate\": \"item.modifiers.gm4.scuba_gear.in_water\",\n                    \"fallback\": \"When in Water:\",\n                    \"color\": \"gray\",\n                    \"italic\": false\n                  },\n                  {\n                    \"translate\": \"item.modifiers.gm4.scuba_gear.neutral_buoyancy\",\n                    \"fallback\": \"Neutral Buoyancy\",\n                    \"color\": \"blue\",\n                    \"italic\": false\n                  },\n                  {\n                    \"translate\": \"attribute.modifier.plus.1\",\n                    \"with\": [\n                      \"20\",\n                      {\n                        \"translate\": \"item.modifiers.gm4.scuba_gear.vertical_swimming_speed\",\n                        \"fallback\": \"Vertical Swimming Speed\"\n                      }\n                    ],\n                    \"color\": \"blue\",\n                    \"italic\": false\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/predicate/all_gear_equipped.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"head\": {\n        \"items\": [\n          \"minecraft:player_head\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_scuba_gear:{item:\\\"helmet\\\"}}\"\n        }\n      },\n      \"chest\": {\n        \"items\": [\n          \"minecraft:leather_chestplate\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_scuba_gear:{item:\\\"tank\\\"}}\"\n        }\n      },\n      \"legs\": {\n        \"items\": [\n          \"minecraft:leather_chestplate\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_scuba_gear:{item:\\\"wetsuit\\\"}}\"\n        }\n      },\n      \"feet\": {\n        \"items\": [\n          \"minecraft:leather_boots\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_scuba_gear:{item:\\\"flippers\\\"}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/predicate/flippers_equipped.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"feet\": {\n        \"items\": [\n          \"minecraft:leather_boots\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_scuba_gear:{item:\\\"flippers\\\"}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/predicate/in_deep_water.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetY\": 0,\n    \"predicate\": {\n      \"fluid\": {\n        \"fluids\": \"#minecraft:water\"\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetY\": 1,\n    \"predicate\": {\n      \"fluid\": {\n        \"fluids\": \"#minecraft:water\"\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetY\": 2,\n    \"predicate\": {\n      \"fluid\": {\n        \"fluids\": \"#minecraft:water\"\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetY\": 3,\n    \"predicate\": {\n      \"fluid\": {\n        \"fluids\": \"#minecraft:water\"\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetY\": 4,\n    \"predicate\": {\n      \"fluid\": {\n        \"fluids\": \"#minecraft:water\"\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/predicate/in_water.json",
    "content": "{\n  \"condition\": \"minecraft:location_check\",\n  \"predicate\": {\n    \"fluid\": {\n      \"fluids\": \"#minecraft:water\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/recipe/flippers.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"pattern\": [\n    \"C C\",\n    \"K K\"\n  ],\n  \"key\": {\n    \"C\": [\n      \"minecraft:copper_ingot\"\n    ],\n    \"K\": [\n      \"minecraft:dried_kelp\"\n    ]\n  },\n  \"result\": {\n    \"id\": \"minecraft:leather_boots\",\n    \"components\": {\n      \"minecraft:item_name\": {\n        \"translate\": \"item.gm4.flippers\",\n        \"fallback\": \"Flippers\"\n      },\n      \"minecraft:attribute_modifiers\": [\n        {\n          \"type\": \"minecraft:armor\",\n          \"id\": \"minecraft:generic.armor\",\n          \"amount\": 1,\n          \"operation\": \"add_value\",\n          \"slot\": \"feet\"\n        },\n        {\n          \"type\": \"minecraft:water_movement_efficiency\",\n          \"id\": \"gm4_scuba_gear:flippers/water_movement_efficiency\",\n          \"amount\": 1,\n          \"operation\": \"add_value\",\n          \"slot\": \"feet\"\n        }\n      ],\n      \"minecraft:item_model\": \"gm4_scuba_gear:flippers\",\n      \"minecraft:custom_data\": {\n        \"gm4_scuba_gear\": {\n          \"item\": \"flippers\"\n        }\n      },\n      \"minecraft:dyed_color\": 2367281,\n      \"minecraft:enchantable\": {\n        \"value\": 8\n      },\n      \"minecraft:enchantments\": {\n        \"gm4_scuba_gear:flippers\": 1\n      },\n      \"minecraft:enchantment_glint_override\": false,\n      \"minecraft:equippable\": {\n        \"slot\": \"feet\",\n        \"asset_id\": \"gm4_scuba_gear:scuba\"\n      },\n      \"minecraft:max_damage\": 156,\n      \"minecraft:tooltip_display\": {\n        \"hidden_components\": [\n          \"minecraft:dyed_color\"\n        ]\n      },\n      \"minecraft:lore\": [\n        {\n          \"translate\": \"item.modifiers.gm4.scuba_gear.on_land\",\n          \"fallback\": \"When on Land:\",\n          \"color\": \"gray\",\n          \"italic\": false\n        },\n        {\n          \"translate\": \"attribute.modifier.take.1\",\n          \"with\": [\n            \"25\",\n            {\n              \"translate\": \"attribute.name.generic.movement_speed\",\n              \"fallback\": \"Speed\"\n            }\n          ],\n          \"color\": \"red\",\n          \"italic\": false\n        }\n      ]\n    },\n    \"count\": 1\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/recipe/scuba_helmet.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"pattern\": [\n    \"CCC\",\n    \"CGC\"\n  ],\n  \"key\": {\n    \"C\": [\n      \"minecraft:copper_ingot\"\n    ],\n    \"G\": [\n      \"minecraft:glass\"\n    ]\n  },\n  \"result\": {\n    \"id\": \"minecraft:leather_helmet\",\n    \"components\": {\n      \"minecraft:item_name\": {\n        \"translate\": \"item.gm4.scuba_helmet\",\n        \"fallback\": \"SCUBA Helmet\"\n      },\n      \"minecraft:attribute_modifiers\": [\n        {\n          \"type\": \"minecraft:armor\",\n          \"id\": \"minecraft:armor.helmet\",\n          \"amount\": 3,\n          \"operation\": \"add_value\",\n          \"slot\": \"head\"\n        },\n        {\n          \"type\": \"minecraft:submerged_mining_speed\",\n          \"id\": \"gm4_scuba_gear:scuba_helmet/submerged_mining_speed\",\n          \"amount\": 5,\n          \"operation\": \"add_multiplied_total\",\n          \"slot\": \"head\"\n        }\n      ],\n      \"minecraft:custom_data\": {\n        \"gm4_scuba_gear\": {\n          \"item\": \"helmet\"\n        }\n      },\n      \"minecraft:item_model\": \"gm4_scuba_gear:scuba_helmet\",\n      \"!minecraft:enchantable\": {},\n      \"minecraft:equippable\": {\n        \"slot\": \"head\",\n        \"asset_id\": \"gm4_scuba_gear:scuba\",\n        \"camera_overlay\": \"gm4_scuba_gear:misc/scuba_helmet\"\n      },\n      \"minecraft:max_damage\": 132,\n      \"minecraft:max_stack_size\": 1,\n      \"minecraft:rarity\": \"common\"\n    },\n    \"count\": 1\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/recipe/scuba_tank.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"pattern\": [\n    \"C C\",\n    \"PCP\",\n    \"CCC\"\n  ],\n  \"key\": {\n    \"C\": [\n      \"minecraft:copper_ingot\"\n    ],\n    \"P\": [\n      \"minecraft:decorated_pot\"\n    ]\n  },\n  \"result\": {\n    \"id\": \"minecraft:leather_chestplate\",\n    \"components\": {\n      \"minecraft:item_name\": {\n        \"translate\": \"item.gm4.scuba_tank\",\n        \"fallback\": \"SCUBA Tank\"\n      },\n      \"minecraft:attribute_modifiers\": [\n        {\n          \"type\": \"minecraft:armor\",\n          \"id\": \"gm4_scuba_gear:tank/armor\",\n          \"amount\": 4,\n          \"operation\": \"add_value\",\n          \"slot\": \"chest\"\n        },\n        {\n          \"type\": \"minecraft:oxygen_bonus\",\n          \"id\": \"gm4_scuba_gear:tank/oxygen_bonus\",\n          \"amount\": 16,\n          \"operation\": \"add_value\",\n          \"slot\": \"chest\"\n        }\n      ],\n      \"minecraft:custom_data\": {\n        \"gm4_scuba_gear\": {\n          \"item\": \"tank\"\n        }\n      },\n      \"minecraft:item_model\": \"gm4_scuba_gear:scuba_tank\",\n      \"!minecraft:enchantable\": {},\n      \"minecraft:equippable\": {\n        \"slot\": \"chest\",\n        \"asset_id\": \"gm4_scuba_gear:scuba\"\n      },\n      \"minecraft:max_damage\": 192,\n      \"minecraft:tooltip_display\": {\n        \"hidden_components\": [\n          \"minecraft:dyed_color\"\n        ]\n      }\n    },\n    \"count\": 1\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/gm4_scuba_gear/recipe/wetsuit.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"pattern\": [\n    \"KCK\",\n    \"K K\",\n    \"K K\"\n  ],\n  \"key\": {\n    \"C\": [\n      \"minecraft:copper_ingot\"\n    ],\n    \"K\": [\n      \"minecraft:dried_kelp\"\n    ]\n  },\n  \"result\": {\n    \"id\": \"minecraft:leather_leggings\",\n    \"components\": {\n      \"minecraft:item_name\": {\n        \"translate\": \"item.gm4.wetsuit\",\n        \"fallback\": \"Wetsuit\"\n      },\n      \"minecraft:max_damage\": 180,\n      \"!minecraft:enchantable\": {},\n      \"minecraft:dyed_color\": 2367281,\n      \"minecraft:custom_data\": {\n        \"gm4_scuba_gear\": {\n          \"item\": \"wetsuit\"\n        }\n      },\n      \"minecraft:item_model\": \"gm4_scuba_gear:wetsuit\",\n      \"minecraft:enchantments\": {\n        \"gm4_scuba_gear:wetsuit\": 1\n      },\n      \"minecraft:enchantment_glint_override\": false,\n      \"minecraft:equippable\": {\n        \"slot\": \"legs\",\n        \"asset_id\": \"gm4_scuba_gear:scuba\",\n        \"equip_sound\": \"minecraft:intentionally_empty\"\n      },\n      \"minecraft:rarity\": \"common\",\n      \"minecraft:tooltip_display\": {\n        \"hidden_components\": [\n          \"minecraft:dyed_color\"\n        ]\n      },\n      \"minecraft:lore\": [\n        {\n          \"translate\": \"item.modifiers.gm4.scuba_gear.in_water\",\n          \"fallback\": \"When in Water:\",\n          \"color\": \"gray\",\n          \"italic\": false\n        },\n        {\n          \"translate\": \"item.modifiers.gm4.scuba_gear.neutral_buoyancy\",\n          \"fallback\": \"Neutral Buoyancy\",\n          \"color\": \"blue\",\n          \"italic\": false\n        },\n        {\n          \"translate\": \"attribute.modifier.plus.1\",\n          \"with\": [\n            \"20\",\n            {\n              \"translate\": \"item.modifiers.gm4.scuba_gear.vertical_swimming_speed\",\n              \"fallback\": \"Vertical Swimming Speed\"\n            }\n          ],\n          \"color\": \"blue\",\n          \"italic\": false\n        }\n      ]\n    },\n    \"count\": 1\n  }\n}\n"
  },
  {
    "path": "gm4_scuba_gear/data/minecraft/tags/enchantment/curse.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\"id\": \"gm4_scuba_gear:wetsuit\", \"required\": false},\n    {\"id\": \"gm4_scuba_gear:flippers\", \"required\": false}\n  ]\n}\n"
  },
  {
    "path": "gm4_shapeless_portals/README.md",
    "content": "# Shapeless Portals<!--$headerTitle--><!--$pmc:delete-->\n\nRectangles are boring, so use this data pack and make your Nether Portals any shape your heart desires!<!--$pmc:headerSize-->\n\n<img src=\"images/shapeless_portals.png\" alt=\"There is 1 portal among us\" height=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- Light portals of any shape with Flint and Steel or Fire Charges.\n- Portals can use Crying Obsidian.\n"
  },
  {
    "path": "gm4_shapeless_portals/beet.yaml",
    "content": "id: gm4_shapeless_portals\nname: Shapeless Portals\nversion: 1.4.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: []\n    website:\n      description: Say goodbye to your boring old rectangular portals!\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: eq7hf4YU\n    smithed:\n      pack_id: gm4_shapeless_portals\n    wiki: https://wiki.gm4.co/wiki/Shapeless_Portals\n    credits:\n      Creator:\n        - Djones\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/advancement/light_portal.json",
    "content": "{\n  \"criteria\": {\n    \"requirement\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": {\n                \"type\": \"minecraft:fixed\",\n                \"name\": \"gm4_shapeless_portals\"\n              },\n              \"score\": \"load.status\"\n            },\n            \"range\": 1\n          },\n          {\n            \"condition\": \"minecraft:any_of\",\n            \"terms\": [\n              {\n                \"condition\": \"minecraft:location_check\",\n                \"predicate\": {\n                  \"dimension\": \"minecraft:overworld\"\n                }\n              },\n              {\n                \"condition\": \"minecraft:location_check\",\n                \"predicate\": {\n                  \"dimension\": \"minecraft:the_nether\"\n                }\n              }\n            ]\n          }\n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:match_tool\",\n            \"predicate\": {\n              \"items\": [\n                \"minecraft:flint_and_steel\",\n                \"minecraft:fire_charge\"\n              ]\n            }\n          },\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": \"#gm4_shapeless_portals:portal_block\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_shapeless_portals:portal_lit\"\n  }\n}\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/function/init.mcfunction",
    "content": "execute unless score shapeless_portals gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Shapeless Portals\"}\nexecute unless score shapeless_portals gm4_earliest_version < shapeless_portals gm4_modules run scoreboard players operation shapeless_portals gm4_earliest_version = shapeless_portals gm4_modules\nscoreboard players set shapeless_portals gm4_modules 1\n\nscoreboard objectives add gm4_sp_data dummy\nexecute unless score $max_portal_size gm4_sp_data matches 0.. run scoreboard players set $max_portal_size gm4_sp_data 441\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/function/portal_found.mcfunction",
    "content": "# check a found possible portal frame\n# @s = player lighting the portal\n# at fire where portal was lit\n# run from raycast\n\n# stop raycast\nscoreboard players set $raycast_limit gm4_sp_data 0\n\n# create marker for origin of portal\nkill @e[type=marker,tag=gm4_sp_portal]\nsummon marker ~ ~ ~ {Tags:[\"gm4_sp_portal\",\"gm4_sp_portal_origin\"]}\nsetblock ~ ~ ~ air\n\n# try to fill x-axis portal\nscoreboard players set $portal_blocks gm4_sp_data 0\nscoreboard players set $portal_build gm4_sp_data 0\nexecute as @e[type=marker,tag=gm4_sp_portal_origin] at @s if predicate gm4_shapeless_portals:portal_validity_x run function gm4_shapeless_portals:x/flood_fill\nexecute if score $portal_blocks gm4_sp_data matches 1.. if score $portal_blocks gm4_sp_data <= $max_portal_size gm4_sp_data run function gm4_shapeless_portals:x/build\n\n# try to fill z-axis portal\nkill @e[type=marker,tag=gm4_sp_portal,tag=!gm4_sp_portal_origin]\nscoreboard players set $portal_blocks gm4_sp_data 0\nexecute if score $portal_build gm4_sp_data matches 0 as @e[type=marker,tag=gm4_sp_portal_origin] at @s if predicate gm4_shapeless_portals:portal_validity_z run function gm4_shapeless_portals:z/flood_fill\nexecute if score $portal_blocks gm4_sp_data matches 1.. if score $portal_build gm4_sp_data matches 0 if score $portal_blocks gm4_sp_data <= $max_portal_size gm4_sp_data run function gm4_shapeless_portals:z/build\n\n# if no portal can be made return fire\nexecute if score $portal_build gm4_sp_data matches 0 at @e[type=marker,tag=gm4_sp_portal_origin] run setblock ~ ~ ~ fire\n\nkill @e[type=marker,tag=gm4_sp_portal]\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/function/portal_lit.mcfunction",
    "content": "# start raycast to find portal location\n# @s = player that lit the portal\n# at @s\nadvancement revoke @s only gm4_shapeless_portals:light_portal\n\nscoreboard players set $raycast_limit gm4_sp_data 12\nexecute anchored eyes positioned ^ ^ ^0.5 run function gm4_shapeless_portals:raycast\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/function/raycast.mcfunction",
    "content": "# raycast to find fire block in portal frame\n# @s = player that lit the portal\n# at @s, raycasting forward\n# run from portal_lit\n# run from here\n\nscoreboard players remove $raycast_limit gm4_sp_data 1\n\nexecute if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found\nexecute if score $raycast_limit gm4_sp_data matches 1.. positioned ~1 ~ ~ if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found\nexecute if score $raycast_limit gm4_sp_data matches 1.. positioned ~-1 ~ ~ if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found\nexecute if score $raycast_limit gm4_sp_data matches 1.. positioned ~ ~ ~1 if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found\nexecute if score $raycast_limit gm4_sp_data matches 1.. positioned ~ ~ ~-1 if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found\nexecute if score $raycast_limit gm4_sp_data matches 1.. positioned ~ ~1 ~ if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found\nexecute if score $raycast_limit gm4_sp_data matches 1.. positioned ~ ~-1 ~ if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found\n\nexecute if score $raycast_limit gm4_sp_data matches 1.. positioned ^ ^ ^0.5 run function gm4_shapeless_portals:raycast\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/function/x/build.mcfunction",
    "content": "# fill in the portal frame\n# @s = portal frame marker\n# at each portal block\n# run from portal_found\n\nexecute at @e[type=marker,tag=gm4_sp_portal] run setblock ~ ~ ~ nether_portal[axis=x]\nscoreboard players set $portal_build gm4_sp_data 1\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/function/x/check_location.mcfunction",
    "content": "# check if new location is valid for a portal frame\n# @s = new portal frame marker\n# at potential new portal block\n# run from x/flood_fill\n\ntag @s remove gm4_sp_portal_check\nexecute unless predicate gm4_shapeless_portals:portal_validity_x run scoreboard players set $portal_blocks gm4_sp_data 9999\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/function/x/flood_fill.mcfunction",
    "content": "# fill new blocks in portal frame\n# @s = portal frame marker\n# at potential new portal block\n# run from portal_found\n# run from here\n\nscoreboard players add $portal_blocks gm4_sp_data 1\ntag @s remove gm4_sp_portal_new\n\n# floodfill possible portal area\nexecute positioned ~1 ~ ~ if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_sp_portal\",\"gm4_sp_portal_new\",\"gm4_sp_portal_check\"]}\nexecute positioned ~-1 ~ ~ if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_sp_portal\",\"gm4_sp_portal_new\",\"gm4_sp_portal_check\"]}\nexecute positioned ~ ~1 ~ if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_sp_portal\",\"gm4_sp_portal_new\",\"gm4_sp_portal_check\"]}\nexecute positioned ~ ~-1 ~ if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_sp_portal\",\"gm4_sp_portal_new\",\"gm4_sp_portal_check\"]}\n\n# check if new filled areas are valid for portals\nexecute as @e[type=marker,tag=gm4_sp_portal_check] at @s run function gm4_shapeless_portals:x/check_location\n\n# continue to fill until portal block cap is reached\nexecute if score $portal_blocks gm4_sp_data <= $max_portal_size gm4_sp_data as @e[type=marker,tag=gm4_sp_portal_new,limit=1] at @s run function gm4_shapeless_portals:x/flood_fill\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/function/z/build.mcfunction",
    "content": "# fill in the portal frame\n# @s = portal frame marker\n# at each portal block\n# run from portal_found\n\nexecute at @e[type=marker,tag=gm4_sp_portal] run setblock ~ ~ ~ nether_portal[axis=z]\nscoreboard players set $portal_build gm4_sp_data 1\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/function/z/check_location.mcfunction",
    "content": "# check if new location is valid for a portal frame\n# @s = new portal frame marker\n# at potential new portal block\n# run from z/flood_fill\n\ntag @s remove gm4_sp_portal_check\nexecute unless predicate gm4_shapeless_portals:portal_validity_z run scoreboard players set $portal_blocks gm4_sp_data 9999\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/function/z/flood_fill.mcfunction",
    "content": "# fill new blocks in portal frame\n# @s = portal frame marker\n# at potential new portal block\n# run from portal_found\n# run from here\n\nscoreboard players add $portal_blocks gm4_sp_data 1\ntag @s remove gm4_sp_portal_new\n\n# floodfill possible portal area\nexecute positioned ~ ~ ~1 if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_sp_portal\",\"gm4_sp_portal_new\",\"gm4_sp_portal_check\"]}\nexecute positioned ~ ~ ~-1 if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_sp_portal\",\"gm4_sp_portal_new\",\"gm4_sp_portal_check\"]}\nexecute positioned ~ ~1 ~ if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_sp_portal\",\"gm4_sp_portal_new\",\"gm4_sp_portal_check\"]}\nexecute positioned ~ ~-1 ~ if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:[\"gm4_sp_portal\",\"gm4_sp_portal_new\",\"gm4_sp_portal_check\"]}\n\n# check if new filled areas are valid for portals\nexecute as @e[type=marker,tag=gm4_sp_portal_check] at @s run function gm4_shapeless_portals:z/check_location\n\n# continue to fill until portal block cap is reached\nexecute if score $portal_blocks gm4_sp_data <= $max_portal_size gm4_sp_data as @e[type=marker,tag=gm4_sp_portal_new,limit=1] at @s run function gm4_shapeless_portals:z/flood_fill\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/guidebook/shapeless_portals.json",
    "content": "{\n  \"id\": \"shapeless_portals\",\n  \"name\": \"Shapeless Portals\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:crying_obsidian\"\n  },\n  \"criteria\": {\n    \"light_portal\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:match_tool\",\n            \"predicate\": {\n              \"items\": [\n                \"minecraft:flint_and_steel\",\n                \"minecraft:fire_charge\"\n              ]\n            }\n          },\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": \"#gm4_shapeless_portals:portal_block\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"light_portal\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.shapeless_portals.description\",\n            \"fallback\": \"Portals can be of all shapes and sizes as long as it is an enclosed loop of obsidian.\\n\\nCrying obsidian also works to create a portal.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/predicate/portal_validity_x.json",
    "content": "[\n    {\n        \"condition\": \"minecraft:any_of\",\n        \"terms\": [\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetX\": 1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#gm4_shapeless_portals:portal_block\"\n                    }\n                }\n            },\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetX\": 1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#minecraft:air\"\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"condition\": \"minecraft:any_of\",\n        \"terms\": [\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetX\": -1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#gm4_shapeless_portals:portal_block\"\n                    }\n                }\n            },\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetX\": -1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#minecraft:air\"\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"condition\": \"minecraft:any_of\",\n        \"terms\": [\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetY\": 1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#gm4_shapeless_portals:portal_block\"\n                    }\n                }\n            },\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetY\": 1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#minecraft:air\"\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"condition\": \"minecraft:any_of\",\n        \"terms\": [\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetY\": -1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#gm4_shapeless_portals:portal_block\"\n                    }\n                }\n            },\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetY\": -1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#minecraft:air\"\n                    }\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/predicate/portal_validity_z.json",
    "content": "[\n    {\n        \"condition\": \"minecraft:any_of\",\n        \"terms\": [\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetZ\": 1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#gm4_shapeless_portals:portal_block\"\n                    }\n                }\n            },\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetZ\": 1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#minecraft:air\"\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"condition\": \"minecraft:any_of\",\n        \"terms\": [\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetZ\": -1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#gm4_shapeless_portals:portal_block\"\n                    }\n                }\n            },\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetZ\": -1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#minecraft:air\"\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"condition\": \"minecraft:any_of\",\n        \"terms\": [\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetY\": 1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#gm4_shapeless_portals:portal_block\"\n                    }\n                }\n            },\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetY\": 1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#minecraft:air\"\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"condition\": \"minecraft:any_of\",\n        \"terms\": [\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetY\": -1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#gm4_shapeless_portals:portal_block\"\n                    }\n                }\n            },\n            {\n                \"condition\": \"minecraft:location_check\",\n                \"offsetY\": -1,\n                \"predicate\": {\n                    \"block\": {\n                        \"blocks\": \"#minecraft:air\"\n                    }\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/tags/block/portal_block.json",
    "content": "{\n  \"values\": [\n    \"minecraft:crying_obsidian\",\n    \"minecraft:obsidian\"\n  ]\n}\n"
  },
  {
    "path": "gm4_shapeless_portals/data/gm4_shapeless_portals/test/create_1x2_portal.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1.5 ~1 ~0.5\n# @optional\n\nfill ~ ~ ~1 ~2 ~3 ~1 obsidian\nfill ~1 ~1 ~1 ~1 ~2 ~1 air\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-2 ~1\nitem replace entity @s weapon.mainhand with flint_and_steel\ndummy @s use block ~1 ~ ~1 up\n\nawait block ~1 ~1 ~1 nether_portal\nassert block ~1 ~2 ~1 nether_portal\n"
  },
  {
    "path": "gm4_shapeless_portals/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.shapeless_portals,Say goodbye to your boring old rectangular portals!\ntext.gm4.guidebook.shapeless_portals.description,Portals can be of all shapes and sizes as long as it is an enclosed loop of obsidian.\\n\\nCrying obsidian also works to create a portal.\n"
  },
  {
    "path": "gm4_shroomites/README.md",
    "content": "# Shroomites<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nMycelium has always been a bit weird, which explains why it has always been locked up on an island.<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Mooshrooms now have a chance of spawning a Shroomite shroom\r\n- This can then spread mycelium and create more spores\r\n- Spores move very slowly, so take several minecraft days to spread and infect blocks\r\n"
  },
  {
    "path": "gm4_shroomites/beet.yaml",
    "content": "id: gm4_shroomites\nname: Shroomites\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops:\n        - main\n        - slow_clock\n    website:\n      description: Ever wondered why all the Mooshrooms are locked up on islands? This Module makes Mooshrooms spread mycelium and mushrooms wherever they go.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: 7Rcai2W4\n    wiki: https://wiki.gm4.co/wiki/Shroomites\n    credits:\n      Creators:\n        - Sparks\n        - SpecialBuilder32\n        - Bloo\n      Icon Design:\n        - DuckJr\n    model_data:\n      - item: red_mushroom\n        reference: gui/advancement/shroomites\n        template: advancement\n"
  },
  {
    "path": "gm4_shroomites/data/gm4/advancement/shroomites.json",
    "content": "{\n    \"display\": {\n        \"icon\": {\n            \"id\": \"minecraft:red_mushroom\",\n            \"components\": {\n                \"minecraft:custom_model_data\": {\n                    \"floats\": [\n                        3240001\n                    ]\n                }\n            }\n        },\n        \"title\": \"Things are grim indeed...\",\n        \"description\": \"Oh no, did I forget about those mushrooms?\",\n        \"frame\": \"challenge\",\n        \"hidden\": true\n    },\n    \"parent\": \"gm4:root\",\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:impossible\",\n            \"conditions\": {}\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/fast_clock.mcfunction",
    "content": "# manages spore movements and a slow clock\n# @s = none\n# at world spawn\n# run from gm4_shroomites:main\n\n# reset clock counter\nscoreboard players set $fast_clock gm4_shroom_data 0\n\n# handle spores\nscoreboard players set $global_spore_count gm4_shroom_data 0\nexecute as @e[type=marker,tag=gm4_shroomite_spore] at @s run function gm4_shroomites:spore/track_age\n\n# manage slow clock\nscoreboard players add $slow_clock gm4_shroom_data 1\n\n# trigger shroom placement and spore spawning\nexecute if score $slow_clock gm4_shroom_data matches 4.. run function gm4_shroomites:slow_clock\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/init.mcfunction",
    "content": "# objectives\nscoreboard objectives add gm4_shroom_data dummy\nscoreboard objectives add gm4_entity_version dummy\n\n# fixed values\nscoreboard players set #spore_max_age gm4_shroom_data 12\nscoreboard players set #spore_placement_cooldown gm4_shroom_data 8\nscoreboard players set #shroom_placement_cooldown gm4_shroom_data 64\nscoreboard players set #fertilization_cost gm4_shroom_data 2\nscoreboard players set #conversion_cost gm4_shroom_data 16\nexecute unless score #global_spore_cap gm4_shroom_data matches -2147483648..2147483647 run scoreboard players set #global_spore_cap gm4_shroom_data 2048\nexecute unless score #global_shroom_cap gm4_shroom_data matches -2147483648..2147483647 run scoreboard players set #global_shroom_cap gm4_shroom_data 1024\n\nexecute unless score shroomites gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Shroomites\"}\nexecute unless score shroomites gm4_earliest_version < shroomites gm4_modules run scoreboard players operation shroomites gm4_earliest_version = shroomites gm4_modules\nscoreboard players set shroomites gm4_modules 1\n\nschedule function gm4_shroomites:main 1t\nschedule function gm4_shroomites:slow_clock 32t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/main.mcfunction",
    "content": "# manages a scoreboard clock system to tie the module in with the random tick speed gamerule\n\n# manage clock speed\nexecute store result score $random_tick_speed gm4_shroom_data run gamerule random_tick_speed\nscoreboard players operation $fast_clock gm4_shroom_data += $random_tick_speed gm4_shroom_data\n\n# trigger spore movement\nexecute if score $fast_clock gm4_shroom_data matches 6.. run function gm4_shroomites:fast_clock\n\n# reschedule\nschedule function gm4_shroomites:main 16t\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/mooshroom/analyze_color.mcfunction",
    "content": "# analyzes the color of a mooshroom and tgs it\n# @s = @e[type=mooshroom] that hasn't been analyzed\n# at @s\n# run from gm4_shroomites:mooshroom/shed_shroom\n\n# analyze color\nexecute store success score $success gm4_shroom_data if data entity @s {Type:\"brown\"} run tag @s add gm4_brown_shroomite\nexecute unless score $success gm4_shroom_data matches 1.. run tag @s add gm4_red_shroomite\nscoreboard players reset $success gm4_shroom_data\n\n# remember that this mooshroom has been analyzed\ntag @s add gm4_shroomite_analyzed\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/mooshroom/convert/brown.mcfunction",
    "content": "# converts an existing cow into a brown mooshroom\n# @s = cow to be converted\n# at @s (after move)\n# run from gm4_shroomites:spore/move/postmovement\n\n# turn cow into a brown mooshroom\nsummon mooshroom ~ ~ ~ {Type:\"brown\",Tags:[\"gm4_new_shroomite_mooshroom\"]}\nteleport @e[type=mooshroom,tag=gm4_new_shroomite_mooshroom,limit=1,distance=0] @s\ndata modify entity @e[type=mooshroom,tag=gm4_new_shroomite_mooshroom,limit=1,distance=0] {} merge from entity @s {}\nexecute as @e[type=mooshroom,limit=1,distance=0] run function gm4_shroomites:mooshroom/initialize/brown\n\n# particles and sound\nparticle minecraft:mycelium ~ ~.8 ~ .4 .4 .4 0 50\nplaysound minecraft:block.chorus_flower.grow hostile @a[distance=..10] ~ ~ ~ 0.625\nparticle minecraft:block{block_state:\"minecraft:brown_mushroom_block\"} ~ ~1 ~ .3 .3 .3 20 20\n\n# add to age\nscoreboard players operation @s gm4_shroom_data += #conversion_cost gm4_shroom_data\n\n# kill cow\ntp @s ~ -4096 ~\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/mooshroom/convert/red.mcfunction",
    "content": "# converts an existing cow into a red mooshroom\n# @s = cow to be converted\n# at @s (after move)\n# run from gm4_shroomites:spore/move/postmovement\n\n# turn cow into a red mooshroom\nsummon mooshroom ~ ~ ~ {Type:\"red\",Tags:[\"gm4_new_shroomite_mooshroom\"]}\nteleport @e[type=mooshroom,tag=gm4_new_shroomite_mooshroom,limit=1,distance=0] @s\ndata modify entity @e[type=mooshroom,tag=gm4_new_shroomite_mooshroom,limit=1,distance=0] {} merge from entity @s {}\nexecute as @e[type=mooshroom,limit=1,distance=0] run function gm4_shroomites:mooshroom/initialize/red\n\n# particles and sound\nparticle minecraft:mycelium ~ ~.8 ~ .4 .4 .4 0 50\nplaysound minecraft:block.chorus_flower.grow hostile @a[distance=..10] ~ ~ ~ 0.625\nparticle minecraft:block{block_state:\"minecraft:red_mushroom_block\"} ~ ~1 ~ .3 .3 .3 20 20\n\n# add to age\nscoreboard players operation @s gm4_shroom_data += #conversion_cost gm4_shroom_data\n\n# kill cow\ntp @s ~ -4096 ~\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/mooshroom/initialize/brown.mcfunction",
    "content": "# initializes a freshly converted cow\n# @s = freshly spawned mooshroom\n# at @s (after move)\n# run from gm4_shroomites:mooshroom/convert/brown\n\ntag @s remove gm4_new_shroomite_mooshroom\ntag @s add gm4_brown_shroomite\ntag @s add gm4_shroomite_analyzed\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/mooshroom/initialize/red.mcfunction",
    "content": "# initializes a freshly converted cow\n# @s = freshly spawned mooshroom\n# at @s (after move)\n# run from gm4_shroomites:mooshroom/convert/red\n\ntag @s remove gm4_new_shroomite_mooshroom\ntag @s add gm4_red_shroomite\ntag @s add gm4_shroomite_analyzed\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/mooshroom/process.mcfunction",
    "content": "# runs actions on and as mooshrooms\n# @s = @e[type=mooshroom]\n# at @s\n# run from gm4_shroomites:slow_clock\n\n# chance to spawn shroom unless this mooshroom is on cooldown from previous spawn and unless the global cap was reached\nexecute unless score @s gm4_shroom_data matches 1.. if score $global_shroom_count gm4_shroom_data < #global_shroom_cap gm4_shroom_data if predicate gm4_shroomites:mooshroom/shroom_spawn_chance if block ~ ~-1 ~ #gm4_shroomites:spore_convertable if block ~ ~ ~ #gm4_shroomites:shroom_replacable unless entity @e[type=marker,tag=gm4_shroomite_shroom,distance=..4.5] run function gm4_shroomites:mooshroom/shed_shroom\nexecute if score @s gm4_shroom_data matches 1.. run scoreboard players remove @s gm4_shroom_data 1\n\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/mooshroom/shed_shroom.mcfunction",
    "content": "# plants a mushroom after checking the color of this mooshroom\n# @s = @e[type=mooshroom] that are ready to plant a shroomite_shroom\n# at @s\n# run from gm4_shroomites:mooshroom/process\n\n# analyze mooshroom color\nexecute unless entity @s[tag=gm4_shroomite_analyzed] run function gm4_shroomites:mooshroom/analyze_color\n\n# plant shroom\nfunction gm4_shroomites:shroom/create\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/shroom/check_structure.mcfunction",
    "content": "# makes sure mushroom structure is still present before processing this shroom\n# @s = @e[type=marker,tag=gm4_shroomite_shroom]\n# at @s\n# run from gm4_shroomites:slow_clock\n\n# check that this is still inside a red_mushroom\nexecute if entity @s[tag=gm4_brown_shroomite] unless block ~ ~ ~ brown_mushroom run kill @s\nexecute if entity @s[tag=gm4_red_shroomite] unless block ~ ~ ~ red_mushroom run kill @s\n\n# process this shroom\nexecute if block ~ ~ ~ #gm4_shroomites:mushrooms run function gm4_shroomites:shroom/process\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/shroom/create.mcfunction",
    "content": "# places a new sporing shroom at the location this function is run at\n# @s = either a spore at the end of its life or a mooshroom\n# at @s\n# run from gm4_shroomites:spore/die and gm4_shroomites:mooshroom/process\n\n# place shroom depending on which mooshroom or spore flavor placed this shroom, default to red\nexecute if entity @s[tag=gm4_brown_shroomite] run function gm4_shroomites:shroom/place/brown\nexecute unless score $success gm4_shroom_data matches 1.. run function gm4_shroomites:shroom/place/red\nscoreboard players reset $success gm4_shroom_data\n\n# add cooldown in case this was planted by a mooshroom\nscoreboard players operation @s gm4_shroom_data += #shroom_placement_cooldown gm4_shroom_data\n\n# sounds\nplaysound minecraft:block.chorus_flower.grow hostile @a[distance=..8] ~ ~ ~ 0.2 0.8\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/shroom/place/brown.mcfunction",
    "content": "# physically places a new brown_mushroom and places the corrosponding entity\n# @s = either a spore at the end of its life or a brown mooshroom\n# at @s\n# run from gm4_shroomites:shroom/create\n\n# place mushroom block unless there is already a mushroom block in this location\nexecute unless block ~ ~ ~ #gm4_shroomites:mushrooms run setblock ~ ~ ~ brown_mushroom destroy\n\n# place marker entity unless there is already a shroomite_shroom in this location. Do not place a marker if the global shroom cap was reached.\nexecute align xyz positioned ~.5 ~.5 ~.5 unless entity @e[type=marker,tag=gm4_shroomite_shroom,distance=..0.1] run summon marker ~ ~ ~ {Tags:[\"gm4_shroomite_shroom\",\"gm4_brown_shroomite\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"],CustomName:\"gm4_shroomite_shroom\"}\nexecute align xyz positioned ~.5 ~.5 ~.5 run scoreboard players set @e[type=marker,tag=gm4_shroomite_shroom,distance=..0.1] gm4_entity_version 1\n\n# particles\nparticle minecraft:block{block_state:\"minecraft:brown_mushroom\"} ~ ~ ~ 0.1 0.1 0.1 1 10\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/shroom/place/red.mcfunction",
    "content": "# physically places a new red_mushroom and places the corrosponding entity\n# @s = either a spore at the end of its life or a red mooshroom\n# at @s\n# run from gm4_shroomites:shroom/create\n\n# place mushroom block unless there is already a mushroom block in this location\nexecute unless block ~ ~ ~ #gm4_shroomites:mushrooms run setblock ~ ~ ~ red_mushroom destroy\n\n# place marker entity unless there is already a shroomite_shroom in this location. Do not place a marker if the global shroom cap was reached.\nexecute align xyz positioned ~.5 ~.5 ~.5 unless entity @e[type=marker,tag=gm4_shroomite_shroom,distance=..0.1] run summon marker ~ ~ ~ {Tags:[\"gm4_shroomite_shroom\",\"gm4_red_shroomite\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"],CustomName:\"gm4_shroomite_shroom\"}\nexecute align xyz positioned ~.5 ~.5 ~.5 run scoreboard players set @e[type=marker,tag=gm4_shroomite_shroom,distance=..0.1] gm4_entity_version 1\n\n# particles\nparticle minecraft:block{block_state:\"minecraft:red_mushroom\"} ~ ~ ~ 0.1 0.1 0.1 1 10\n\n# set fake player flag\nscoreboard players set $success gm4_shroom_data 1\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/shroom/process.mcfunction",
    "content": "# runs actions on and as sporing shrooms\n# @s = @e[type=marker,tag=gm4_shroomite_shroom]\n# at @s\n# run from gm4_shroomites:shroom/check_structure\n\n# count total shrooms\nscoreboard players add $global_shroom_count gm4_shroom_data 1\n\n# chance to spawn spore unless this shroom is on cooldown from previous spawn\nexecute unless score @s gm4_shroom_data matches 1.. if predicate gm4_shroomites:shroom/spore_spawn_chance run function gm4_shroomites:spore/spawn\nexecute if score @s gm4_shroom_data matches 1.. run scoreboard players remove @s gm4_shroom_data 1\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/slow_clock.mcfunction",
    "content": "# manages shroom placement and shroom behavior\n# @s = none\n# at world spawn\n# run from gm4_shroomites:fast_clock\n\n# reset clock counter\nscoreboard players set $slow_clock gm4_shroom_data 0\n\n# handle shrooms\nscoreboard players set $global_shroom_count gm4_shroom_data 0\nexecute as @e[type=marker,tag=gm4_shroomite_shroom] at @s run function gm4_shroomites:shroom/check_structure\n\n# handle mooshrooms placing shrooms\nexecute as @e[type=mooshroom,tag=!smithed.entity] at @s run function gm4_shroomites:mooshroom/process\n\n# grant advancement if shroomite cap has been reached\nexecute if score $global_shroom_count gm4_shroom_data >= #global_shroom_cap gm4_shroom_data run advancement grant @a only gm4:shroomites\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/spore/die.mcfunction",
    "content": "# kills the selected spore. Tries to plant a new shroomite_shroom if possible\n# @s = @e[type=marker,tag=gm4_shroomite_spore]\n# at @s\n# run from gm4_shroomites:spore/track_age\n\n# try to place new sporing shroom if there is mycelium below, unless the global cap has been reached\nexecute if score $global_shroom_count gm4_shroom_data < #global_shroom_cap gm4_shroom_data if block ~ ~-1 ~ mycelium if block ~ ~ ~ #gm4_shroomites:shroom_replacable unless entity @e[type=marker,tag=gm4_shroomite_shroom,distance=..4.5] run function gm4_shroomites:shroom/create\n\n# kill spore\nkill @s\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/spore/fertilize.mcfunction",
    "content": "# turns a block below this spore into mycelium and uses up some of the age of this spore\n# @s = @e[type=marker,tag=gm4_shroomite_spore]\n# at @s\n# run from gm4_shroomites:spore/move/postmovement\n\n# place mycelium\nsetblock ~ ~-1 ~ mycelium replace\nexecute if block ~ ~ ~ #gm4:foliage unless block ~ ~ ~ #gm4_shroomites:mushrooms run setblock ~ ~ ~ air destroy\n\n# add to age\nscoreboard players operation @s gm4_shroom_data += #fertilization_cost gm4_shroom_data\n\n# particles and sounds\nparticle minecraft:block{block_state:\"minecraft:mycelium\"} ~ ~ ~ 0.12 0 0.12 1 2\nplaysound minecraft:block.chorus_flower.grow hostile @a[distance=..16] ~ ~ ~ 0.1 0\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/spore/initialize.mcfunction",
    "content": "# sets up the marker used for spore entities\n# @s = shroomite_shroom ready to spawn a spore if the global spore cap has not yet been reached\n# at @s\n# run from gm4_shroomites:spore/spawn\n\n# place correct marker depending on spore color\nexecute store success score $success gm4_shroom_data if entity @s[tag=gm4_brown_shroomite] run summon marker ~ ~ ~ {Tags:[\"gm4_shroomite_spore\",\"gm4_brown_shroomite\"],CustomName:\"gm4_shroomite_spore\"}\nexecute unless score $success gm4_shroom_data matches 1.. run summon marker ~ ~ ~ {Tags:[\"gm4_shroomite_spore\",\"gm4_red_shroomite\"],CustomName:\"gm4_shroomite_spore\"}\nscoreboard players reset $success gm4_shroom_data\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/spore/move/horizontal.mcfunction",
    "content": "# moves a spore one step horizontally\n# @s = @e[type=marker,tag=gm4_shroomite_spore]\n# at @s\n# run from gm4_shroomites:spore/move/vertical\n\n# select valid directions\nsummon marker ~1 ~ ~ {Tags:[\"gm4_shroomite_path\"],CustomName:\"gm4_shroomite_path\"}\nsummon marker ~-1 ~ ~ {Tags:[\"gm4_shroomite_path\"],CustomName:\"gm4_shroomite_path\"}\nsummon marker ~ ~ ~1 {Tags:[\"gm4_shroomite_path\"],CustomName:\"gm4_shroomite_path\"}\nsummon marker ~ ~ ~-1 {Tags:[\"gm4_shroomite_path\"],CustomName:\"gm4_shroomite_path\"}\nexecute as @e[type=marker,tag=gm4_shroomite_path] at @s if block ~ ~ ~ #gm4:full_collision run function gm4_shroomites:spore/move/step_up\n\n# move in random valid direction\nteleport @s @e[type=marker,tag=gm4_shroomite_path,sort=random,limit=1,distance=..1.5]\nkill @e[type=marker,tag=gm4_shroomite_path,distance=..1.5]\n\n# environmental effects\nexecute at @s run function gm4_shroomites:spore/move/postmovement\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/spore/move/postmovement.mcfunction",
    "content": "# applies environmental effects after the spore has moved\n# @s = @e[type=marker,tag=gm4_shroomite_spore]\n# at @s (after move)\n# run from gm4_shroomites:spore/move/horizontal\n\n# subtract from age and convert dirt below to mycelium\nexecute unless block ~ ~-1 ~ mycelium if block ~ ~-1 ~ #gm4_shroomites:spore_convertable run function gm4_shroomites:spore/fertilize\n\n# subtract from age and convert neraby cows to mooshrooms\nexecute if entity @s[tag=gm4_brown_shroomite] as @e[type=cow,distance=..1,nbt=!{NoAI:1b}] at @s run function gm4_shroomites:mooshroom/convert/brown\nexecute if entity @s[tag=gm4_red_shroomite] as @e[type=cow,distance=..1,nbt=!{NoAI:1b}] at @s run function gm4_shroomites:mooshroom/convert/red\n\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/spore/move/step_up.mcfunction",
    "content": "# moves a shroomite_path up by 1 if necessary.\n# @s = @e[type=marker,tag=gm4_shroomite_path]\n# at @s\n# run from gm4_shroomites:spore/move/horizontal\n\n# check if there is space above\nexecute unless block ~ ~1 ~ #gm4:full_collision run tp @s ~ ~1 ~\nexecute if block ~ ~1 ~ #gm4:full_collision run kill @s\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/spore/move/vertical.mcfunction",
    "content": "# moves a spore one step\n# @s = @e[type=marker,tag=gm4_shroomite_spore]\n# at @s\n# run from gm4_shroomites:spore/process\n\n# move down if spore is above a block without collision, move horizontally otherwise\nexecute unless block ~ ~-1 ~ #gm4:full_collision if predicate gm4_shroomites:spore/descent_chance store success score $success gm4_shroom_data run tp @s ~ ~-1 ~\nexecute unless score $success gm4_shroom_data matches 1.. run function gm4_shroomites:spore/move/horizontal\nscoreboard players reset $success gm4_shroom_data\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/spore/process.mcfunction",
    "content": "# runs actions on and as spores\n# @s = @e[type=marker,tag=gm4_shroomite_spore]\n# at @s\n# run from gm4_shroomites:spore/track_age\n\n# count total spores\nscoreboard players add $global_spore_count gm4_shroom_data 1\n\n# move\nexecute if predicate gm4_shroomites:spore/move_chance run function gm4_shroomites:spore/move/vertical\n\n# particles and sounds\nparticle minecraft:mycelium ~ ~ ~ 0.22 0.1 0.22 1 16\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/spore/spawn.mcfunction",
    "content": "# spawns a spore at the location this function is run at\n# @s = shroomite_shroom ready to spawn a spore\n# at @s\n# run from gm4_shroomites:shroom/process\n\n# spawn spore unless the global spore cap has been reached\nexecute if score $global_spore_count gm4_shroom_data < #global_spore_cap gm4_shroom_data run function gm4_shroomites:spore/initialize\n\n# set this shroom on cooldown\nscoreboard players operation @s gm4_shroom_data += #spore_placement_cooldown gm4_shroom_data\n\n# particles and sounds\nplaysound minecraft:block.chorus_flower.grow hostile @a[distance=..16] ~ ~ ~ 0.2 0\nparticle minecraft:mycelium ~ ~-0.35 ~ 0.2 0.07 0.2 1 96\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/function/spore/track_age.mcfunction",
    "content": "# runs validates that this spore has not died already\n# @s = @e[type=marker,tag=gm4_shroomite_spore]\n# at @s\n# run from gm4_shroomites:main\n\n# kill spores that are inside a non-traversable block\nexecute if block ~ ~ ~ #gm4_shroomites:spore_opaque run kill @s\n\n# manage age and process actions on spore if age doesn't exceed #spore_max_age\nscoreboard players add @s gm4_shroom_data 1\nexecute if score @s gm4_shroom_data > #spore_max_age gm4_shroom_data run function gm4_shroomites:spore/die\nexecute unless score @s gm4_shroom_data > #spore_max_age gm4_shroom_data run function gm4_shroomites:spore/process\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/guidebook/shroomites.json",
    "content": "{\n  \"id\": \"shroomites\",\n  \"name\": \"Shroomites\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:mycelium\"\n  },\n  \"criteria\": {\n    \"step_on_mycelium\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"stepping_on\": {\n                \"block\": {\n                  \"blocks\": [\n                    \"minecraft:mycelium\"\n                  ]\n                }\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"stand_in_blocker\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": \"#gm4_shroomites:spore_opaque\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"step_on_mycelium\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.shroomites.description\",\n            \"fallback\": \"Mooshrooms have a rare chance to spawn a shroomite mushroom.\\n\\nA shroomite will spawn spores that spread mycelium to nearby dirt, and convert cows to mooshrooms.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"spreading\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"stand_in_blocker\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.shroomites.spreading\",\n            \"fallback\": \"Spores will float in the air and can produce new shroomites.\\n\\nBlocks with collision, water, lava, cobwebs, powdered snow, and sunflowers can block shroomite spores from spreading.\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"description\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/predicate/mooshroom/shroom_spawn_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.24\n}\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/predicate/shroom/spore_spawn_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.33\n}\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/predicate/spore/descent_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.66\n}\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/predicate/spore/move_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.8\n}\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/tags/block/mushrooms.json",
    "content": "{\n    \"values\": [\n        \"minecraft:red_mushroom\",\n        \"minecraft:brown_mushroom\"\n    ]\n}\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/tags/block/shroom_replacable.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:air\",\n        \"#gm4:foliage\"\n    ]\n}\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/tags/block/spore_convertable.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:substrate_overworld\",\n        \"minecraft:farmland\"\n    ]\n}\n"
  },
  {
    "path": "gm4_shroomites/data/gm4_shroomites/tags/block/spore_opaque.json",
    "content": "{\n    \"values\": [\n        \"#gm4:full_collision\",\n        \"#gm4:water\",\n        \"minecraft:cobweb\",\n        \"minecraft:lava\",\n        \"minecraft:powder_snow\",\n        \"minecraft:sunflower\"\n    ]\n}\n"
  },
  {
    "path": "gm4_shroomites/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.shroomites,Ever wondered why all the Mooshrooms are locked up on islands? This Module makes Mooshrooms spread mycelium and mushrooms wherever they go.\ntext.gm4.guidebook.shroomites.description,\"Mooshrooms have a rare chance to spawn a shroomite mushroom.\\n\\nA shroomite will spawn spores that spread mycelium to nearby dirt, and convert cows to mooshrooms.\"\ntext.gm4.guidebook.shroomites.spreading,\"Spores will float in the air and can produce new shroomites.\\n\\nBlocks with collision, water, lava, cobwebs, powdered snow, and sunflowers can block shroomite spores from spreading.\"\n"
  },
  {
    "path": "gm4_smelteries/README.md",
    "content": "# Smelteries<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nBuild a multi-block structure to double the output of your ores!<!--$pmc:headerSize-->\r\n\r\n<img src=\"images/creating_smeltery.gif\" alt=\"Creating a Smeltery, block by block.\" height=\"350\"/> <!--$localAssetToURL--> <!--$pmc:delete-->\r\n\r\n### Features\r\n- Adds a 3x2x3 multi-block structure made of iron blocks, glass, a furnace and a cauldron\r\n- Doubles Iron, Gold, Copper, Sand and Chorus Fruit\r\n- Smelteries have a 1 in 90 chance of filling the Cauldron with Lava\r\n"
  },
  {
    "path": "gm4_smelteries/assets/gm4_smelteries/models/block/ore_display.json",
    "content": "{\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [4, 12, 4],\n\t\t\t\"to\": [12, 19, 12],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 14], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 16, 16], \"rotation\": 180, \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#top\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_smelteries/assets/model_data.yaml",
    "content": "model_data:\n  - item: player_head\n    reference: item/smeltery\n    model: block/smeltery_unlit\n  - item: iron_block\n    template: block\n    broadcast:\n      - reference: block/smeltery_unlit\n        textures: \n          top: block/smeltery_top\n          front: block/smeltery_front\n          side: block/smeltery_side\n          bottom: block/smeltery_bottom\n      - reference: block/smeltery_lit\n        textures: \n          top: block/smeltery_top\n          front: block/smeltery_front_lit\n          side: block/smeltery_side\n          bottom: block/smeltery_bottom\n    transforms:\n      - name: item_display\n        origin: [0.5, 1, 0.5]\n        scale: [0.438, 0.438, 0.438]\n        translation: [0, 0.1, 0]\n  - item: chorus_flower\n    template: smelteries:ore_display\n    reference: block/ore_display/chorus_fruit\n  - item: copper_ore\n    template: smelteries:ore_display\n    reference: block/ore_display/copper_ore\n  - item: deepslate_copper_ore\n    template: smelteries:ore_display\n    reference: block/ore_display/deepslate_copper_ore\n  - item: deepslate_gold_ore\n    template: smelteries:ore_display\n    reference: block/ore_display/deepslate_gold_ore\n  - item: deepslate_iron_ore\n    template: smelteries:ore_display\n    reference: block/ore_display/deepslate_iron_ore\n  - item: gold_ore\n    template: smelteries:ore_display\n    reference: block/ore_display/gold_ore\n  - item: iron_ore\n    template: smelteries:ore_display\n    reference: block/ore_display/iron_ore\n  - item: nether_gold_ore\n    template: smelteries:ore_display\n    reference: block/ore_display/nether_gold_ore\n  - item: raw_copper_block\n    template: smelteries:ore_display\n    reference: block/ore_display/raw_copper\n  - item: raw_gold_block\n    template: smelteries:ore_display\n    reference: block/ore_display/raw_gold\n  - item: raw_iron_block\n    template: smelteries:ore_display\n    reference: block/ore_display/raw_iron\n  - item: red_sand\n    template: smelteries:ore_display\n    reference: block/ore_display/red_sand\n  - item: sand\n    template: smelteries:ore_display\n    reference: block/ore_display/sand\n  - item: furnace\n    reference: gui/advancement/smelteries\n    template:\n      name: advancement\n      forward: block/smeltery_unlit\n"
  },
  {
    "path": "gm4_smelteries/assets/translations.csv",
    "content": "key,en_us\nblock.gm4.smeltery,Smeltery\ncontainer.gm4.smeltery,Smeltery\nadvancement.gm4.smelteries.title,Serious Smelter\nadvancement.gm4.smelteries.description,Construct a Smeltery\ntext.gm4.guidebook.module_desc.smelteries,Build a Smeltery and double your ore output with this multi-block structure.\ntext.gm4.guidebook.smelteries.description,\"Smelteries can refine certain furnace recipes.\\n\\nMetal ores, sand, and chorus fruit can be doubled with Smelteries.\"\ntext.gm4.guidebook.smelteries.crafting,A Smeltery can be crafted in a crafting table:\ntext.gm4.guidebook.smelteries.multi_block,\"The smeltery requires a multi-block structure to work.\\n\\nBehind the smeltery must be a cauldron. The rest of the 3x3 grid must be filled with iron blocks, then another layer of iron blocks above the first.\"\ntext.gm4.guidebook.smelteries.doubling,\"Once the multi-block is set up, the smeltery will produce double the normal result.\\n\\nSmelting metal ores, raw metals, sand, red sand, or chorus fruit will result in doubled outputs.\"\ntext.gm4.guidebook.smelteries.lava,\"When something is smelted in the smeltery there is a chance that the cauldron behind it will fill with lava.\\n\\nWith a continuous smelting process, it's possible to keep a smeltery fueled with the extra lava.\"\n"
  },
  {
    "path": "gm4_smelteries/beet.yaml",
    "content": "id: gm4_smelteries\nname: Smelteries\nversion: 1.9.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4_smelteries.ore_display\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_machines\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_machines: 1.5.0\n      schedule_loops: [main]\n    \n    gui_fonts:\n      - translation: gui.gm4.smeltery\n        container: furnace\n        texture: gui/container/smeltery\n    website:\n      description: Build a Smeltery and double your ore output with this multi-block structure.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: AHj8RSHk\n    wiki: https://wiki.gm4.co/wiki/smelteries\n    credits:\n      Creator:\n        - Bloo\n      Updated By:\n        - dvitski\n        - Kroppeb\n        - Misode\n        - SpecialBuilder32\n        - BPR\n        - runcows\n      Textures By:\n        - Kyrius\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_smelteries/data/gm4/advancement/smelteries.json",
    "content": "{\n    \"display\": {\n        \"icon\": {\n            \"id\": \"furnace\",\n            \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_smelteries:gui/advancement/smelteries\"]}\n            }\n        },\n        \"title\": {\n            \"translate\": \"advancement.gm4.smelteries.title\",\n            \"fallback\": \"Serious Smelter\"\n        },\n        \"description\": {\n            \"translate\": \"advancement.gm4.smelteries.description\",\n            \"fallback\": \"Construct a Smeltery\",\n            \"color\": \"gray\"\n        }\n    },\n    \"parent\": \"gm4:root\",\n    \"criteria\": {\n        \"obtain_smeltery\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": [\n                            \"minecraft:player_head\"\n                        ],\n                        \"predicates\": {\n                          \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"smeltery\\\"}}\"\n                        }\n                    }\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_machines/tags/function/destroy.json",
    "content": "{\n    \"values\": [\n        \"gm4_smelteries:machine/verify_destroy\"\n    ]\n}\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_machines/tags/function/place_down.json",
    "content": "{\n    \"values\": [\n        \"gm4_smelteries:machine/verify_place_down\"\n    ]\n}\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/advancement/recipes/smeltery.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_smelteries:smeltery\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:furnace\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_smelteries:smeltery\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/furnace_lit.mcfunction",
    "content": "# run smeltery in lit state\n# @s = smeltery marker\n# at @s\n# run from process\n\nexecute unless entity @s[tag=gm4_smeltery_lit] run item replace entity @e[type=item_display,tag=gm4_smeltery_display,distance=..0.1,limit=1] contents with iron_block[custom_model_data={strings:[\"gm4_smelteries:block/smeltery_lit\"]}]\ntag @s add gm4_smeltery_lit\n\nparticle large_smoke ~ ~ ~ 0 0.3 0 0 5 normal @a\nexecute if block ^ ^1 ^-1 #minecraft:air if block ^ ^ ^-1 #gm4_smelteries:valid_cauldron if block ^1 ^ ^ iron_block if block ^1 ^ ^-1 iron_block if block ^1 ^ ^-2 iron_block if block ^ ^ ^-2 iron_block if block ^-1 ^ ^ iron_block if block ^-1 ^ ^-1 iron_block if block ^-1 ^ ^-2 iron_block if block ^1 ^1 ^ iron_block if block ^1 ^1 ^-1 iron_block if block ^1 ^1 ^-2 iron_block if block ^ ^1 ^-2 iron_block if block ^-1 ^1 ^ iron_block if block ^-1 ^1 ^-1 iron_block if block ^-1 ^1 ^-2 iron_block run function gm4_smelteries:smelt/check_cook_time\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/furnace_unlit.mcfunction",
    "content": "# set smeltery to unlit state\n# @s = smeltery marker\n# at @s\n# run from process\n\nitem replace entity @e[type=item_display,tag=gm4_smeltery_display,distance=..0.1,limit=1] contents with iron_block[custom_model_data={strings:[\"gm4_smelteries:block/smeltery_unlit\"]}]\nitem replace entity @e[type=item_display,tag=gm4_smeltery_cauldron,distance=..0.1,limit=1] contents with air\ntag @s remove gm4_smeltery_lit\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_smelt_data dummy\n\nexecute unless score smelteries gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Smelteries\"}\nexecute unless score smelteries gm4_earliest_version < smelteries gm4_modules run scoreboard players operation smelteries gm4_earliest_version = smelteries gm4_modules\nscoreboard players set smelteries gm4_modules 1\n\nschedule function gm4_smelteries:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/machine/create.mcfunction",
    "content": "# places the smeltery down\n# @s = player who placed the smeltery\n# located at the center of the placed block\n# run from gm4_smelteries:machine/verify_place_down\n\n# place block depending on rotation\nexecute if score $single_rotation gm4_machine_data matches 1 run data modify storage gm4_smelteries:placement temp set value {facing:\"south\",rotation:[0.0f,0.0f]}\nexecute if score $single_rotation gm4_machine_data matches 2 run data modify storage gm4_smelteries:placement temp set value {facing:\"west\",rotation:[90.0f,0.0f]}\nexecute if score $single_rotation gm4_machine_data matches 3 run data modify storage gm4_smelteries:placement temp set value {facing:\"north\",rotation:[180.0f,0.0f]}\nexecute if score $single_rotation gm4_machine_data matches 4 run data modify storage gm4_smelteries:placement temp set value {facing:\"east\",rotation:[-90.0f,0.0f]}\n\nfunction gm4_smelteries:machine/place_rotated with storage gm4_smelteries:placement temp\n\ndata remove storage gm4_smelteries:placement temp\n\n# mark block as placed\nplaysound block.anvil.use block @a[distance=..4] ~ ~ ~ 1 0.8\nscoreboard players set $placed_block gm4_machine_data 1\nscoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2\ntag @e[distance=..3] remove gm4_new_machine\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/machine/destroy.mcfunction",
    "content": "# destroys the smeltery\n# @s = smeltery marker\n# located at @s\n# run from gm4_smelteries:machine/verify_destroy\n\n# legacy cleanup - TODO: remove this when we stop supporting the upgrade path\nexecute positioned ~ ~-0.3 ~ run kill @e[type=armor_stand,tag=gm4_smeltery_stand,limit=1,distance=..0.01]\nscoreboard players operation $current gm4_smelt_id = @s gm4_smelt_id\nexecute positioned ^ ^-1.5 ^-1 as @e[type=armor_stand,tag=gm4_smeltery_cauldron,distance=..0.01] if score @s gm4_smelt_id = $current gm4_smelt_id run kill @s\n\n# kill entities related to machine block\nkill @e[type=item_display,tag=gm4_smeltery_display,limit=1,distance=..0.01]\nkill @e[type=item_display,tag=gm4_smeltery_cauldron,limit=1,distance=..0.01]\nexecute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:\"minecraft:furnace\",count:1,components:{}}},limit=1,sort=nearest]\nkill @s\n\n# drop item (unless broken in creative mode)\nexecute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_smelteries:items/smeltery\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/machine/place_rotated.mcfunction",
    "content": "# places the smeltery down based on rotation\n# @s = player who placed the smeltery\n# located at the center of the placed block, rotated same cardinal direction as @s\n# with {facing, rotation}\n# run from gm4_smelteries:machine/create\n\n# place furnace\n$setblock ~ ~ ~ furnace[facing=$(facing)]\ndata merge block ~ ~ ~ {CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.smeltery\",\"fallback\":\"Smeltery\"},[{\"text\":\" \",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.smeltery\",\"fallback\":\"Smeltery\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.smeltery\",\"fallback\":\"Smeltery\",\"font\":\"gm4:offscreen\"},{\"translate\":\"gui.gm4.smeltery\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"text\":\" \",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.smeltery\",\"fallback\":\"Smeltery\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.smeltery\",\"fallback\":\"Smeltery\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon cauldron display\n$summon item_display ~ ~ ~ {\\\n  CustomName:\"gm4_smeltery_cauldron\",\\\n  Tags:[\"gm4_no_edit\",\"gm4_smeltery_cauldron\",\"gm4_machine_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],\\\n  item_display:head,\\\n  brightness:{sky:15,block:15},\\\n  Rotation:$(rotation),\\\n  transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.1875f,-1.0f],scale:[0.625,0.625,0.625]}\\\n}\n\n# summon display and marker entity\n$summon item_display ~ ~ ~ {\\\n  CustomName:\"gm4_smeltery_display\",\\\n  Tags:[\"gm4_no_edit\",\"gm4_smeltery_display\",\"gm4_machine_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],\\\n  item:{id:\"minecraft:iron_block\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_smelteries:block/smeltery_unlit\"]}}},\\\n  item_display:head,\\\n  brightness:{sky:15,block:15},\\\n  Rotation:$(rotation),\\\n  transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.601f,0f],scale:[0.438,0.438,0.438]}\\\n}\n$summon marker ~ ~ ~ {Tags:[\"gm4_smeltery\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_smeltery\",Rotation:$(rotation)}\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/machine/verify_destroy.mcfunction",
    "content": "# verifies that the destroyed machine was from this module\n# @s = machine block marker\n# located at @s\n# run from #gm4_machines:destroy\n\nexecute if entity @s[tag=gm4_smeltery] run function gm4_smelteries:machine/destroy\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/machine/verify_place_down.mcfunction",
    "content": "# verifies that the placed down machine was from this module\n# @s = player who placed down the machine\n# located at the machine block marker (at the center of the placed down block)\n# run from #gm4_machines:place_down\n\nexecute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:\"smeltery\"} run function gm4_smelteries:machine/create\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/main.mcfunction",
    "content": "# upgrade path, needs run before process\nfunction gm4_smelteries:upgrade_paths/1.9\n# process machine\nexecute as @e[type=marker,tag=gm4_smeltery] at @s run function gm4_smelteries:process\n\nschedule function gm4_smelteries:main 16t\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/process.mcfunction",
    "content": "# smeltery processes\n# @s = smeltery\n# at @s\n# run from main\n\n# update smeltery state\nexecute if block ~ ~ ~ furnace[lit=true] run function gm4_smelteries:furnace_lit\nexecute unless block ~ ~ ~ furnace[lit=true] if entity @s[tag=gm4_smeltery_lit] run function gm4_smelteries:furnace_unlit\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/smelt/check_cook_time.mcfunction",
    "content": "# check furnace and store cooktime\n# @s = smeltery marker\n# at @s\n# run from furnace_lit\n\nscoreboard players set $cook_time gm4_smelt_data -1\nexecute store result score $cook_time gm4_smelt_data run data get block ~ ~ ~ cooking_time_spent\n\n# display ore\ntag @s add gm4_smeltery_processing\nexecute if score $cook_time gm4_smelt_data matches 0.. as @e[type=item_display,tag=gm4_smeltery_cauldron,limit=1,distance=..0.01] run function gm4_smelteries:smelt/smelting\ntag @s remove gm4_smeltery_processing\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/smelt/check_finish_smelt.mcfunction",
    "content": "# @s = none\n# run from smelt/prep_finish_smelt\n\nexecute as @e[type=marker,tag=gm4_smeltery_smelting] at @s if block ~ ~ ~ furnace{cooking_time_spent:199s} run function gm4_smelteries:smelt/finish_smelt\n\nexecute if entity @e[type=marker,tag=gm4_smeltery_smelting,limit=1] run schedule function gm4_smelteries:smelt/check_finish_smelt 1t\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/smelt/finish_smelt.mcfunction",
    "content": "# complete the smelting process\n# @s = smeltery marker that finished smelting\n# located at @s\n# run from smelt/check_finish_smelt\n\ntag @s remove gm4_smeltery_smelting\ntag @s add gm4_smeltery_smelted\nexecute if block ~ ~-1 ~ hopper{TransferCooldown:1} run data modify block ~ ~-1 ~ TransferCooldown set value 2\nexecute if block ~ ~-1 ~ hopper{TransferCooldown:0} run data modify block ~ ~-1 ~ TransferCooldown set value 2\nexecute positioned ~ ~-1 ~ as @e[type=hopper_minecart,distance=..1] run tag @s add gm4_smelteries_disabled\nexecute as @e[type=hopper_minecart,tag=gm4_smelteries_disabled,distance=..3] run data merge entity @s {Enabled:0b}\nschedule function gm4_smelteries:smelt/modify_output 1t\n\n# lava cauldron\nexecute if block ^ ^ ^-1 cauldron if predicate gm4_smelteries:lava_cauldron_chance run setblock ^ ^ ^-1 lava_cauldron\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/smelt/increase_output.mcfunction",
    "content": "# increases the smeltery output by 1\n# @s = smeltery marker that finished smelting\n# located at a smeltery that finished smelting\n# run from smelt/modify_output\n\nexecute store result score $output gm4_smelt_data run data get block ~ ~ ~ Items[{Slot:2b}].count\nexecute store result block ~ ~ ~ Items[{Slot:2b}].count byte 1 if score $output gm4_smelt_data matches ..63 run scoreboard players add $output gm4_smelt_data 1\n\nparticle large_smoke ~ ~ ~ 0.1 0 0.1 0.05 5 normal @a\nplaysound block.redstone_torch.burnout block @a[distance=..8] ~ ~ ~ 0.8 2\nplaysound block.lava.ambient block @a[distance=..8] ~ ~ ~ 0.6 2\n\n# clean up\ntag @s remove gm4_smeltery_smelted\nexecute as @e[type=hopper_minecart,tag=gm4_smelteries_disabled,distance=..3] run data merge entity @s {Enabled:1b}\ntag @e[type=hopper_minecart,distance=..3] remove gm4_smelteries_disabled\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/smelt/modify_output.mcfunction",
    "content": "# @s = none\n# run from smelt/finish_smelt\n\nexecute as @e[type=marker,tag=gm4_smeltery_smelted] at @s run function gm4_smelteries:smelt/increase_output\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/smelt/prep_finish_smelt.mcfunction",
    "content": "# set up marker for smelting\n# @s = smeltery cauldron linked to a furnace that's smelting items\n# located at the smeltery block (furnace)\n# run from smelt/smelting\n\ntag @e[type=marker,tag=gm4_smeltery_processing,limit=1,distance=..2] add gm4_smeltery_smelting\nfunction gm4_smelteries:smelt/check_finish_smelt\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/smelt/smelting.mcfunction",
    "content": "# check for doublable ores\n# @s = smeltery cauldron linked to a furnace that's smelting items\n# located at the smeltery block (furnace)\n# run from smelt/check_cook_time\n\n# check if the currently smeling item can be doubled\nitem replace entity @s contents with air\nexecute unless items block ~ ~ ~ container.0 #gm4_smelteries:can_double run return run tag @e[type=marker,tag=gm4_smeltery_processing,limit=1,distance=..2] remove gm4_smeltery_smelting\n\n# update the cauldron block display\nexecute if items block ~ ~ ~ container.0 minecraft:gold_ore run item replace entity @s contents with minecraft:gold_ore[custom_model_data={\"strings\":[\"gm4_smelteries:block/ore_display/gold_ore\"]}]\nexecute if items block ~ ~ ~ container.0 minecraft:nether_gold_ore run item replace entity @s contents with minecraft:nether_gold_ore[custom_model_data={\"strings\":[\"gm4_smelteries:block/ore_display/nether_gold_ore\"]}]\nexecute if items block ~ ~ ~ container.0 minecraft:deepslate_gold_ore run item replace entity @s contents with minecraft:deepslate_gold_ore[custom_model_data={\"strings\":[\"gm4_smelteries:block/ore_display/deepslate_gold_ore\"]}]\nexecute if items block ~ ~ ~ container.0 minecraft:raw_gold run item replace entity @s contents with minecraft:raw_gold_block[custom_model_data={\"strings\":[\"gm4_smelteries:block/ore_display/raw_gold\"]}]\nexecute if items block ~ ~ ~ container.0 minecraft:iron_ore run item replace entity @s contents with minecraft:iron_ore[custom_model_data={\"strings\":[\"gm4_smelteries:block/ore_display/iron_ore\"]}]\nexecute if items block ~ ~ ~ container.0 minecraft:deepslate_iron_ore run item replace entity @s contents with minecraft:deepslate_iron_ore[custom_model_data={\"strings\":[\"gm4_smelteries:block/ore_display/deepslate_iron_ore\"]}]\nexecute if items block ~ ~ ~ container.0 minecraft:raw_iron run item replace entity @s contents with minecraft:raw_iron_block[custom_model_data={\"strings\":[\"gm4_smelteries:block/ore_display/raw_iron\"]}]\nexecute if items block ~ ~ ~ container.0 minecraft:copper_ore run item replace entity @s contents with minecraft:copper_ore[custom_model_data={\"strings\":[\"gm4_smelteries:block/ore_display/copper_ore\"]}]\nexecute if items block ~ ~ ~ container.0 minecraft:deepslate_copper_ore run item replace entity @s contents with minecraft:deepslate_copper_ore[custom_model_data={\"strings\":[\"gm4_smelteries:block/ore_display/deepslate_copper_ore\"]}]\nexecute if items block ~ ~ ~ container.0 minecraft:raw_copper run item replace entity @s contents with minecraft:raw_copper_block[custom_model_data={\"strings\":[\"gm4_smelteries:block/ore_display/raw_copper\"]}]\nexecute if items block ~ ~ ~ container.0 minecraft:sand run item replace entity @s contents with minecraft:sand[custom_model_data={\"strings\":[\"gm4_smelteries:block/ore_display/sand\"]}]\nexecute if items block ~ ~ ~ container.0 minecraft:red_sand run item replace entity @s contents with minecraft:red_sand[custom_model_data={\"strings\":[\"gm4_smelteries:block/ore_display/red_sand\"]}]\nexecute if items block ~ ~ ~ container.0 minecraft:chorus_fruit run item replace entity @s contents with minecraft:chorus_flower[custom_model_data={\"strings\":[\"gm4_smelteries:block/ore_display/chorus_fruit\"]}]\n\n# check if the furnace is close to finish smelting\nexecute if score $cook_time gm4_smelt_data matches 184..199 run function gm4_smelteries:smelt/prep_finish_smelt\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/upgrade_paths/1.9/cauldron_item_display.mcfunction",
    "content": "# @s = gm4_smeltery_cauldron armor stand\n# at center of smeltery\n# run from upgrade_paths/1.9\n\n# create item display\nsummon item_display ~ ~ ~ {\\\n  CustomName:\"gm4_smeltery_cauldron\",\\\n  Tags:[\"gm4_no_edit\",\"gm4_smeltery_cauldron\",\"gm4_machine_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],\\\n  item_display:head,\\\n  brightness:{sky:15,block:15},\\\n  transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.1875f,-1.0f],scale:[0.625,0.625,0.625]}\\\n}\n# copy data from armor stand\nexecute rotated as @s run rotate @e[type=item_display,tag=gm4_smeltery_cauldron,limit=1,distance=..0.01] ~ ~\nitem replace entity @e[type=item_display,tag=gm4_smeltery_cauldron,limit=1,distance=..0.01] contents from entity @s armor.head\n# increment entity version\nscoreboard players set @e[type=item_display,tag=gm4_smeltery_cauldron,limit=1,distance=..0.01] gm4_entity_version 2\n\nkill @s\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/upgrade_paths/1.9/smeltery_item_display.mcfunction",
    "content": "# @s = gm4_smeltery_stand armor stand\n# at center of smeltery\n# run from upgrade_paths/1.9\n\n# create item display\nsummon item_display ~ ~ ~ {\\\n  CustomName:\"gm4_smeltery_display\",\\\n  Tags:[\"gm4_no_edit\",\"gm4_smeltery_display\",\"gm4_machine_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],\\\n  item:{id:\"minecraft:iron_block\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_smelteries:block/smeltery_unlit\"]}}},\\\n  item_display:head,\\\n  brightness:{sky:15,block:15},\\\n  Rotation:[0.0f,0.0f],\\\n  transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.601f,0f],scale:[0.438,0.438,0.438]}\\\n}\n# copy data from armor stand\nexecute rotated as @s run rotate @e[type=item_display,tag=gm4_smeltery_display,limit=1,distance=..0.01] ~ ~\nitem replace entity @e[type=item_display,tag=gm4_smeltery_display,limit=1,distance=..0.01] contents from entity @s armor.head\n# increment entity version (this function handles the marker as well)\nscoreboard players set @e[type=item_display,tag=gm4_smeltery_display,limit=1,distance=..0.01] gm4_entity_version 2\nscoreboard players set @e[type=marker,tag=gm4_smeltery,limit=1,distance=..0.01] gm4_entity_version 2\n\nkill @s\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/function/upgrade_paths/1.9.mcfunction",
    "content": "# run from main and via upgrade paths util\n\nexecute as @e[type=minecraft:armor_stand,tag=gm4_smeltery_stand] at @s positioned ~ ~0.3 ~ \\\n  run function gm4_smelteries:upgrade_paths/1.9/smeltery_item_display\n\nexecute as @e[type=minecraft:armor_stand,tag=gm4_smeltery_cauldron] at @s positioned ^ ^1.5 ^1 \\\n  run function gm4_smelteries:upgrade_paths/1.9/cauldron_item_display\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/guidebook/smelteries.json",
    "content": "{\n  \"id\": \"smelteries\",\n  \"name\": \"Smelteries\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:furnace\"\n  },\n  \"criteria\": {\n    \"obtain_furnace\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:furnace\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_iron_ingot\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:iron_ingot\"\n            ]\n          }\n        ]\n      }\n    },\n    \"open_smeltery\": {\n      \"trigger\": \"minecraft:default_block_use\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:furnace\"\n                ],\n                \"nbt\": \"{CustomName:{\\\"translate\\\":\\\"gm4.second\\\",\\\"fallback\\\":\\\"%1$s\\\",\\\"with\\\":[{\\\"translate\\\":\\\"container.gm4.smeltery\\\",\\\"fallback\\\":\\\"Smeltery\\\"},{\\\"text\\\":\\\" \\\",\\\"extra\\\":[{\\\"translate\\\":\\\"container.gm4.smeltery\\\",\\\"fallback\\\":\\\"Smeltery\\\",\\\"font\\\":\\\"gm4:half_invert\\\"},{\\\"translate\\\":\\\"container.gm4.smeltery\\\",\\\"fallback\\\":\\\"Smeltery\\\",\\\"font\\\":\\\"gm4:offscreen\\\"},{\\\"translate\\\":\\\"gui.gm4.smeltery\\\",\\\"fallback\\\":\\\"\\\",\\\"font\\\":\\\"gm4:container_gui\\\",\\\"color\\\":\\\"white\\\"},{\\\"text\\\":\\\" \\\",\\\"font\\\":\\\"gm4:half_invert\\\"},{\\\"translate\\\":\\\"container.gm4.smeltery\\\",\\\"fallback\\\":\\\"Smeltery\\\",\\\"font\\\":\\\"gm4:half_invert\\\"},{\\\"translate\\\":\\\"container.gm4.smeltery\\\",\\\"fallback\\\":\\\"Smeltery\\\",\\\"font\\\":\\\"gm4:default\\\",\\\"color\\\":\\\"#404040\\\"}],\\\"font\\\":\\\"gm4:half_invert\\\"}]}}\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.smelteries.description\",\n            \"fallback\": \"Smelteries can refine certain furnace recipes.\\n\\nMetal ores, sand, and chorus fruit can be doubled with Smelteries.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"crafting\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_furnace\"\n        ],\n        [\n          \"obtain_iron_ingot\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.smelteries.crafting\",\n            \"fallback\": \"A Smeltery can be crafted in a crafting table:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_smelteries:smeltery\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"open_smeltery\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.smelteries.multi_block\",\n            \"fallback\": \"The smeltery requires a multi-block structure to work.\\n\\nBehind the smeltery must be a cauldron. The rest of the 3x3 grid must be filled with iron blocks, then another layer of iron blocks above the first.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.smelteries.doubling\",\n            \"fallback\": \"Once the multi-block is set up, the smeltery will produce double the normal result.\\n\\nSmelting metal ores, raw metals, sand, red sand, or chorus fruit will result in doubled outputs.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.smelteries.lava\",\n            \"fallback\": \"When something is smelted in the smeltery there is a chance that the cauldron behind it will fill with lava.\\n\\nWith a continuous smelting process, it's possible to keep a smeltery fueled with the extra lava.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"description\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/loot_table/items/smeltery.json",
    "content": "{\n  \"type\": \"block\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_smelteries:item/smeltery\"]},\n                \"minecraft:profile\": \"$smeltery\"\n              }\n            },\n            {\n              \"function\": \"set_custom_data\",\n              \"tag\": \"{gm4_machines:{id:'smeltery'}}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"translate\": \"block.gm4.smeltery\",\n                  \"fallback\": \"Smeltery\",\n                  \"color\": \"white\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/predicate/lava_cauldron_chance.json",
    "content": "{\n    \"condition\": \"random_chance\",\n    \"chance\": 0.011\n}\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/recipe/smeltery.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"redstone\",\n  \"pattern\": [\n    \"CCC\",\n    \"CFC\",\n    \"IcI\"\n  ],\n  \"key\": {\n    \"C\": \"minecraft:cobblestone\",\n    \"F\": \"minecraft:furnace\",\n    \"I\": \"minecraft:iron_ingot\",\n    \"c\": \"minecraft:comparator\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:player_head\",\n    \"components\": {\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_smelteries:item/smeltery\"]},\n      \"minecraft:profile\": \"$smeltery\",\n      \"minecraft:custom_data\": \"{gm4_machines:{id:'smeltery'}}\",\n      \"minecraft:custom_name\": {\"translate\":\"block.gm4.smeltery\",\"fallback\":\"Smeltery\",\"color\":\"white\",\"italic\":false}\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/tags/block/valid_cauldron.json",
    "content": "{\n    \"values\": [\n        \"minecraft:cauldron\",\n        \"minecraft:lava_cauldron\"\n    ]\n}\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/tags/item/can_double.json",
    "content": "{\n  \"values\": [\n    \"minecraft:gold_ore\",\n    \"minecraft:nether_gold_ore\",\n    \"minecraft:deepslate_gold_ore\",\n    \"minecraft:raw_gold\",\n    \"minecraft:iron_ore\",\n    \"minecraft:deepslate_iron_ore\",\n    \"minecraft:raw_iron\",\n    \"minecraft:copper_ore\",\n    \"minecraft:deepslate_copper_ore\",\n    \"minecraft:raw_copper\",\n    \"minecraft:sand\",\n    \"minecraft:red_sand\",\n    \"minecraft:chorus_fruit\"\n  ]\n}\n"
  },
  {
    "path": "gm4_smelteries/data/gm4_smelteries/test/construct_and_use.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1.5 ~1 ~0.5\n# @timeout 300\n# @skyaccess\n\nloot give @s loot gm4_smelteries:items/smeltery\ndummy @s jump\nawait delay 5t\ndummy @s use block ~1 ~ ~ up\n\nawait block ~1 ~1 ~ furnace\n\nsetblock ~1 ~1 ~1 cauldron\nfill ~ ~1 ~ ~2 ~2 ~2 iron_block replace air\nfill ~1 ~1 ~ ~1 ~2 ~1 air replace iron_block\n\nawait entity @e[tag=gm4_smeltery] inside\n\nitem replace block ~1 ~1 ~ container.0 with raw_iron\nitem replace block ~1 ~1 ~ container.1 with coal\n\nawait items block ~1 ~1 ~ container.2 minecraft:iron_ingot[count=2]\n"
  },
  {
    "path": "gm4_smelteries/ore_display.py",
    "content": "from typing import Literal\nfrom beet import NamespaceProxy, Model, Context\nfrom gm4.plugins.resource_pack import TemplateOptions, ModelData, ItemDisplayModel, ensure_single_model_config, ContainerGuiOptions, CenteredContainerGui\n\nclass OreDisplayTemplate(TemplateOptions):\n    \"\"\"setup a model template for the smeltable ores displayed by smeltries\"\"\"\n    name: Literal[\"smelteries:ore_display\"] = \"smelteries:ore_display\"\n    texture_map = [\"top\", \"side\"]\n\n    default_transforms = [\n        ItemDisplayModel(\n            origin=[0.5, 0.5, 0.5],\n            scale=[0.624, 0.624, 0.624],\n            translation=[0, 0.19, 0]\n        )\n    ]\n\n    def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]):\n        model_name = ensure_single_model_config(self.name, config)\n        reference = config.reference.split('/')[-1]\n        m = models_container[model_name] = Model({\n            \"parent\": \"gm4_smelteries:block/ore_display\",\n            \"textures\":{\n                \"top\": f\"gm4_smelteries:block/ore_display/{reference}_top\",\n                \"side\": f\"gm4_smelteries:block/ore_display/{reference}_side\",\n                \"particle\": f\"gm4_smelteries:block/ore_display/{reference}_side\",\n            }\n        })\n        return [m]\n\nclass FurnaceContainerGui(CenteredContainerGui, ContainerGuiOptions):\n    container: Literal[\"furnace\"] = \"furnace\" # type: ignore ; Inheriting CenteredContainerGui overwrites a Literal \"_centered\" -> \"furnace\"\n\ndef beet_default(ctx: Context):\n    pass\n"
  },
  {
    "path": "gm4_soul_glass/README.md",
    "content": "# Soul Glass<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nBeacons need a bit more corruption. This data pack reverses their effects<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Crafted by smelting Soul Sand in a Furnace\r\n- Applies an inverted effect when placed on-top of a Beacon\r\n- Beacon power can be disabled by either moving the glass block or turning off the beacon\r\n- For example: Speed becomes Slowness, Haste becomes Mining Fatigue\r\n\r\nRead more info about inverted effects on the [Wiki](https://wiki.gm4.co/Soul_Glass).\r\n"
  },
  {
    "path": "gm4_soul_glass/assets/translations.csv",
    "content": "key,en_us\nitem.gm4.soul_glass,Soul Glass\nadvancement.gm4.soul_glass.title,Corruption at its Finest\nadvancement.gm4.soul_glass.description,Corrupt the effects of a beacon\ntext.gm4.guidebook.module_desc.soul_glass,\"Reverse the effects of beacons with corrupting glass! But be careful, a poison Beacon may sound great at first, but is incredibly painful in pratice.\"\ntext.gm4.guidebook.soul_glass.description,\"Soul Sand can be smelted in a furnace to get Soul Glass.\\n\\nWhen placed directly over a beacon, soul glass will corrupt the effects.\"\ntext.gm4.guidebook.soul_glass.usage,If soul glass is moved from its original location it will lose its properties.\\n\\nThe exception is moving it with a sticky piston up to one block away.\ntext.gm4.guidebook.soul_glass.corrupted_effects,Corrupted Effects:\n"
  },
  {
    "path": "gm4_soul_glass/beet.yaml",
    "content": "id: gm4_soul_glass\nname: Soul Glass\nversion: 1.7.X\n\nrequire:\n  - bolt\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_machines\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_machines: 1.5.0\n      schedule_loops: \n        - main\n        - beacon_clock\n    model_data:\n      - item: brown_stained_glass\n        reference: item/soul_glass\n        template: vanilla\n      - item: brown_stained_glass\n        reference: gui/advancement/soul_glass\n        template: advancement\n    website:\n      description: Reverse the effects of beacons with corrupting glass! But be careful, a poison Beacon may sound great at first, but is incredibly painful in pratice.\n      recommended: []\n      notes:\n        - On versions <1.21, Blast Furnaces may need to be broken and replaced to be able to craft Soul Glass when the module is first installed.\n    modrinth:\n      project_id: Hi8fkYoI\n    wiki: https://wiki.gm4.co/wiki/Soul_Glass\n    credits:\n      Creators:\n        - BPR\n        - Denniss\n        - Lue\n      Icon Design:\n        - Sparks\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4/advancement/soul_glass.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"brown_stained_glass\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_soul_glass:gui/advancement/soul_glass\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.soul_glass.title\",\n      \"fallback\": \"Corruption at its Finest\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.soul_glass.description\",\n      \"fallback\": \"Corrupt the effects of a beacon\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"impossible\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_machines/tags/function/destroy.json",
    "content": "{\n    \"values\": [\n        \"gm4_soul_glass:machine/verify_destroy\"\n    ]\n}\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/advancement/place_soul_glass.json",
    "content": "{\n  \"criteria\": {\n    \"place_furnace\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"type_specific\": {\n                  \"type\": \"player\",\n                  \"gamemode\": [\n                    \"spectator\"\n                  ]\n                }\n              }\n            }\n          }          \n        ],\n        \"location\": [\n          {\n            \"condition\": \"minecraft:block_state_property\",\n            \"block\": \"minecraft:brown_stained_glass\"\n          },\n          {\n            \"condition\": \"minecraft:match_tool\",\n            \"predicate\": {\n              \"predicates\": {\n                \"minecraft:custom_data\": \"{gm4_soul_glass:1b}\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_soul_glass:place_soul_glass\"\n  }\n}\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/advancement/recipes/soul_glass.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_soul_glass:soul_glass\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:soul_sand\"\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_soul_glass:soul_glass\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/beacon_clock.mcfunction",
    "content": "# @s = none\n# run from beacon_clock (on it's own clock)\n\nexecute as @e[type=marker,tag=gm4_soul_glass] at @s run function gm4_soul_glass:process\n\nexecute as @e[type=marker,tag=gm4_soul_glass] at @s if block ~ ~-1 ~ beacon if predicate gm4_soul_glass:has_beam positioned ~-50 ~-51 ~-50 if entity @a[dx=100,dy=356,dz=100,limit=1] at @s run function gm4_soul_glass:effect/check\n\nschedule function gm4_soul_glass:beacon_clock 80t\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/effect/check.mcfunction",
    "content": "# @s = gm4_soul_glass marker\n# run from beacon_clock\n\nexecute if data block ~ ~-1 ~ primary_effect run function gm4_soul_glass:effect/update_effects\n\nexecute store result score @s gm4_sg_levels run data get block ~ ~-1 ~ Levels\n\nexecute if score @s gm4_sg_levels matches 1 positioned ~-20 ~-21 ~-20 run function gm4_soul_glass:effect/level_1\nexecute if score @s gm4_sg_levels matches 2 positioned ~-30 ~-31 ~-30 run function gm4_soul_glass:effect/level_2\nexecute if score @s gm4_sg_levels matches 3 positioned ~-40 ~-41 ~-40 run function gm4_soul_glass:effect/level_3\nexecute if score @s gm4_sg_levels matches 4 if score @s gm4_sg_primary = @s gm4_sg_secondary positioned ~-50 ~-51 ~-50 run function gm4_soul_glass:effect/level_4_strong\nexecute if score @s gm4_sg_levels matches 4 unless score @s gm4_sg_primary = @s gm4_sg_secondary positioned ~-50 ~-51 ~-50 run function gm4_soul_glass:effect/level_4\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/effect/level_1.mcfunction",
    "content": "# @s = gm4_soul_glass marker with level 1 beacon below it\n# run from effect/check\n\nexecute if score @s gm4_sg_primary matches 1 run effect give @a[dx=40,dy=296,dz=40,gamemode=!spectator] minecraft:slowness 11 0\nexecute if score @s gm4_sg_primary matches 3 run effect give @a[dx=40,dy=296,dz=40,gamemode=!spectator] minecraft:mining_fatigue 11 0\nexecute if score @s gm4_sg_primary matches 5 run effect give @a[dx=40,dy=296,dz=40,gamemode=!spectator] minecraft:weakness 11 0\nexecute if score @s gm4_sg_primary matches 8 run effect give @a[dx=40,dy=296,dz=40,gamemode=!spectator] minecraft:slow_falling 11 0\nexecute if score @s gm4_sg_primary matches 11 run effect give @a[dx=40,dy=296,dz=40,gamemode=!spectator] minecraft:glowing 11 0\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/effect/level_2.mcfunction",
    "content": "# @s = gm4_soul_glass marker with level 2 beacon below it\n# run from effect/check\n\nexecute if score @s gm4_sg_primary matches 1 run effect give @a[dx=60,dy=316,dz=60,gamemode=!spectator] minecraft:slowness 13 0\nexecute if score @s gm4_sg_primary matches 3 run effect give @a[dx=60,dy=316,dz=60,gamemode=!spectator] minecraft:mining_fatigue 13 0\nexecute if score @s gm4_sg_primary matches 5 run effect give @a[dx=60,dy=316,dz=60,gamemode=!spectator] minecraft:weakness 13 0\nexecute if score @s gm4_sg_primary matches 8 run effect give @a[dx=60,dy=316,dz=60,gamemode=!spectator] minecraft:slow_falling 13 0\nexecute if score @s gm4_sg_primary matches 11 run effect give @a[dx=60,dy=316,dz=60,gamemode=!spectator] minecraft:glowing 13 0\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/effect/level_3.mcfunction",
    "content": "# @s = gm4_soul_glass marker with level 3 beacon below it\n# run from effect/check\n\nexecute if score @s gm4_sg_primary matches 1 run effect give @a[dx=80,dy=336,dz=80,gamemode=!spectator] minecraft:slowness 15 0\nexecute if score @s gm4_sg_primary matches 3 run effect give @a[dx=80,dy=336,dz=80,gamemode=!spectator] minecraft:mining_fatigue 15 0\nexecute if score @s gm4_sg_primary matches 5 run effect give @a[dx=80,dy=336,dz=80,gamemode=!spectator] minecraft:weakness 15 0\nexecute if score @s gm4_sg_primary matches 8 run effect give @a[dx=80,dy=336,dz=80,gamemode=!spectator] minecraft:slow_falling 15 0\nexecute if score @s gm4_sg_primary matches 11 run effect give @a[dx=80,dy=336,dz=80,gamemode=!spectator] minecraft:glowing 15 0\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/effect/level_4.mcfunction",
    "content": "# @s = gm4_soul_glass marker with level 4 beacon below it\n# run from effect/check\n\nexecute if score @s gm4_sg_primary matches 1 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:slowness 17 0\nexecute if score @s gm4_sg_primary matches 3 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:mining_fatigue 17 0\nexecute if score @s gm4_sg_primary matches 5 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:weakness 17 0\nexecute if score @s gm4_sg_primary matches 8 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:slow_falling 17 0\nexecute if score @s gm4_sg_primary matches 11 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:glowing 17 0\n\nexecute if score @s gm4_sg_secondary matches 1 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:slowness 17 0\nexecute if score @s gm4_sg_secondary matches 3 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:mining_fatigue 17 0\nexecute if score @s gm4_sg_secondary matches 5 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:weakness 17 0\nexecute if score @s gm4_sg_secondary matches 8 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:slow_falling 17 0\nexecute if score @s gm4_sg_secondary matches 11 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:glowing 17 0\n\nexecute if score @s gm4_sg_secondary matches 10 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:poison 17 0\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/effect/level_4_strong.mcfunction",
    "content": "# @s = gm4_soul_glass marker with strong level 4 beacon below it\n# run from effect/check\n\nexecute if score @s gm4_sg_primary matches 1 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:slowness 17 1\nexecute if score @s gm4_sg_primary matches 3 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:mining_fatigue 17 1\nexecute if score @s gm4_sg_primary matches 5 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:weakness 17 1\nexecute if score @s gm4_sg_primary matches 8 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:slow_falling 17 1\nexecute if score @s gm4_sg_primary matches 11 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:glowing 17 1\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/effect/obtain_numeric_primary_id.mcfunction",
    "content": "# Converts a string effect id to a matching numeric id, as scoreboard lookups are cheaper and this conversion only has to be done once when soul glass is first placed on a beacon\n# @s = gm4_soul_glass marker\n# at @s\n# run from effect/update_effects\n\n# convert id\nexecute if data storage gm4_soul_glass:temp {effect:\"minecraft:speed\"} run scoreboard players set @s gm4_sg_primary 1\nexecute if data storage gm4_soul_glass:temp {effect:\"minecraft:haste\"} run scoreboard players set @s gm4_sg_primary 3\nexecute if data storage gm4_soul_glass:temp {effect:\"minecraft:strength\"} run scoreboard players set @s gm4_sg_primary 5\nexecute if data storage gm4_soul_glass:temp {effect:\"minecraft:jump_boost\"} run scoreboard players set @s gm4_sg_primary 8\nexecute if data storage gm4_soul_glass:temp {effect:\"minecraft:resistance\"} run scoreboard players set @s gm4_sg_primary 11\n\n# clean up storage\ndata remove storage gm4_soul_glass:temp effect\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/effect/obtain_numeric_secondary_id.mcfunction",
    "content": "# Converts a string effect id to a matching numeric id, as scoreboard lookups are cheaper and this conversion only has to be done once when soul glass is first placed on a beacon\n# @s = gm4_soul_glass marker\n# at @s\n# run from effect/update_effects\n\n# convert id\nexecute if data storage gm4_soul_glass:temp {effect:\"minecraft:speed\"} run scoreboard players set @s gm4_sg_secondary 1\nexecute if data storage gm4_soul_glass:temp {effect:\"minecraft:haste\"} run scoreboard players set @s gm4_sg_secondary 3\nexecute if data storage gm4_soul_glass:temp {effect:\"minecraft:strength\"} run scoreboard players set @s gm4_sg_secondary 5\nexecute if data storage gm4_soul_glass:temp {effect:\"minecraft:jump_boost\"} run scoreboard players set @s gm4_sg_secondary 8\nexecute if data storage gm4_soul_glass:temp {effect:\"minecraft:resistance\"} run scoreboard players set @s gm4_sg_secondary 11\nexecute if data storage gm4_soul_glass:temp {effect:\"minecraft:regeneration\"} run scoreboard players set @s gm4_sg_secondary 10\n\n# clean up storage\ndata remove storage gm4_soul_glass:temp effect\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/effect/revert_effects.mcfunction",
    "content": "# @s = gm4_soul_glass marker\n# run from effect/check\n\nexecute store result block ~ ~-1 ~ primary_effect int 1 run scoreboard players get @s gm4_sg_primary\nexecute store result block ~ ~-1 ~ secondary_effect int 1 run scoreboard players get @s gm4_sg_secondary\n\nscoreboard players reset @s gm4_sg_primary\nscoreboard players reset @s gm4_sg_secondary\n\nplaysound minecraft:block.beacon.power_select block @a[distance=..10]\nparticle minecraft:totem_of_undying ~ ~-1 ~ 0.5 0.5 0.5 .1 40 force\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/effect/update_effects.mcfunction",
    "content": "# @s = gm4_soul_glass marker\n# run from effect/check\n\ndata modify storage gm4_soul_glass:temp effect set from block ~ ~-1 ~ primary_effect\nfunction gm4_soul_glass:effect/obtain_numeric_primary_id\n\ndata modify storage gm4_soul_glass:temp effect set from block ~ ~-1 ~ secondary_effect\nexecute if data storage gm4_soul_glass:temp effect run function gm4_soul_glass:effect/obtain_numeric_secondary_id\n\ndata remove block ~ ~-1 ~ primary_effect\ndata remove block ~ ~-1 ~ secondary_effect\n\nplaysound minecraft:entity.wither.spawn block @a[distance=..10] ~ ~ ~ .5 1.3\nparticle minecraft:witch ~ ~-1 ~ 0.5 0.5 0.5 0 40 force\nadvancement grant @a[distance=..4] only gm4:soul_glass\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_sg_cook_time dummy\nscoreboard objectives add gm4_count dummy\nscoreboard objectives add gm4_sg_primary dummy\nscoreboard objectives add gm4_sg_secondary dummy\nscoreboard objectives add gm4_sg_levels dummy\n\nexecute unless score soul_glass gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Soul Glass\"}\nexecute unless score soul_glass gm4_earliest_version < soul_glass gm4_modules run scoreboard players operation soul_glass gm4_earliest_version = soul_glass gm4_modules\nscoreboard players set soul_glass gm4_modules 1\n\nschedule function gm4_soul_glass:main 1t\nschedule function gm4_soul_glass:beacon_clock 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/init_soul_glass_marker.mcfunction",
    "content": "# @s = new marker\n# at @s\n# run from ray\n\ndata merge entity @s {CustomName:\"gm4_soul_glass\",Tags:[\"gm4_soul_glass\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\"]}\nscoreboard players set @s gm4_entity_version 1\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/machine/destroy.mcfunction",
    "content": "# destroys the soul glass\n# @s = gm4_soul_glass marker\n# located at @s\n# run from gm4_soul_glass:machine/verify_destroy\n\n# restore beacon effect\nexecute if score @s gm4_sg_primary matches 1 run data modify block ~ ~-1 ~ primary_effect set value \"minecraft:speed\"\nexecute if score @s gm4_sg_primary matches 3 run data modify block ~ ~-1 ~ primary_effect set value \"minecraft:haste\"\nexecute if score @s gm4_sg_primary matches 5 run data modify block ~ ~-1 ~ primary_effect set value \"minecraft:strength\"\nexecute if score @s gm4_sg_primary matches 8 run data modify block ~ ~-1 ~ primary_effect set value \"minecraft:jump_boost\"\nexecute if score @s gm4_sg_primary matches 11 run data modify block ~ ~-1 ~ primary_effect set value \"minecraft:resistance\"\n\nexecute if score @s gm4_sg_secondary matches 1 run data modify block ~ ~-1 ~ secondary_effect set value \"minecraft:speed\"\nexecute if score @s gm4_sg_secondary matches 3 run data modify block ~ ~-1 ~ secondary_effect set value \"minecraft:haste\"\nexecute if score @s gm4_sg_secondary matches 5 run data modify block ~ ~-1 ~ secondary_effect set value \"minecraft:strength\"\nexecute if score @s gm4_sg_secondary matches 8 run data modify block ~ ~-1 ~ secondary_effect set value \"minecraft:jump_boost\"\nexecute if score @s gm4_sg_secondary matches 10 run data modify block ~ ~-1 ~ secondary_effect set value \"minecraft:regeneration\"\nexecute if score @s gm4_sg_secondary matches 11 run data modify block ~ ~-1 ~ secondary_effect set value \"minecraft:resistance\"\n\n# kill entities related to machine block\nexecute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:\"minecraft:brown_stained_glass\",count:1}},nbt=!{Item:{components:{}}},limit=1,sort=nearest]\nkill @s\n\n# drop item (unless broken in creative mode)\nexecute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_soul_glass:items/soul_glass\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/machine/verify_destroy.mcfunction",
    "content": "# verifies that the destroyed machine was from this module\n# @s = machine block marker\n# located at @s\n# run from #gm4_machines:destroy\n\nexecute if entity @s[tag=gm4_soul_glass] unless block ~ ~ ~ moving_piston run function gm4_soul_glass:machine/destroy\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/main.mcfunction",
    "content": "schedule function gm4_soul_glass:main 16t\n\n# process soul glass\nexecute as @e[type=marker,tag=gm4_soul_glass] at @s run function gm4_soul_glass:process\n\n# Kill old blast furnace markers, remove this later\nkill @e[type=marker,tag=gm4_sg_furnace]\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/place_soul_glass.mcfunction",
    "content": "# @s = player that just placed a soul glass\n# at @s\n# run from advancement place_soul_glass\n\nadvancement revoke @s only gm4_soul_glass:place_soul_glass\n\nexecute store result score gm4_ray_counter gm4_count run attribute @s minecraft:block_interaction_range get 100\nexecute anchored eyes positioned ^ ^ ^ run function gm4_soul_glass:ray\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/process.mcfunction",
    "content": "# @s = gm4_soul_glass marker\n# run from main and beacon_clock\n\nexecute if score @s gm4_sg_primary matches 1.. unless block ~ ~ ~ brown_stained_glass if block ~ ~-1 ~ beacon run function gm4_soul_glass:effect/revert_effects\n\nparticle minecraft:smoke ~ ~ ~ 0.3 0.3 0.3 0 15 normal\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/function/ray.mcfunction",
    "content": "# @s = player who placed soul glass\n# at @s anchored eyes, then marched forward 0.01 over and over\n# run from place_soul_glass and self\n\nexecute if block ~ ~ ~ brown_stained_glass \\\n  align xyz positioned ~0.5 ~0.5 ~0.5 unless entity @e[type=marker,distance=..0.1,tag=gm4_soul_glass,limit=1] \\\n  summon marker run return run function gm4_soul_glass:init_soul_glass_marker\n\n# loop\nscoreboard players remove gm4_ray_counter gm4_count 1\nexecute if score gm4_ray_counter gm4_count matches 0.. positioned ^ ^ ^0.01 run function gm4_soul_glass:ray\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/guidebook/soul_glass.json",
    "content": "{\n  \"id\": \"soul_glass\",\n  \"name\": \"Soul Glass\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:brown_stained_glass\",\n    \"components\": {\n      \"minecraft:enchantment_glint_override\": true\n    }\n  },\n  \"criteria\": {\n    \"obtain_soul_sand\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:soul_sand\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_soul_glass\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:brown_stained_glass\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_soul_glass:1b}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_soul_sand\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.soul_glass.description\",\n            \"fallback\": \"Soul Sand can be smelted in a furnace to get Soul Glass.\\n\\nWhen placed directly over a beacon, soul glass will corrupt the effects.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_soul_glass\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.soul_glass.usage\",\n            \"fallback\": \"If soul glass is moved from its original location it will lose its properties.\\n\\nThe exception is moving it with a sticky piston up to one block away.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.soul_glass.corrupted_effects\",\n            \"fallback\": \"Corrupted Effects:\"\n          },\n          \"\\n\\n\",\n          {\n            \"translate\": \"effect.minecraft.speed\"\n          },\n          \"\\n - \",\n          {\n            \"translate\": \"effect.minecraft.slowness\"\n          },\n          \"\\n\",\n          {\n            \"translate\": \"effect.minecraft.haste\"\n          },\n          \"\\n - \",\n          {\n            \"translate\": \"effect.minecraft.mining_fatigue\"\n          },\n          \"\\n\",\n          {\n            \"translate\": \"effect.minecraft.resistance\"\n          },\n          \"\\n - \",\n          {\n            \"translate\": \"effect.minecraft.glowing\"\n          },\n          \"\\n\",\n          {\n            \"translate\": \"effect.minecraft.jump_boost\"\n          },\n          \"\\n - \",\n          {\n            \"translate\": \"effect.minecraft.slow_falling\"\n          }\n        ],\n        [\n          \"\\n\",\n          {\n            \"translate\": \"effect.minecraft.strength\"\n          },\n          \"\\n - \",\n          {\n            \"translate\": \"effect.minecraft.weakness\"\n          },\n          \"\\n\",\n          {\n            \"translate\": \"effect.minecraft.regeneration\"\n          },\n          \"\\n - \",\n          {\n            \"translate\": \"effect.minecraft.poison\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"description\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/loot_table/items/soul_glass.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:brown_stained_glass\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_soul_glass:item/soul_glass\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_soul_glass:1b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.soul_glass\",\n                \"fallback\": \"Soul Glass\"\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/predicate/has_beam.json",
    "content": "block_checks = []\n\nfor y in range(1, 4064):\n  block_checks.append({\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetY\": y,\n          \"predicate\": {\n            \"light\": {\n              \"light\": {\n                \"min\": 0,\n                \"max\": 15\n              }\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:location_check\",\n        \"offsetY\": y,\n        \"predicate\": {\n          \"block\": {\n            \"blocks\": \"#gm4_soul_glass:beacon_passable\"\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:location_check\",\n        \"offsetY\": y,\n        \"predicate\": {\n          \"block\": {\n            \"state\": {\n              \"extended\": \"true\"\n            },\n            \"blocks\": \"#gm4_soul_glass:piston\"\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:location_check\",\n        \"offsetY\": y,\n        \"predicate\": {\n          \"block\": {\n            \"state\": {\n              \"type\": \"bottom\"\n            },\n            \"blocks\": \"#minecraft:slabs\"\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:location_check\",\n        \"offsetY\": y,\n        \"predicate\": {\n          \"block\": {\n            \"state\": {\n              \"type\": \"top\"\n            },\n            \"blocks\": \"#minecraft:slabs\"\n          }\n        }\n      }\n    ]\n  })\n\n{\n  \"condition\": \"minecraft:all_of\",\n  \"terms\": block_checks\n}\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/recipe/soul_glass.json",
    "content": "{\n   \"type\": \"minecraft:smelting\",\n   \"ingredient\": \"minecraft:soul_sand\",\n   \"result\": {\n      \"id\": \"minecraft:brown_stained_glass\",\n      \"components\": {\n         \"minecraft:custom_model_data\": {\"strings\":[\"gm4_soul_glass:item/soul_glass\"]},\n         \"minecraft:custom_data\": \"{gm4_soul_glass:1b}\",\n         \"minecraft:enchantment_glint_override\": true,\n         \"minecraft:item_name\": {\"translate\":\"item.gm4.soul_glass\",\"fallback\":\"Soul Glass\"}\n      }\n   },\n   \"experience\": 1.0,\n   \"cookingtime\": 800\n}\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/tags/block/beacon_passable.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:air\",\n        \"#gm4:no_collision\",\n        \"#minecraft:anvil\",\n        \"#minecraft:banners\",\n        \"#minecraft:beds\",\n        \"#minecraft:wool_carpets\",\n        \"#minecraft:cauldrons\",\n        \"#minecraft:doors\",\n        \"#minecraft:fence_gates\",\n        \"#minecraft:fences\",\n        \"#minecraft:flower_pots\",\n        \"#minecraft:leaves\",\n        \"#minecraft:portals\",\n        \"#minecraft:shulker_boxes\",\n        \"#minecraft:stairs\",\n        \"#minecraft:trapdoors\",\n        \"#minecraft:walls\",\n        \"minecraft:bamboo_sapling\",\n        \"minecraft:bamboo\",\n        \"minecraft:barrier\",\n        \"minecraft:beacon\",\n        \"minecraft:bedrock\",\n        \"minecraft:bell\",\n        \"minecraft:black_stained_glass_pane\",\n        \"minecraft:black_stained_glass\",\n        \"minecraft:blue_stained_glass_pane\",\n        \"minecraft:blue_stained_glass\",\n        \"minecraft:brewing_stand\",\n        \"minecraft:brown_stained_glass_pane\",\n        \"minecraft:brown_stained_glass\",\n        \"minecraft:bubble_column\",\n        \"minecraft:cactus\",\n        \"minecraft:cake\",\n        \"minecraft:campfire\",\n        \"minecraft:chest\",\n        \"minecraft:chorus_flower\",\n        \"minecraft:chorus_plant\",\n        \"minecraft:cobweb\",\n        \"minecraft:cocoa\",\n        \"minecraft:comparator\",\n        \"minecraft:conduit\",\n        \"minecraft:creeper_head\",\n        \"minecraft:creeper_wall_head\",\n        \"minecraft:cyan_stained_glass_pane\",\n        \"minecraft:cyan_stained_glass\",\n        \"minecraft:daylight_detector\",\n        \"minecraft:dragon_egg\",\n        \"minecraft:dragon_head\",\n        \"minecraft:dragon_wall_head\",\n        { \"id\": \"minecraft:dried_ghast\", \"required\": false },\n        \"minecraft:enchanting_table\",\n        \"minecraft:end_portal_frame\",\n        \"minecraft:end_rod\",\n        \"minecraft:ender_chest\",\n        \"minecraft:farmland\",\n        \"minecraft:frosted_ice\",\n        \"minecraft:glass_pane\",\n        \"minecraft:glass\",\n        \"minecraft:dirt_path\",\n        \"minecraft:gray_stained_glass_pane\",\n        \"minecraft:gray_stained_glass\",\n        \"minecraft:green_stained_glass_pane\",\n        \"minecraft:green_stained_glass\",\n        \"minecraft:grindstone\",\n        \"minecraft:honey_block\",\n        \"minecraft:hopper\",\n        \"minecraft:ice\",\n        \"minecraft:iron_bars\",\n        \"minecraft:ladder\",\n        \"minecraft:lantern\",\n        \"minecraft:lectern\",\n        \"minecraft:light_blue_stained_glass_pane\",\n        \"minecraft:light_blue_stained_glass\",\n        \"minecraft:light_gray_stained_glass_pane\",\n        \"minecraft:light_gray_stained_glass\",\n        \"minecraft:lily_pad\",\n        \"minecraft:lime_stained_glass_pane\",\n        \"minecraft:lime_stained_glass\",\n        \"minecraft:magenta_stained_glass_pane\",\n        \"minecraft:magenta_stained_glass\",\n        \"minecraft:moss_carpet\",\n        \"minecraft:moving_piston\",\n        \"minecraft:orange_stained_glass_pane\",\n        \"minecraft:orange_stained_glass\",\n        \"minecraft:pink_stained_glass_pane\",\n        \"minecraft:pink_stained_glass\",\n        \"minecraft:piston_head\",\n        \"minecraft:player_head\",\n        \"minecraft:player_wall_head\",\n        \"minecraft:purple_stained_glass_pane\",\n        \"minecraft:purple_stained_glass\",\n        \"minecraft:red_stained_glass_pane\",\n        \"minecraft:red_stained_glass\",\n        \"minecraft:repeater\",\n        \"minecraft:scaffolding\",\n        \"minecraft:sea_pickle\",\n        \"minecraft:skeleton_skull\",\n        \"minecraft:skeleton_wall_skull\",\n        \"minecraft:slime_block\",\n        \"minecraft:snow\",\n        \"minecraft:spawner\",\n        \"minecraft:stonecutter\",\n        \"minecraft:sweet_berry_bush\",\n        \"minecraft:trapped_chest\",\n        \"minecraft:tripwire_hook\",\n        \"minecraft:tripwire\",\n        \"minecraft:turtle_egg\",\n        \"minecraft:white_stained_glass_pane\",\n        \"minecraft:white_stained_glass\",\n        \"minecraft:wither_skeleton_skull\",\n        \"minecraft:wither_skeleton_wall_skull\",\n        \"minecraft:yellow_stained_glass_pane\",\n        \"minecraft:yellow_stained_glass\",\n        \"minecraft:zombie_head\",\n        \"minecraft:zombie_wall_head\"\n    ]\n}\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/tags/block/piston.json",
    "content": "{\n    \"values\": [\n        \"minecraft:piston\",\n        \"minecraft:sticky_piston\"\n    ]\n}\n"
  },
  {
    "path": "gm4_soul_glass/data/gm4_soul_glass/test/smelt_soul_glass.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1.5 ~1 ~0.5\n# @timeout 900\n\nitem replace entity @s weapon.mainhand with furnace\nexecute at @s run tp @s ~ ~ ~ facing ~ ~-1 ~1\ndummy @s use block ~1 ~ ~1 up\nassert block ~1 ~1 ~1 furnace\n\nitem replace block ~1 ~1 ~1 container.0 with soul_sand\nitem replace block ~1 ~1 ~1 container.1 with coal\n\nawait items block ~1 ~1 ~1 container.2 minecraft:brown_stained_glass[custom_data~{gm4_soul_glass:1b}]\n"
  },
  {
    "path": "gm4_spawner_minecarts/README.md",
    "content": "# Spawner Minecarts<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nPick up Spawners and move them wherever you want with Minecarts.<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Any spawner can be pushed into a Minecart buy pushing it with a piston\r\n- Spawner Minecarts have a reduced spawn rate for each nearby spawner minecart\r\n"
  },
  {
    "path": "gm4_spawner_minecarts/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.spawner_minecarts.title,Don't Go Breaking My Cart\nadvancement.gm4.spawner_minecarts.description,Capture a Monster Spawner\ntext.gm4.guidebook.module_desc.spawner_minecarts,Pick up Spawners and move them wherever you want with Minecarts.\ntext.gm4.guidebook.spawner_minecarts.description,Spawners can be picked up with Minecarts.\\n\\nOnce a spawner is in a minecart it cannot be ejected and has reduced spawn rates for all carts within a 9x8x9 area around the spawner.\ntext.gm4.guidebook.spawner_minecarts.pick_up,\"To capture a spawner, place a minecart under it, then a downwards piston above the spawner, and finally a redstone block above the piston.\"\n"
  },
  {
    "path": "gm4_spawner_minecarts/beet.yaml",
    "content": "id: gm4_spawner_minecarts\nname: Spawner Minecarts\nversion: 3.1.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    model_data:\n      - item: spawner\n        reference: gui/advancement/spawner_minecarts\n        template: advancement\n    website:\n      description: Pick up Spawners and move them wherever you want with Minecarts.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: j4qeIaSW\n    wiki: https://wiki.gm4.co/wiki/Spawner_Minecarts\n    credits:\n      Creators:\n        - Sparks\n        - Bloo\n        - SpecialBuilder32\n      Icon Design:\n        - Sparks\n"
  },
  {
    "path": "gm4_spawner_minecarts/data/gm4/advancement/spawner_minecarts.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"spawner\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_spawner_minecarts:gui/advancement/spawner_minecarts\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.spawner_minecarts.title\",\n      \"fallback\": \"Don't Go Breaking My Cart\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.spawner_minecarts.description\",\n      \"fallback\": \"Capture a Monster Spawner\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"capture_spawner_cart\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_spawner_minecarts/data/gm4_spawner_minecarts/function/capture_spawner.mcfunction",
    "content": "# try to pick up spawner with minecart\n# @s = minecarts under spawners\n# at @s\n# run from main\n\n# get spawner data\ndata modify storage gm4_spawner_minecarts:temp spawner set from block ~ ~1 ~\n\n# check if this spawner is blacklisted\nexecute if data storage gm4_spawner_minecarts:temp spawner.SpawnPotentials[{data:{entity:{data:{gm4_spawner_minecrarts:{ban_pickup:1}}}}}] run return run function gm4_spawner_minecarts:capture_spawner/fail_pickup\nexecute if data storage gm4_spawner_minecarts:temp spawner.SpawnData[{data:{entity:{data:{gm4_spawner_minecrarts:{ban_pickup:1}}}}}] run return run function gm4_spawner_minecarts:capture_spawner/fail_pickup\n\n# pick up spawner\nsummon spawner_minecart ~ ~ ~ {Tags:[\"gm4_spawner_minecart\",\"gm4_spawner_minecart.new\"],MaxNearbyEntities:6,RequiredPlayerRange:16,SpawnCount:4,SpawnData:{entity:{id:\"minecraft:pig\"}},MaxSpawnDelay:600s,Delay:-1,SpawnRange:4s,MinSpawnDelay:100s,SpawnPotentials:[],Invulnerable:1b}\nsetblock ~ ~1 ~ air destroy\ndata modify entity @e[tag=gm4_spawner_minecart.new,limit=1,distance=..1] {} merge from storage gm4_spawner_minecarts:temp spawner\ntag @e[tag=gm4_spawner_minecart.new,limit=1,distance=..1] remove gm4_spawner_minecart.new\nadvancement grant @a[distance=..5,gamemode=!spectator] only gm4:spawner_minecarts\nkill @s\n"
  },
  {
    "path": "gm4_spawner_minecarts/data/gm4_spawner_minecarts/function/init.mcfunction",
    "content": "execute unless score spawner_minecarts gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Spawner Minecarts\"}\nexecute unless score spawner_minecarts gm4_earliest_version < spawner_minecarts gm4_modules run scoreboard players operation spawner_minecarts gm4_earliest_version = spawner_minecarts gm4_modules\nscoreboard players set spawner_minecarts gm4_modules 1\n\nscoreboard objectives add gm4_spawner_minecarts_data dummy\n\nschedule function gm4_spawner_minecarts:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_spawner_minecarts/data/gm4_spawner_minecarts/function/main.mcfunction",
    "content": "schedule function gm4_spawner_minecarts:main 16t\n\n# check for minecarts under spawners\nexecute as @e[type=minecart,tag=!smithed.entity] at @s if block ~ ~1 ~ spawner align xyz positioned ~0.5 ~1.5 ~0.5 unless entity @e[tag=smithed.block,distance=..0.5,limit=1] at @s if block ~ ~2 ~ #gm4_spawner_minecarts:piston[facing=down] if block ~ ~3 ~ redstone_block run function gm4_spawner_minecarts:capture_spawner\n\n#process all spawner minecarts\nexecute as @e[type=spawner_minecart,tag=gm4_spawner_minecart] at @s run function gm4_spawner_minecarts:process\n"
  },
  {
    "path": "gm4_spawner_minecarts/data/gm4_spawner_minecarts/function/process.mcfunction",
    "content": "# process spawner minecarts\n# @s = spawner minecart\n# at @s\n# run from main\n\n# check nearby spawner minecarts, each gives a +25% chance to not reduce delay\nexecute positioned ~-4.5 ~-4 ~-4.5 store result score $nearby_carts gm4_spawner_minecarts_data if entity @e[type=spawner_minecart,tag=gm4_spawner_minecart,dx=8,dy=7,dz=8]\nscoreboard players remove $nearby_carts gm4_spawner_minecarts_data 1\nexecute unless predicate {condition:\"random_chance\",chance:{type:\"score\",score:\"gm4_spawner_minecarts_data\",target:{type:\"fixed\",name:\"$nearby_carts\"},scale:0.25}} run return fail\n\nexecute store result score $delay gm4_spawner_minecarts_data run data get entity @s Delay\nexecute store result entity @s Delay int 1 run scoreboard players add $delay gm4_spawner_minecarts_data 16\nparticle angry_villager ~ ~ ~ 0.4 0.4 0.4 0 1\n"
  },
  {
    "path": "gm4_spawner_minecarts/data/gm4_spawner_minecarts/guidebook/spawner_minecarts.json",
    "content": "{\n  \"id\": \"spawner_minecarts\",\n  \"name\": \"Spawner Minecarts\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:spawner\"\n  },\n  \"criteria\": {\n    \"obtain_piston\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:piston\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_minecart\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:minecart\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.spawner_minecarts.description\",\n            \"fallback\": \"Spawners can be picked up with Minecarts.\\n\\nOnce a spawner is in a minecart it cannot be ejected and has reduced spawn rates for all carts within a 9x8x9 area around the spawner.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"pick_up\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_piston\"\n        ],\n        [\n          \"obtain_minecart\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.spawner_minecarts.pick_up\",\n            \"fallback\": \"To capture a spawner, place a minecart under it, then a downwards piston above the spawner, and finally a redstone block above the piston.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_spawner_minecarts/data/gm4_spawner_minecarts/tags/block/piston.json",
    "content": "{\n    \"values\": [\n        \"minecraft:piston\",\n        \"minecraft:sticky_piston\"\n    ]\n}\n"
  },
  {
    "path": "gm4_spawner_minecarts/data/gm4_spawner_minecarts/test/capture_spawner.mcfunction",
    "content": "# @template gm4:test_platform\n\nsetblock ~1 ~1 ~1 rail\nsummon minecart ~1.5 ~1 ~1.5\nsetblock ~1 ~2 ~1 spawner{SpawnData:{entity:{id:\"minecraft:zombie\"}}}\nsetblock ~1 ~3 ~1 piston[facing=down]\nsetblock ~1 ~4 ~1 redstone_block\n\nawait entity @e[type=spawner_minecart,tag=gm4_spawner_minecart,nbt={SpawnData:{entity:{id:\"minecraft:zombie\"}}}] inside\n"
  },
  {
    "path": "gm4_speed_paths/README.md",
    "content": "# Speed Paths<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nConnect your places with paths and get a speed buff for doing so!<!--$pmc:headerSize-->\r\n\r\n<img src=\"images/speed_paths.webp\" alt=\"Two players running, one going faster due to a speed boost from the path.\" height=\"350\"/> <!--$localAssetToURL--> <!--$pmc:delete-->\r\n\r\n### Features\r\n- When walking on a path, the player is given a 20% speed boost\r\n- Speed from the path stacks with other sources\r\n"
  },
  {
    "path": "gm4_speed_paths/beet.yaml",
    "content": "id: gm4_speed_paths\nname: Speed Paths\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    website:\n      description: Gives you a speed effect when you walk on path blocks.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: vRH8BKZ7\n    video: https://www.youtube.com/watch?v=99VFSW1ORzU\n    wiki: https://wiki.gm4.co/wiki/Speed_Paths\n    credits:\n      Creator:\n        - 15Redstones\n      Updated by:\n        - Misode\n        - TheEpyonProject\n      Icon Design:\n        - Sparks\n"
  },
  {
    "path": "gm4_speed_paths/data/gm4_speed_paths/function/apply_effects/add_speed.mcfunction",
    "content": "# applies the Speed Paths attribute and gm4_on_path tag\n# @s = player upon stepping on a speed path\n# at @s\n# run from main\n\ntag @s add gm4_on_path\nscoreboard players set @s gm4_speed_paths 5\nattribute @s minecraft:movement_speed modifier add minecraft:dc33007e-5da4-4fad-a850-9c5a058c22ba 0.2 add_multiplied_base\n"
  },
  {
    "path": "gm4_speed_paths/data/gm4_speed_paths/function/apply_effects/check_path.mcfunction",
    "content": "# checks if the player is still on a speed path\n# @s = player, with gm4_on_path tag\n# at @s\n# run from main\n\nexecute if entity @s[scores={gm4_speed_paths=1..}] unless block ~ ~-0.9 ~ minecraft:dirt_path run scoreboard players remove @s gm4_speed_paths 1\nexecute if block ~ ~-0.9 ~ minecraft:dirt_path run scoreboard players set @s gm4_speed_paths 5\n\nexecute at @s[scores={gm4_speed_paths=..0}] run function gm4_speed_paths:apply_effects/remove_speed\n"
  },
  {
    "path": "gm4_speed_paths/data/gm4_speed_paths/function/apply_effects/remove_speed.mcfunction",
    "content": "# removes the Speed Path attribute speed and on_path tag\n# @s = player, 2 after no longer being on a speed path\n# at @s\n# run from apply_effects/check_path\n\nattribute @s minecraft:movement_speed modifier remove minecraft:dc33007e-5da4-4fad-a850-9c5a058c22ba\ntag @s remove gm4_on_path\n"
  },
  {
    "path": "gm4_speed_paths/data/gm4_speed_paths/function/init.mcfunction",
    "content": "execute unless score speed_paths gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Speed Paths\"}\nexecute unless score speed_paths gm4_earliest_version < speed_paths gm4_modules run scoreboard players operation speed_paths gm4_earliest_version = speed_paths gm4_modules\nscoreboard players set speed_paths gm4_modules 1\n\nscoreboard objectives add gm4_speed_paths dummy\n\nschedule function gm4_speed_paths:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_speed_paths/data/gm4_speed_paths/function/main.mcfunction",
    "content": "execute as @a[tag=!gm4_on_path] at @s if block ~ ~-0.9 ~ minecraft:dirt_path run function gm4_speed_paths:apply_effects/add_speed\nexecute as @a[tag=gm4_on_path] at @s run function gm4_speed_paths:apply_effects/check_path\n\nschedule function gm4_speed_paths:main 8t\n"
  },
  {
    "path": "gm4_speed_paths/data/gm4_speed_paths/guidebook/speed_paths.json",
    "content": "{\n  \"id\": \"speed_paths\",\n  \"name\": \"Speed Paths\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:dirt_path\"\n  },\n  \"criteria\": {\n    \"stand_in_path\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"block\": {\n                  \"blocks\": [\n                    \"minecraft:dirt_path\"\n                  ]\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"stand_in_path\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.speed_paths.description\",\n            \"fallback\": \"Dirt paths increase movement speed by 20%.\\n\\nThis will stack with other speed effects such as that from beacons and potions.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_speed_paths/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.speed_paths,Gives you a speed effect when you walk on path blocks.\ntext.gm4.guidebook.speed_paths.description,Dirt paths increase movement speed by 20%.\\n\\nThis will stack with other speed effects such as that from beacons and potions.\n"
  },
  {
    "path": "gm4_standard_crafting/README.md",
    "content": "# Standard Crafting<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nA recipe pack that adds some handy additional recipes to the crafting table.<!--$pmc:headerSize-->\r\n\r\n<img src=\"images/standard_crafting.webp\" alt=\"Player crafting basic recipes in a Custom Crafter\" height=\"350\"/> <!--$localAssetToURL--> <!--$pmc:delete-->\r\n\r\n### Features\r\n- Adds a basic set of recipes to the crafting table\r\n\r\nA full list of recipes can be read on the [Wiki](https://wiki.gm4.co/Standard_Crafting).\r\n"
  },
  {
    "path": "gm4_standard_crafting/beet.yaml",
    "content": "id: gm4_standard_crafting\nname: Standard Crafting\nversion: 2.0.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - generate_recipes\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    website:\n      description: A crafting recipe pack that adds some nifty new recipes to the game.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: KIxK9MA7\n    video: https://www.youtube.com/watch?v=_GekIoefncg\n    wiki: https://wiki.gm4.co/wiki/Standard_Crafting\n    credits:\n      Creator:\n        - Sparks\n      Updated by:\n        - Bloo\n        - runcows\n      Icon Design:\n        - Sparks\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/amethyst_shard.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:amethyst_shard\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:amethyst_block\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:amethyst_shard\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/bamboo_block_chest.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:bamboo_block_chest\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:bamboo_block\",\n              \"minecraft:stripped_bamboo_block\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:bamboo_block_chest\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/bone_block.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:bone_block\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:bone\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:bone_block\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/brown_dye.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:brown_dye\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:orange_dye\",\n              \"minecraft:black_dye\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:brown_dye\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/cherry_leaves.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:cherry_leaves\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:pink_petals\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:cherry_leaves\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/cobweb.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:cobweb\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:string\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:cobweb\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/copper_chain.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:copper_chain\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:copper_ingot\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:copper_chain\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/diamond_horse_armor.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:golden_horse_armor\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:gold_ingot\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:golden_horse_armor\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/dispenser.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:dispenser\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:dropper\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:dispenser\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/enchanted_golden_apple.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:enchanted_golden_apple\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:gold_block\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:enchanted_golden_apple\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/golden_horse_armor.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:diamond_horse_armor\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:diamond\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:diamond_horse_armor\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/gravel.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:gravel\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:flint\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:gravel\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/green_dye.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:green_dye\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:blue_dye\",\n              \"minecraft:yellow_dye\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:green_dye\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/honeycomb.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:honeycomb\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:honeycomb_block\"\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:honeycomb\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/iron_chain.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:iron_chain\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:iron_ingot\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:iron_chain\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/iron_horse_armor.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:iron_horse_armor\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:iron_ingot\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:iron_horse_armor\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/log_chest.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:log_chest\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:logs\"\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:log_chest\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/pink_petals.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:pink_petals\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:cherry_leaves\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:pink_petals\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/pointed_dripstone.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:pointed_dripstone\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:dripstone_block\"\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:pointed_dripstone\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/quartz.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:quartz\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:quartz_block\"\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:quartz\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/red_sand_conversion.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:red_sand_conversion\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:iron_nugget\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:red_sand_conversion\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/red_sand_from_sandstone.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:red_sand_from_sandstone\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:red_sandstone\",\n              \"minecraft:chiseled_red_sandstone\",\n              \"minecraft:cut_red_sandstone\",\n              \"minecraft:smooth_red_sandstone\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:red_sand_from_sandstone\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/sand.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:sand\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:sandstone\",\n              \"minecraft:chiseled_sandstone\",\n              \"minecraft:cut_sandstone\",\n              \"minecraft:smooth_sandstone\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:sand\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/string.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_standard_crafting:string\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:wool\"\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_standard_crafting:string\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/function/init.mcfunction",
    "content": "execute unless score standard_crafting gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Standard Crafting\"}\nexecute unless score standard_crafting gm4_earliest_version < standard_crafting gm4_modules run scoreboard players operation standard_crafting gm4_earliest_version = standard_crafting gm4_modules\nscoreboard players set standard_crafting gm4_modules 1\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/guidebook/standard_crafting.json",
    "content": "{\n  \"id\": \"standard_crafting\",\n  \"name\": \"Standard Crafting\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:crafting_table\"\n  },\n  \"criteria\": {\n    \"obtain_gravel\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:gravel\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_sand\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:sand\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_red_sand\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:red_sand\",\n              \"minecraft:iron_nugget\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_amethyst\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:amethyst_block\",\n              \"minecraft:amethyst_shard\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_dripstone\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:dripstone_block\",\n              \"minecraft:pointed_dripstone\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_quartz\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:quartz_block\",\n              \"minecraft:quartz\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_cobweb\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:cobweb\",\n              \"minecraft:string\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_wool\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:wool\"\n          }\n        ]\n      }\n    },\n    \"ride_horse\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"vehicle\": {\n                \"type\": \"minecraft:horse\"\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:entity_properties\",\n              \"entity\": \"this\",\n              \"predicate\": {\n                \"vehicle\": {\n                  \"type\": \"minecraft:horse\",\n                  \"nbt\": \"{NoAI:1b}\"\n                }\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_gold_block\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:enchanted_golden_apple\",\n              \"minecraft:gold_block\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_honeycomb_block\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:honeycomb_block\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_dropper\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:dropper\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_bone\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:bone\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_log\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:logs\"\n          }\n        ]\n      }\n    },\n    \"obtain_bamboo_block\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:bamboo_block\",\n              \"minecraft:stripped_bamboo_block\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_cherry_leaves\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:cherry_leaves\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_pink_petals\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:pink_petals\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_iron_ingot\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:iron_ingot\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_copper_ingot\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:copper_ingot\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_brown_dye_ingredients\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:orange_dye\",\n              \"minecraft:black_dye\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_green_dye_ingredients\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:blue_dye\",\n              \"minecraft:yellow_dye\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"default_recipes\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.standard_crafting.recipes\",\n            \"fallback\": \"The following recipes have been added to the crafting table.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.standard_crafting.stair_decraft\",\n            \"fallback\": \"Stairs can be reverted to their base block\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:stairs_decraft/oak_stairs\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.standard_crafting.slab_decraft\",\n            \"fallback\": \"Slabs can be reverted to their base block\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:slab_decraft/stone_slab\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"gravel_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_gravel\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:gravel\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"sand_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_sand\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.standard_crafting.sandstone_decraft\",\n            \"fallback\": \"Any sandstone can be converted into sand\"\n          },\n          \"\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:sand\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"red_sand_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_red_sand\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.standard_crafting.red_sandstone_decraft\",\n            \"fallback\": \"Any red sandstone can be converted into red sand\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:red_sand_from_sandstone\"\n          }\n        ],\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:red_sand_conversion\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"amethyst_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_amethyst\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:amethyst_shard\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"dripstone_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_dripstone\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:pointed_dripstone\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"quartz_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_quartz\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:quartz\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"string_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_wool\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.standard_crafting.string_craft\",\n            \"fallback\": \"Any wool can be ripped into string\"\n          },\n          \"\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:string\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"cobweb_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_cobweb\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:cobweb\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"horse_armor_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"ride_horse\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.standard_crafting.horse_armor\",\n            \"fallback\": \"Diamond, iron, copper, and golden armor can be crafted\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:diamond_horse_armor\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"enchanted_golden_apple_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_gold_block\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:enchanted_golden_apple\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"honeycomb_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_honeycomb_block\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:honeycomb\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"dispenser_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_dropper\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:dispenser\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"bone_block_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_bone\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:bone_block\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"log_chest_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_log\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:log_chest\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"bamboo_block_chest_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_bamboo_block\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:bamboo_block_chest\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"pink_petals_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_cherry_leaves\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:pink_petals\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"cherry_leaves_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_pink_petals\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:cherry_leaves\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"iron_chain_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_iron_ingot\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:iron_chain\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"copper_chain_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_copper_ingot\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:copper_chain\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"brown_dye_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_brown_dye_ingredients\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:brown_dye\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    },\n    {\n      \"name\": \"green_dye_recipe\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_green_dye_ingredients\"\n        ]\n      ],\n      \"pages\": [\n        [\n          \"\\n\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_standard_crafting:green_dye\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"default_recipes\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/amethyst_shard.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"misc\",\n  \"ingredients\": [\n    \"minecraft:amethyst_block\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:amethyst_shard\",\n    \"count\": 4\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/bamboo_block_chest.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"misc\",\n  \"group\": \"chest\",\n  \"key\": {\n    \"#\": [\n      \"minecraft:bamboo_block\",\n      \"minecraft:stripped_bamboo_block\"\n    ]\n  },\n  \"pattern\": [\n    \"###\",\n    \"# #\",\n    \"###\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:chest\",\n    \"count\": 2\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/bone_block.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"building\",\n  \"group\": \"bone_block\",\n  \"ingredients\": [\n    \"minecraft:bone\",\n    \"minecraft:bone\",\n    \"minecraft:bone\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:bone_block\"\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/brown_dye.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"group\": \"brown_dye\",\n  \"ingredients\": [\n    \"minecraft:orange_dye\",\n    \"minecraft:black_dye\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:brown_dye\",\n    \"count\": 2\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/cherry_leaves.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"building\",\n  \"pattern\": [\n    \"PP\",\n    \"PP\"\n  ],\n  \"key\": {\n    \"P\": \"minecraft:pink_petals\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:cherry_leaves\",\n    \"count\": 1\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/cobweb.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"building\",\n  \"pattern\": [\n    \"SSS\",\n    \"SBS\",\n    \"SSS\"\n  ],\n  \"key\": {\n    \"S\": \"minecraft:string\",\n    \"B\": \"minecraft:slime_ball\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:cobweb\"\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/copper_chain.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"misc\",\n  \"group\": \"copper_chain\",\n  \"key\": {\n    \"I\": \"minecraft:copper_block\",\n    \"N\": \"minecraft:copper_ingot\"\n  },\n  \"pattern\": [\n    \"N\",\n    \"I\",\n    \"N\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:copper_chain\",\n    \"count\": 9\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/diamond_horse_armor.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"pattern\": [\n    \"  D\",\n    \"DLD\",\n    \"D D\"\n  ],\n  \"key\": {\n    \"D\": \"minecraft:diamond\",\n    \"L\": \"minecraft:leather\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:diamond_horse_armor\"\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/dispenser.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"misc\",\n  \"group\": \"dispenser\",\n  \"key\": {\n    \"S\": \"minecraft:string\",\n    \"#\": \"minecraft:dropper\",\n    \"/\": \"minecraft:stick\"\n  },\n  \"pattern\": [\n    \" /S\",\n    \"/#S\",\n    \" /S\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:dispenser\",\n    \"count\": 1\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/enchanted_golden_apple.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"misc\",\n  \"pattern\": [\n    \"GGG\",\n    \"GAG\",\n    \"GGG\"\n  ],\n  \"key\": {\n    \"G\": \"minecraft:gold_block\",\n    \"A\": \"minecraft:apple\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:enchanted_golden_apple\"\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/golden_horse_armor.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"pattern\": [\n    \"  G\",\n    \"GLG\",\n    \"G G\"\n  ],\n  \"key\": {\n    \"G\": \"minecraft:gold_ingot\",\n    \"L\": \"minecraft:leather\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:golden_horse_armor\"\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/gravel.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"building\",\n  \"pattern\": [\n    \"FF\",\n    \"FF\"\n  ],\n  \"key\": {\n    \"F\": \"minecraft:flint\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:gravel\",\n    \"count\": 4\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/green_dye.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"ingredients\": [\n    \"minecraft:yellow_dye\",\n    \"minecraft:blue_dye\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:green_dye\",\n    \"count\": 2\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/honeycomb.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"misc\",\n  \"ingredients\": [\n    \"minecraft:honeycomb_block\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:honeycomb\",\n    \"count\": 4\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/iron_chain.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"misc\",\n  \"group\": \"iron_chain\",\n  \"key\": {\n    \"I\": \"minecraft:iron_block\",\n    \"N\": \"minecraft:iron_ingot\"\n  },\n  \"pattern\": [\n    \"N\",\n    \"I\",\n    \"N\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:iron_chain\",\n    \"count\": 9\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/iron_horse_armor.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"pattern\": [\n    \"  I\",\n    \"ILI\",\n    \"I I\"\n  ],\n  \"key\": {\n    \"I\": \"minecraft:iron_ingot\",\n    \"L\": \"minecraft:leather\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:iron_horse_armor\"\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/log_chest.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"misc\",\n  \"group\": \"chest\",\n  \"key\": {\n    \"#\": \"#minecraft:logs\"\n  },\n  \"pattern\": [\n    \"###\",\n    \"# #\",\n    \"###\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:chest\",\n    \"count\": 4\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/pink_petals.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"ingredients\": [\n    \"minecraft:cherry_leaves\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:pink_petals\",\n    \"count\": 4\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/pointed_dripstone.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"misc\",\n  \"ingredients\": [\n    \"minecraft:dripstone_block\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:pointed_dripstone\",\n    \"count\": 4\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/quartz.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"misc\",\n  \"ingredients\": [\n    \"minecraft:quartz_block\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:quartz\",\n    \"count\": 4\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/red_sand_conversion.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"building\",\n  \"group\": \"red_sand\",\n  \"pattern\": [\n    \"SSS\",\n    \"SIS\",\n    \"SSS\"\n  ],\n  \"key\": {\n    \"S\": \"minecraft:sand\",\n    \"I\": \"minecraft:iron_nugget\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:red_sand\",\n    \"count\": 8\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/red_sand_from_sandstone.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"building\",\n  \"group\": \"red_sand\",\n  \"ingredients\": [\n    [\n      \"minecraft:red_sandstone\",\n      \"minecraft:chiseled_red_sandstone\",\n      \"minecraft:cut_red_sandstone\",\n      \"minecraft:smooth_red_sandstone\"\n    ]\n  ],\n  \"result\": {\n    \"id\": \"minecraft:red_sand\",\n    \"count\": 4\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/sand.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"building\",\n  \"ingredients\": [\n    [\n      \"minecraft:sandstone\",\n      \"minecraft:chiseled_sandstone\",\n      \"minecraft:cut_sandstone\",\n      \"minecraft:smooth_sandstone\"\n    ]\n  ],\n  \"result\": {\n    \"id\": \"minecraft:sand\",\n    \"count\": 4\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/data/gm4_standard_crafting/recipe/string.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"misc\",\n  \"ingredients\": [\n    \"#minecraft:wool\"\n  ],\n  \"result\": {\n    \"id\": \"minecraft:string\",\n    \"count\": 3\n  }\n}\n"
  },
  {
    "path": "gm4_standard_crafting/generate_recipes.py",
    "content": "from beet import Context, Recipe, Advancement\nfrom beet.contrib.vanilla import Vanilla\nimport logging\n\nlogger = logging.getLogger(__name__)\n\ndef beet_default(ctx: Context):\n    \"\"\"\n        - generates recipes for stair and slab decrafting\n        - groups recipes that have existing vanilla recipes\n    \"\"\"\n    \n    vanilla = ctx.inject(Vanilla)\n    vanilla.minecraft_version = '26.1'\n    item_tags = vanilla.mount(\"data/minecraft/tags/item\").data.item_tags\n    recipes = vanilla.mount(\"data/minecraft/recipe\").data.recipes\n\n    def group_recipe(output: str) -> str:\n        output = output.removeprefix('minecraft:') # remove prefix\n        output_recipe = recipes.get(\"minecraft:\" + output)\n        if output_recipe is None: # no recipe\n            return output\n        elif \"group\" in output_recipe.data: # recipe with group\n            return output_recipe.data[\"group\"]\n        else: # recipe but no group, add it\n            group: str = output\n            output_recipe.data[\"group\"] = group\n            output_recipe.data[\"__smithed__\"] = {\n                \"rules\": [\n                    {\n                        \"type\": \"replace\",\n                        \"target\": \"group\",\n                        \"source\": {\n                            \"type\": \"reference\",\n                            \"path\": \"group\"\n                        }\n                    }\n                ]\n            }\n            ctx.data[\"minecraft:\" + output] = Recipe(output_recipe.data)\n            return group\n\n    def recursive_apply(items: list[str], dir: str, shape: list[str], output_count: int):\n        for item in items:\n            if \"#\" in item:\n                recursive_apply(item_tags[item.lstrip(\"#\")].data[\"values\"], dir, shape, output_count)\n                continue\n\n            # get full block id from the vanilla stair recipe\n            recipe = recipes.get(item)\n            if not recipe:\n                logger.debug(f\"No vanilla recipe found for {item}, skipping\")\n                continue\n            input: str | list[str] = recipe.data[\"key\"][\"#\"]\n            if isinstance(input, list):\n                output = input[0]\n            else:\n                output = input\n\n            recipe_path = f\"gm4_standard_crafting:{dir}/{item.removeprefix('minecraft:')}\"\n\n            group = group_recipe(output)\n\n            ctx.data[recipe_path] = Recipe({\n                \"type\": \"minecraft:crafting_shaped\",\n                \"category\": \"building\",\n                \"group\": group,\n                \"pattern\": shape,\n                \"key\": {\n                    \"#\": item\n                },\n                \"result\": {\n                    \"id\": output,\n                    \"count\": output_count\n                }\n            })\n\n            ctx.data[f\"gm4_standard_crafting:recipes/{dir}/{item.removeprefix('minecraft:')}\"] = Advancement({\n                \"parent\": \"minecraft:recipes/root\",\n                \"criteria\": {\n                    \"has_the_recipe\": {\n                    \"trigger\": \"minecraft:recipe_unlocked\",\n                        \"conditions\": {\n                            \"recipe\": recipe_path\n                        }\n                    },\n                    \"has_materials\": {\n                    \"trigger\": \"minecraft:inventory_changed\",\n                    \"conditions\": {\n                        \"items\": [\n                            {\n                                \"items\": [\n                                    item\n                                ]\n                            }\n                        ]\n                    }\n                    }\n                },\n                \"requirements\": [\n                    [\n                        \"has_the_recipe\",\n                        \"has_materials\"\n                    ]\n                ],\n                \"rewards\": {\n                    \"recipes\": [\n                        recipe_path\n                    ]\n                }\n            })\n\n    stairs: list[str] = item_tags[\"minecraft:stairs\"].data['values']\n    recursive_apply(stairs, \"stairs_decraft\", [\"##\", \"##\"], 3)\n    slabs: list[str] = item_tags[\"minecraft:slabs\"].data['values']\n    recursive_apply(slabs, \"slab_decraft\", [\"##\",\"##\"], 2)\n\n    for recipe in [\n        \"dispenser\", \"bone_block\", \"chest\", \"iron_chain\", \"copper_chain\", \"brown_dye\"\n    ]:\n        group_recipe(recipe)\n"
  },
  {
    "path": "gm4_standard_crafting/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.standard_crafting,A crafting recipe pack that adds some nifty new recipes to the game.\ntext.gm4.guidebook.shapeless,Recipe is shapeless\ntext.gm4.guidebook.standard_crafting.recipes,The following recipes have been added to the crafting table.\ntext.gm4.guidebook.standard_crafting.stair_decraft,Stairs can be reverted to their base block\ntext.gm4.guidebook.standard_crafting.slab_decraft,Slabs can be reverted to their base block\ntext.gm4.guidebook.standard_crafting.sandstone_decraft,Any sandstone can be converted into sand\ntext.gm4.guidebook.standard_crafting.red_sandstone_decraft,Any red sandstone can be converted into red sand\ntext.gm4.guidebook.standard_crafting.string_craft,Any wool can be ripped into string\ntext.gm4.guidebook.standard_crafting.horse_armor,\"Diamond, iron, copper, and golden armor can be crafted\"\n"
  },
  {
    "path": "gm4_sunken_treasure/README.md",
    "content": "# Sunken Treasure<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nDigging sand underwater with a fortune tool can uncover buried treasures, or a nasty surprise! Who knows, maybe you'll even find some old love letters. <!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Chances of getting treasure increase per level of Fortune\r\n- Treasure drops range from Bones to Treasure Chests\r\n- A chance to get a Message in a Bottle also exists... with some hidden story amongst them all.\r\n\r\nA full list of drops can be read on the [Wiki](https://wiki.gm4.co/Sunken_Treasure).\r\n"
  },
  {
    "path": "gm4_sunken_treasure/assets/gm4_sunken_treasure/optifine/cit/waders.properties",
    "content": "type=armor\nmatchItems=golden_boots\ntexture.gold_layer_1=waders_layer_1\nnbt.CustomModelData=$item/waders\n"
  },
  {
    "path": "gm4_sunken_treasure/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.sunken_treasure.description,Find all Dearest Audrey messages in a bottle\nadvancement.gm4.sunken_treasure.title,All My Audreys\nblock.gm4.treasure_chest,Treasure Chest\nblock.gm4.shipwreck_treasure_chest,Shipwreck Treasure Chest\nblock.gm4.shipwreck_supply_chest,Shipwreck Supply Chest\nitem.gm4.message_in_a_bottle,Message in a Bottle\nitem.gm4.waders,Waders\ntext.gm4.dearest_audrey.1,I drank all my beer\ntext.gm4.dearest_audrey.10.1,What's your\ntext.gm4.dearest_audrey.10.2,phone number; bottled messages\ntext.gm4.dearest_audrey.10.3,are hard to make!\ntext.gm4.dearest_audrey.11.1,I find myself stranded\ntext.gm4.dearest_audrey.11.2,on a barren island.\ntext.gm4.dearest_audrey.11.3,\"An enderdragon took me here,\"\ntext.gm4.dearest_audrey.11.4,please rescue me.\ntext.gm4.dearest_audrey.12,Put the money in the bag.\ntext.gm4.dearest_audrey.13.1,The compass you sent me\ntext.gm4.dearest_audrey.13.2,\"seems to only point in the direction of our love,\"\ntext.gm4.dearest_audrey.13.3,but that seems to have vanished long ago.\ntext.gm4.dearest_audrey.13.4,\"Please, get help, even if it's the last thing you do.\"\ntext.gm4.dearest_audrey.14.1,I fear this may\ntext.gm4.dearest_audrey.14.2,be my last attempt at finding help.\ntext.gm4.dearest_audrey.14.3,I just want you to know... I always... loved...\ntext.gm4.dearest_audrey.14.4,your sister.\ntext.gm4.dearest_audrey.15.1,I've been here for 3 months\ntext.gm4.dearest_audrey.15.2,\"and after several attempts to find food,\"\ntext.gm4.dearest_audrey.15.3,\"shelter, or even enough water... I'm giving up.\"\ntext.gm4.dearest_audrey.15.4,\"Tell my family I love them, but most importantly,\"\ntext.gm4.dearest_audrey.15.5,\"Audrey, I love you.\"\ntext.gm4.dearest_audrey.16.1,I know exactly who\ntext.gm4.dearest_audrey.16.2,you are - play along. I don't have any\ntext.gm4.dearest_audrey.16.3,money. I burned it all trying to make a\ntext.gm4.dearest_audrey.16.4,fire. But I can tell you I've developed\ntext.gm4.dearest_audrey.16.5,a very particular set of skills. Skills\ntext.gm4.dearest_audrey.16.6,that'll make Bear Grylls quake in his boots.\ntext.gm4.dearest_audrey.17.1,I'm in the sink sand.\ntext.gm4.dearest_audrey.17.2,\"If you find my head, hang it on the\"\ntext.gm4.dearest_audrey.17.3,wall of fame.\ntext.gm4.dearest_audrey.18.1,Each day that passes\ntext.gm4.dearest_audrey.18.2,\"is immensely terrible, painful and sad.\"\ntext.gm4.dearest_audrey.18.3,Getting away from you just didn't\ntext.gm4.dearest_audrey.18.4,improve anything.\ntext.gm4.dearest_audrey.19.1,I write this on paper\ntext.gm4.dearest_audrey.19.2,made from native plants and ink\ntext.gm4.dearest_audrey.19.3,from a squid I wrangled. I like it here.\ntext.gm4.dearest_audrey.19.4,I found a dungeon. I'm setting up a mob\ntext.gm4.dearest_audrey.19.5,grinder and never coming home.\ntext.gm4.dearest_audrey.2.1,My boat was\ntext.gm4.dearest_audrey.2.2,sunk by a lily-pad and now I'm\ntext.gm4.dearest_audrey.2.3,stuck on this island.\ntext.gm4.dearest_audrey.20.1,punching wood\ntext.gm4.dearest_audrey.20.2,for logs doesn't work in real life.\ntext.gm4.dearest_audrey.3.1,I don't know how to spell\ntext.gm4.dearest_audrey.3.2,\"your name, nor do I know you, but I\"\ntext.gm4.dearest_audrey.3.3,\"do know that I love you, I feel like I\"\ntext.gm4.dearest_audrey.3.4,have a mutual connection. After\ntext.gm4.dearest_audrey.3.5,you ordered the pizza with cheezy\ntext.gm4.dearest_audrey.3.6,crust and pinapple I just lost it. Oh\ntext.gm4.dearest_audrey.3.7,no Clair you got shot... I mean Audrey.\ntext.gm4.dearest_audrey.3.8,I don't mind that you're chunky\ntext.gm4.dearest_audrey.4.1,when I listen\ntext.gm4.dearest_audrey.4.2,\"to the ocean, all I hear is your\"\ntext.gm4.dearest_audrey.4.3,snoring and I can't sleep. Please\ntext.gm4.dearest_audrey.4.4,\"silence your snoring... please, I\"\ntext.gm4.dearest_audrey.4.5,need sleep.\ntext.gm4.dearest_audrey.5.1,How's your\ntext.gm4.dearest_audrey.5.2,\"day going? I'm good, BUT I'VE\"\ntext.gm4.dearest_audrey.5.3,BEEN STRANDED FOR 20 YEARS!\ntext.gm4.dearest_audrey.5.4,Thanks for your response.\ntext.gm4.dearest_audrey.6.1,I'm stranded\ntext.gm4.dearest_audrey.6.2,\"in the middle of nowhere,\"\ntext.gm4.dearest_audrey.6.3,surrounded by things that\ntext.gm4.dearest_audrey.6.4,aren't cubic.\ntext.gm4.dearest_audrey.7.1,I mean Hannah...\ntext.gm4.dearest_audrey.7.2,\"wait, no... is it Denise? ...Anyway,\"\ntext.gm4.dearest_audrey.7.3,I love you.\ntext.gm4.dearest_audrey.8.1,I seem to have\ntext.gm4.dearest_audrey.8.2,\"run out of clean water, if you could\"\ntext.gm4.dearest_audrey.8.3,return this bottle with something to\ntext.gm4.dearest_audrey.8.4,drink that would be wonderful.\ntext.gm4.dearest_audrey.9.1,I have no\ntext.gm4.dearest_audrey.9.2,internet so I am sending you\ntext.gm4.dearest_audrey.9.3,a bottle.\ntext.gm4.dearest_audrey.prefix,\"Dearest Audrey, \"\ntext.gm4.guidebook.module_desc.sunken_treasure,\"Digging sand underwater with a fortune tool can uncover buried treasures, or a nasty surprise! Who knows, maybe you'll even find some old love letters.\"\ntext.gm4.guidebook.sunken_treasure.description,Mining sand or gravel deep underwater with a Fortune shovel has a chance of dropping treasure.\\n\\nMining in different biomes can result in different drops.\ntext.gm4.guidebook.sunken_treasure.details,\"Treasure can only be found if submerged in water at least 4 blocks deep.\\n\\nGravel and sand contain different loot, but both contain rare treasure chests.\"\n"
  },
  {
    "path": "gm4_sunken_treasure/beet.yaml",
    "content": "id: gm4_sunken_treasure\nname: Sunken Treasure\nversion: 1.8.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [tick]\n    model_data:\n      - item: glass_bottle\n        reference: item/message_in_a_bottle\n        template: generated\n      - item: golden_boots\n        reference: item/waders\n        template: generated\n      - item: chest\n        template: vanilla\n        broadcast:\n          - reference: item/shipwreck_supply\n          - reference: item/shipwreck_treasure\n          - reference: item/treasure_chest\n      - item: glass_bottle\n        reference: gui/advancement/sunken_treasure\n        template:\n          name: advancement\n          forward: item/message_in_a_bottle\n    website:\n      description: Digging sand underwater with a fortune tool can uncover buried treasures, or a nasty surprise! Who knows, maybe you'll even find some old love letters.\n      recommended:\n        - gm4_resource_pack\n        - gm4_scuba_gear\n      notes: []\n    modrinth:\n      project_id: drjgVlzU\n    video: https://www.youtube.com/watch?v=VV7ZIyIzKV0\n    wiki: https://wiki.gm4.co/wiki/Sunken_Treasure\n    credits:\n      Creators:\n        - Wumpacraft\n        - Sparks\n      Updated by:\n        - BPR\n        - Lue\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4/advancement/sunken_treasure.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"glass_bottle\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:gui/advancement/sunken_treasure\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.sunken_treasure.title\",\n      \"fallback\": \"All My Audreys\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.sunken_treasure.description\",\n      \"fallback\": \"Find all Dearest Audrey messages in a bottle\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"my_audrey_1\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:1b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_2\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:2b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_3\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:3b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_4\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:4b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_5\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:5b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_6\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:6b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_7\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:7b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_8\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:8b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_9\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:9b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_10\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:10b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_11\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:11b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_12\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:12b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_13\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:13b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_14\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:14b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_15\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:15b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_16\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:16b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_17\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:17b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_18\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:18b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_19\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:19b}\"\n            }\n          }\n        ]\n      }\n    },\n    \"my_audrey_20\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_audrey:20b}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/function/check_gravel.mcfunction",
    "content": "# @s = player that has mined gravel while underwater\n# located at @s\n# run from tick\n\nexecute at @e[type=minecraft:item,limit=1,distance=..2.5,predicate=gm4_sunken_treasure:is_gravel_item,nbt={Age:0s}] run function gm4_sunken_treasure:treasure_gravel\nexecute at @e[type=minecraft:item,limit=1,distance=..2.5,predicate=gm4_sunken_treasure:is_flint_item,nbt={Age:0s}] run function gm4_sunken_treasure:treasure_flint\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_st_sand minecraft.mined:minecraft.sand\nscoreboard objectives add gm4_st_gravel minecraft.mined:minecraft.gravel\nscoreboard objectives add gm4_st_random dummy\n\nexecute unless score sunken_treasure gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Sunken Treasure\"}\nexecute unless score sunken_treasure gm4_earliest_version < sunken_treasure gm4_modules run scoreboard players operation sunken_treasure gm4_earliest_version = sunken_treasure gm4_modules\nscoreboard players set sunken_treasure gm4_modules 1\n\nschedule function gm4_sunken_treasure:tick 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/function/spawn_entity.mcfunction",
    "content": "# @s = item to spawn an entity\n# run from treasure_flint\n# and from treasure_gravel\n# and from treasure sand\n\ndata modify storage gm4_sunken_treasure:temp spawn set from entity @s Item.components.\"minecraft:custom_data\".gm4_sunken_treasure.spawn\n\nexecute if data storage gm4_sunken_treasure:temp spawn{id:\"minecraft:glow_squid\"} run summon glow_squid\nexecute if data storage gm4_sunken_treasure:temp spawn{id:\"minecraft:squid\"} run summon squid\nexecute if data storage gm4_sunken_treasure:temp spawn{id:\"minecraft:guardian\"} run summon guardian\nexecute if data storage gm4_sunken_treasure:temp spawn{id:\"minecraft:tropical_fish\"} run summon tropical_fish\n\ndata remove storage gm4_sunken_treasure:temp spawn\nkill @s\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/function/tick.mcfunction",
    "content": "execute as @a[scores={gm4_st_sand=1..}] at @s if predicate gm4_sunken_treasure:in_deep_water anchored eyes positioned ^ ^ ^2 at @e[type=minecraft:item,limit=1,distance=..2.5,predicate=gm4_sunken_treasure:is_sand_item,nbt={Age:0s}] run function gm4_sunken_treasure:treasure_sand\nexecute as @a[scores={gm4_st_gravel=1..}] at @s if predicate gm4_sunken_treasure:in_deep_water anchored eyes positioned ^ ^ ^2 run function gm4_sunken_treasure:check_gravel\n\nscoreboard players reset @a gm4_st_sand\nscoreboard players reset @a gm4_st_gravel\n\nschedule function gm4_sunken_treasure:tick 1t\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/function/treasure_flint.mcfunction",
    "content": "# @s = player that has mined gravel while underwater\n# located at position of flint item\n# run from check_gravel\n\nexecute store result score $result gm4_st_random run loot spawn ~ ~ ~ fish gm4_sunken_treasure:gameplay/gravel_treasure ~ ~ ~ mainhand\n\nexecute as @e[type=item,limit=1,dx=0,predicate=gm4_sunken_treasure:is_spawn_entity_item,nbt={Age:0s}] at @s run function gm4_sunken_treasure:spawn_entity\n\n# kill flint if loot was spawned\nexecute if score $result gm4_st_random matches 1.. run kill @e[type=minecraft:item,limit=1,distance=0,predicate=gm4_sunken_treasure:is_flint_item,nbt={Age:0s}]\nscoreboard players reset $result gm4_st_random\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/function/treasure_gravel.mcfunction",
    "content": "# @s = player that has mined gravel while underwater\n# located at position of gravel item\n# run from check_gravel\n\nexecute store result score $result gm4_st_random run loot spawn ~ ~ ~ fish gm4_sunken_treasure:gameplay/gravel_treasure ~ ~ ~ mainhand\n\nexecute as @e[type=item,limit=1,dx=0,predicate=gm4_sunken_treasure:is_spawn_entity_item,nbt={Age:0s}] at @s run function gm4_sunken_treasure:spawn_entity\n\n# kill gravel if loot was spawned\nexecute if score $result gm4_st_random matches 1.. run kill @e[type=minecraft:item,limit=1,distance=0,predicate=gm4_sunken_treasure:is_gravel_item,nbt={Age:0s}]\nscoreboard players reset $result gm4_st_random\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/function/treasure_sand.mcfunction",
    "content": "# @s = player that has mined sand while underwater\n# located at position of sand item\n# run from tick\n\nexecute store result score $result gm4_st_random run loot spawn ~ ~ ~ fish gm4_sunken_treasure:gameplay/sand_treasure ~ ~ ~ mainhand\n\nexecute as @e[type=item,limit=1,dx=0,predicate=gm4_sunken_treasure:is_spawn_entity_item,nbt={Age:0s}] at @s run function gm4_sunken_treasure:spawn_entity\n\n# kill sand if loot was spawned\nexecute if score $result gm4_st_random matches 1.. run kill @e[type=minecraft:item,limit=1,distance=0,predicate=gm4_sunken_treasure:is_sand_item,nbt={Age:0s}]\nscoreboard players reset $result gm4_st_random\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/guidebook/sunken_treasure.json",
    "content": "{\n  \"id\": \"sunken_treasure\",\n  \"name\": \"Sunken Treasure\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:golden_shovel\"\n  },\n  \"criteria\": {\n    \"obtain_fortune_shovel\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:shovels\",\n            \"enchantments\": [\n              {\n                \"enchantments\": \"minecraft:fortune\"\n              }\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.sunken_treasure.description\",\n            \"fallback\": \"Mining sand or gravel deep underwater with a Fortune shovel has a chance of dropping treasure.\\n\\nMining in different biomes can result in different drops.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"details\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_fortune_shovel\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.sunken_treasure.details\",\n            \"fallback\": \"Treasure can only be found if submerged in water at least 4 blocks deep.\\n\\nGravel and sand contain different loot, but both contain rare treasure chests.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/loot_table/chests/treasure_chest.json",
    "content": "{\n  \"type\": \"minecraft:chest\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:heart_of_the_sea\",\n          \"weight\": 10\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:wet_sponge\",\n          \"weight\": 50,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:trident\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.01\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 0,\n        \"max\": 2\n      },\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:emerald\",\n          \"weight\": 20,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:diamond\",\n          \"weight\": 10,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:nautilus_shell\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 3\n      },\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:tube_coral\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:tube_coral_fan\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:tube_coral_block\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:brain_coral\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:brain_coral_fan\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:brain_coral_block\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:bubble_coral\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:bubble_coral_fan\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:bubble_coral_block\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:fire_coral\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:fire_coral_fan\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:fire_coral_block\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:horn_coral\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:horn_coral_fan\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:horn_coral_block\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 4,\n        \"max\": 8\n      },\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:sand\",\n          \"weight\": 15,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:gravel\",\n          \"weight\": 20,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:clay_ball\",\n          \"weight\": 15,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 5,\n                \"max\": 9\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 2,\n        \"max\": 4\n      },\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:gunpowder\",\n          \"weight\": 10,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:lapis_lazuli\",\n          \"weight\": 10,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 4,\n                \"max\": 12\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:gold_nugget\",\n          \"weight\": 10,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:iron_nugget\",\n          \"weight\": 10,\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:rotten_flesh\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:bone\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 5\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 0,\n        \"max\": 1\n      },\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:book\",\n          \"weight\": 2,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\"\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:iron_shovel\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\"\n            },\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:fishing_rod\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\"\n            },\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.4\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": 2,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:cod\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:salmon\",\n          \"weight\": 5,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:tropical_fish\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:pufferfish\",\n          \"weight\": 3,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 4\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/loot_table/gameplay/gravel_treasure.json",
    "content": "{\n  \"type\": \"minecraft:fishing\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_sunken_treasure:gameplay/treasure_loot/gravel\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:table_bonus\",\n          \"enchantment\": \"minecraft:fortune\",\n          \"chances\": [\n            0,\n            0.15,\n            0.45,\n            0.9\n          ]\n        },\n        {\n          \"condition\": \"minecraft:reference\",\n          \"name\": \"gm4_sunken_treasure:in_ocean\"\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_sunken_treasure:gameplay/treasure_loot/gravel\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:table_bonus\",\n          \"enchantment\": \"minecraft:fortune\",\n          \"chances\": [\n            0,\n            0.1167,\n            0.35,\n            0.7\n          ]\n        },\n        {\n          \"condition\": \"minecraft:reference\",\n          \"name\": \"gm4_sunken_treasure:in_river\"\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_sunken_treasure:gameplay/treasure_loot/gravel\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:table_bonus\",\n          \"enchantment\": \"minecraft:fortune\",\n          \"chances\": [\n            0,\n            0.0833,\n            0.25,\n            0.5\n          ]\n        },\n        {\n          \"condition\": \"minecraft:inverted\",\n          \"term\": {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_sunken_treasure:in_ocean\"\n          }\n        },\n        {\n          \"condition\": \"minecraft:inverted\",\n          \"term\": {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_sunken_treasure:in_river\"\n          }\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/loot_table/gameplay/sand_treasure.json",
    "content": "{\n  \"type\": \"minecraft:fishing\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_sunken_treasure:gameplay/treasure_loot/sand\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:table_bonus\",\n          \"enchantment\": \"minecraft:fortune\",\n          \"chances\": [\n            0,\n            0.1167,\n            0.35,\n            0.7\n          ]\n        },\n        {\n          \"condition\": \"minecraft:reference\",\n          \"name\": \"gm4_sunken_treasure:in_ocean\"\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_sunken_treasure:gameplay/treasure_loot/sand\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:table_bonus\",\n          \"enchantment\": \"minecraft:fortune\",\n          \"chances\": [\n            0,\n            0.0833,\n            0.25,\n            0.5\n          ]\n        },\n        {\n          \"condition\": \"minecraft:reference\",\n          \"name\": \"gm4_sunken_treasure:in_river\"\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_sunken_treasure:gameplay/treasure_loot/sand\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:table_bonus\",\n          \"enchantment\": \"minecraft:fortune\",\n          \"chances\": [\n            0,\n            0.05,\n            0.15,\n            0.3\n          ]\n        },\n        {\n          \"condition\": \"minecraft:inverted\",\n          \"term\": {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_sunken_treasure:in_ocean\"\n          }\n        },\n        {\n          \"condition\": \"minecraft:inverted\",\n          \"term\": {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_sunken_treasure:in_river\"\n          }\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/loot_table/gameplay/treasure_loot/audrey_bottle.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:1b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.1\",\n                      \"fallback\": \"I drank all my beer\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:2b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.2.1\",\n                      \"fallback\": \"My boat was\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.2.2\",\n                  \"fallback\": \"sunk by a lily-pad and now I'm\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.2.3\",\n                  \"fallback\": \"stuck on this island.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:3b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.3.1\",\n                      \"fallback\": \"I don't know how to spell\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.3.2\",\n                  \"fallback\": \"your name, nor do I know you, but I\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.3.3\",\n                  \"fallback\": \"do know that I love you, I feel like I\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.3.4\",\n                  \"fallback\": \"have a mutual connection. After\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.3.5\",\n                  \"fallback\": \"you ordered the pizza with cheezy\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.3.6\",\n                  \"fallback\": \"crust and pinapple I just lost it. Oh\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.3.7\",\n                  \"fallback\": \"no Clair you got shot... I mean Audrey.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.3.8\",\n                  \"fallback\": \"I don't mind that you're chunky\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:4b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.4.1\",\n                      \"fallback\": \"when I listen\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.4.2\",\n                  \"fallback\": \"to the ocean, all I hear is your\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.4.3\",\n                  \"fallback\": \"snoring and I can't sleep. Please\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.4.4\",\n                  \"fallback\": \"silence your snoring... please, I\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.4.5\",\n                  \"fallback\": \"need sleep.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:5b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.5.1\",\n                      \"fallback\": \"How's your\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.5.2\",\n                  \"fallback\": \"day going? I'm good, BUT I'VE\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.5.3\",\n                  \"fallback\": \"BEEN STRANDED FOR 20 YEARS!\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.5.4\",\n                  \"fallback\": \"Thanks for your response.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:6b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.6.1\",\n                      \"fallback\": \"I'm stranded\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.6.2\",\n                  \"fallback\": \"in the middle of nowhere,\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.6.3\",\n                  \"fallback\": \"surrounded by things that\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.6.4\",\n                  \"fallback\": \"aren't cubic.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:7b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.7.1\",\n                      \"fallback\": \"I mean Hannah...\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.7.2\",\n                  \"fallback\": \"wait, no... is it Denise? ...Anyway,\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.7.3\",\n                  \"fallback\": \"I love you.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:8b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.8.1\",\n                      \"fallback\": \"I seem to have\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.8.2\",\n                  \"fallback\": \"run out of clean water, if you could\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.8.3\",\n                  \"fallback\": \"return this bottle with something to\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.8.4\",\n                  \"fallback\": \"drink that would be wonderful.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:9b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.9.1\",\n                      \"fallback\": \"I have no\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.9.2\",\n                  \"fallback\": \"internet so I am sending you\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.9.3\",\n                  \"fallback\": \"a bottle.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:10b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.10.1\",\n                      \"fallback\": \"What's your\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.10.2\",\n                  \"fallback\": \"phone number; bottled messages\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.10.3\",\n                  \"fallback\": \"are hard to make!\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:11b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.11.1\",\n                      \"fallback\": \"I find myself stranded\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.11.2\",\n                  \"fallback\": \"on a barren island.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.11.3\",\n                  \"fallback\": \"An enderdragon took me here,\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.11.4\",\n                  \"fallback\": \"please rescue me.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:12b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.12\",\n                      \"fallback\": \"Put the money in the bag.\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:13b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.13.1\",\n                      \"fallback\": \"The compass you sent me\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.13.2\",\n                  \"fallback\": \"seems to only point in the direction of our love,\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.13.3\",\n                  \"fallback\": \"but that seems to have vanished long ago.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.13.4\",\n                  \"fallback\": \"Please, get help, even if it's the last thing you do.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:14b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.14.1\",\n                      \"fallback\": \"I fear this may\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.14.2\",\n                  \"fallback\": \"be my last attempt at finding help.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.14.3\",\n                  \"fallback\": \"I just want you to know... I always... loved...\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.14.4\",\n                  \"fallback\": \"your sister.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:15b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.15.1\",\n                      \"fallback\": \"I've been here for 3 months\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.15.2\",\n                  \"fallback\": \"and after several attempts to find food,\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.15.3\",\n                  \"fallback\": \"shelter, or even enough water... I'm giving up.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.15.4\",\n                  \"fallback\": \"Tell my family I love them, but most importantly,\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.15.5\",\n                  \"fallback\": \"Audrey, I love you.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:16b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.16.1\",\n                      \"fallback\": \"I know exactly who\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.16.2\",\n                  \"fallback\": \"you are - play along. I don't have any\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.16.3\",\n                  \"fallback\": \"money. I burned it all trying to make a\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.16.4\",\n                  \"fallback\": \"fire. But I can tell you I've developed\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.16.5\",\n                  \"fallback\": \"a very particular set of skills. Skills\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.16.6\",\n                  \"fallback\": \"that'll make Bear Grylls quake in his boots.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:17b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.17.1\",\n                      \"fallback\": \"I'm in the sink sand.\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.17.2\",\n                  \"fallback\": \"If you find my head, hang it on the\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.17.3\",\n                  \"fallback\": \"wall of fame.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:18b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.18.1\",\n                      \"fallback\": \"Each day that passes\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.18.2\",\n                  \"fallback\": \"is immensely terrible, painful and sad.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.18.3\",\n                  \"fallback\": \"Getting away from you just didn't\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.18.4\",\n                  \"fallback\": \"improve anything.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:19b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.19.1\",\n                      \"fallback\": \"I write this on paper\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.19.2\",\n                  \"fallback\": \"made from native plants and ink\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.19.3\",\n                  \"fallback\": \"from a squid I wrangled. I like it here.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.19.4\",\n                  \"fallback\": \"I found a dungeon. I'm setting up a mob\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.19.5\",\n                  \"fallback\": \"grinder and never coming home.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:glass_bottle\",\n          \"weight\": 1,\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/message_in_a_bottle\"]}\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_audrey:20b}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.message_in_a_bottle\",\n                \"fallback\": \"Message in a Bottle\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_lore\",\n              \"mode\": \"append\",\n              \"lore\": [\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.prefix\",\n                  \"fallback\": \"Dearest Audrey, \",\n                  \"extra\": [\n                    {\n                      \"translate\": \"text.gm4.dearest_audrey.20.1\",\n                      \"fallback\": \"punching wood\"\n                    }\n                  ],\n                  \"color\": \"gray\",\n                  \"italic\": false\n                },\n                {\n                  \"translate\": \"text.gm4.dearest_audrey.20.2\",\n                  \"fallback\": \"for logs doesn't work in real life.\",\n                  \"color\": \"gray\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/loot_table/gameplay/treasure_loot/gravel.json",
    "content": "{\n  \"type\": \"minecraft:fishing\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 40,\n          \"name\": \"minecraft:kelp\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 60,\n          \"name\": \"minecraft:seagrass\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:gold_nugget\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:iron_nugget\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:nautilus_shell\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 60,\n          \"name\": \"minecraft:bone\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:prismarine_crystals\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:prismarine_shard\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:golden_boots\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0.2,\n                \"max\": 0.8\n              }\n            },\n            {\n              \"function\": \"minecraft:set_enchantments\",\n              \"enchantments\": {\n                \"minecraft:depth_strider\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.waders\",\n                \"fallback\": \"Waders\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/waders\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:leather_boots\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.1\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:wet_sponge\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:experience_bottle\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:fishing_rod\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:bow\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:iron_shovel\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:golden_shovel\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:spyglass\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:iron_ingot\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:gold_ingot\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:copper_ingot\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:chest\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/shipwreck_supply\"]},\n                \"minecraft:container_loot\": {\n                  \"loot_table\": \"minecraft:chests/shipwreck_supply\"\n                }\n              }\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"block.gm4.shipwreck_supply_chest\",\n                \"fallback\": \"Shipwreck Supply Chest\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:chest\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/shipwreck_treasure\"]},\n                \"minecraft:container_loot\": {\n                  \"loot_table\": \"minecraft:chests/shipwreck_treasure\"\n                }\n              }\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"block.gm4.shipwreck_treasure_chest\",\n                \"fallback\": \"Shipwreck Treasure Chest\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:chest\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/treasure_chest\"]},\n                \"minecraft:container_loot\": {\n                  \"loot_table\": \"gm4_sunken_treasure:chests/treasure_chest\"\n                }\n              }\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"block.gm4.treasure_chest\",\n                \"fallback\": \"Treasure Chest\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:prismarine_shard\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_sunken_treasure:{spawn:{id:'minecraft:guardian'}}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 40,\n          \"name\": \"minecraft:glow_ink_sac\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_sunken_treasure:{spawn:{id:'minecraft:glow_squid'}}}\"\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"max\": 30\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 40,\n          \"name\": \"minecraft:ink_sac\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_sunken_treasure:{spawn:{id:'minecraft:squid'}}}\"\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": 31\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 40,\n          \"value\": \"gm4_sunken_treasure:gameplay/treasure_loot/audrey_bottle\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:clay_ball\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:gunpowder\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 30,\n          \"name\": \"minecraft:bone_meal\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 30,\n          \"name\": \"minecraft:mossy_cobblestone\"\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 4,\n          \"value\": \"gm4_scuba_gear:items/scuba_helmet\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:value_check\",\n              \"value\": {\n                \"type\": \"minecraft:score\",\n                \"target\": {\n                  \"type\": \"minecraft:fixed\",\n                  \"name\": \"gm4_scuba_gear\"\n                },\n                \"score\": \"load.status\"\n              },\n              \"range\": {\n                \"min\": 1\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 3,\n          \"value\": \"gm4_scuba_gear:items/scuba_tank\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:value_check\",\n              \"value\": {\n                \"type\": \"minecraft:score\",\n                \"target\": {\n                  \"type\": \"minecraft:fixed\",\n                  \"name\": \"gm4_scuba_gear\"\n                },\n                \"score\": \"load.status\"\n              },\n              \"range\": {\n                \"min\": 1\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/loot_table/gameplay/treasure_loot/sand.json",
    "content": "{\n  \"type\": \"minecraft:fishing\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 40,\n          \"name\": \"minecraft:kelp\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 60,\n          \"name\": \"minecraft:seagrass\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:sea_pickle\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:gold_nugget\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:iron_nugget\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:nautilus_shell\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 60,\n          \"name\": \"minecraft:bone\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:prismarine_crystals\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:prismarine_shard\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:golden_boots\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0.2,\n                \"max\": 0.8\n              }\n            },\n            {\n              \"function\": \"minecraft:set_enchantments\",\n              \"enchantments\": {\n                \"minecraft:depth_strider\": 1\n              }\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.waders\",\n                \"fallback\": \"Waders\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/waders\"]}\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:leather_boots\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.1\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:turtle_scute\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:wet_sponge\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:experience_bottle\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:fishing_rod\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:bow\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:iron_shovel\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:golden_shovel\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_damage\",\n              \"damage\": {\n                \"min\": 0,\n                \"max\": 0.2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:spyglass\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:iron_ingot\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:gold_ingot\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:copper_ingot\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:chest\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/shipwreck_supply\"]},\n                \"minecraft:container_loot\": {\n                  \"loot_table\": \"minecraft:chests/shipwreck_supply\"\n                }\n              }\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"block.gm4.shipwreck_supply_chest\",\n                \"fallback\": \"Shipwreck Supply Chest\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:chest\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/shipwreck_treasure\"]},\n                \"minecraft:container_loot\": {\n                  \"loot_table\": \"minecraft:chests/shipwreck_treasure\"\n                }\n              }\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"block.gm4.shipwreck_treasure_chest\",\n                \"fallback\": \"Shipwreck Treasure Chest\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:chest\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sunken_treasure:item/treasure_chest\"]},\n                \"minecraft:container_loot\": {\n                  \"loot_table\": \"gm4_sunken_treasure:chests/treasure_chest\"\n                }\n              }\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"block.gm4.treasure_chest\",\n                \"fallback\": \"Treasure Chest\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:prismarine_shard\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_sunken_treasure:{spawn:{id:'minecraft:guardian'}}}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 40,\n          \"name\": \"minecraft:glow_ink_sac\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_sunken_treasure:{spawn:{id:'minecraft:glow_squid'}}}\"\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"max\": 30\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 40,\n          \"name\": \"minecraft:ink_sac\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_sunken_treasure:{spawn:{id:'minecraft:squid'}}}\"\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"position\": {\n                  \"y\": {\n                    \"min\": 31\n                  }\n                }\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 20,\n          \"name\": \"minecraft:tropical_fish\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_sunken_treasure:{spawn:{id:'minecraft:tropical_fish'}}}\"\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:any_of\",\n              \"terms\": [\n                {\n                  \"condition\": \"minecraft:reference\",\n                  \"name\": \"gm4_sunken_treasure:in_lukewarm_ocean\"\n                },\n                {\n                  \"condition\": \"minecraft:reference\",\n                  \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 40,\n          \"value\": \"gm4_sunken_treasure:gameplay/treasure_loot/audrey_bottle\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:tube_coral\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:tube_coral_block\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:tube_coral_fan\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:brain_coral\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:brain_coral_block\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:brain_coral_fan\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:bubble_coral\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:bubble_coral_block\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:bubble_coral_fan\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:fire_coral\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:fire_coral_block\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:fire_coral_fan\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:horn_coral\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:horn_coral_block\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:horn_coral_fan\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_sunken_treasure:in_warm_ocean\"\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 4,\n          \"value\": \"gm4_scuba_gear:items/scuba_helmet\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:value_check\",\n              \"value\": {\n                \"type\": \"minecraft:score\",\n                \"target\": {\n                  \"type\": \"minecraft:fixed\",\n                  \"name\": \"gm4_scuba_gear\"\n                },\n                \"score\": \"load.status\"\n              },\n              \"range\": {\n                \"min\": 1\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 3,\n          \"value\": \"gm4_scuba_gear:items/scuba_tank\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:value_check\",\n              \"value\": {\n                \"type\": \"minecraft:score\",\n                \"target\": {\n                  \"type\": \"minecraft:fixed\",\n                  \"name\": \"gm4_scuba_gear\"\n                },\n                \"score\": \"load.status\"\n              },\n              \"range\": {\n                \"min\": 1\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/in_deep_water.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetY\": 0,\n    \"predicate\": {\n      \"fluid\": {\n        \"fluids\": \"#minecraft:water\"\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetY\": 1,\n    \"predicate\": {\n      \"fluid\": {\n        \"fluids\": \"#minecraft:water\"\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetY\": 2,\n    \"predicate\": {\n      \"fluid\": {\n        \"fluids\": \"#minecraft:water\"\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetY\": 3,\n    \"predicate\": {\n      \"fluid\": {\n        \"fluids\": \"#minecraft:water\"\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetY\": 4,\n    \"predicate\": {\n      \"fluid\": {\n        \"fluids\": \"#minecraft:water\"\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/in_lukewarm_ocean.json",
    "content": "{\n  \"condition\": \"minecraft:location_check\",\n  \"predicate\": {\n    \"biomes\": [\n      \"minecraft:deep_lukewarm_ocean\",\n      \"minecraft:lukewarm_ocean\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/in_ocean.json",
    "content": "{\n  \"condition\": \"minecraft:location_check\",\n  \"predicate\": {\n    \"biomes\": [\n      \"minecraft:cold_ocean\",\n      \"minecraft:deep_cold_ocean\",\n      \"minecraft:deep_frozen_ocean\",\n      \"minecraft:deep_lukewarm_ocean\",\n      \"minecraft:deep_ocean\",\n      \"minecraft:frozen_ocean\",\n      \"minecraft:lukewarm_ocean\",\n      \"minecraft:ocean\",\n      \"minecraft:warm_ocean\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/in_river.json",
    "content": "{\n  \"condition\": \"minecraft:location_check\",\n  \"predicate\": {\n    \"biomes\": [\n      \"minecraft:frozen_river\",\n      \"minecraft:river\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/in_warm_ocean.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:location_check\",\n      \"predicate\": {\n        \"biomes\": \"minecraft:warm_ocean\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/is_flint_item.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"items\": \"minecraft:flint\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/is_gravel_item.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"items\": \"minecraft:gravel\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/is_sand_item.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"items\": \"minecraft:sand\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/is_spawn_entity_item.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_sunken_treasure:{spawn:{}}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_sunken_treasure/mod.mcdoc",
    "content": "\ndispatch minecraft:storage[gm4_sunken_treasure:temp] to struct {\n  spawn?: SunkenTreasureSpawn,\n}\n\ndispatch mcdoc:custom_data[gm4_sunken_treasure] to struct {\n  spawn?: SunkenTreasureSpawn,\n}\n\nstruct SunkenTreasureSpawn {\n  id: #[id=\"entity_type\"] string,\n}\n\ndispatch mcdoc:custom_data[gm4_audrey] to byte\n"
  },
  {
    "path": "gm4_survival_refightalized/README.md",
    "content": "# Survival Refightalized<!--$headerTitle--><!--$pmc:delete-->\n\nA reworked survival experience with more varied mobs and new armor and shield mechanics.<!--$pmc:headerSize-->\n\n<img src=\"images/survival_refightalized.png\" alt=\"New shield mechanics\" height=\"350\"/> <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features:\n- Armor acts like a second health bar instead of reducing incoming damage.\n- Shields are disabled after being hit, adds the possibility to \"parry\" an attack.\n- Mobs scale with spawn location, being stronger lower down in the world.\n- Phantoms take damage if they try to fly into water, as they deserve.\n\nA full detailed list of all mechanics can be found at the [Wiki](https://wiki.gm4.co/Survival_Refightalized).\n"
  },
  {
    "path": "gm4_survival_refightalized/beet.yaml",
    "content": "id: gm4_survival_refightalized\nname: Survival Refightalized\nversion: 1.2.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_forceload\n  - gm4.plugins.include.lib_lore\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_forceload: 1.6.0\n        lib_lore: 1.4.0\n      schedule_loops: \n        - tick\n        - main\n        - slow_clock\n    website:\n      description: A reworked survival experience with more varied mobs and new armor and shield mechanics.\n      recommended:\n        - gm4_monsters_unbound\n    wiki: https://wiki.gm4.co/wiki/Survival_Refightalized\n    credits:\n      Creator:\n        - Djones\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4/advancement/survival_refightalized_armor_damage.json",
    "content": "{\n    \"display\": {\n        \"icon\": {\n            \"id\": \"minecraft:leather_chestplate\"\n        },\n        \"title\": {\n            \"translate\": \"advancement.gm4.survival_refightalized.armor_damage.title\",\n            \"fallback\": \"Armor Up!\"\n        },\n        \"description\": {\n            \"translate\": \"advancement.gm4.survival_refightalized.armor_damage.description\",\n            \"fallback\": \"Discover that Armor works a bit differently now\",\n            \"color\": \"gray\"\n        },\n        \"frame\": \"task\"\n    },\n    \"parent\": \"gm4:root\",\n    \"criteria\": {\n        \"full_set\": {\n            \"trigger\": \"minecraft:impossible\"\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4/advancement/survival_refightalized_parry.json",
    "content": "{\n    \"display\": {\n        \"icon\": {\n            \"id\": \"minecraft:shield\"\n        },\n        \"title\": {\n            \"translate\": \"advancement.gm4.survival_refightalized.parry.title\",\n            \"fallback\": \"Not Today\"\n        },\n        \"description\": {\n            \"translate\": \"advancement.gm4.survival_refightalized.parry.description\",\n            \"fallback\": \"Parry with a Shield by blocking just before an attack\",\n            \"color\": \"gray\"\n        },\n        \"frame\": \"task\"\n    },\n    \"parent\": \"gm4:survival_refightalized_armor_damage\",\n    \"criteria\": {\n        \"full_set\": {\n            \"trigger\": \"minecraft:impossible\"\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4/advancement/survival_refightalized_parry_lethal_damage.json",
    "content": "{\n    \"display\": {\n        \"icon\": {\n            \"id\": \"minecraft:shield\",\n            \"components\": {\n              \"minecraft:enchantment_glint_override\": true\n            }\n        },\n        \"title\": {\n            \"translate\": \"advancement.gm4.survival_refightalized.parry_lethal_damage.title\",\n            \"fallback\": \"Not Today, Either\"\n        },\n        \"description\": {\n            \"translate\": \"advancement.gm4.survival_refightalized.parry_lethal_damage.description\",\n            \"fallback\": \"Block lethal damage with a Shield Parry\",\n            \"color\": \"gray\"\n        },\n        \"frame\": \"challenge\",\n        \"hidden\": true\n    },\n    \"parent\": \"gm4:survival_refightalized_parry\",\n    \"criteria\": {\n        \"full_set\": {\n            \"trigger\": \"minecraft:impossible\"\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/advancement/damaged.json",
    "content": "{\n  \"criteria\": {\n    \"combat_damage\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"gm4_survival_refightalized:combat\",\n                \"expected\": true\n              },\n              {\n                \"id\": \"gm4_survival_refightalized:ignore\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    },\n    \"armor_piercing\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"gm4_survival_refightalized:armor_piercing\",\n                \"expected\": true\n              },\n              {\n                \"id\": \"gm4_survival_refightalized:ignore\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    },\n    \"armor_piercing_mob\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"source_entity\": {\n              \"nbt\": \"{Tags:[\\\"gm4_sr_stat.armor_pierce_attack\\\"]}\"\n            }\n          }\n        }\n      }\n    },\n    \"breaching\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"source_entity\": {\n            \"equipment\": {\n              \"mainhand\": {\n                \"predicates\": {\n                  \"minecraft:enchantments\": [\n                    {\n                      \"enchantments\": \"minecraft:breach\"\n                    }\n                  ]\n                }\n              }\n            }\n          },\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"gm4_survival_refightalized:ignore\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    },\n    \"bypasses_enchantments\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"minecraft:bypasses_enchantments\",\n                \"expected\": true\n              },\n              {\n                \"id\": \"gm4_survival_refightalized:ignore\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    },\n    \"bypasses_shield\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"minecraft:bypasses_shield\",\n                \"expected\": true\n              },\n              {\n                \"id\": \"gm4_survival_refightalized:ignore\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    },\n    \"is_fire\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"minecraft:is_fire\",\n                \"expected\": true\n              },\n              {\n                \"id\": \"gm4_survival_refightalized:ignore\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    },\n    \"is_explosion\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"minecraft:is_explosion\",\n                \"expected\": true\n              },\n              {\n                \"id\": \"gm4_survival_refightalized:ignore\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    },\n    \"is_fall\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"minecraft:is_fall\",\n                \"expected\": true\n              },\n              {\n                \"id\": \"gm4_survival_refightalized:ignore\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    },\n    \"is_projectile\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"minecraft:is_projectile\",\n                \"expected\": true\n              },\n              {\n                \"id\": \"gm4_survival_refightalized:ignore\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    },\n    \"witch\": {\n      \"trigger\": \"minecraft:effects_changed\",\n      \"conditions\": {\n        \"effects\": {\n          \"minecraft:poison\": {}\n        },\n        \"source\": {\n          \"type\": \"minecraft:witch\"\n        }\n      }\n    },\n    \"cave_spider\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"source_entity\": {\n            \"type\": \"minecraft:cave_spider\"\n          },\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"gm4_survival_refightalized:ignore\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    },\n    \"catch_other\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"damage\": {\n          \"type\": {\n            \"tags\": [\n              {\n                \"id\": \"gm4_survival_refightalized:ignore\",\n                \"expected\": false\n              }\n            ]\n          }\n        }\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"combat_damage\",\n      \"armor_piercing\",\n      \"armor_piercing_mob\",\n      \"breaching\",\n      \"bypasses_enchantments\",\n      \"bypasses_shield\",\n      \"is_fire\",\n      \"is_fall\",\n      \"is_explosion\",\n      \"is_projectile\",\n      \"witch\",\n      \"cave_spider\",\n      \"catch_other\"\n    ]\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/advancement/kill_mob.json",
    "content": "{\n    \"criteria\": {\n        \"hostile\": {\n            \"trigger\": \"minecraft:player_killed_entity\",\n            \"conditions\": {\n                \"entity\": {\n                    \"type\": \"#gm4:hostile\"\n                }\n            }\n        },\n        \"neutral_hostile\": {\n            \"trigger\": \"minecraft:player_killed_entity\",\n            \"conditions\": {\n                \"entity\": {\n                    \"type\": \"#gm4:neutral_hostile\"\n                }\n            }\n        }\n    },\n    \"requirements\": [\n        [\n            \"hostile\",\n            \"neutral_hostile\"\n        ]\n    ],\n    \"rewards\": {\n        \"function\": \"gm4_survival_refightalized:player/killed_mob\"\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/advancement/reach_tier/diamond_netherite.json",
    "content": "{\n    \"criteria\": {\n        \"diamond_helmet\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:diamond_helmet\"\n                    }\n                ]\n            }\n        },\n        \"diamond_chestplate\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:diamond_chestplate\"\n                    }\n                ]\n            }\n        },\n        \"diamond_leggings\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:diamond_leggings\"\n                    }\n                ]\n            }\n        },\n        \"diamond_boots\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:diamond_boots\"\n                    }\n                ]\n            }\n        },\n        \"netherite_helmet\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:netherite_helmet\"\n                    }\n                ]\n            }\n        },\n        \"netherite_chestplate\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:netherite_chestplate\"\n                    }\n                ]\n            }\n        },\n        \"netherite_leggings\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:netherite_leggings\"\n                    }\n                ]\n            }\n        },\n        \"netherite_boots\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:netherite_boots\"\n                    }\n                ]\n            }\n        }\n    },\n    \"requirements\": [\n        [\n            \"diamond_helmet\",\n            \"diamond_chestplate\",\n            \"diamond_leggings\",\n            \"diamond_boots\",\n            \"netherite_helmet\",\n            \"netherite_chestplate\",\n            \"netherite_leggings\",\n            \"netherite_boots\"\n        ]\n    ],\n    \"rewards\": {\n        \"function\": \"gm4_survival_refightalized:player/reach_tier/diamond_netherite\"\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/advancement/reach_tier/iron_golden.json",
    "content": "{\n    \"criteria\": {\n        \"iron_helmet\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:iron_helmet\"\n                    }\n                ]\n            }\n        },\n        \"iron_chestplate\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:iron_chestplate\"\n                    }\n                ]\n            }\n        },\n        \"iron_leggings\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:iron_leggings\"\n                    }\n                ]\n            }\n        },\n        \"iron_boots\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:iron_boots\"\n                    }\n                ]\n            }\n        },\n        \"golden_helmet\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:golden_helmet\"\n                    }\n                ]\n            }\n        },\n        \"golden_chestplate\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:golden_chestplate\"\n                    }\n                ]\n            }\n        },\n        \"golden_leggings\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:golden_leggings\"\n                    }\n                ]\n            }\n        },\n        \"golden_boots\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"items\": [\n                    {\n                        \"items\": \"minecraft:golden_boots\"\n                    }\n                ]\n            }\n        }\n    },\n    \"requirements\": [\n        [\n            \"iron_helmet\",\n            \"iron_chestplate\",\n            \"iron_leggings\",\n            \"iron_boots\",\n            \"golden_helmet\",\n            \"golden_chestplate\",\n            \"golden_leggings\",\n            \"golden_boots\"\n        ]\n    ],\n    \"rewards\": {\n        \"function\": \"gm4_survival_refightalized:player/reach_tier/iron_golden\"\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/advancement/using_custom_shield.json",
    "content": "{\n    \"criteria\": {\n        \"custom_shield\": {\n            \"trigger\": \"minecraft:using_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                        \"minecraft:custom_data\": {\n                            \"gm4_survival_refightalized\": {\n                                \"shield\": {}\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_survival_refightalized:player/damage/shield/using\"\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/advancement/using_vanilla_shield.json",
    "content": "{\n    \"criteria\": {\n        \"mainhand\": {\n            \"trigger\": \"minecraft:using_item\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:all_of\",\n                        \"terms\": [\n                            {\n                                \"condition\": \"minecraft:entity_properties\",\n                                \"entity\": \"this\",\n                                \"predicate\": {\n                                    \"equipment\": {\n                                        \"mainhand\": {\n                                            \"items\": \"shield\"\n                                        }\n                                    }\n                                }\n                            },\n                            {\n                                \"condition\": \"minecraft:inverted\",\n                                \"term\": {\n                                    \"condition\": \"minecraft:entity_properties\",\n                                    \"entity\": \"this\",\n                                    \"predicate\": {\n                                        \"equipment\": {\n                                            \"mainhand\": {\n                                                \"predicates\": {\n                                                    \"minecraft:custom_data\": {\n                                                        \"gm4_survival_refightalized\": {}\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        ]\n                    }\n                ],\n                \"item\": {\n                    \"items\": \"shield\"\n                }\n            }\n        },\n        \"offhand\": {\n            \"trigger\": \"minecraft:using_item\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:all_of\",\n                        \"terms\": [\n                            {\n                                \"condition\": \"minecraft:entity_properties\",\n                                \"entity\": \"this\",\n                                \"predicate\": {\n                                    \"equipment\": {\n                                        \"offhand\": {\n                                            \"items\": \"shield\"\n                                        }\n                                    }\n                                }\n                            },\n                            {\n                                \"condition\": \"minecraft:inverted\",\n                                \"term\": {\n                                    \"condition\": \"minecraft:entity_properties\",\n                                    \"entity\": \"this\",\n                                    \"predicate\": {\n                                        \"equipment\": {\n                                            \"offhand\": {\n                                                \"predicates\": {\n                                                    \"minecraft:custom_data\": {\n                                                        \"gm4_survival_refightalized\": {}\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        ]\n                    }\n                ],\n                \"item\": {\n                    \"items\": \"shield\"\n                }\n            }\n        }\n    },\n    \"requirements\": [\n        [\n            \"mainhand\",\n            \"offhand\"\n        ]\n    ],\n    \"rewards\": {\n        \"function\": \"gm4_survival_refightalized:player/damage/shield/update_vanilla_shield\"\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/enchantment/trident_damage_reduction.json",
    "content": "{\n    \"anvil_cost\": 0,\n    \"description\": \"gm4.survival_refightalized.trident_damage_reduction\",\n    \"effects\": {\n        \"minecraft:damage\": [\n            {\n                \"effect\": {\n                    \"type\": \"minecraft:add\",\n                    \"value\": {\n                        \"type\": \"minecraft:linear\",\n                        \"base\": -1,\n                        \"per_level_above_first\": -1\n                    }\n                }\n            }\n        ]\n    },\n    \"max_cost\": {\n        \"base\": 0,\n        \"per_level_above_first\": 0\n    },\n    \"max_level\": 5,\n    \"min_cost\": {\n        \"base\": 0,\n        \"per_level_above_first\": 0\n    },\n    \"slots\": [\n        \"mainhand\"\n    ],\n    \"supported_items\": \"trident\",\n    \"weight\": 1\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/check_arrow.mcfunction",
    "content": "# check shot arrows\n# @s = arrow\n# at unspecified\n# run from tick\n\n# tag item as checked and try to process\ntag @s add gm4_sr_arrow_checked\nscoreboard players set $trident_damage_change gm4_sr_data 0\n\nexecute store result score $arrow_damage gm4_sr_data run data get entity @s damage 10\ntag @s add gm4_sr_current_arrow\nexecute on origin if entity @s[type=#gm4_survival_refightalized:can_fire_arrows] run function gm4_survival_refightalized:mob/process/arrow/run\ntag @s remove gm4_sr_current_arrow\n\n# if it's a trident use enchantments instead\nexecute if entity @s[type=trident] run return run execute store result entity @s item.components.\"minecraft:enchantments\".\"gm4_survival_refightalized:trident_damage_reduction\" int -1 run scoreboard players get $trident_damage_change gm4_sr_data\n\n# store result on arrow\nscoreboard players operation $arrow_damage gm4_sr_data += $arrow_damage_change gm4_sr_data\nexecute store result entity @s damage double 0.1 run scoreboard players get $arrow_damage gm4_sr_data\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/debug/dont_run/dev.mcfunction",
    "content": "# show stats of the closest modified mob\n# @s = modified mob\n# at player with gm4_sr_dev.mob_stats tag\n# run from player/player_submain\n\nexecute store result score $dev.difficulty gm4_sr_data run scoreboard players get @s gm4_sr_mob.difficulty\nexecute store result score $dev.health_max gm4_sr_data run attribute @s minecraft:max_health get 1\nexecute store result score $dev.health_curr gm4_sr_data run data get entity @s Health\nexecute store result score $worlddiff gm4_sr_data run difficulty\nexecute if score $worlddiff gm4_sr_data matches 1 store result score $dev.damage gm4_sr_data run attribute @s minecraft:attack_damage get 77\nexecute if score $worlddiff gm4_sr_data matches 2 store result score $dev.damage gm4_sr_data run attribute @s minecraft:attack_damage get 100\nexecute if score $worlddiff gm4_sr_data matches 3 store result score $dev.damage gm4_sr_data run attribute @s minecraft:attack_damage get 150\nscoreboard players operation $dev.damage_10 gm4_sr_data = $dev.damage gm4_sr_data\nscoreboard players operation $dev.damage_10 gm4_sr_data /= #100 gm4_sr_data\nscoreboard players operation $dev.damage_1 gm4_sr_data = $dev.damage gm4_sr_data\nscoreboard players operation $dev.damage_1 gm4_sr_data %= #100 gm4_sr_data\nexecute store result score $dev.speed gm4_sr_data run attribute @s minecraft:movement_speed get 100\nexecute at @s run particle firework ~ ~1 ~ 0.2 0.5 0.2 0 3 force @p[tag=gm4_sr_dev.mob_stats]\ntitle @p[tag=gm4_sr_dev.mob_stats] actionbar [{\"text\":\"Diff: \",\"color\":\"gray\"},{\"score\":{\"name\":\"$dev.difficulty\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\" Health: \",\"color\":\"gray\"},{\"score\":{\"name\":\"$dev.health_curr\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\"/\",\"color\":\"white\"},{\"score\":{\"name\":\"$dev.health_max\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\" Damage: \"},{\"score\":{\"name\":\"$dev.damage_10\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\".\",\"color\":\"white\"},{\"score\":{\"name\":\"$dev.damage_1\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\" Speed: \"},{\"score\":{\"name\":\"$dev.speed\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"}]\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/init.mcfunction",
    "content": "execute unless score survival_refightalized gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Survival Refightalized\"}\nexecute unless score survival_refightalized gm4_earliest_version < survival_refightalized gm4_modules run scoreboard players operation survival_refightalized gm4_earliest_version = survival_refightalized gm4_modules\nscoreboard players set survival_refightalized gm4_modules 1\n\n# scoreboards\nscoreboard objectives add gm4_sr_data dummy\nscoreboard objectives add gm4_sr_config dummy\n\nscoreboard objectives add gm4_sr_mob.difficulty dummy\nscoreboard objectives add gm4_sr_mob.damage_cap dummy\n\nscoreboard objectives add gm4_sr_health.restoration dummy\nscoreboard objectives add gm4_sr_health.regeneration_timer dummy\nscoreboard objectives add gm4_sr_health.absorption_reduction_timer dummy\n\nscoreboard objectives add gm4_sr_stat.current_health dummy\nscoreboard objectives add gm4_sr_stat.max_health dummy\nscoreboard objectives add gm4_sr_stat.health_percentage dummy\nscoreboard objectives add gm4_sr_stat.current_absorption dummy\nscoreboard objectives add gm4_sr_stat.max_absorption dummy\n\nscoreboard objectives add gm4_sr_stat.armor_recharge_change dummy\nscoreboard objectives add gm4_sr_stat.regeneration_rate_change dummy\n\nscoreboard objectives add gm4_sr_stat.hunger food\nscoreboard objectives add gm4_sr_stat.damage_taken custom:damage_taken\nscoreboard objectives add gm4_sr_stat.damage_absorbed custom:damage_absorbed\nscoreboard objectives add gm4_sr_stat.damage_resisted custom:damage_resisted\nscoreboard objectives add gm4_sr_stat.damage_blocked custom:damage_blocked_by_shield\nscoreboard objectives add gm4_sr_stat.armor armor\nscoreboard objectives add gm4_sr_stat.deaths deathCount\n\nscoreboard objectives add gm4_sr_armor.tier dummy\nscoreboard objectives add gm4_sr_armor.reduction dummy\nscoreboard objectives add gm4_sr_armor.reduction_timer dummy\nscoreboard objectives add gm4_sr_armor.hit_cooldown dummy\n\nscoreboard objectives add gm4_sr_arrow.fire_delay dummy\nscoreboard objectives add gm4_sr_arrow.fire_delay_left dummy\nscoreboard objectives add gm4_sr_arrow.damage_change dummy\n\nscoreboard objectives add gm4_sr_shield.spam_detection dummy\nscoreboard objectives add gm4_sr_shield.use_ticks dummy\nscoreboard objectives add gm4_sr_shield.timer dummy\n\n# configs\nexecute unless score $config_version gm4_sr_config matches 2.. run scoreboard players set $natural_regen gm4_sr_config 1\nexecute unless score $config_version gm4_sr_config matches 2.. run scoreboard players set $combat_regen_timer gm4_sr_config 1250\nexecute unless score $config_version gm4_sr_config matches 2.. run scoreboard players set $rapid_regen_timer gm4_sr_config 250\nexecute unless score $config_version gm4_sr_config matches 2.. run scoreboard players set $armor_recharge_timer gm4_sr_config 500\nscoreboard players set $config_version gm4_sr_data 2\n\n# swap natural regeneration to module's system\nexecute unless score $natural_regen_disabled gm4_sr_data matches 1 run gamerule natural_health_regeneration false\nexecute unless score $natural_regen_disabled gm4_sr_data matches 1 run data modify storage gm4:log queue append value {type:\"text\",message:{\"text\":\"[INFO] Survival Refightalized changed gamerule natural_health_regeneration to false\"}}\nscoreboard players set $natural_regen_disabled gm4_sr_data 1\nexecute store result score $naturalregeneration gm4_sr_data run gamerule natural_health_regeneration\nexecute if score $natural_regen gm4_sr_config matches 1 if score $naturalregeneration gm4_sr_data matches 1 run data modify storage gm4:log queue append value {type:\"text\",message:[{\"text\":\"[WARN]\",\"color\":\"red\"},{\"text\":\" Survival Refightalized requires minecraft:natural_health_regeneration to be false, but it is true. \",\"color\":\"white\"},{\"text\":\"click here to fix\",\"color\":\"red\",\"click_event\":{\"action\":\"suggest_command\",\"command\":\"/gamerule natural_health_regeneration false\"}}]}\n\n# constants\nscoreboard players set #-128 gm4_sr_data -128\nscoreboard players set #0 gm4_sr_data 0\nscoreboard players set #1 gm4_sr_data 1\nscoreboard players set #2 gm4_sr_data 2\nscoreboard players set #5 gm4_sr_data 5\nscoreboard players set #8 gm4_sr_data 8\nscoreboard players set #10 gm4_sr_data 10\nscoreboard players set #60 gm4_sr_data 60\nscoreboard players set #80 gm4_sr_data 80\nscoreboard players set #100 gm4_sr_data 100\nscoreboard players set #1024 gm4_sr_data 1024\n\n# start clocks\nschedule function gm4_survival_refightalized:tick 1t\nschedule function gm4_survival_refightalized:main 2t\nschedule function gm4_survival_refightalized:slow_clock 3t\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/main.mcfunction",
    "content": "schedule function gm4_survival_refightalized:main 16t\n\n# Inititate newly spawned mobs, as long as they are in the modify entity tag list\nexecute as @e[type=#gm4_survival_refightalized:modify,tag=!smithed.entity,tag=!gm4_sr_processed,nbt=!{PersistenceRequired:1b}] at @s run function gm4_survival_refightalized:mob/init/check_mob\nschedule function gm4_survival_refightalized:mob/init/stat/check_damage_cap_schedule 1t\n\n# phantoms drown under water\nexecute as @e[type=phantom,tag=!smithed.entity] at @s if block ~ ~ ~ #gm4:water run damage @s 2 drown\n\n# restore armor here as well as in player submain to make it happen every 8 ticks\nexecute as @a[gamemode=!spectator,tag=gm4_sr_armor.reduction,scores={gm4_sr_armor.reduction_timer=..0}] run function gm4_survival_refightalized:player/armor/recharge\n\n# tick down skeleton arrow fire delay\nexecute as @e[type=#gm4_survival_refightalized:can_fire_arrows,scores={gm4_sr_arrow.fire_delay_left=1..}] run function gm4_survival_refightalized:mob/process/arrow/clock_fire_delay\n\n# schedule player submain 8 ticks from now\nschedule function gm4_survival_refightalized:player_submain 8t\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/calc_difficulty_else.mcfunction",
    "content": "# calc base difficulty for this mob and any spawns that originate from it\n# @s = mobs that can be buffed\n# at @s\n# run from mob/init/check_mob\n\n# use world difficulty to set base difficulty 10/25/50\nexecute store result score $worlddiff gm4_sr_data run difficulty\nexecute if score $worlddiff gm4_sr_data matches 3 run scoreboard players set $difficulty_base gm4_sr_data 50\nexecute if score $worlddiff gm4_sr_data matches 2 run scoreboard players set $difficulty_base gm4_sr_data 25\nexecute unless score $worlddiff gm4_sr_data matches 2..3 run scoreboard players set $difficulty_base gm4_sr_data 10\n\n# add at random 20-80\nexecute store result score $random_add gm4_sr_data run random value 20..80\nscoreboard players operation $difficulty_base gm4_sr_data += $random_add gm4_sr_data\n\n# the rest of this function will also run for any additional spawns\nfunction gm4_survival_refightalized:mob/init/initiate\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/calc_difficulty_overworld.mcfunction",
    "content": "# calc base difficulty for this mob and any spawns that originate from it\n# @s = mobs that can be buffed\n# at @s\n# run from mob/init/check_mob\n\n# use world difficulty to set base difficulty 5/10/20\nexecute store result score $worlddiff gm4_sr_data run difficulty\nexecute if score $worlddiff gm4_sr_data matches 3 run scoreboard players set $difficulty_base gm4_sr_data 20\nexecute if score $worlddiff gm4_sr_data matches 2 run scoreboard players set $difficulty_base gm4_sr_data 10\nexecute unless score $worlddiff gm4_sr_data matches 2..3 run scoreboard players set $difficulty_base gm4_sr_data 5\n\n# not underground + raining +10\nexecute if predicate gm4_survival_refightalized:technical/raining run scoreboard players add $difficulty_base gm4_sr_data 10\n# not underground + thundering (will also add the raining modifier) +15\nexecute if predicate gm4_survival_refightalized:technical/thundering run scoreboard players add $difficulty_base gm4_sr_data 15\n# not underground + nighttime +0-20 based on moon phase (0 at new moon, 20 at full moon)\nscoreboard players operation $moon_diff_add gm4_sr_data = $moon gm4_sr_data\nscoreboard players operation $moon_diff_add gm4_sr_data *= #5 gm4_sr_data\nexecute unless predicate gm4_survival_refightalized:mob/underground if predicate gm4_survival_refightalized:technical/night_time run scoreboard players operation $difficulty_base gm4_sr_data += $moon_diff_add gm4_sr_data\n\n# get depth the mob spawned at based on motion_blocking_no_leaves, subtract 16 to shift curve\nexecute positioned over motion_blocking_no_leaves summon marker run function gm4_survival_refightalized:mob/init/get_world_surface\nexecute store result score $mob_depth gm4_sr_data run data get entity @s Pos[1]\nscoreboard players operation $mob_depth gm4_sr_data -= $world_surface gm4_sr_data\nscoreboard players remove $mob_depth gm4_sr_data 16\nscoreboard players operation $mob_depth gm4_sr_data > #-128 gm4_sr_data \nscoreboard players operation $mob_depth gm4_sr_data < #0 gm4_sr_data\n\n# underground quadratic increase +0-80 based on mob depth\nscoreboard players operation $mob_depth gm4_sr_data *= $mob_depth gm4_sr_data\nscoreboard players operation $mob_depth gm4_sr_data *= #5 gm4_sr_data\nscoreboard players operation $mob_depth gm4_sr_data /= #1024 gm4_sr_data\nexecute if predicate gm4_survival_refightalized:mob/underground if score $mob_depth gm4_sr_data matches 1.. run scoreboard players operation $difficulty_base gm4_sr_data += $mob_depth gm4_sr_data\n\n# the rest of this function will also run for any additional spawns\nfunction gm4_survival_refightalized:mob/init/initiate\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/check_mob.mcfunction",
    "content": "# initiate newly spawned mobs (mobs without any tags)\n# @s = mobs that can be buffed\n# at @s\n# run from main\n\n# pre-mark mob as processed if it spawned in the air (from a spawner), these do not get health changes or armor\n# mobs in the modify_in_air list are ignored here\nexecute if block ~ ~-0.01 ~ #gm4:no_collision run tag @s[type=!#gm4_survival_refightalized:modify_in_air] add gm4_sr_from_spawner\n\n# if the mob is riding another mob *do* modify them\nscoreboard players set $mounted gm4_sr_data 0\nexecute if entity @s[tag=gm4_sr_from_spawner] on vehicle run scoreboard players set $mounted gm4_sr_data 1\nexecute if score $mounted gm4_sr_data matches 1 run tag @s remove gm4_sr_from_spawner\n\n# initiate depending on dimension\nexecute if dimension minecraft:overworld run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld\nexecute unless dimension minecraft:overworld run function gm4_survival_refightalized:mob/init/calc_difficulty_else\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/get_world_surface.mcfunction",
    "content": "# get y level of world surface (motion blocking no leaves)\n# @s = marker\n# at @s\n# run from mob/init/calc_difficulty_overworld\n\nexecute store result score $world_surface gm4_sr_data run data get entity @s Pos[1]\nkill @s \n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/initiate.mcfunction",
    "content": "# initiate newly spawned mobs (mobs without any tags)\n# @s = mobs that can be buffed\n# at @s\n# run from mob/init/calc_difficulty_else\n# run from mob/init/calc_difficulty_overworld\n# run from here\n\n# get the highest armor tier from closest player\nscoreboard players operation $armor_tier gm4_sr_data = @p gm4_sr_armor.tier\n\n# get difficulty data in score\nscoreboard players operation $difficulty gm4_sr_data = $difficulty_base gm4_sr_data\nexecute store result score $difficulty_mult gm4_sr_data run random value -35..35\nexecute store result score $difficulty_flat gm4_sr_data run random value -15..15\n# function tag so other modules can modify the difficulty\nfunction #gm4_survival_refightalized:init_difficulty\n\n# apply a random difficulty_mult to nudge difficulty around\nscoreboard players operation $difficulty_add gm4_sr_data = $difficulty gm4_sr_data\nscoreboard players operation $difficulty_add gm4_sr_data *= $difficulty_mult gm4_sr_data\nscoreboard players operation $difficulty_add gm4_sr_data /= #100 gm4_sr_data\nscoreboard players operation $difficulty gm4_sr_data += $difficulty_add gm4_sr_data\n# apply a random difficulty_flat to nudge difficulty around\nscoreboard players operation $difficulty gm4_sr_data += $difficulty_flat gm4_sr_data\n\n# make sure difficulty is between 0 - 100\nscoreboard players operation $difficulty gm4_sr_data > #0 gm4_sr_data\nscoreboard players operation $difficulty gm4_sr_data < #100 gm4_sr_data\n\n# store difficulty on mob\nscoreboard players operation @s gm4_sr_mob.difficulty = $difficulty gm4_sr_data\n\n# reset scoreboard\nscoreboard players reset $mob_extras gm4_sr_data\n# initialize different mobs\nfunction gm4_survival_refightalized:mob/init/mob_type\n# allow expansions to alter mobs\nfunction #gm4_survival_refightalized:init_mob\n\n# remove the damage bonus from hard difficulty if needed\n# ( Hard normally adds a x1.5 damage multiplier, this counteracts that so mobs can be better tuned )\nexecute if score $worlddiff gm4_sr_data matches 3 run attribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.hard_difficulty_offset -0.333334 add_multiplied_total\n\n# set modifiers\nexecute unless score $removed_mob gm4_sr_data matches 1 run function gm4_survival_refightalized:mob/init/stat/prep\nscoreboard players reset $removed_mob gm4_sr_data\n\n# heal to max health\neffect give @s[type=#minecraft:undead] instant_damage 1 20 true\neffect give @s[type=!#minecraft:undead] instant_health 1 20 true\n\n# mark mob as initiated\ntag @s add gm4_sr_processed\n\n# process any spawned mobs\nexecute if score $mob_extras gm4_sr_data matches 1.. unless entity @s[tag=gm4_sr_extra_mob] as @e[type=#gm4_survival_refightalized:modify,tag=gm4_sr_extra_mob] at @s run function gm4_survival_refightalized:mob/init/initiate\ntag @s remove gm4_sr_extra_mob\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/cave_spider.mcfunction",
    "content": "# calculate modifiers for newly spawned cave spider\n# @s = cave spider\n# at @s\n# run from mob/init/mob_type\n\n## Stat Block (normal/hard diff)\n# health: 4 - 16\n# damage: 1.5 - 3\n# speed: 90 - 135%\n\n# base stat nerf\nattribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -8 add_value\nattribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -0.5 add_value\nattribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.1 add_multiplied_base\n\n# max stat buffs\nscoreboard players set $mob_health gm4_sr_data 12\nscoreboard players set $mob_damage gm4_sr_data 15\nscoreboard players set $mob_speed gm4_sr_data 45\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/creeper.mcfunction",
    "content": "# calculate modifiers for newly spawned creeper\n# @s = creeper\n# at @s\n# run from mob/init/mob_type\n\n## Stat Block (normal/hard diff)\n# health: 12 - 28\n# damage: explosion\n# speed: 90 - 130%\n\n# base stat nerf\nattribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -8 add_value\nattribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.1 add_value\n\n# max stat buffs\nscoreboard players set $mob_health gm4_sr_data 16\nscoreboard players set $mob_damage gm4_sr_data 0\nscoreboard players set $mob_speed gm4_sr_data 40\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/enderman.mcfunction",
    "content": "# calculate modifiers for newly spawned enderman\n# @s = enderman\n# at @s\n# run from mob/init/mob_type\n\n## Stat Block (normal/hard diff)\n# health: 40 - 55\n# damage: 5 - 9\n# speed: 90 - 125%\n\n# base stat nerf\nattribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -2 add_value\nattribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.1 add_multiplied_base\n\n# max stat buffs\nscoreboard players set $mob_health gm4_sr_data 15\nscoreboard players set $mob_damage gm4_sr_data 40\nscoreboard players set $mob_speed gm4_sr_data 35\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/phantom.mcfunction",
    "content": "# calculate modifiers for newly spawned phantom\n# @s = phantom\n# at @s\n# run from mob/init/mob_type\n\n## Stat Block (normal/hard diff)\n# health: 4 - 16\n# damage: 1.5 - 4\n# speed: 100%\n\n# base stat nerf\nattribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -16 add_value\nattribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -0.5 add_value\n\n# max stat buffs\nscoreboard players set $mob_health gm4_sr_data 12\nscoreboard players set $mob_damage gm4_sr_data 35\nscoreboard players set $mob_speed gm4_sr_data 0\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/piglin.mcfunction",
    "content": "# calculate modifiers for newly spawned piglin\n# @s = piglin\n# at @s\n# run from mob/init/mob_type\n\n## Stat Block (normal/hard diff)\n# health: 16 - 32\n# damage: 5 - 7 (melee), 2 - 4 (unarmed)\n# speed: 80 - 125%\n\n# base stat nerf\nattribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -3 add_value\nattribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.2 add_multiplied_base\n\n# max stat buffs\nscoreboard players set $mob_health gm4_sr_data 16\nscoreboard players set $mob_damage gm4_sr_data 20\nscoreboard players set $mob_speed gm4_sr_data 45\n# max damage mob is allowed to deal in one hit (to deal with weapons)\nscoreboard players set @s gm4_sr_mob.damage_cap 80\ntag @s add gm4_sr_check_damage_cap\n\n# set armor\nexecute if entity @s[tag=gm4_sr_from_spawner] run return 0\nscoreboard players set $override_equipment gm4_sr_data 0\nfunction #gm4_survival_refightalized:equip/piglin\nexecute if score $override_equipment gm4_sr_data matches 1 run return 1\nloot replace entity @s armor.feet loot gm4_survival_refightalized:mob/piglin/feet\nloot replace entity @s armor.legs loot gm4_survival_refightalized:mob/piglin/legs\nloot replace entity @s armor.chest loot gm4_survival_refightalized:mob/piglin/chest\nloot replace entity @s armor.head loot gm4_survival_refightalized:mob/piglin/head\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/piglin_brute.mcfunction",
    "content": "# calculate modifiers for newly spawned piglin brute\n# @s = piglin brute\n# at @s\n# run from mob/init/mob_type\n\n## Stat Block (normal/hard diff)\n# health: 30 - 50\n# damage: 6 - 8 (melee), 3 - 5 (unarmed)\n# speed: 75 - 105%\n\n# base stat nerf\nattribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -20 add_value\nattribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -4 add_value\nattribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.25 add_multiplied_base\n\n# max stat buffs\nscoreboard players set $mob_health gm4_sr_data 20\nscoreboard players set $mob_damage gm4_sr_data 20\nscoreboard players set $mob_speed gm4_sr_data 30\n# max damage mob is allowed to deal in one hit (to deal with weapons)\nscoreboard players set @s gm4_sr_mob.damage_cap 90\ntag @s add gm4_sr_check_damage_cap\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/silverfish.mcfunction",
    "content": "# calculate modifiers for newly spawned silverfish\n# @s = silverfish\n# at @s\n# run from mob/init/mob_type\n\n## Stat Block (normal/hard diff)\n# health: 1 - 6\n# damage: 1 - 2.5\n# speed: 80 - 120%\n\n# base stat nerf\nattribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -7 add_value\nattribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.2 add_multiplied_total\n\n# max stat buffs\nscoreboard players set $mob_health gm4_sr_data 5\nscoreboard players set $mob_damage gm4_sr_data 15\nscoreboard players set $mob_speed gm4_sr_data 40\n\n# size changes (not if from spawner)\nexecute if entity @s[tag=gm4_sr_from_spawner] run return 0\nexecute store result score $size_change gm4_sr_data run random value 1..100\n# normal (+20% speed)\nexecute if score $size_change gm4_sr_data matches ..50 run attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.random_scale 0.2 add_multiplied_total\n# medium (+0.25 scale)\nexecute if score $size_change gm4_sr_data matches 51..75 run attribute @s minecraft:scale modifier add gm4_survival_refightalized:stat_change.random_scale 0.25 add_value\n# large (+0.5 scale, +2 health)\nexecute if score $size_change gm4_sr_data matches 76..90 run attribute @s minecraft:scale modifier add gm4_survival_refightalized:stat_change.random_scale 0.5 add_value\nexecute if score $size_change gm4_sr_data matches 76..90 run attribute @s minecraft:max_health modifier add gm4_survival_refightalized:stat_change.random_scale 2 add_value\n# giant (+0.75 scale, +4 health, +1 damage)\nexecute if score $size_change gm4_sr_data matches 90..100 run attribute @s minecraft:scale modifier add gm4_survival_refightalized:stat_change.random_scale 0.75 add_value\nexecute if score $size_change gm4_sr_data matches 90..100 run attribute @s minecraft:max_health modifier add gm4_survival_refightalized:stat_change.random_scale 4 add_value\nexecute if score $size_change gm4_sr_data matches 90..100 run attribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.random_scale 1 add_value\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/skeleton.mcfunction",
    "content": "# calculate modifiers for newly spawned skeleton / stray / bogged\n# @s = skeleton / stray / bogged\n# at @s\n# run from mob/init/mob_type\n\n## Stat Block (normal/hard diff)\n# health: 9 - 22\n# damage: 2 - 6.5 (cap 7)\n# speed: 75 - 105%\n\n# base stat nerf\nattribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -11 add_value\nattribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.25 add_multiplied_base\n\n# max stat buffs\nscoreboard players set $mob_health gm4_sr_data 13\nscoreboard players set $mob_damage gm4_sr_data 45\nscoreboard players set $mob_speed gm4_sr_data 30\n# max damage mob is allowed to deal in one hit (to deal with weapons)\nscoreboard players set @s gm4_sr_mob.damage_cap 70\ntag @s add gm4_sr_check_damage_cap\n\n# arrow damage - only set if it was not preset at spawning\nexecute unless score @s gm4_sr_arrow.damage_change matches -2147483648..2147483647 store result score @s gm4_sr_arrow.damage_change run random value -4..4\nexecute unless score @s gm4_sr_arrow.fire_delay matches -2147483648..2147483647 store result score @s gm4_sr_arrow.fire_delay run random value 2..4\n\n# set weapon\nexecute if entity @s[tag=gm4_sr_from_spawner] run return 0\nloot replace entity @s[tag=!gm4_sr_melee_skeleton] weapon.mainhand loot gm4_survival_refightalized:mob/skeleton/weapon\n\n# set armor\nscoreboard players set $override_equipment gm4_sr_data 0\nfunction #gm4_survival_refightalized:equip/skeleton\nexecute if score $override_equipment gm4_sr_data matches 1 run return 1\nloot replace entity @s armor.feet loot gm4_survival_refightalized:mob/generic/feet\nloot replace entity @s armor.legs loot gm4_survival_refightalized:mob/generic/legs\nloot replace entity @s armor.chest loot gm4_survival_refightalized:mob/generic/chest\nloot replace entity @s armor.head loot gm4_survival_refightalized:mob/generic/head\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/spider.mcfunction",
    "content": "# calculate modifiers for newly spawned spider\n# @s = spider\n# at @s\n# run from mob/init/mob_type\n\n## Stat Block (normal/hard diff)\n# health: 12 - 30\n# damage: 2 - 5.5\n# speed: 95 - 145%\n\n# base stat nerf\nattribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -4 add_value\nattribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.05 add_multiplied_base\n\n# max stat buffs\nscoreboard players set $mob_health gm4_sr_data 18\nscoreboard players set $mob_damage gm4_sr_data 35\nscoreboard players set $mob_speed gm4_sr_data 50\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/wither_skeleton.mcfunction",
    "content": "# calculate modifiers for newly spawned wither skeleton\n# @s = wither skeleton\n# at @s\n# run from mob/init/mob_type\n\n## Stat Block (normal/hard diff)\n# health: 22 - 36\n# damage: 7.5 - 8.5 (armed), 1.5 - 2.5 (unarmed)\n# speed: 95 - 120%\n\n# base stat nerf\nattribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_buff 2 add_value\nattribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -0.5 add_value\nattribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.05 add_multiplied_base\n\n# max stat buffs\nscoreboard players set $mob_health gm4_sr_data 14\nscoreboard players set $mob_damage gm4_sr_data 10\nscoreboard players set $mob_speed gm4_sr_data 25\n# max damage mob is allowed to deal in one hit (to deal with weapons)\nscoreboard players set @s gm4_sr_mob.damage_cap 95\ntag @s add gm4_sr_check_damage_cap\n\n# knockback resistance\nattribute @s minecraft:knockback_resistance modifier add gm4_survival_refightalized:stat_change.kb_resist 0.666 add_value\n\n# shoot arrows slower and weaker\nscoreboard players set @s gm4_sr_arrow.fire_delay 4\nexecute store result score @s gm4_sr_arrow.damage_change run random value -6..0\n\n# set weapon\nexecute if entity @s[tag=gm4_sr_from_spawner] run return 0\nloot replace entity @s weapon.mainhand loot gm4_survival_refightalized:mob/wither_skeleton/weapon\n\n# withering arrow if a bow is held\nexecute if items entity @s weapon.mainhand bow run loot replace entity @s weapon.offhand loot gm4_survival_refightalized:mob/wither_skeleton/arrow\n\n# set armor\nscoreboard players set $override_equipment gm4_sr_data 0\nfunction #gm4_survival_refightalized:equip/wither_skeleton\nexecute if score $override_equipment gm4_sr_data matches 1 run return 1\nloot replace entity @s armor.feet loot gm4_survival_refightalized:mob/wither_skeleton/feet\nloot replace entity @s armor.legs loot gm4_survival_refightalized:mob/wither_skeleton/legs\nloot replace entity @s armor.chest loot gm4_survival_refightalized:mob/wither_skeleton/chest\nloot replace entity @s armor.head loot gm4_survival_refightalized:mob/wither_skeleton/head\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/zombie.mcfunction",
    "content": "# calculate modifiers for newly spawned zombie / zombie villager / husk / drowned\n# @s = zombie / zombie villager / husk / drowned\n# at @s\n# run from mob/init/mob_type\n\n## Stat Block (normal/hard diff)\n# health: 18 - 36\n# damage: 3 - 6.5 (cap 8) | trident: 4.5 - 9.0\n# speed: 80 - 125%\n\n# base stat nerf\nattribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -2 add_value\nattribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.2 add_multiplied_base\n\n# max stat buffs\nscoreboard players set $mob_health gm4_sr_data 18\nscoreboard players set $mob_damage gm4_sr_data 35\nscoreboard players set $mob_speed gm4_sr_data 45\n# max damage mob is allowed to deal in one hit (to deal with weapons)\nscoreboard players set @s gm4_sr_mob.damage_cap 80\ntag @s add gm4_sr_check_damage_cap\n\n# add fire delay and damage variance to drowned for tridents\nexecute unless score @s[type=drowned] gm4_sr_arrow.damage_change matches -2147483648..2147483647 store result score @s gm4_sr_arrow.damage_change run random value -5..-2\nexecute unless score @s[type=drowned] gm4_sr_arrow.fire_delay matches -2147483648..2147483647 store result score @s gm4_sr_arrow.fire_delay run random value 3..5\n\n# remove leader bonus from zombies\nexecute if data entity @s attributes[{id:\"minecraft:max_health\"}].modifiers[{id:\"minecraft:leader_zombie_bonus\"}] run attribute @s minecraft:max_health modifier remove minecraft:leader_zombie_bonus\n\n# remove baby zombies except chicken jockeys (will be turned into Elites with Monsters Unbound)\nscoreboard players set $was_baby gm4_sr_data 0\nexecute if predicate {condition:\"all_of\",terms:[{condition:\"entity_properties\",entity:\"this\",predicate:{flags:{is_baby:1b}}},{condition:\"inverted\",term:{condition:\"entity_properties\",entity:\"this\",predicate:{vehicle:{}}}}]} store success score $was_baby gm4_sr_data run data modify entity @s IsBaby set value 0b\nexecute if score $was_baby gm4_sr_data matches 1 run tag @s add gm4_sr_was_baby\n\n# set armor\nexecute if entity @s[tag=gm4_sr_from_spawner] run return 0\nscoreboard players set $override_equipment gm4_sr_data 0\nfunction #gm4_survival_refightalized:equip/zombie\nexecute if score $override_equipment gm4_sr_data matches 1 run return 1\nloot replace entity @s armor.feet loot gm4_survival_refightalized:mob/generic/feet\nloot replace entity @s armor.legs loot gm4_survival_refightalized:mob/generic/legs\nloot replace entity @s armor.chest loot gm4_survival_refightalized:mob/generic/chest\nloot replace entity @s armor.head loot gm4_survival_refightalized:mob/generic/head\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/zombified_piglin.mcfunction",
    "content": "# calculate modifiers for newly spawned zombified piglin\n# @s = zombified piglin\n# at @s\n# run from mob/init/mob_type\n\n## Stat Block (normal/hard diff)\n# health: 14 - 24\n# damage: 5.5 - 7 (armed), 2.5 - 4 (unarmed)\n# speed: 90 - 140%\n\n# base stat nerf\nattribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -6 add_value\nattribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -2.5 add_value\nattribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.1 add_multiplied_base\n\n# max stat buffs\nscoreboard players set $mob_health gm4_sr_data 22\nscoreboard players set $mob_damage gm4_sr_data 15\nscoreboard players set $mob_speed gm4_sr_data 50\n# max damage mob is allowed to deal in one hit (to deal with weapons)\nscoreboard players set @s gm4_sr_mob.damage_cap 60\ntag @s add gm4_sr_check_damage_cap\n\n# remove zombie leader bonus\nexecute if data entity @s attributes[{id:\"minecraft:max_health\"}].modifiers[{id:\"minecraft:leader_zombie_bonus\"}] run attribute @s minecraft:max_health modifier remove minecraft:leader_zombie_bonus\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type.mcfunction",
    "content": "# check what mob is being processed\n# @s = mobs that can be buffed\n# at @s\n# run from mob/init/initiate\n\n# these are reset to 0, otherwise if the spawn function fails it can cause a crash due constantly increasing scores\nscoreboard players set $mob_health gm4_sr_data 0\nscoreboard players set $mob_damage gm4_sr_data 0\nscoreboard players set $mob_speed gm4_sr_data 0\n\n# zombie, zombie_villager, husk, drowned\nexecute if entity @s[type=#gm4_survival_refightalized:zombie_types] run return run function gm4_survival_refightalized:mob/init/mob_type/zombie\n# skeleton, bogged, stray\nexecute if entity @s[type=#gm4_survival_refightalized:skeleton_types,type=!wither_skeleton] run return run function gm4_survival_refightalized:mob/init/mob_type/skeleton\nexecute if entity @s[type=spider] run return run function gm4_survival_refightalized:mob/init/mob_type/spider\nexecute if entity @s[type=creeper] run return run function gm4_survival_refightalized:mob/init/mob_type/creeper\nexecute if entity @s[type=cave_spider] run return run function gm4_survival_refightalized:mob/init/mob_type/spider\nexecute if entity @s[type=enderman] run return run function gm4_survival_refightalized:mob/init/mob_type/enderman\nexecute if entity @s[type=wither_skeleton] run return run function gm4_survival_refightalized:mob/init/mob_type/wither_skeleton\nexecute if entity @s[type=phantom] run return run function gm4_survival_refightalized:mob/init/mob_type/phantom\nexecute if entity @s[type=piglin] run return run function gm4_survival_refightalized:mob/init/mob_type/piglin\nexecute if entity @s[type=piglin_brute] run return run function gm4_survival_refightalized:mob/init/mob_type/piglin_brute\nexecute if entity @s[type=zombified_piglin] run return run function gm4_survival_refightalized:mob/init/mob_type/zombified_piglin\nexecute if entity @s[type=silverfish] run return run function gm4_survival_refightalized:mob/init/mob_type/silverfish\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/stat/check_damage_cap.mcfunction",
    "content": "# cap damage mobs can do\n# @s = mob with gm4_sr_check_damage_cap tag\n# at unspecified\n# run from mob/init/modifier/check_damage_cap_schedule\n\ntag @s remove gm4_sr_check_damage_cap\n\n# check if damage did not exceed the cap, otherwise reduce to get back to it\nexecute if score $worlddiff gm4_sr_data matches ..2 store result score $mob_total_damage gm4_sr_data run attribute @s minecraft:attack_damage get 10\nexecute if score $worlddiff gm4_sr_data matches 3 store result score $mob_total_damage gm4_sr_data run attribute @s minecraft:attack_damage get 15\nexecute store result storage gm4_survival_refightalized:temp picked_stat.damage_capped float 0.1 run scoreboard players operation @s gm4_sr_mob.damage_cap -= $mob_total_damage gm4_sr_data\nexecute if score @s gm4_sr_mob.damage_cap matches ..-1 run function gm4_survival_refightalized:mob/init/stat/eval_damage_cap with storage gm4_survival_refightalized:temp picked_stat\ndata remove storage gm4_survival_refightalized:temp picked_stat\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/stat/check_damage_cap_schedule.mcfunction",
    "content": "# schedule damage cap check 1t later to allow mainhand changes to apply\n# @s = unspecified\n# at unspecified\n# schedule from main\n\nexecute as @e[tag=gm4_sr_check_damage_cap] run function gm4_survival_refightalized:mob/init/stat/check_damage_cap\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/stat/eval.mcfunction",
    "content": "# evaluate stats\n# @s = mobs that can be buffed\n# at @s\n# run from mob/init/modifier/stat/prep\n\n$execute if score $mob_health gm4_sr_data matches 1.. run attribute @s minecraft:max_health modifier add gm4_survival_refightalized:stat_change.difficulty_buff $(health) add_value\n$execute if score $mob_damage gm4_sr_data matches 1.. run attribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.difficulty_buff $(damage) add_value\n$execute if score $mob_speed gm4_sr_data matches 1.. run attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.difficulty_buff $(speed) add_multiplied_base\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/stat/eval_damage_cap.mcfunction",
    "content": "# cap damage to this mobs cap\n# @s = mob with gm4_sr_check_damage_cap tag\n# at unspecified\n# run from mob/init/modifier/check_damage_cap\n\n$attribute @s attack_damage modifier add gm4_survival_refightalized:stat_change.damage_cap_reduction $(damage_capped) add_value\ntag @s add gm4_sr_mob.damage_capped\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/stat/prep.mcfunction",
    "content": "# randomize mob stats\n# @s = mobs that can be buffed\n# at @s\n# run from mob/init/initiate\n\n# remove bonus health if enderman spawned in end\nexecute if entity @s[type=enderman] if dimension the_end run scoreboard players set $mob_health gm4_sr_data 0\n# remove bonus damage if melee weapon is held\nexecute if predicate gm4_survival_refightalized:mob/has_weapon run scoreboard players set $mob_damage gm4_sr_data 0\n\n# randomise stats - set values based on:\n# HEALTH = 0.5*score + BINOMDIST(n=0.5*score,p=0.5)\nexecute if score $mob_health gm4_sr_data matches 1.. store result score $mob_health gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:randomize_stats/health\n# DAMAGE = 0.15*score + RANDOM(0 - 0.35*score) + BINOMDIST(n=0.5*score,p=0.5)\nexecute if score $mob_damage gm4_sr_data matches 1.. store result score $mob_damage gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:randomize_stats/damage\n# SPEED = RANDOM(0 - 0.5*score) + BINOMDIST(n=0.5*score,p=0.5)\nexecute if score $mob_speed gm4_sr_data matches 1.. store result score $mob_speed gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:randomize_stats/speed\nexecute positioned ~ -4064 ~ run kill @e[type=item,distance=..1]\n\n# store modifiers modified by difficulty\nexecute if score $difficulty gm4_sr_data matches 101.. run say problem difficuly\n\nexecute store result storage gm4_survival_refightalized:temp picked_stat.health float 0.01 run scoreboard players operation $mob_health gm4_sr_data *= $difficulty gm4_sr_data\nexecute store result storage gm4_survival_refightalized:temp picked_stat.damage float 0.001 run scoreboard players operation $mob_damage gm4_sr_data *= $difficulty gm4_sr_data\nexecute store result storage gm4_survival_refightalized:temp picked_stat.speed float 0.0001 run scoreboard players operation $mob_speed gm4_sr_data *= $difficulty gm4_sr_data\n\n# evaluate stats and add modifiers to mob\nfunction gm4_survival_refightalized:mob/init/stat/eval with storage gm4_survival_refightalized:temp picked_stat\ndata remove storage gm4_survival_refightalized:temp picked_stat\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/process/arrow/clock_fire_delay.mcfunction",
    "content": "# tick down arrow fire delay\n# @s = entity that shot an arrow\n# at unspecified\n# run from main\n\nscoreboard players remove @s gm4_sr_arrow.fire_delay_left 1\nattribute @s[scores={gm4_sr_arrow.fire_delay_left=0}] minecraft:follow_range modifier remove gm4_survival_refightalized:arrow_fire_delay\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/process/arrow/run.mcfunction",
    "content": "# modify shot arrows\n# @s = arrow origin\n# at unspecified\n# run from check_arrow\n\n# if origin is a player run function tag for expansions\nexecute if entity @s[type=player] run return run function #gm4_survival_refightalized:player_fired_arrow\n\n# | Non-players:\n# add damage to arrow\nscoreboard players operation $arrow_damage_change gm4_sr_data = @s gm4_sr_arrow.damage_change\nscoreboard players operation $trident_damage_change gm4_sr_data = @s gm4_sr_arrow.damage_change\n# add fire delay\n# ( A modifier that removes all follow_range is added to stop the entity from firing more arrows)\nscoreboard players operation @s gm4_sr_arrow.fire_delay_left = @s gm4_sr_arrow.fire_delay\nattribute @s[scores={gm4_sr_arrow.fire_delay_left=1..}] minecraft:follow_range modifier add gm4_survival_refightalized:arrow_fire_delay -1 add_multiplied_total\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/absorption/eval_reduction.mcfunction",
    "content": "# reduce absorption hearts on player based on their score\n# @s = damaged player\n# at @s\n# run from player/damage/calculate_damage\n\n$attribute @s max_absorption modifier add gm4_sr_absorption_reduced -$(absorption_reduction) add_value\n# restore absorption cap after 4 ticks to let it remove the health properly\nscoreboard players set @s gm4_sr_health.absorption_reduction_timer 3\nschedule function gm4_survival_refightalized:player/absorption/restore_clock 1t\n\nscoreboard players reset $damage_absorption gm4_sr_data\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/absorption/restore_clock.mcfunction",
    "content": "# restore absorption hearts cap\n# @s = unspecified\n# at unspecified\n# schedule from player/absorption/eval_reduction\n# schedule from here\n\nexecute as @a[scores={gm4_sr_health.absorption_reduction_timer=1}] run attribute @s minecraft:max_absorption modifier remove gm4_sr_absorption_reduced\nscoreboard players remove @a[scores={gm4_sr_health.absorption_reduction_timer=1..}] gm4_sr_health.absorption_reduction_timer 1\n\nexecute if entity @a[scores={gm4_sr_health.absorption_reduction_timer=1..}] run schedule function gm4_survival_refightalized:player/absorption/restore_clock 1t\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/break.mcfunction",
    "content": "# armor is reduced to 0\n# @s = damaged player\n# at @s\n# run from player/damage/calculate_damage\n\nplaysound minecraft:entity.armor_stand.break player @a[distance=..8] ~ ~ ~ 1 0 1\nplaysound minecraft:entity.armor_stand.break player @s ~ ~ ~ 1 0.75 1\nfunction gm4_survival_refightalized:player/resistance/remove\nfunction #gm4_survival_refightalized:armor_break\n\n# set damage taken to the amount of armor remaining so it gets removed\nscoreboard players operation $total_armor_damage gm4_sr_data = $player_armor gm4_sr_data\nscoreboard players operation $damage_armor gm4_sr_data < $player_armor gm4_sr_data\n\n# reduce damage by players max armor\nscoreboard players operation $armor_break_damage_reduction gm4_sr_data = @s gm4_sr_armor.reduction\nscoreboard players operation $armor_break_damage_reduction gm4_sr_data += $player_armor gm4_sr_data\nscoreboard players operation $damage_total gm4_sr_data -= $armor_break_damage_reduction gm4_sr_data\nscoreboard players operation $damage_total gm4_sr_data > $player_armor gm4_sr_data\ntellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\"Armor Break: \",\"color\":\"gray\"},{\"text\":\"-\",\"color\":\"white\"},{\"score\":{\"name\":\"$armor_break_damage_reduction\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\" = \",\"color\":\"gray\"},{\"score\":{\"name\":\"$damage_total\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"}]\n\n# increase the armor recharge cooldown\nscoreboard players operation $set gm4_sr_armor.reduction_timer += $armor_recharge_timer gm4_sr_config\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/check.mcfunction",
    "content": "# apply durability damage on armor item\n# @s = damaged player\n# at @s\n# run from player/damage/run\n\n# get item data\nitem replace block 29999998 1 7134 container.0 from entity @s armor.head\nitem replace block 29999998 1 7134 container.1 from entity @s armor.chest\nitem replace block 29999998 1 7134 container.2 from entity @s armor.legs\nitem replace block 29999998 1 7134 container.3 from entity @s armor.feet\ndata modify storage gm4_survival_refightalized:temp Items set from block 29999998 1 7134 Items\n\nexecute if items block 29999998 1 7134 container.0 * run function gm4_survival_refightalized:player/armor/durability/head/run\nexecute if items block 29999998 1 7134 container.1 * run function gm4_survival_refightalized:player/armor/durability/chest/run\nexecute if items block 29999998 1 7134 container.2 * run function gm4_survival_refightalized:player/armor/durability/legs/run\nexecute if items block 29999998 1 7134 container.3 * run function gm4_survival_refightalized:player/armor/durability/feet/run\n\n# stopsounds\nstopsound @s player item.armor.equip_chain\nstopsound @s player item.armor.equip_diamond\nstopsound @s player item.armor.equip_generic\nstopsound @s player item.armor.equip_gold\nstopsound @s player item.armor.equip_iron\nstopsound @s player item.armor.equip_leather\nstopsound @s player item.armor.equip_netherite\nstopsound @s player item.armor.equip_turtle\n\n# cleanup\ndata remove block 29999998 1 7134 Items\ndata remove storage gm4_survival_refightalized:temp Items\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/chest/break.mcfunction",
    "content": "# set damage on armor item\n# @s = player wearing the item\n# at unspecified\n# run from player/armor/durability/chest/run\n\nplaysound minecraft:entity.item.break player @s ~ ~ ~ 1 1\nitem replace entity @s armor.chest with air\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/chest/eval.mcfunction",
    "content": "# set damage on armor item\n# @s = player wearing the item\n# at unspecified\n# run from player/armor/durability/chest/run\n\n$item modify entity @s armor.chest {function:\"minecraft:set_components\",components:{\"minecraft:damage\":$(damage)}}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/chest/find_durability.mcfunction",
    "content": "# set damage on armor item\n# @s = player wearing the item\n# at unspecified\n# run from player/armor/durability/chest/run\n\nexecute if items block 29999998 1 7134 container.1 leather_chestplate run return 80\nexecute if items block 29999998 1 7134 container.1 golden_chestplate run return 112\nexecute if items block 29999998 1 7134 container.1 copper_chestplate run return 176\nexecute if items block 29999998 1 7134 container.1 chainmail_chestplate run return 240\nexecute if items block 29999998 1 7134 container.1 iron_chestplate run return 240\nexecute if items block 29999998 1 7134 container.1 diamond_chestplate run return 528\nexecute if items block 29999998 1 7134 container.1 netherite_chestplate run return 592\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/chest/run.mcfunction",
    "content": "# apply durability damage on armor item\n# @s = damaged player\n# at @s\n# run from player/armor/durability/check\n\n# if unbreakable don't run\nexecute if data storage gm4_survival_refightalized:temp Items[{Slot:1b}].components.\"minecraft:unbreakable\" run return 0\n\n# calculate incoming damage based on unbreaking\nexecute store result score $unbreaking_level gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components.\"minecraft:enchantments\".\"minecraft:unbreaking\"\nscoreboard players add $unbreaking_level gm4_sr_data 1\nscoreboard players set $damage_chance gm4_sr_data 100\nscoreboard players operation $damage_chance gm4_sr_data /= $unbreaking_level gm4_sr_data\nscoreboard players set $damage_opportunities gm4_sr_data 1\nexecute store result score $incoming_damage gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:technical/roll_damage\nexecute positioned ~ -4064 ~ run kill @e[type=item,distance=..1]\n\n# if no damage is going to be applied cancel function\nexecute unless score $incoming_damage gm4_sr_data matches 1.. run return 0\n\n# find the total durability of this item\nexecute store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components.\"minecraft:max_damage\"\nexecute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components.\"minecraft:custom_data\".gm4_augmented_armor.durability\nexecute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run function gm4_survival_refightalized:player/armor/durability/chest/find_durability\nexecute if score $total_durability gm4_sr_data matches 0 run return 0\n\n# add incoming damage to the current damage\nexecute store result score $current_damage gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components.\"minecraft:damage\"\nscoreboard players operation $current_damage gm4_sr_data += $incoming_damage gm4_sr_data\nexecute if score $current_damage gm4_sr_data > $total_durability gm4_sr_data run return run function gm4_survival_refightalized:player/armor/durability/chest/break\n\n# apply to armor\nexecute store result storage gm4_survival_refightalized:temp set.damage int 1 run scoreboard players get $current_damage gm4_sr_data\nfunction gm4_survival_refightalized:player/armor/durability/chest/eval with storage gm4_survival_refightalized:temp set\n\n# cleanup\ndata remove storage gm4_survival_refightalized:temp set\nscoreboard players reset $total_durability gm4_sr_data\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/feet/break.mcfunction",
    "content": "# set damage on armor item\n# @s = player wearing the item\n# at unspecified\n# run from player/armor/durability/feet/run\n\nplaysound minecraft:entity.item.break player @s ~ ~ ~ 1 1\nitem replace entity @s armor.feet with air\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/feet/eval.mcfunction",
    "content": "# set damage on armor item\n# @s = player wearing the item\n# at unspecified\n# run from player/armor/durability/feet/run\n\n$item modify entity @s armor.feet {function:\"minecraft:set_components\",components:{\"minecraft:damage\":$(damage)}}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/feet/find_durability.mcfunction",
    "content": "# set damage on armor item\n# @s = player wearing the item\n# at unspecified\n# run from player/armor/durability/feet/run\n\nexecute if items block 29999998 1 7134 container.3 leather_boots run return 65\nexecute if items block 29999998 1 7134 container.3 golden_boots run return 91\nexecute if items block 29999998 1 7134 container.3 copper_boots run return 143\nexecute if items block 29999998 1 7134 container.3 chainmail_boots run return 195\nexecute if items block 29999998 1 7134 container.3 iron_boots run return 195\nexecute if items block 29999998 1 7134 container.3 diamond_boots run return 429\nexecute if items block 29999998 1 7134 container.3 netherite_boots run return 481\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/feet/run.mcfunction",
    "content": "# apply durability damage on armor item\n# @s = damaged player\n# at @s\n# run from player/armor/durability/check\n\n# if unbreakable don't run\nexecute if data storage gm4_survival_refightalized:temp Items[{Slot:3b}].components.\"minecraft:unbreakable\" run return 0\n\n# calculate incoming damage based on unbreaking\nexecute store result score $unbreaking_level gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components.\"minecraft:enchantments\".\"minecraft:unbreaking\"\nscoreboard players add $unbreaking_level gm4_sr_data 1\nscoreboard players set $damage_chance gm4_sr_data 100\nscoreboard players operation $damage_chance gm4_sr_data /= $unbreaking_level gm4_sr_data\nscoreboard players set $damage_opportunities gm4_sr_data 1\nexecute store result score $incoming_damage gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:technical/roll_damage\nexecute positioned ~ -4064 ~ run kill @e[type=item,distance=..1]\n\n# if no damage is going to be applied cancel function\nexecute unless score $incoming_damage gm4_sr_data matches 1.. run return 0\n\n# find the total durability of this item\nexecute store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components.\"minecraft:max_damage\"\nexecute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components.\"minecraft:custom_data\".gm4_augmented_armor.durability\nexecute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run function gm4_survival_refightalized:player/armor/durability/feet/find_durability\nexecute if score $total_durability gm4_sr_data matches 0 run return 0\n\n# add incoming damage to the current damage\nexecute store result score $current_damage gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components.\"minecraft:damage\"\nscoreboard players operation $current_damage gm4_sr_data += $incoming_damage gm4_sr_data\nexecute if score $current_damage gm4_sr_data > $total_durability gm4_sr_data run return run function gm4_survival_refightalized:player/armor/durability/feet/break\n\n# apply to armor\nexecute store result storage gm4_survival_refightalized:temp set.damage int 1 run scoreboard players get $current_damage gm4_sr_data\nfunction gm4_survival_refightalized:player/armor/durability/feet/eval with storage gm4_survival_refightalized:temp set\n\n# cleanup\ndata remove storage gm4_survival_refightalized:temp set\nscoreboard players reset $total_durability gm4_sr_data\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/head/break.mcfunction",
    "content": "# set damage on armor item\n# @s = player wearing the item\n# at unspecified\n# run from player/armor/durability/head/run\n\nplaysound minecraft:entity.item.break player @s ~ ~ ~ 1 1\nitem replace entity @s armor.head with air\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/head/eval.mcfunction",
    "content": "# set damage on armor item\n# @s = player wearing the item\n# at unspecified\n# run from player/armor/durability/head/run\n\n$item modify entity @s armor.head {function:\"minecraft:set_components\",components:{\"minecraft:damage\":$(damage)}}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/head/find_durability.mcfunction",
    "content": "# set damage on armor item\n# @s = player wearing the item\n# at unspecified\n# run from player/armor/durability/head/run\n\nexecute if items block 29999998 1 7134 container.0 leather_helmet run return 55\nexecute if items block 29999998 1 7134 container.0 golden_helmet run return 77\nexecute if items block 29999998 1 7134 container.0 copper_helmet run return 121\nexecute if items block 29999998 1 7134 container.0 chainmail_helmet run return 165\nexecute if items block 29999998 1 7134 container.0 iron_helmet run return 165\nexecute if items block 29999998 1 7134 container.0 diamond_helmet run return 363\nexecute if items block 29999998 1 7134 container.0 netherite_helmet run return 407\nexecute if items block 29999998 1 7134 container.0 turtle_helmet run return 275\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/head/run.mcfunction",
    "content": "# apply durability damage on armor item\n# @s = damaged player\n# at @s\n# run from player/armor/durability/check\n\n# if unbreakable don't run\nexecute if data storage gm4_survival_refightalized:temp Items[{Slot:0b}].components.\"minecraft:unbreakable\" run return 0\n\n# calculate incoming damage based on unbreaking\nexecute store result score $unbreaking_level gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components.\"minecraft:enchantments\".\"minecraft:unbreaking\"\nscoreboard players add $unbreaking_level gm4_sr_data 1\nscoreboard players set $damage_chance gm4_sr_data 100\nscoreboard players operation $damage_chance gm4_sr_data /= $unbreaking_level gm4_sr_data\nscoreboard players set $damage_opportunities gm4_sr_data 1\nexecute store result score $incoming_damage gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:technical/roll_damage\nexecute positioned ~ -4064 ~ run kill @e[type=item,distance=..1]\n\n# if no damage is going to be applied cancel function\nexecute unless score $incoming_damage gm4_sr_data matches 1.. run return 0\n\n# find the total durability of this item\nexecute store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components.\"minecraft:max_damage\"\nexecute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components.\"minecraft:custom_data\".gm4_augmented_armor.durability\nexecute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run function gm4_survival_refightalized:player/armor/durability/head/find_durability\nexecute if score $total_durability gm4_sr_data matches 0 run return 0\n\n# add incoming damage to the current damage\nexecute store result score $current_damage gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components.\"minecraft:damage\"\nscoreboard players operation $current_damage gm4_sr_data += $incoming_damage gm4_sr_data\nexecute if score $current_damage gm4_sr_data > $total_durability gm4_sr_data run return run function gm4_survival_refightalized:player/armor/durability/head/break\n\n# apply to armor\nexecute store result storage gm4_survival_refightalized:temp set.damage int 1 run scoreboard players get $current_damage gm4_sr_data\nfunction gm4_survival_refightalized:player/armor/durability/head/eval with storage gm4_survival_refightalized:temp set\n\n# cleanup\ndata remove storage gm4_survival_refightalized:temp set\nscoreboard players reset $total_durability gm4_sr_data\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/legs/break.mcfunction",
    "content": "# set damage on armor item\n# @s = player wearing the item\n# at unspecified\n# run from player/armor/durability/legs/run\n\nplaysound minecraft:entity.item.break player @s ~ ~ ~ 1 1\nitem replace entity @s armor.legs with air\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/legs/eval.mcfunction",
    "content": "# set damage on armor item\n# @s = player wearing the item\n# at unspecified\n# run from player/armor/durability/legs/run\n\n$item modify entity @s armor.legs {function:\"minecraft:set_components\",components:{\"minecraft:damage\":$(damage)}}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/legs/find_durability.mcfunction",
    "content": "# set damage on armor item\n# @s = player wearing the item\n# at unspecified\n# run from player/armor/durability/legs/run\n\nexecute if items block 29999998 1 7134 container.2 leather_leggings run return 75\nexecute if items block 29999998 1 7134 container.2 golden_leggings run return 105\nexecute if items block 29999998 1 7134 container.2 copper_leggings run return 165\nexecute if items block 29999998 1 7134 container.2 chainmail_leggings run return 225\nexecute if items block 29999998 1 7134 container.2 iron_leggings run return 225\nexecute if items block 29999998 1 7134 container.2 diamond_leggings run return 495\nexecute if items block 29999998 1 7134 container.2 netherite_leggings run return 555\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/legs/run.mcfunction",
    "content": "# apply durability damage on armor item\n# @s = damaged player\n# at @s\n# run from player/armor/durability/check\n\n# if unbreakable don't run\nexecute if data storage gm4_survival_refightalized:temp Items[{Slot:2b}].components.\"minecraft:unbreakable\" run return 0\n\n# calculate incoming damage based on unbreaking\nexecute store result score $unbreaking_level gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components.\"minecraft:enchantments\".\"minecraft:unbreaking\"\nscoreboard players add $unbreaking_level gm4_sr_data 1\nscoreboard players set $damage_chance gm4_sr_data 100\nscoreboard players operation $damage_chance gm4_sr_data /= $unbreaking_level gm4_sr_data\nscoreboard players set $damage_opportunities gm4_sr_data 1\nexecute store result score $incoming_damage gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:technical/roll_damage\nexecute positioned ~ -4064 ~ run kill @e[type=item,distance=..1]\n\n# if no damage is going to be applied cancel function\nexecute unless score $incoming_damage gm4_sr_data matches 1.. run return 0\n\n# find the total durability of this item\nexecute store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components.\"minecraft:max_damage\"\nexecute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components.\"minecraft:custom_data\".gm4_augmented_armor.durability\nexecute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run function gm4_survival_refightalized:player/armor/durability/legs/find_durability\nexecute if score $total_durability gm4_sr_data matches 0 run return 0\n\n# add incoming damage to the current damage\nexecute store result score $current_damage gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components.\"minecraft:damage\"\nscoreboard players operation $current_damage gm4_sr_data += $incoming_damage gm4_sr_data\nexecute if score $current_damage gm4_sr_data > $total_durability gm4_sr_data run return run function gm4_survival_refightalized:player/armor/durability/legs/break\n\n# apply to armor\nexecute store result storage gm4_survival_refightalized:temp set.damage int 1 run scoreboard players get $current_damage gm4_sr_data\nfunction gm4_survival_refightalized:player/armor/durability/legs/eval with storage gm4_survival_refightalized:temp set\n\n# cleanup\ndata remove storage gm4_survival_refightalized:temp set\nscoreboard players reset $total_durability gm4_sr_data\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/eval_reduction.mcfunction",
    "content": "# reduce armor on player based on their score\n# @s = damaged player\n# at @s\n# run from player/armor/recharge\n# run from player/damage/calculate_damage\n\nattribute @s minecraft:armor modifier remove gm4_survival_refightalized:armor_reduced\n$attribute @s armor modifier add gm4_survival_refightalized:armor_reduced -$(armor_reduction) add_value\ntag @s add gm4_sr_armor.reduction\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/recharge.mcfunction",
    "content": "# regain armor for this player\n# @s = player with reduced armor\n# at unspecified\n# run from player/armor/timer\n\nscoreboard players remove @s[scores={gm4_sr_armor.reduction=1..}] gm4_sr_armor.reduction 10\nscoreboard players operation @s gm4_sr_armor.reduction > #0 gm4_sr_data\n\n# if no armor reduction is left don't apply armor\nattribute @s[scores={gm4_sr_armor.reduction=..0}] minecraft:armor modifier remove gm4_survival_refightalized:armor_reduced\nexecute if entity @s[scores={gm4_sr_armor.reduction=..0}] run return run tag @s remove gm4_sr_armor.reduction\n\nexecute store result storage gm4_survival_refightalized:temp set.armor_reduction float 0.1 run scoreboard players get @s gm4_sr_armor.reduction\nfunction gm4_survival_refightalized:player/armor/eval_reduction with storage gm4_survival_refightalized:temp set\ndata remove storage gm4_survival_refightalized:temp set\n\n# reapply resistance\neffect give @s resistance 2 255 true\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/timer.mcfunction",
    "content": "# process players that have their armor reduced\n# @s = player\n# at unspecified\n# run from player/player_submain\n\n# gm4_sr_stat.armor_recharge_change is normally 0, but can be changed by expansions\nscoreboard players set @s gm4_sr_stat.armor_recharge_change 0\nfunction #gm4_survival_refightalized:armor_recharge_timer\n\nscoreboard players set $armor_recharge gm4_sr_data 100\nscoreboard players operation $armor_recharge gm4_sr_data += @s gm4_sr_stat.armor_recharge_change\nscoreboard players operation $armor_recharge gm4_sr_data > #0 gm4_sr_data\nscoreboard players operation @s[scores={gm4_sr_armor.reduction_timer=1..}] gm4_sr_armor.reduction_timer -= $armor_recharge gm4_sr_data\nexecute unless score @s gm4_sr_armor.reduction_timer matches 1.. run function gm4_survival_refightalized:player/armor/recharge\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/calculate_breach_enchantment.mcfunction",
    "content": "# calculate breach extra damage to armor\n# @s = damaged player\n# at @s\n# run from player/damage/calculate_damage\n\n# get breach level x15\nexecute on attacker store result score $breach_level gm4_sr_data run data get entity @s equipment.mainhand.components.\"minecraft:enchantments\".\"minecraft:breach\" 15\n\n# get extra damage (this is calculated from post-mitigation damage)\nscoreboard players operation $extra_armor_damage gm4_sr_data = $damage_armor gm4_sr_data\nscoreboard players operation $extra_armor_damage gm4_sr_data *= $breach_level gm4_sr_data\nscoreboard players operation $extra_armor_damage gm4_sr_data /= #100 gm4_sr_data\nscoreboard players operation $total_armor_damage gm4_sr_data += $extra_armor_damage gm4_sr_data\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/calculate_damage.mcfunction",
    "content": "# devide damage between armor, absorption and health\n# @s = damaged player\n# at @s\n# run from player/damage/run\n\n# make sure at least 1 damage is dealt\nscoreboard players operation $damage_total gm4_sr_data > #1 gm4_sr_data\n\n# | Armor\nscoreboard players operation $damage_armor gm4_sr_data += $damage_total gm4_sr_data\n# if damage pierces armor no effect\nexecute unless entity @s[advancements={gm4_survival_refightalized:damaged={armor_piercing=false,armor_piercing_mob=false}}] run scoreboard players set $damage_armor gm4_sr_data 0\n# breach adds 15% more damage per level\nscoreboard players operation $total_armor_damage gm4_sr_data = $damage_armor gm4_sr_data\nexecute if entity @s[advancements={gm4_survival_refightalized:damaged={breaching=true}}] run function gm4_survival_refightalized:player/damage/calculate_breach_enchantment\n# if armor is reduced to below 1 play sound and remove resistance effect on player\nexecute store result score $player_armor gm4_sr_data run attribute @s minecraft:armor get 10\nscoreboard players operation $armor_check gm4_sr_data = $player_armor gm4_sr_data\nscoreboard players operation $armor_check gm4_sr_data -= $total_armor_damage gm4_sr_data\nexecute if score $armor_check gm4_sr_data matches ..9 run function gm4_survival_refightalized:player/armor/break\ntellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\"Real Damage Taken (x10): \",\"color\":\"gray\"},{\"score\":{\"name\":\"$damage_total\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"}]\n# apply armor reduction to player armor\nscoreboard players operation @s gm4_sr_armor.reduction += $total_armor_damage gm4_sr_data\nexecute store result storage gm4_survival_refightalized:temp set.armor_reduction float 0.1 run scoreboard players get @s gm4_sr_armor.reduction\n# any leftover damage is applied to the players absorption and health\nscoreboard players operation $damage_left gm4_sr_data = $damage_total gm4_sr_data\nscoreboard players operation $damage_left gm4_sr_data -= $damage_armor gm4_sr_data\n\n# | Absorption\n# get scores\nscoreboard players operation $current_absorption_hearts gm4_sr_data = @s gm4_sr_stat.current_absorption\nscoreboard players operation $current_absorption_max gm4_sr_data = @s gm4_sr_stat.max_absorption\n# apply leftover damge to absorption first\nscoreboard players operation $damage_absorption gm4_sr_data += $damage_left gm4_sr_data\nscoreboard players operation $damage_absorption gm4_sr_data < $current_absorption_hearts gm4_sr_data\nscoreboard players operation $current_absorption_hearts gm4_sr_data -= $damage_absorption gm4_sr_data\n# set storage to the amount of reduction of max absorption needed to get to the new absorption total\nexecute store result storage gm4_survival_refightalized:temp set.absorption_reduction float 0.1 run scoreboard players operation $current_absorption_max gm4_sr_data -= $current_absorption_hearts gm4_sr_data\n\n# | Health\nscoreboard players operation $damage_left gm4_sr_data -= $damage_absorption gm4_sr_data\nscoreboard players operation $damage_health gm4_sr_data += $damage_left gm4_sr_data\n\n# | Damage the player\n# armor\nexecute if score $damage_armor gm4_sr_data matches 1.. unless entity @s[advancements={gm4_survival_refightalized:damaged={breaching=true}}] run tellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\"  > Armor: \",\"color\":\"gray\"},{\"score\":{\"name\":\"$total_armor_damage\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"}]\nexecute if score $damage_armor gm4_sr_data matches 1.. if entity @s[advancements={gm4_survival_refightalized:damaged={breaching=true}}] run tellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\"  > Armor: \",\"color\":\"gray\"},{\"score\":{\"name\":\"$total_armor_damage\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\" | Breach Enchantment: \",\"color\":\"gray\"},{\"text\":\"+\",\"color\":\"white\"},{\"score\":{\"name\":\"$extra_armor_damage\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\" (\",\"color\":\"dark_gray\"},{\"score\":{\"name\":\"$breach_level\",\"objective\":\"gm4_sr_data\"},\"color\":\"dark_gray\"},{\"text\":\"%)\",\"color\":\"dark_gray\"}]\nexecute if score $damage_armor gm4_sr_data matches 1.. run function gm4_survival_refightalized:player/armor/eval_reduction with storage gm4_survival_refightalized:temp set\n# absorption hearts\nexecute if score $damage_absorption gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\"  > Absorption: \",\"color\":\"gray\"},{\"score\":{\"name\":\"$damage_absorption\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"}]\nexecute if score $damage_absorption gm4_sr_data matches 1.. run function gm4_survival_refightalized:player/absorption/eval_reduction with storage gm4_survival_refightalized:temp set\n# red hearts\nexecute if score $damage_health gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\"  > Health: \",\"color\":\"gray\"},{\"score\":{\"name\":\"$damage_health\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"}]\nexecute if score $damage_health gm4_sr_data matches 1.. run function gm4_survival_refightalized:player/health/reduce/activate\n\n# advancement\nexecute if score $damage_armor gm4_sr_data matches 1.. run advancement grant @s only gm4:survival_refightalized_armor_damage\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/calculate_reduction.mcfunction",
    "content": "# calculate damage reduction based on different factors - if armor is worn\n# @s = damaged player\n# at @s\n# run from player/damage/run\n\n# add a 10 tick delay before damage can be calculated again\nexecute if score @s gm4_sr_armor.hit_cooldown matches 1.. run return run tellraw @s[tag=gm4_sr_dev.damage_log] {\"text\":\"Recent damage invulnerability\",\"color\":\"white\"}\nscoreboard players set @s gm4_sr_armor.hit_cooldown 10\n\n# grab active effects to check for resistance later - can be skipped if this was already done for cave spider / witch poison reduction\nexecute unless data storage gm4_survival_refightalized:temp active_effects run data modify storage gm4_survival_refightalized:temp active_effects set from entity @s active_effects\n\n# don't run if this resistance level is not due to armor (as the player will already have taken the damage)\n# this should generally not run, and is mostly here as a fail-safe\nexecute store result score $resistance_level gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:\"minecraft:resistance\"}].amplifier\nexecute unless score $resistance_level gm4_sr_data matches -1 run return run scoreboard players reset @s gm4_sr_stat.damage_resisted\n\n# dev damage log\ntellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\"Base Damage Taken (x10): \",\"color\":\"gray\"},{\"score\":{\"name\":\"@s\",\"objective\":\"gm4_sr_stat.damage_resisted\"},\"color\":\"white\"}]\n\n# transfer damage resistance to damage to health score\nscoreboard players operation $damage_total gm4_sr_data = @s gm4_sr_stat.damage_resisted\n\n# first check the resistance level besides from this module\n# if this results in 100% damage reduction skip the rest of this function\nscoreboard players set $resistance_damage_reduction gm4_sr_data 0\nexecute if data storage gm4_survival_refightalized:temp active_effects[{id:\"minecraft:resistance\"}].hidden_effect.duration store result score $resistance_damage_reduction gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:\"minecraft:resistance\"}].hidden_effect.amplifier 20\nexecute if score $resistance_damage_reduction gm4_sr_data matches 1.. run scoreboard players add $resistance_damage_reduction gm4_sr_data 20\nexecute if score $resistance_damage_reduction gm4_sr_data matches 100.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{text:\"Blocked by Resistance\",color:\"gray\"}]\nexecute if score $resistance_damage_reduction gm4_sr_data matches 100.. run scoreboard players set $damage_total gm4_sr_data 0\nexecute unless score $resistance_damage_reduction gm4_sr_data matches 0..99 run return run data remove storage gm4_survival_refightalized:temp active_effects\n\n# | Reduce damage taken based on\n# /!\\ order for these is important!\n# 1. armor toughness (only if player still has armor)\nexecute store result score $armor_toughness gm4_sr_data run attribute @s minecraft:armor_toughness get\nexecute if score $armor_toughness gm4_sr_data matches 1.. if score @s[advancements={gm4_survival_refightalized:damaged={armor_piercing=false,armor_piercing_mob=false}}] gm4_sr_stat.armor matches 1.. run function gm4_survival_refightalized:player/damage/reduction/armor_toughness\n\n# 2. enchantments\nexecute if entity @s[advancements={gm4_survival_refightalized:damaged={bypasses_enchantments=false}}] run function gm4_survival_refightalized:player/damage/reduction/enchantments/run\n\n# 3. resistance effect (uses highest level besides the one used for this module)\nscoreboard players operation $resistance_damage_reduction_percentage gm4_sr_data = $resistance_damage_reduction gm4_sr_data\nscoreboard players operation $resistance_damage_reduction gm4_sr_data *= $damage_total gm4_sr_data\nscoreboard players operation $resistance_damage_reduction gm4_sr_data /= #100 gm4_sr_data\nscoreboard players operation $damage_total gm4_sr_data -= $resistance_damage_reduction gm4_sr_data\nexecute if score $resistance_damage_reduction gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\"Resistance: \",\"color\":\"gray\"},{\"text\":\"-\",\"color\":\"white\"},{\"score\":{\"name\":\"$resistance_damage_reduction\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\" = \"},{\"score\":{\"name\":\"$damage_total\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\" (\",\"color\":\"dark_gray\"},{\"score\":{\"name\":\"$resistance_damage_reduction_percentage\",\"objective\":\"gm4_sr_data\"},\"color\":\"dark_gray\"},{\"text\":\"%)\",\"color\":\"dark_gray\"}]\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/cave_spider_poison_reduction.mcfunction",
    "content": "# reduce poison duration from cave spider attacks\n# @s = damaged player\n# at @s\n# run from player/damage/run\n\n# dont run on easy, no poison applied\nexecute store result score $worlddiff gm4_sr_data run difficulty\nexecute if score $worlddiff gm4_sr_data matches 1 run return 0\n\n# get effect data\ndata modify storage gm4_survival_refightalized:temp active_effects set from entity @s active_effects\nexecute store result score $poison.amplifier gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:\"minecraft:poison\"}].amplifier\nexecute store result score $poison.duration gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:\"minecraft:poison\"}].duration\n\n# dont run if there is a stronger poison running\nexecute unless score $poison.amplifier gm4_sr_data matches 0 run return 0\nexecute unless score $poison.duration gm4_sr_data matches 299 unless score $poison.duration gm4_sr_data matches 139 run return 0\n\n# reapply weaker poison, 1 damage for normal, 2 damage for hard\neffect clear @s poison\nexecute if score $worlddiff gm4_sr_data matches 2 run effect give @s poison 2 0\nexecute if score $worlddiff gm4_sr_data matches 3 run effect give @s poison 4 0\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/reduction/armor_toughness.mcfunction",
    "content": "# reduce damage with armor toughness\n# @s = damaged player\n# at @s\n# run from player/damage/calculate_reduction\n\n# Formula:\n# Damage reduction percentage = (6 * armor_toughness + 2 * armor_toughness * damage) / (damage + 5 * armor_toughness)\n\nscoreboard players operation $armor_toughness.times_5 gm4_sr_data = $armor_toughness gm4_sr_data\nscoreboard players operation $armor_toughness.times_5 gm4_sr_data *= #5 gm4_sr_data\n\n# dividend = 6 * armor_toughness + 2 * armor_toughness * damage\nscoreboard players operation $armor_toughness.dividend gm4_sr_data += $armor_toughness.times_5 gm4_sr_data\nscoreboard players operation $armor_toughness.dividend gm4_sr_data *= $armor_toughness gm4_sr_data\nscoreboard players operation $armor_toughness.dividend2 gm4_sr_data = $damage_total gm4_sr_data\nscoreboard players operation $armor_toughness.dividend2 gm4_sr_data *= $armor_toughness gm4_sr_data\nscoreboard players operation $armor_toughness.dividend2 gm4_sr_data *= #2 gm4_sr_data\nscoreboard players operation $armor_toughness.dividend gm4_sr_data += $armor_toughness.dividend2 gm4_sr_data\n\n# divisor = damage + 5 * armor_toughness\nscoreboard players operation $armor_toughness.divisor gm4_sr_data = $damage_total gm4_sr_data\nscoreboard players operation $armor_toughness.divisor gm4_sr_data += $armor_toughness.times_5 gm4_sr_data\n\n# dividend / divisor (this rounds down!), can max reduce damage by 2x armor_toughness\nscoreboard players operation $armor_toughness.dividend gm4_sr_data /= $armor_toughness.divisor gm4_sr_data\nscoreboard players operation $armor_toughness.max_reduction gm4_sr_data = $armor_toughness gm4_sr_data\nscoreboard players operation $armor_toughness.max_reduction gm4_sr_data *= #2 gm4_sr_data\nscoreboard players operation $armor_toughness.dividend gm4_sr_data < $armor_toughness.max_reduction gm4_sr_data\n\n# get damage reduction\nscoreboard players operation $armor_toughness_effect gm4_sr_data = $damage_total gm4_sr_data\nscoreboard players operation $armor_toughness_effect gm4_sr_data *= $armor_toughness.dividend gm4_sr_data\nscoreboard players operation $armor_toughness_effect gm4_sr_data /= #100 gm4_sr_data\n\n# reduce damage taken\nscoreboard players operation $damage_total gm4_sr_data -= $armor_toughness_effect gm4_sr_data\n\n# dev damage log\ntellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\"Armor Toughness: \",\"color\":\"gray\"},{\"text\":\"-\",\"color\":\"white\"},{\"score\":{\"name\":\"$armor_toughness_effect\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\" = \",\"color\":\"gray\"},{\"score\":{\"name\":\"$damage_total\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\" (\",\"color\":\"dark_gray\"},{\"score\":{\"name\":\"$armor_toughness.dividend\",\"objective\":\"gm4_sr_data\"},\"color\":\"dark_gray\"},{\"text\":\"%)\",\"color\":\"dark_gray\"}]\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/reduction/enchantments/blast_protection.mcfunction",
    "content": "# reduce damage with blast protection\n# @s = damaged player\n# at @s\n# run from player/damage/reduction/enchantments/ruun\n\nexecute store result score $enchant.blast_protection gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components.\"minecraft:enchantments\".\"minecraft:blast_protection\" 4\nexecute store result score $enchant.blast_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components.\"minecraft:enchantments\".\"minecraft:blast_protection\" 4\nscoreboard players operation $enchant.blast_protection gm4_sr_data += $enchant.blast_protection.add gm4_sr_data\nexecute store result score $enchant.blast_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components.\"minecraft:enchantments\".\"minecraft:blast_protection\" 4\nscoreboard players operation $enchant.blast_protection gm4_sr_data += $enchant.blast_protection.add gm4_sr_data\nexecute store result score $enchant.blast_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components.\"minecraft:enchantments\".\"minecraft:blast_protection\" 4\nscoreboard players operation $enchant.blast_protection gm4_sr_data += $enchant.blast_protection.add gm4_sr_data\n\nexecute if score $enchant.damage_reduction gm4_sr_data matches 0 if score $enchant.blast_protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] {\"text\":\"Enchantments:\",\"color\":\"gray\"}\nscoreboard players operation $enchant.damage_reduction gm4_sr_data += $enchant.blast_protection gm4_sr_data\nexecute if score $enchant.blast_protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\" > Blast Protection: \",\"color\":\"gray\"},{\"score\":{\"name\":\"$enchant.blast_protection\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\"%\",\"color\":\"white\"}]\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/reduction/enchantments/feather_falling.mcfunction",
    "content": "# reduce damage with feather falling\n# @s = damaged player\n# at @s\n# run from player/damage/reduction/enchantments/ruun\n\nexecute store result score $enchant.feather_falling gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components.\"minecraft:enchantments\".\"minecraft:feather_falling\" 12\nexecute store result score $enchant.feather_falling.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components.\"minecraft:enchantments\".\"minecraft:feather_falling\" 12\nscoreboard players operation $enchant.feather_falling gm4_sr_data += $enchant.feather_falling.add gm4_sr_data\nexecute store result score $enchant.feather_falling.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components.\"minecraft:enchantments\".\"minecraft:feather_falling\" 12\nscoreboard players operation $enchant.feather_falling gm4_sr_data += $enchant.feather_falling.add gm4_sr_data\nexecute store result score $enchant.feather_falling.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components.\"minecraft:enchantments\".\"minecraft:feather_falling\" 12\nscoreboard players operation $enchant.feather_falling gm4_sr_data += $enchant.feather_falling.add gm4_sr_data\n\nexecute if score $enchant.damage_reduction gm4_sr_data matches 0 if score $enchant.feather_falling gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] {\"text\":\"Enchantments:\",\"color\":\"gray\"}\nscoreboard players operation $enchant.damage_reduction gm4_sr_data += $enchant.feather_falling gm4_sr_data\nexecute if score $enchant.feather_falling gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\" > Feather Falling: \",\"color\":\"gray\"},{\"score\":{\"name\":\"$enchant.feather_falling\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\"%\",\"color\":\"white\"}]\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/reduction/enchantments/fire_protection.mcfunction",
    "content": "# reduce damage with fire protection\n# @s = damaged player\n# at @s\n# run from player/damage/reduction/enchantments/ruun\n\nexecute store result score $enchant.fire_protection gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components.\"minecraft:enchantments\".\"minecraft:fire_protection\" 4\nexecute store result score $enchant.fire_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components.\"minecraft:enchantments\".\"minecraft:fire_protection\" 4\nscoreboard players operation $enchant.fire_protection gm4_sr_data += $enchant.fire_protection.add gm4_sr_data\nexecute store result score $enchant.fire_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components.\"minecraft:enchantments\".\"minecraft:fire_protection\" 4\nscoreboard players operation $enchant.fire_protection gm4_sr_data += $enchant.fire_protection.add gm4_sr_data\nexecute store result score $enchant.fire_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components.\"minecraft:enchantments\".\"minecraft:fire_protection\" 4\nscoreboard players operation $enchant.fire_protection gm4_sr_data += $enchant.fire_protection.add gm4_sr_data\n\nexecute if score $enchant.damage_reduction gm4_sr_data matches 0 if score $enchant.fire_protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] {\"text\":\"Enchantments:\",\"color\":\"gray\"}\nscoreboard players operation $enchant.damage_reduction gm4_sr_data += $enchant.fire_protection gm4_sr_data\nexecute if score $enchant.fire_protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\" > Fire Protection: \",\"color\":\"gray\"},{\"score\":{\"name\":\"$enchant.fire_protection\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\"%\",\"color\":\"white\"}]\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/reduction/enchantments/projectile_protection.mcfunction",
    "content": "# reduce damage with projectile protection\n# @s = damaged player\n# at @s\n# run from player/damage/reduction/enchantments/ruun\n\nexecute store result score $enchant.projectile_protection gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components.\"minecraft:enchantments\".\"minecraft:projectile_protection\" 4\nexecute store result score $enchant.projectile_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components.\"minecraft:enchantments\".\"minecraft:projectile_protection\" 4\nscoreboard players operation $enchant.projectile_protection gm4_sr_data += $enchant.projectile_protection.add gm4_sr_data\nexecute store result score $enchant.projectile_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components.\"minecraft:enchantments\".\"minecraft:projectile_protection\" 4\nscoreboard players operation $enchant.projectile_protection gm4_sr_data += $enchant.projectile_protection.add gm4_sr_data\nexecute store result score $enchant.projectile_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components.\"minecraft:enchantments\".\"minecraft:projectile_protection\" 4\nscoreboard players operation $enchant.projectile_protection gm4_sr_data += $enchant.projectile_protection.add gm4_sr_data\n\nexecute if score $enchant.damage_reduction gm4_sr_data matches 0 if score $enchant.projectile_protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] {\"text\":\"Enchantments:\",\"color\":\"gray\"}\nscoreboard players operation $enchant.damage_reduction gm4_sr_data += $enchant.projectile_protection gm4_sr_data\nexecute if score $enchant.projectile_protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\" > Projectile Protection: \",\"color\":\"gray\"},{\"score\":{\"name\":\"$enchant.projectile_protection\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\"%\",\"color\":\"white\"}]\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/reduction/enchantments/run.mcfunction",
    "content": "# reduce damage with enchantments\n# @s = damaged player\n# at @s\n# run from player/damage/calculate_reduction\n\n# get required data\nitem replace block 29999998 1 7134 container.0 from entity @s armor.head\nitem replace block 29999998 1 7134 container.1 from entity @s armor.chest\nitem replace block 29999998 1 7134 container.2 from entity @s armor.legs\nitem replace block 29999998 1 7134 container.3 from entity @s armor.feet\ndata modify storage gm4_survival_refightalized:temp Items set from block 29999998 1 7134 Items\ndata remove block 29999998 1 7134 Items\n\n# /?\\ enchantments have been nerfed! Protection values are:\n# 1% per level of Protection\n# 4% per level of Fire / Blast / Projectile Protection\n\nscoreboard players set $enchant.damage_reduction gm4_sr_data 0\n\n# generic protection enchantment\nexecute store result score $enchant.protection gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components.\"minecraft:enchantments\".\"minecraft:protection\" 2\nexecute store result score $enchant.protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components.\"minecraft:enchantments\".\"minecraft:protection\" 2\nscoreboard players operation $enchant.protection gm4_sr_data += $enchant.protection.add gm4_sr_data\nexecute store result score $enchant.protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components.\"minecraft:enchantments\".\"minecraft:protection\" 2\nscoreboard players operation $enchant.protection gm4_sr_data += $enchant.protection.add gm4_sr_data\nexecute store result score $enchant.protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components.\"minecraft:enchantments\".\"minecraft:protection\" 2\nscoreboard players operation $enchant.protection gm4_sr_data += $enchant.protection.add gm4_sr_data\n\nexecute if score $enchant.damage_reduction gm4_sr_data matches 0 if score $enchant.protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] {\"text\":\"Enchantments:\",\"color\":\"gray\"}\nscoreboard players operation $enchant.damage_reduction gm4_sr_data += $enchant.protection gm4_sr_data\nexecute if score $enchant.protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\" > Protection: \",\"color\":\"gray\"},{\"score\":{\"name\":\"$enchant.protection\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\"%\",\"color\":\"white\"}]\n\n# check if specific protection enchants would apply\nscoreboard players set $enchant.fire_protection gm4_sr_data 0\nscoreboard players set $enchant.blast_protection gm4_sr_data 0\nscoreboard players set $enchant.projectile_protection gm4_sr_data 0\nscoreboard players set $enchant.feather_falling gm4_sr_data 0\nexecute if entity @s[advancements={gm4_survival_refightalized:damaged={is_fire=true}}] run function gm4_survival_refightalized:player/damage/reduction/enchantments/fire_protection\nexecute if entity @s[advancements={gm4_survival_refightalized:damaged={is_explosion=true}}] run function gm4_survival_refightalized:player/damage/reduction/enchantments/blast_protection\nexecute if entity @s[advancements={gm4_survival_refightalized:damaged={is_projectile=true}}] run function gm4_survival_refightalized:player/damage/reduction/enchantments/projectile_protection\nexecute if entity @s[advancements={gm4_survival_refightalized:damaged={is_fall=true}}] run function gm4_survival_refightalized:player/damage/reduction/enchantments/feather_falling\n\n# total enchantment damage reduction is capped at 80%\nscoreboard players operation $enchant.damage_reduction gm4_sr_data < #80 gm4_sr_data\nscoreboard players operation $enchant.damage_reduction_percentage gm4_sr_data = $enchant.damage_reduction gm4_sr_data\nscoreboard players operation $enchant.damage_reduction gm4_sr_data *= $damage_total gm4_sr_data\nscoreboard players operation $enchant.damage_reduction gm4_sr_data /= #100 gm4_sr_data\nscoreboard players operation $damage_total gm4_sr_data -= $enchant.damage_reduction gm4_sr_data\n\nexecute if score $enchant.damage_reduction gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\" >> Total: \",\"color\":\"gray\"},{\"text\":\"-\",\"color\":\"white\"},{\"score\":{\"name\":\"$enchant.damage_reduction\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\" = \",\"color\":\"gray\"},{\"score\":{\"name\":\"$damage_total\",\"objective\":\"gm4_sr_data\"},\"color\":\"white\"},{\"text\":\" (\",\"color\":\"dark_gray\"},{\"score\":{\"name\":\"$enchant.damage_reduction_percentage\",\"objective\":\"gm4_sr_data\"},\"color\":\"dark_gray\"},{\"text\":\"%)\",\"color\":\"dark_gray\"}]\n\n# cleanup\ndata remove storage gm4_survival_refightalized:temp Items\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/run.mcfunction",
    "content": "# run when player gets damaged\n# @s = damaged player\n# at @s\n# run from tick\n\n# dev damage log\ntellraw @s[tag=gm4_sr_dev.damage_log] {\"text\":\"-- Damage Log --\"}\n\n# prep scores\nfunction gm4_survival_refightalized:player/health/calculate_hp\nscoreboard players set $damage_armor gm4_sr_data 0\nscoreboard players set $damage_absorption gm4_sr_data 0\nscoreboard players set $damage_health gm4_sr_data 0\nscoreboard players set $damage_total gm4_sr_data 0\n\n### TEMP - paper fix - damage resist score gets multiplied by 51.2, so we need to revert that or the player instantly dies\n### this currently breaks if a player takes a multiple of 51.2 damage, but that should be rare enough\nscoreboard players set #512 gm4_sr_data 512\nexecute if score $on_paper gm4_sr_data matches 1 run tellraw @s[tag=gm4_sr_dev.damage_log] {\"text\":\"Paper Bug - divided damage by 51.2\",\"color\":\"red\",\"italic\":true}\nexecute if score $on_paper gm4_sr_data matches 1 run scoreboard players operation @s gm4_sr_stat.damage_resisted *= #10 gm4_sr_data\nexecute if score $on_paper gm4_sr_data matches 1 run scoreboard players operation @s gm4_sr_stat.damage_resisted /= #512 gm4_sr_data\n\n# disable shield if damage was blocked, don't run the rest of this function\nexecute unless score @s[scores={gm4_sr_shield.timer=1..2,gm4_sr_shield.use_ticks=1..},advancements={gm4_survival_refightalized:damaged={bypasses_shield=false}}] gm4_sr_stat.damage_taken matches 1.. unless score @s gm4_sr_stat.damage_absorbed matches 1.. run return run function gm4_survival_refightalized:player/damage/shield/blocked_damage\n\n# cave spider / witch poison reduction\nexecute if entity @s[advancements={gm4_survival_refightalized:damaged={cave_spider=true}}] run function gm4_survival_refightalized:player/damage/cave_spider_poison_reduction\nexecute if entity @s[advancements={gm4_survival_refightalized:damaged={witch=true}}] run function gm4_survival_refightalized:player/damage/witch_poison_reduction\n\n# dev damage log\ntellraw @s[tag=gm4_sr_dev.damage_log,advancements={gm4_survival_refightalized:damaged={combat_damage=false}}] {\"text\":\"Non-Combat Damage\",\"color\":\"dark_gray\",\"italic\":true}\n\n# calculate damage if player has armor\nexecute if score @s gm4_sr_stat.armor matches 1.. run function gm4_survival_refightalized:player/damage/calculate_reduction\nexecute unless score @s gm4_sr_stat.armor matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\"No Armor - Damage (x10): \",\"color\":\"gray\"},{\"score\":{\"name\":\"@s\",\"objective\":\"gm4_sr_stat.damage_taken\"},\"color\":\"white\"}]\n\n# set combat regeneration timers, allow to be altered by function call, use rapid_regen if damage was non-combat\nscoreboard players operation $set gm4_sr_armor.reduction_timer = $armor_recharge_timer gm4_sr_config\nscoreboard players operation $set gm4_sr_health.regeneration_timer = $combat_regen_timer gm4_sr_config\nexecute if entity @s[advancements={gm4_survival_refightalized:damaged={combat_damage=false}}] run scoreboard players operation $set gm4_sr_health.regeneration_timer = $rapid_regen_timer gm4_sr_config\n\n# function call\n# called after damage is calculated but before it is applied (unless there was no armor, then it is applied by the game)\nfunction #gm4_survival_refightalized:damage_taken\n\n# divide the damage taken between armor, absorption and health\nexecute if score $damage_total gm4_sr_data matches 1.. run function gm4_survival_refightalized:player/damage/calculate_damage\n\n# apply armor recharge timer, /5 if damage was non-combat, 0 if damage did not apply to armor\nexecute if entity @s[advancements={gm4_survival_refightalized:damaged={combat_damage=false}}] run scoreboard players operation $set gm4_sr_armor.reduction_timer /= #5 gm4_sr_data\nexecute if score $damage_armor gm4_sr_data matches 1.. run scoreboard players operation @s gm4_sr_armor.reduction_timer > $set gm4_sr_armor.reduction_timer\n# apply durability damage to armor unless it was armor piercing damage\nexecute if entity @s[advancements={gm4_survival_refightalized:damaged={armor_piercing=false,armor_piercing_mob=false}}] run function gm4_survival_refightalized:player/armor/durability/check\n\n# apply health regeneration timer, 0 if damage did not apply to health\nexecute if score $damage_health gm4_sr_data matches 1.. run scoreboard players operation @s gm4_sr_health.regeneration_timer > $set gm4_sr_health.regeneration_timer\nscoreboard players operation @s[scores={gm4_sr_stat.damage_taken=1..}] gm4_sr_health.regeneration_timer > $set gm4_sr_health.regeneration_timer\n\n# cleanup\nscoreboard players reset @s gm4_sr_stat.damage_taken\nscoreboard players reset @s gm4_sr_stat.damage_absorbed\nscoreboard players reset @s gm4_sr_stat.damage_resisted\nscoreboard players reset @s gm4_sr_stat.damage_blocked\nadvancement revoke @s only gm4_survival_refightalized:damaged\ndata remove storage gm4_survival_refightalized:temp active_effects\ndata remove storage gm4_survival_refightalized:temp set\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/blocked_damage.mcfunction",
    "content": "# disable shield if it blocked damage\n# @s = damaged player\n# at @s\n# run from player/damage/run\n\n# revoke advancement as it's not needed for shield blocking\nadvancement revoke @s only gm4_survival_refightalized:damaged\n\n# get shield data\nscoreboard players set $mainhand_shield gm4_sr_data 0\nexecute if items entity @s weapon.mainhand *[custom_data~{gm4_survival_refightalized:{shield:{}}}] store success score $mainhand_shield gm4_sr_data run item replace block 29999998 1 7134 container.0 from entity @s weapon.mainhand\nexecute if score $mainhand_shield gm4_sr_data matches 0 run item replace block 29999998 1 7134 container.0 from entity @s weapon.offhand\ndata modify storage gm4_survival_refightalized:temp Item set from block 29999998 1 7134 Items[0]\ndata remove block 29999998 1 7134 Items\n\n# non-player attacker is weak for 1 second so they don't immediatly hit again\nexecute on attacker run effect give @s[type=!player] weakness 1 9 true\n\n# parry attack (shield won't get disabled)\nexecute store result score $parry_ticks gm4_sr_data run data get storage gm4_survival_refightalized:temp Item.components.\"minecraft:custom_data\".gm4_survival_refightalized.shield.parry_ticks\nexecute if score @s gm4_sr_shield.use_ticks <= $parry_ticks gm4_sr_data unless score @s gm4_sr_shield.spam_detection matches 10.. run return run function gm4_survival_refightalized:player/damage/shield/parry\n\n# disable shield\ntag @s add gm4_sr_target\nexecute at @s anchored eyes positioned ^ ^ ^1 summon armor_stand run function gm4_survival_refightalized:player/damage/shield/disable\ntag @s remove gm4_sr_target\n\n# dev damage log\ntellraw @s[tag=gm4_sr_dev.damage_log] {\"text\":\"Damage blocked by shield\",\"color\":\"dark_gray\"}\n\n# cleanup\nscoreboard players reset @s gm4_sr_stat.damage_resisted\nscoreboard players reset @s gm4_sr_stat.damage_blocked\nadvancement revoke @s only gm4_survival_refightalized:damaged\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/disable.mcfunction",
    "content": "# damage the player from an axe to disable their shield\n# @s = armor stand\n# at @s\n# run from player/damage/shield/blocked_damage\n\nitem replace entity @s weapon.mainhand with iron_axe[weapon={disable_blocking_for_seconds:2}]\ndamage @p[tag=gm4_sr_target] 0.01 mob_attack by @s\nkill @s\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/parry.mcfunction",
    "content": "# shield parry\n# @s = damaged player\n# at @s\n# run from player/damage/shield/blocked_damage\n\ntag @s add gm4_sr_attack_parried\n\n# advancements\nadvancement grant @s only gm4:survival_refightalized_parry\nexecute store result score $lethal_damage gm4_sr_data run attribute @s minecraft:armor get 10\nscoreboard players operation $lethal_damage gm4_sr_data += @s gm4_sr_stat.current_health\nscoreboard players operation $lethal_damage gm4_sr_data += @s gm4_sr_stat.current_absorption\nexecute if score @s gm4_sr_stat.damage_resisted >= $lethal_damage gm4_sr_data run advancement grant @s only gm4:survival_refightalized_parry_lethal_damage\n\n# parry sounds\nplaysound entity.arrow.hit_player player @s ~ ~ ~ 0.25 0.5\nplaysound item.shield.block player @a ~ ~ ~ 1 1.25\n\n# reset spam detection\nscoreboard players set @s gm4_sr_shield.spam_detection 0\n\n# stop attacker for a bit\ntag @s add gm4_sr_parrier\nexecute store result storage gm4_survival_refightalized:temp parry.damage float 1 run attribute @s attack_damage get 1\nexecute on attacker run function gm4_survival_refightalized:player/damage/shield/parry_effect with storage gm4_survival_refightalized:temp parry\ndata remove storage gm4_survival_refightalized:temp parry\ntag @s remove gm4_sr_parrier\n\n# dev damage log\ntellraw @s[tag=gm4_sr_dev.damage_log] {\"text\":\"Parry\",\"color\":\"dark_gray\"}\n\n# cleanup\nscoreboard players reset @s gm4_sr_stat.damage_resisted\nscoreboard players reset @s gm4_sr_stat.damage_blocked\nadvancement revoke @s only gm4_survival_refightalized:damaged\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/parry_effect.mcfunction",
    "content": "# shield parry effects\n# @s = entity that was parried\n# at @s\n# run from player/damage/shield/parry\n\n# weakness is already applied from the blocking action\n\nstopsound @s player minecraft:entity.player.hurt\neffect give @s[distance=..3] nausea 2 0\neffect give @s[distance=..3,type=!player] slowness 1 9 true\neffect give @s[distance=..3] slowness 2 0 true\n$damage @s[distance=..3] $(damage) player_attack by @p[tag=gm4_sr_parrier]\nparticle minecraft:sweep_attack ~ ~1 ~ 0 0 0 0 1\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/remove_using.mcfunction",
    "content": "# remove shield using status from player that stopped using a shield\n# @s = player\n# at unspecified\n# run from tick\n\nattribute @s minecraft:knockback_resistance modifier remove gm4_survival_refightalized:using_shield\nscoreboard players add @s gm4_sr_shield.use_ticks 999\n\ntag @s remove gm4_sr_attack_parried\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/update_vanilla_shield.mcfunction",
    "content": "# update vanilla shields\n# @s = player using a shield\n# at @s\n# run from advancement using_vanilla_shield\n\n# in order for shields to work with the module we add custom_data gm4_survival_refightalized:{shield:{}}, optionally with parry_ticks\n# parry_ticks indicates the ticks after the shield is raised that the attack must be blocked for the attack to be considered a parry\n# the vanilla blocks_attacks is also copied into the item, with the exception that block_delay_seconds is set to 0.0\n\n# offhand\nexecute if entity @s[advancements={gm4_survival_refightalized:using_vanilla_shield={offhand=true}}] run item modify entity @s weapon.offhand {function:\"set_components\",components:{\\\n\"custom_data\":\\\n    {\"gm4_survival_refightalized\":{\\\n        \"shield\":{\\\n            \"parry_ticks\":5\\\n}}},\\\n\"minecraft:blocks_attacks\": {\\\n      \"block_delay_seconds\": 0.0,\\\n      \"disable_cooldown_scale\": 1,\\\n      \"block_sound\": \"minecraft:item.shield.block\",\\\n      \"bypassed_by\": \"#minecraft:bypasses_shield\",\\\n      \"disabled_sound\": \"minecraft:item.shield.break\",\\\n      \"item_damage\": {\\\n        \"base\": 1.0,\\\n        \"factor\": 1.0,\\\n        \"threshold\": 3.0\\\n}}}}\n\n# mainhand\nexecute if entity @s[advancements={gm4_survival_refightalized:using_vanilla_shield={mainhand=true}}] run item modify entity @s weapon.mainhand {function:\"set_components\",components:{\\\n\"custom_data\":\\\n    {\"gm4_survival_refightalized\":{\\\n        \"shield\":{\\\n            \"parry_ticks\":5\\\n}}},\\\n\"minecraft:blocks_attacks\": {\\\n      \"block_delay_seconds\": 0.0,\\\n      \"disable_cooldown_scale\": 1,\\\n      \"block_sound\": \"minecraft:item.shield.block\",\\\n      \"bypassed_by\": \"#minecraft:bypasses_shield\",\\\n      \"disabled_sound\": \"minecraft:item.shield.break\",\\\n      \"item_damage\": {\\\n        \"base\": 1.0,\\\n        \"factor\": 1.0,\\\n        \"threshold\": 3.0\\\n}}}}\n\n# revoke advancement\nadvancement revoke @s only gm4_survival_refightalized:using_vanilla_shield\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/using.mcfunction",
    "content": "# run while using a shield\n# @s = player using a shield\n# at @s\nadvancement revoke @s only gm4_survival_refightalized:using_custom_shield\n\n# add to spam detection so you can't just spam click your shield to parry\nexecute unless score @s gm4_sr_shield.timer matches 1.. unless score @s gm4_sr_shield.spam_detection matches 30.. run scoreboard players add @s gm4_sr_shield.spam_detection 6\n\n# track how many ticks shield is being held in gm4_sr_shield.use_ticks\nexecute unless score @s gm4_sr_shield.timer matches 1.. run scoreboard players set @s gm4_sr_shield.use_ticks 0\nscoreboard players add @s gm4_sr_shield.use_ticks 1\nscoreboard players set @s gm4_sr_shield.timer 2\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/witch_poison_reduction.mcfunction",
    "content": "# reduce poison duration from witch potions\n# @s = damaged player\n# at @s\n# run from player/damage/run\n\n# get effect data\ndata modify storage gm4_survival_refightalized:temp active_effects set from entity @s active_effects\nexecute store result score $poison.amplifier gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:\"minecraft:poison\"}].amplifier\nexecute store result score $poison.duration gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:\"minecraft:poison\"}].duration\n\n# dont run if there is a stronger poison running\nexecute unless score $poison.amplifier gm4_sr_data matches 0 run return 0\nexecute unless score $poison.duration gm4_sr_data matches ..900 run return 0\n\n# reapply shorter poison by dividing duration by 3 (60 as it is in ticks), at least 2 seconds\neffect clear @s poison\nscoreboard players operation $poison.duration gm4_sr_data /= #60 gm4_sr_data\nexecute if score $poison.duration gm4_sr_data matches 15.. run return run effect give @s poison 15 0\nexecute if score $poison.duration gm4_sr_data matches 14 run return run effect give @s poison 14 0\nexecute if score $poison.duration gm4_sr_data matches 13 run return run effect give @s poison 13 0\nexecute if score $poison.duration gm4_sr_data matches 12 run return run effect give @s poison 12 0\nexecute if score $poison.duration gm4_sr_data matches 11 run return run effect give @s poison 11 0\nexecute if score $poison.duration gm4_sr_data matches 10 run return run effect give @s poison 10 0\nexecute if score $poison.duration gm4_sr_data matches 9 run return run effect give @s poison 9 0\nexecute if score $poison.duration gm4_sr_data matches 8 run return run effect give @s poison 8 0\nexecute if score $poison.duration gm4_sr_data matches 7 run return run effect give @s poison 7 0\nexecute if score $poison.duration gm4_sr_data matches 6 run return run effect give @s poison 6 0\nexecute if score $poison.duration gm4_sr_data matches 5 run return run effect give @s poison 5 0\nexecute if score $poison.duration gm4_sr_data matches 4 run return run effect give @s poison 4 0\nexecute if score $poison.duration gm4_sr_data matches 3 run return run effect give @s poison 3 0\nexecute if score $poison.duration gm4_sr_data matches ..2 run effect give @s poison 2 0\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/death.mcfunction",
    "content": "# process players that died\n# @s = player\n# at player that died\n# run from player/player_submain\n\n# reset scores\nscoreboard players set @s gm4_sr_stat.deaths 0\nscoreboard players set @s gm4_sr_armor.reduction 0\nscoreboard players set @s gm4_sr_armor.reduction_timer 0\nscoreboard players set @s gm4_sr_health.restoration 0\n\n# remove armor reduction so player respawns with full armor in case of KeepInventory\nattribute @s minecraft:armor modifier remove gm4_survival_refightalized:armor_reduced\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/calculate_hp.mcfunction",
    "content": "# calculate the red health of player calling this function and store in scoreboards\n# @s = player to calculate health from\n# at unspecified\n# run from player/health/detect_sleep\n# run from player/health/regen_combat_health\n# run from player/health/regen_fast_health\n# run from player/health/heal/heal_calc\n# run from player/health/reduce/activate\n# called from expansion modules to get player health stats\n\n# get max health x10\nexecute store result score @s gm4_sr_stat.max_health run attribute @s minecraft:max_health get 10\n\n# calculate current health x10 (only red hearts)\n# add healstore as that will be added to health this tick and should be counted\nexecute store result score @s gm4_sr_stat.current_health run data get entity @s Health 10\nscoreboard players operation @s gm4_sr_stat.current_health += @s gm4_sr_health.restoration\n\n# calculate percentage of max health\n# this uses the rounded values displayed to the player\nscoreboard players operation @s gm4_sr_stat.health_percentage = @s gm4_sr_stat.current_health\nscoreboard players operation @s gm4_sr_stat.health_percentage *= #100 gm4_sr_data\nscoreboard players operation @s gm4_sr_stat.health_percentage /= @s gm4_sr_stat.max_health\n\n# calculate absorption health same as red hearts\nexecute store result score @s gm4_sr_stat.max_absorption run attribute @s minecraft:max_absorption get 10\nexecute store result score @s gm4_sr_stat.current_absorption run data get entity @s AbsorptionAmount 10\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/heal/activate.mcfunction",
    "content": "# code taken from sweethearts\n# @s = player to heal\n# at unspecified\n# run from player_submain\n\n# calculate health\nfunction gm4_survival_refightalized:player/health/calculate_hp\n\n# calculate max health to get player to new health\n# we can use stat.current_health as that already has the restoration added to it\nscoreboard players operation $remove_health gm4_sr_data = @s gm4_sr_stat.max_health\nscoreboard players operation $remove_health gm4_sr_data -= @s gm4_sr_stat.current_health\nexecute store result storage gm4_survival_refightalized:temp heal_player.remove_health float 0.1 run scoreboard players get $remove_health gm4_sr_data\n\nexecute unless score $remove_health gm4_sr_data matches 0 run function gm4_survival_refightalized:player/health/heal/eval with storage gm4_survival_refightalized:temp heal_player\ndata remove storage gm4_survival_refightalized:temp heal_player\n\n# prepare reverting\ntag @s add gm4_sr_healed\nschedule function gm4_survival_refightalized:player/health/heal/context 1t\n\n# heal player\neffect give @s minecraft:instant_health 1 10 true\n\n# cleanup\nscoreboard players reset @s gm4_sr_health.restoration\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/heal/context.mcfunction",
    "content": "# code taken from sweethearts\n# @s = unspecified\n# at unspecified\n# scheduled from player/health/heal/activate\n\nexecute as @a[tag=gm4_sr_healed] run function gm4_survival_refightalized:player/health/heal/revert\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/heal/eval.mcfunction",
    "content": "# reduce max health of player to their new health\n# @s = player to heal\n# at unspecified\n# run from player/health/heal/activate\n\n$attribute @s minecraft:max_health modifier add gm4_survival_refightalized:remove_health.healing -$(remove_health) add_value\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/heal/revert.mcfunction",
    "content": "# code taken from sweethearts\n# @s = player to revert max health\n# at unspecified\n# run from player/health/heal/context\n\nattribute @s minecraft:max_health modifier remove gm4_survival_refightalized:remove_health.healing\ntag @s remove gm4_sr_healed\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/reduce/activate.mcfunction",
    "content": "# code taken from sweethearts\n# @s = player to damage\n# at unspecified\n# run from player/damage/calculate_damage\n\n# calc hp and remove the healstore to get the actual current health\nfunction gm4_survival_refightalized:player/health/calculate_hp\nscoreboard players operation @s gm4_sr_stat.current_health -= @s gm4_sr_health.restoration\n\n# calculate max health to get player to new health\nscoreboard players operation $remove_health gm4_sr_data = @s gm4_sr_stat.max_health\nscoreboard players operation $remove_health gm4_sr_data -= @s gm4_sr_stat.current_health\nscoreboard players operation $remove_health gm4_sr_data += $damage_health gm4_sr_data\n\n# if player dies from this damage\nexecute if score $remove_health gm4_sr_data >= @s gm4_sr_stat.max_health run return run function gm4_survival_refightalized:player/health/reduce/death\n\nexecute store result storage gm4_survival_refightalized damage_player.remove_health float 0.1 run scoreboard players get $remove_health gm4_sr_data\nexecute unless score $remove_health gm4_sr_data matches 0 run function gm4_survival_refightalized:player/health/reduce/eval with storage gm4_survival_refightalized damage_player\ndata remove storage gm4_survival_refightalized damage_player\n\n# heal player to set their health\neffect give @s minecraft:instant_health 1 10 true\n\n# prepare reverting\ntag @s add gm4_sr_damaged\nschedule function gm4_survival_refightalized:player/health/reduce/context 2t\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/reduce/context.mcfunction",
    "content": "# code taken from sweethearts\n# @s = unspecified\n# at unspecified\n# schedule from player/health/reduce/activate\n\nexecute as @a[tag=gm4_sr_damaged] run function gm4_survival_refightalized:player/health/reduce/revert\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/reduce/death.mcfunction",
    "content": "# kill the player if they get reduced to 0 health\n# @s = player to damage\n# at unspecified\n# run from player/health/reduce/activate\n\n# check if player is holding item with death_protection component\nexecute if items entity @s weapon.* *[death_protection] run return run function gm4_survival_refightalized:player/health/reduce/death_protection\n\ntellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\"Custom Death Message:\",\"color\":\"gray\"}]\n\n# kill player with custom death message\nexecute store result score $showDeathMessages gm4_sr_data run gamerule show_death_messages\ngamerule show_death_messages false\nkill @s\nexecute if score $showDeathMessages gm4_sr_data matches 1 run tellraw @a [\"\",{\"selector\":\"@s\"},{\"translate\":\"text.gm4.survival_refightalized.death\",\"fallback\":\" ran out of health\"}]\nexecute if score $showDeathMessages gm4_sr_data matches 1 run gamerule show_death_messages true\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/reduce/death_protection.mcfunction",
    "content": "# preventing death with death_protection item\n# @s = player to damage\n# at unspecified\n# run from player/health/reduce/death\n\n# if player has resistance from module remove said resistance\nexecute store result score $resistance_level gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:\"minecraft:resistance\"}].amplifier\nexecute if score $resistance_level gm4_sr_data matches -1 run function gm4_survival_refightalized:player/resistance/remove\n\n# damage player to trigger death_protection item\ndamage @s 99999999999999 generic\n\n# dev damage log\ntellraw @s[tag=gm4_sr_dev.damage_log] [{\"text\":\"Triggered death_protection item\",\"color\":\"gray\"}]\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/reduce/eval.mcfunction",
    "content": "# reduce max health of player to their new health\n# @s = player to heal\n# at unspecified\n# run from player/health/reduce/activate\n\n$attribute @s minecraft:max_health modifier add gm4_survival_refightalized:remove_health.damaging -$(remove_health) add_value\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/reduce/revert.mcfunction",
    "content": "# code taken from sweethearts\n# @s = player to revert max health\n# at unspecified\n# run from player/health/reduce/context\n\n# revert max health\nattribute @s minecraft:max_health modifier remove gm4_survival_refightalized:remove_health.damaging\ntag @s remove gm4_sr_damaged\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/regeneration/combat_health.mcfunction",
    "content": "# check if player can get some healing\n# @s = player to regenerate\n# at unspecified\n# run from player/health/regeneration/timer\n\nfunction gm4_survival_refightalized:player/health/calculate_hp\nexecute unless score @s gm4_sr_stat.current_health < @s gm4_sr_stat.max_health run return 0\n\n# base restore 10 (half a heart), call function tag for expansions\nscoreboard players add @s gm4_sr_health.restoration 10\nscoreboard players operation @s gm4_sr_health.regeneration_timer = $rapid_regen_timer gm4_sr_config\nfunction #gm4_survival_refightalized:health_regeneration\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/regeneration/timer.mcfunction",
    "content": "# process the player's regen timer\n# @s = player\n# at unspecified\n# run from player_submain\n\n# gm4_sr_stat.regeneration_rate_change is normally 0, but can be changed by expansions\nscoreboard players set @s gm4_sr_stat.regeneration_rate_change 0\nfunction #gm4_survival_refightalized:health_regeneration_timer\n\nscoreboard players set $regeneration_timer gm4_sr_data 100\nscoreboard players operation $regeneration_timer gm4_sr_data += @s gm4_sr_stat.regeneration_rate_change\nscoreboard players operation $regeneration_timer gm4_sr_data > #0 gm4_sr_data\nscoreboard players operation @s[scores={gm4_sr_health.regeneration_timer=1..}] gm4_sr_health.regeneration_timer -= $regeneration_timer gm4_sr_data\nexecute unless score @s gm4_sr_health.regeneration_timer matches 1.. unless score @s gm4_sr_stat.hunger matches ..6 run function gm4_survival_refightalized:player/health/regeneration/combat_health\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/killed_mob.mcfunction",
    "content": "advancement revoke @s only gm4_survival_refightalized:kill_mob\n\n# lower regen timer\nscoreboard players operation @s gm4_sr_health.regeneration_timer < $rapid_regen_timer gm4_sr_config\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/reach_tier/diamond_netherite.mcfunction",
    "content": "# improve the gear mobs can use\n# @s = player with diamond / netherite gear\n# at unspecified\n# run from advancement reach_tier/diamond_netherite\n\nscoreboard players operation @s gm4_sr_armor.tier > #2 gm4_sr_data\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/reach_tier/iron_golden.mcfunction",
    "content": "# improve the gear mobs can use\n# @s = player with iron / golden gear\n# at unspecified\n# run from advancement reach_tier/iron_golden\n\nscoreboard players operation @s gm4_sr_armor.tier > #1 gm4_sr_data\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/resistance/reapply_loop.mcfunction",
    "content": "# reapply resistance effects that the player had besides the one from this module\n# @s = damaged player\n# at @s\n# run from player/resistance/remove\n# run from here\n\n# reapply\n$execute unless score $duration gm4_sr_data matches 0..19 run effect give @s resistance $(duration_set) $(amplifier) $(show_icon)\n\n# check if this should keep looping\nexecute unless data storage gm4_survival_refightalized:temp reapply_resistance.hidden_effect run return 0\n\ndata modify storage gm4_survival_refightalized:temp reapply_resistance set from storage gm4_survival_refightalized:temp reapply_resistance.hidden_effect\n\nexecute store result score $show_particles gm4_sr_data run data get storage gm4_survival_refightalized:temp reapply_resistance.show_icon\nexecute if score $show_particles gm4_sr_data matches 0 run data modify storage gm4_survival_refightalized:temp reapply_resistance.show_icon set value \"true\"\nexecute if score $show_particles gm4_sr_data matches 1 run data modify storage gm4_survival_refightalized:temp reapply_resistance.show_icon set value \"false\"\n\nexecute store result score $duration gm4_sr_data run data get storage gm4_survival_refightalized:temp reapply_resistance.duration\nexecute if score $duration gm4_sr_data matches 20.. store result storage gm4_survival_refightalized:temp reapply_resistance.duration_set int 0.05 run scoreboard players get $duration gm4_sr_data\nexecute if score $duration gm4_sr_data matches -1 run data modify storage gm4_survival_refightalized:temp reapply_resistance.duration_set set value \"infinite\"\n\nfunction gm4_survival_refightalized:player/resistance/reapply_loop with storage gm4_survival_refightalized:temp reapply_resistance\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/resistance/remove.mcfunction",
    "content": "# remove resistance from armor if armor is broken\n# @s = damaged player\n# at @s\n# run from player/damage/armor/break\n# run from player/\n\n# check if player actually has resistance that should be removed\nexecute store result score $resistance_level gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:\"minecraft:resistance\"}].amplifier\nexecute unless score $resistance_level gm4_sr_data matches -1 run return 0\n\n# clear resistance to remove the immunite from armor\neffect clear @s resistance\n\n# check if the player had additional resistance levels\nexecute unless data storage gm4_survival_refightalized:temp active_effects[{id:\"minecraft:resistance\"}].hidden_effect run return 0\n\n# reapply the resistance levels that should stay\ndata modify storage gm4_survival_refightalized:temp reapply_resistance set from storage gm4_survival_refightalized:temp active_effects[{id:\"minecraft:resistance\"}].hidden_effect\n\nexecute store result score $show_particles gm4_sr_data run data get storage gm4_survival_refightalized:temp reapply_resistance.show_icon\nexecute if score $show_particles gm4_sr_data matches 0 run data modify storage gm4_survival_refightalized:temp reapply_resistance.show_icon set value \"true\"\nexecute if score $show_particles gm4_sr_data matches 1 run data modify storage gm4_survival_refightalized:temp reapply_resistance.show_icon set value \"false\"\n\nexecute store result score $duration gm4_sr_data run data get storage gm4_survival_refightalized:temp reapply_resistance.duration\nexecute if score $duration gm4_sr_data matches 20.. store result storage gm4_survival_refightalized:temp reapply_resistance.duration_set int 0.05 run scoreboard players get $duration gm4_sr_data\nexecute if score $duration gm4_sr_data matches -1 run data modify storage gm4_survival_refightalized:temp reapply_resistance.duration_set set value \"infinite\"\n\nfunction gm4_survival_refightalized:player/resistance/reapply_loop with storage gm4_survival_refightalized:temp reapply_resistance\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/player_submain.mcfunction",
    "content": "# process anything player related\n# @s = unspecified\n# at unspecified\n# scheduled from main (8t)\n\n## /!\\\n# This function is NOT run as the player because the order of some of these functions is important\n\n# DEV: trigger for players with `gm4_sr_dev.mob_stats` tag\nexecute as @a[tag=gm4_sr_dev.mob_stats] at @s as @n[type=#gm4_survival_refightalized:modify] run function gm4_survival_refightalized:debug/dont_run/dev\n\n# process players that died\nexecute as @a[scores={gm4_sr_stat.deaths=1..}] run function gm4_survival_refightalized:player/death\n\n# armor recharge timer\nexecute as @a[gamemode=!spectator,tag=gm4_sr_armor.reduction] run function gm4_survival_refightalized:player/armor/timer\n# health regen timer\nexecute unless score $natural_regen gm4_sr_config matches -1 store result score $natural_regen gm4_sr_config run gamerule natural_health_regeneration\nexecute if score $natural_regen gm4_sr_config matches 0 as @a[gamemode=!spectator] run function gm4_survival_refightalized:player/health/regeneration/timer\n\n# if player has armor use new damage calculation\neffect give @a[gamemode=!spectator,scores={gm4_sr_stat.armor=1..}] resistance 2 255 true\n\n# heal players if they have stored health\nexecute as @a[gamemode=!spectator,scores={gm4_sr_health.restoration=1..}] run function gm4_survival_refightalized:player/health/heal/activate\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/slow_clock.mcfunction",
    "content": "schedule function gm4_survival_refightalized:slow_clock 30s\n\n# get moon cycle (0 = new moon, 4 = full moon)\nexecute store result score $moon gm4_sr_data run time query day repetition\nscoreboard players operation $moon gm4_sr_data %= #8 gm4_sr_data\nscoreboard players set $8 gm4_sr_data 8\nexecute if score $moon gm4_sr_data matches ..3 store result score $moon gm4_sr_data run scoreboard players operation $8 gm4_sr_data -= $moon gm4_sr_data\nscoreboard players remove $moon gm4_sr_data 4\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/function/tick.mcfunction",
    "content": "schedule function gm4_survival_refightalized:tick 1t\n\n# check for player damage\nexecute as @a[advancements={gm4_survival_refightalized:damaged=true}] at @s run function gm4_survival_refightalized:player/damage/run\n\n# check for projectiles\nexecute as @e[type=#gm4_survival_refightalized:arrow,tag=!gm4_sr_arrow_checked,tag=!smithed.strict,tag=!smithed.entity] run function gm4_survival_refightalized:check_arrow\n\n# shield parry\nexecute as @a[scores={gm4_sr_shield.timer=1}] run function gm4_survival_refightalized:player/damage/shield/remove_using\nscoreboard players remove @a[scores={gm4_sr_shield.timer=1..}] gm4_sr_shield.timer 1\nscoreboard players remove @a[scores={gm4_sr_shield.spam_detection=1..}] gm4_sr_shield.spam_detection 1\n\nscoreboard players remove @a[scores={gm4_sr_armor.hit_cooldown=1..}] gm4_sr_armor.hit_cooldown 1\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/guidebook/survival_refightalized.json",
    "content": "{\n  \"id\": \"survival_refightalized\",\n  \"name\": \"Survival Refightalized\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:leather_chestplate\"\n  },\n  \"criteria\": {\n    \"equip_armor\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:any_of\",\n            \"terms\": [\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"equipment\": {\n                    \"feet\": {\n                      \"items\": \"#gm4_survival_refightalized:armor\"\n                    }\n                  }\n                }\n              },\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"equipment\": {\n                    \"legs\": {\n                      \"items\": \"#gm4_survival_refightalized:armor\"\n                    }\n                  }\n                }\n              },\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"equipment\": {\n                    \"chest\": {\n                      \"items\": \"#gm4_survival_refightalized:armor\"\n                    }\n                  }\n                }\n              },\n              {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                  \"equipment\": {\n                    \"head\": {\n                      \"items\": \"#gm4_survival_refightalized:armor\"\n                    }\n                  }\n                }\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_shield\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"player\": [],\n        \"items\": [\n          {\n            \"items\": \"minecraft:shield\"\n          }\n        ]\n      }\n    },\n    \"kill_hostile\": {\n      \"trigger\": \"minecraft:player_hurt_entity\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"player\",\n                \"advancements\": {\n                  \"minecraft:adventure/kill_a_mob\": true\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"health\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.survival_refightalized.description.health\",\n            \"fallback\": \"Damage taken is split in combat and non-combat damage.\\nCombat damage regenerates every 60 seconds, while non-combat damage regenerates rapidly when out of combat.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"armor\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"equip_armor\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.survival_refightalized.description.armor\",\n            \"fallback\": \"Armor no longer reduces damage taken, instead serving as a second health bar. Armor recharges rapidly shortly after it takes damage.\\nProtection enchantments have reduced effectiveness.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"shield\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_shield\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.survival_refightalized.description.shield\",\n            \"fallback\": \"Shields will go on cooldown after blocking any damage.\\n\\nBlocking damage within 0.25s of holding the Shield performs a Parry, releasing the Shield within that 0.25s will not disable it.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"mobs\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"kill_hostile\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.survival_refightalized.description.mobs\",\n            \"fallback\": \"Mobs are stronger based on their environment, such as being outside during a thunderstorm or full moon, or being deep underground.\\nSome mobs are altered, such as Skeletons firing slower, and Phantoms drowning.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/generic/chest.json",
    "content": "{\n    \"type\": \"minecraft:generic\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:alternatives\",\n                    \"children\": [\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"minecraft:diamond_chestplate\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/diamond\"\n                                },\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$armor_tier\"\n                                        },\n                                        \"score\": \"gm4_sr_data\"\n                                    },\n                                    \"range\": {\n                                        \"min\": 2\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"golden_chestplate\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/golden\"\n                                },\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$armor_tier\"\n                                        },\n                                        \"score\": \"gm4_sr_data\"\n                                    },\n                                    \"range\": {\n                                        \"min\": 1\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"iron_chestplate\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/iron\"\n                                },\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$armor_tier\"\n                                        },\n                                        \"score\": \"gm4_sr_data\"\n                                    },\n                                    \"range\": {\n                                        \"min\": 1\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"chainmail_chestplate\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/chainmail\"\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"copper_chestplate\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/copper\"\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"leather_chestplate\"\n                        }\n                    ],\n                    \"conditions\": [\n                        {\n                            \"condition\": \"minecraft:random_chance\",\n                            \"chance\": {\n                                \"type\": \"minecraft:score\",\n                                \"target\": {\n                                    \"type\": \"minecraft:fixed\",\n                                    \"name\": \"$armor_chance\"\n                                },\n                                \"score\": \"gm4_sr_data\",\n                                \"scale\": 0.05\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/generic/feet.json",
    "content": "{\n    \"type\": \"minecraft:generic\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:alternatives\",\n                    \"children\": [\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"diamond_boots\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/diamond\"\n                                },\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$armor_tier\"\n                                        },\n                                        \"score\": \"gm4_sr_data\"\n                                    },\n                                    \"range\": {\n                                        \"min\": 2\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"golden_boots\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/golden\"\n                                },\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$armor_tier\"\n                                        },\n                                        \"score\": \"gm4_sr_data\"\n                                    },\n                                    \"range\": {\n                                        \"min\": 1\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"iron_boots\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/iron\"\n                                },\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$armor_tier\"\n                                        },\n                                        \"score\": \"gm4_sr_data\"\n                                    },\n                                    \"range\": {\n                                        \"min\": 1\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"chainmail_boots\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/chainmail\"\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"copper_boots\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/copper\"\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"leather_boots\"\n                        }\n                    ],\n                    \"conditions\": [\n                        {\n                            \"condition\": \"minecraft:random_chance\",\n                            \"chance\": {\n                                \"type\": \"minecraft:score\",\n                                \"target\": {\n                                    \"type\": \"minecraft:fixed\",\n                                    \"name\": \"$armor_chance\"\n                                },\n                                \"score\": \"gm4_sr_data\",\n                                \"scale\": 0.05\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/generic/head.json",
    "content": "{\n    \"type\": \"minecraft:generic\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:alternatives\",\n                    \"children\": [\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"turtle_helmet\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/turtle_helmet\"\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"diamond_helmet\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/diamond\"\n                                },\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$armor_tier\"\n                                        },\n                                        \"score\": \"gm4_sr_data\"\n                                    },\n                                    \"range\": {\n                                        \"min\": 2\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"golden_helmet\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/golden\"\n                                },\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$armor_tier\"\n                                        },\n                                        \"score\": \"gm4_sr_data\"\n                                    },\n                                    \"range\": {\n                                        \"min\": 1\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"iron_helmet\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/iron\"\n                                },\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$armor_tier\"\n                                        },\n                                        \"score\": \"gm4_sr_data\"\n                                    },\n                                    \"range\": {\n                                        \"min\": 1\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"chainmail_helmet\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/chainmail\"\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"copper_helmet\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/copper\"\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"leather_helmet\"\n                        }\n                    ],\n                    \"conditions\": [\n                        {\n                            \"condition\": \"minecraft:random_chance\",\n                            \"chance\": {\n                                \"type\": \"minecraft:score\",\n                                \"target\": {\n                                    \"type\": \"minecraft:fixed\",\n                                    \"name\": \"$armor_chance\"\n                                },\n                                \"score\": \"gm4_sr_data\",\n                                \"scale\": 0.05\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/generic/legs.json",
    "content": "{\n    \"type\": \"minecraft:generic\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:alternatives\",\n                    \"children\": [\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"diamond_leggings\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/diamond\"\n                                },\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$armor_tier\"\n                                        },\n                                        \"score\": \"gm4_sr_data\"\n                                    },\n                                    \"range\": {\n                                        \"min\": 2\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"golden_leggings\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/golden\"\n                                },\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$armor_tier\"\n                                        },\n                                        \"score\": \"gm4_sr_data\"\n                                    },\n                                    \"range\": {\n                                        \"min\": 1\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"iron_leggings\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/iron\"\n                                },\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$armor_tier\"\n                                        },\n                                        \"score\": \"gm4_sr_data\"\n                                    },\n                                    \"range\": {\n                                        \"min\": 1\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"chainmail_leggings\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/chainmail\"\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"copper_leggings\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:reference\",\n                                    \"name\": \"gm4_survival_refightalized:mob/material_check/copper\"\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:item\",\n                            \"name\": \"leather_leggings\"\n                        }\n                    ],\n                    \"conditions\": [\n                        {\n                            \"condition\": \"minecraft:random_chance\",\n                            \"chance\": {\n                                \"type\": \"minecraft:score\",\n                                \"target\": {\n                                    \"type\": \"minecraft:fixed\",\n                                    \"name\": \"$armor_chance\"\n                                },\n                                \"score\": \"gm4_sr_data\",\n                                \"scale\": 0.05\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/piglin/chest.json",
    "content": "{\n  \"type\": \"minecraft:entity\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"golden_chestplate\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:random_chance\",\n              \"chance\": 0.5\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/piglin/feet.json",
    "content": "{\n  \"type\": \"minecraft:entity\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"golden_boots\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:random_chance\",\n              \"chance\": 0.5\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/piglin/head.json",
    "content": "{\n  \"type\": \"minecraft:entity\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"golden_helmet\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:random_chance\",\n              \"chance\": 0.5\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/piglin/legs.json",
    "content": "{\n  \"type\": \"minecraft:entity\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"golden_leggings\",\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:random_chance\",\n              \"chance\": 0.5\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/skeleton/weapon.json",
    "content": "{\n  \"type\": \"minecraft:entity\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:bow\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_with_levels\",\n              \"levels\": {\n                \"min\": 0,\n                \"max\": 20\n              },\n              \"options\": \"#minecraft:non_treasure\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.15\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/wither_skeleton/arrow.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:tipped_arrow\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:potion_contents\": {\n                  \"custom_color\": 7561558,\n                  \"custom_effects\": [\n                    {\n                      \"id\": \"minecraft:wither\",\n                      \"amplifier\": 0,\n                      \"duration\": 1600,\n                      \"show_particles\": true,\n                      \"show_icon\": true,\n                      \"ambient\": false\n                    }\n                  ]\n                }\n              }\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.survival_refightalized.lore.wither_arrow\",\n                \"fallback\": \"Arrow of Wither\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 4\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/wither_skeleton/chest.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"iron_chestplate\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:reference\",\n                  \"name\": \"gm4_survival_refightalized:mob/material_check/iron\"\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"chainmail_chestplate\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:reference\",\n                  \"name\": \"gm4_survival_refightalized:mob/material_check/chainmail\"\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"value\": \"gm4:empty\"\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:random_chance\",\n              \"chance\": 0.666\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/wither_skeleton/feet.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"iron_boots\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:reference\",\n                  \"name\": \"gm4_survival_refightalized:mob/material_check/iron\"\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"chainmail_boots\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:reference\",\n                  \"name\": \"gm4_survival_refightalized:mob/material_check/chainmail\"\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"value\": \"gm4:empty\"\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:random_chance\",\n              \"chance\": 0.666\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/wither_skeleton/head.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"iron_helmet\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:reference\",\n                  \"name\": \"gm4_survival_refightalized:mob/material_check/iron\"\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"chainmail_helmet\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:reference\",\n                  \"name\": \"gm4_survival_refightalized:mob/material_check/chainmail\"\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"value\": \"gm4:empty\"\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:random_chance\",\n              \"chance\": 0.666\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/wither_skeleton/legs.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"iron_leggings\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:reference\",\n                  \"name\": \"gm4_survival_refightalized:mob/material_check/iron\"\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"chainmail_leggings\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:reference\",\n                  \"name\": \"gm4_survival_refightalized:mob/material_check/chainmail\"\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"value\": \"gm4:empty\"\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:random_chance\",\n              \"chance\": 0.666\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/wither_skeleton/weapon.json",
    "content": "{\n  \"type\": \"minecraft:entity\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"minecraft:bow\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.4\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:item\",\n              \"name\": \"stone_sword\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/randomize_stats/damage.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": {\n                \"type\": \"minecraft:score\",\n                \"target\": {\n                    \"type\": \"minecraft:fixed\",\n                    \"name\": \"$mob_damage\"\n                },\n                \"score\": \"gm4_sr_data\",\n                \"scale\": 0.15\n            },\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                     \"name\": \"minecraft:stone\"\n                }\n            ]\n        },\n        {\n            \"rolls\": {\n                \"min\": 1,\n                \"max\": {\n                    \"type\": \"minecraft:score\",\n                    \"target\": {\n                        \"type\": \"minecraft:fixed\",\n                        \"name\": \"$mob_damage\"\n                    },\n                    \"score\": \"gm4_sr_data\",\n                    \"scale\": 0.35\n                }\n            },\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                     \"name\": \"minecraft:stone\"\n                }\n            ]\n        },\n        {\n            \"rolls\": {\n                \"type\": \"minecraft:binomial\",\n                \"n\": {\n                    \"type\": \"minecraft:score\",\n                    \"target\": {\n                        \"type\": \"minecraft:fixed\",\n                        \"name\": \"$mob_damage\"\n                    },\n                    \"score\": \"gm4_sr_data\",\n                    \"scale\": 0.5\n                },\n                \"p\": 0.5\n            },\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                     \"name\": \"minecraft:stone\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/randomize_stats/health.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": {\n                \"type\": \"minecraft:score\",\n                \"target\": {\n                    \"type\": \"minecraft:fixed\",\n                    \"name\": \"$mob_health\"\n                },\n                \"score\": \"gm4_sr_data\",\n                \"scale\": 0.5\n            },\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                     \"name\": \"minecraft:stone\"\n                }\n            ]\n        },\n        {\n            \"rolls\": {\n                \"type\": \"minecraft:binomial\",\n                \"n\": {\n                    \"type\": \"minecraft:score\",\n                    \"target\": {\n                        \"type\": \"minecraft:fixed\",\n                        \"name\": \"$mob_health\"\n                    },\n                    \"score\": \"gm4_sr_data\",\n                    \"scale\": 0.5\n                },\n                \"p\": 0.5\n            },\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                     \"name\": \"minecraft:stone\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/randomize_stats/speed.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": {\n                \"min\": 1,\n                \"max\": {\n                    \"type\": \"minecraft:score\",\n                    \"target\": {\n                        \"type\": \"minecraft:fixed\",\n                        \"name\": \"$mob_speed\"\n                    },\n                    \"score\": \"gm4_sr_data\",\n                    \"scale\": 0.5\n                }\n            },\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                     \"name\": \"minecraft:stone\"\n                }\n            ]\n        },\n        {\n            \"rolls\": {\n                \"type\": \"minecraft:binomial\",\n                \"n\": {\n                    \"type\": \"minecraft:score\",\n                    \"target\": {\n                        \"type\": \"minecraft:fixed\",\n                        \"name\": \"$mob_speed\"\n                    },\n                    \"score\": \"gm4_sr_data\",\n                    \"scale\": 0.5\n                },\n                \"p\": 0.5\n            },\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                     \"name\": \"minecraft:stone\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/technical/roll_damage.json",
    "content": "{\n    \"type\": \"minecraft:generic\",\n    \"pools\": [\n        {\n            \"rolls\": {\n                \"type\": \"minecraft:binomial\",\n                \"n\": {\n                    \"type\": \"minecraft:score\",\n                    \"target\": {\n                        \"type\": \"minecraft:fixed\",\n                        \"name\": \"$damage_opportunities\"\n                    },\n                    \"score\": \"gm4_sr_data\"\n                },\n                \"p\": {\n                    \"type\": \"minecraft:score\",\n                    \"target\": {\n                        \"type\": \"minecraft:fixed\",\n                        \"name\": \"$damage_chance\"\n                    },\n                    \"score\": \"gm4_sr_data\",\n                    \"scale\": 0.01\n                }\n            },\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:stone\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/has_weapon.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"mainhand\": {\n                \"items\": \"#gm4_survival_refightalized:weapon\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/material_check/chainmail.json",
    "content": "{\n  \"condition\": \"minecraft:random_chance\",\n  \"chance\": 0.45\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/material_check/copper.json",
    "content": "{\n  \"condition\": \"minecraft:random_chance\",\n  \"chance\": 0.25\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/material_check/diamond.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:value_check\",\n    \"value\": {\n      \"type\": \"minecraft:score\",\n      \"target\": {\n        \"type\": \"minecraft:fixed\",\n        \"name\": \"$difficulty\"\n      },\n      \"score\": \"gm4_sr_data\"\n    },\n    \"range\": {\n      \"min\": 25\n    }\n  },\n  {\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.0075\n  }\n]\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/material_check/golden.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:all_of\",\n        \"terms\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"biomes\": \"#minecraft:is_badlands\"\n            }\n          },\n          {\n            \"condition\": \"minecraft:random_chance\",\n            \"chance\": 0.30\n          }\n        ]\n      },\n      {\n        \"condition\": \"minecraft:all_of\",\n        \"terms\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:location_check\",\n              \"predicate\": {\n                \"biomes\": \"#minecraft:is_badlands\"\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:random_chance\",\n            \"chance\": 0.15\n          }\n        ]\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/material_check/iron.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:all_of\",\n        \"terms\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_survival_refightalized:mob/underground\"\n          },\n          {\n            \"condition\": \"minecraft:random_chance\",\n            \"chance\": 0.55\n          }\n        ]\n      },\n      {\n        \"condition\": \"minecraft:all_of\",\n        \"terms\": [\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_survival_refightalized:mob/underground\"\n            }\n          },\n          {\n            \"condition\": \"minecraft:random_chance\",\n            \"chance\": 0.35\n          }\n        ]\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/material_check/turtle_helmet.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.75\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n      \"fluid\": {\n        \"fluids\": \"#minecraft:water\"\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/underground.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:inverted\",\n    \"term\": {\n      \"condition\": \"minecraft:location_check\",\n      \"predicate\": {\n        \"block\": {\n          \"blocks\": \"#gm4:water\"\n        }\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetY\": 1,\n    \"predicate\": {\n      \"light\": {\n        \"light\": 0\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/technical/holding_vanilla_shield.json",
    "content": "{\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n        {\n            \"condition\": \"minecraft:all_of\",\n            \"terms\": [\n                {\n                    \"condition\": \"minecraft:entity_properties\",\n                    \"entity\": \"this\",\n                    \"predicate\": {\n                        \"equipment\": {\n                            \"mainhand\": {\n                                \"items\": \"shield\"\n                            }\n                        }\n                    }\n                },\n                {\n                    \"condition\": \"minecraft:inverted\",\n                    \"term\": {\n                        \"condition\": \"minecraft:entity_properties\",\n                        \"entity\": \"this\",\n                        \"predicate\": {\n                            \"equipment\": {\n                                \"mainhand\": {\n                                    \"predicates\": {\n                                        \"minecraft:custom_data\": {\n                                            \"gm4_survival_refightalized\": {}\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"condition\": \"minecraft:all_of\",\n            \"terms\": [\n                {\n                    \"condition\": \"minecraft:entity_properties\",\n                    \"entity\": \"this\",\n                    \"predicate\": {\n                        \"equipment\": {\n                            \"offhand\": {\n                                \"items\": \"shield\"\n                            }\n                        }\n                    }\n                },\n                {\n                    \"condition\": \"minecraft:inverted\",\n                    \"term\": {\n                        \"condition\": \"minecraft:entity_properties\",\n                        \"entity\": \"this\",\n                        \"predicate\": {\n                            \"equipment\": {\n                                \"offhand\": {\n                                    \"predicates\": {\n                                        \"minecraft:custom_data\": {\n                                            \"gm4_survival_refightalized\": {}\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/technical/in_witch_hut.json",
    "content": "{\n    \"condition\": \"minecraft:location_check\",\n    \"predicate\": {\n        \"structures\": \"minecraft:swamp_hut\"\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/technical/night_time.json",
    "content": "{\n  \"condition\": \"minecraft:time_check\",\n  \"clock\": \"minecraft:overworld\",\n  \"value\": {\n    \"min\": 13188,\n    \"max\": 23031\n  },\n  \"period\": 24000\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/technical/raining.json",
    "content": "{\n    \"condition\": \"minecraft:all_of\",\n    \"terms\": [\n        {\n            \"condition\": \"minecraft:weather_check\",\n            \"raining\": true\n        },\n        {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n                \"condition\": \"minecraft:reference\",\n                \"name\": \"gm4_survival_refightalized:mob/underground\"\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/technical/thundering.json",
    "content": "{\n    \"condition\": \"minecraft:all_of\",\n    \"terms\": [\n        {\n            \"condition\": \"minecraft:weather_check\",\n            \"thundering\": true\n        },\n        {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n                \"condition\": \"minecraft:reference\",\n                \"name\": \"gm4_survival_refightalized:mob/underground\"\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/damage_type/armor_piercing.json",
    "content": "{\n  \"values\": [\n    \"minecraft:cramming\",\n    \"minecraft:dragon_breath\",\n    \"minecraft:drown\",\n    \"minecraft:ender_pearl\",\n    \"minecraft:fall\",\n    \"minecraft:fly_into_wall\",\n    \"minecraft:freeze\",\n    \"minecraft:generic\",\n    \"minecraft:generic_kill\",\n    \"minecraft:in_wall\",\n    \"minecraft:indirect_magic\",\n    \"minecraft:magic\",\n    \"minecraft:on_fire\",\n    \"minecraft:out_of_world\",\n    \"minecraft:outside_border\",\n    \"minecraft:sonic_boom\",\n    \"minecraft:stalagmite\",\n    \"minecraft:starve\",\n    \"minecraft:wither\"\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/damage_type/combat.json",
    "content": "{\n    \"values\": [\n        \"minecraft:arrow\",\n        \"minecraft:bad_respawn_point\",\n        \"minecraft:dragon_breath\",\n        \"minecraft:falling_anvil\",\n        \"minecraft:falling_block\",\n        \"minecraft:falling_stalactite\",\n        \"minecraft:explosion\",\n        \"minecraft:hot_floor\",\n        \"minecraft:in_fire\",\n        \"minecraft:fireball\",\n        \"minecraft:lava\",\n        \"minecraft:magic\",\n        \"minecraft:fireworks\",\n        \"minecraft:indirect_magic\",\n        \"minecraft:lightning_bolt\",\n        \"minecraft:mob_attack_no_aggro\",\n        \"minecraft:out_of_world\",\n        \"minecraft:mob_attack\",\n        \"minecraft:mob_projectile\",\n        \"minecraft:player_attack\",\n        \"minecraft:player_explosion\",\n        \"minecraft:sonic_boom\",\n        \"minecraft:sting\",\n        \"minecraft:thorns\",\n        \"minecraft:thrown\",\n        \"minecraft:trident\",\n        \"minecraft:unattributed_fireball\",\n        \"minecraft:wither\",\n        \"minecraft:wither_skull\"\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/damage_type/ignore.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:bypasses_invulnerability\",\n        \"#minecraft:bypasses_resistance\"\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/entity_type/arrow.json",
    "content": "{\n    \"values\": [\n        \"minecraft:arrow\",\n        \"minecraft:spectral_arrow\",\n        \"minecraft:trident\"\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/entity_type/can_fire_arrows.json",
    "content": "{\n    \"values\": [\n        \"#gm4_survival_refightalized:skeleton_types\",\n        \"minecraft:drowned\",\n        \"minecraft:player\"\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/entity_type/modify.json",
    "content": "{\n    \"values\": [\n        \"minecraft:bogged\",\n        \"minecraft:cave_spider\",\n        \"minecraft:creeper\",\n        \"minecraft:drowned\",\n        \"minecraft:enderman\",\n        \"minecraft:husk\",\n        \"minecraft:parched\",\n        \"minecraft:phantom\",\n        \"minecraft:piglin\",\n        \"minecraft:piglin_brute\",\n        \"minecraft:silverfish\",\n        \"minecraft:skeleton\",\n        \"minecraft:spider\",\n        \"minecraft:stray\",\n        \"minecraft:wither_skeleton\",\n        \"minecraft:zombie\",\n        \"minecraft:zombie_villager\",\n        \"minecraft:zombified_piglin\"\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/entity_type/modify_in_air.json",
    "content": "{\n    \"values\": [\n        \"minecraft:cave_spider\",\n        \"minecraft:drowned\",\n        \"minecraft:phantom\",\n        \"minecraft:silverfish\"\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/entity_type/skeleton_types.json",
    "content": "{\n    \"values\": [\n        \"minecraft:bogged\",\n        \"minecraft:parched\",\n        \"minecraft:skeleton\",\n        \"minecraft:stray\",\n        \"minecraft:wither_skeleton\"\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/entity_type/zombie_types.json",
    "content": "{\n    \"values\": [\n        \"minecraft:drowned\",\n        \"minecraft:husk\",\n        \"minecraft:zombie\",\n        \"minecraft:zombie_villager\"\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/armor_break.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/armor_recharge_timer.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/damage_taken.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/equip/piglin.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/equip/skeleton.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/equip/wither_skeleton.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/equip/zombie.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/health_regeneration.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/health_regeneration_timer.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/init_difficulty.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/init_mob.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/player_fired_arrow.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/item/armor.json",
    "content": "{\n  \"values\": [\n    \"chainmail_boots\",\n    \"chainmail_chestplate\",\n    \"chainmail_helmet\",\n    \"chainmail_leggings\",\n    \"copper_boots\",\n    \"copper_chestplate\",\n    \"copper_helmet\",\n    \"copper_leggings\",\n    \"diamond_boots\",\n    \"diamond_chestplate\",\n    \"diamond_helmet\",\n    \"diamond_leggings\",\n    \"golden_boots\",\n    \"golden_chestplate\",\n    \"golden_helmet\",\n    \"golden_leggings\",\n    \"iron_boots\",\n    \"iron_chestplate\",\n    \"iron_helmet\",\n    \"iron_leggings\",\n    \"leather_boots\",\n    \"leather_chestplate\",\n    \"leather_helmet\",\n    \"leather_leggings\",\n    \"netherite_boots\",\n    \"netherite_chestplate\",\n    \"netherite_helmet\",\n    \"netherite_leggings\",\n    \"player_head\",\n    \"turtle_helmet\"\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/gm4_survival_refightalized/tags/item/weapon.json",
    "content": "{\n  \"values\": [\n    \"copper_axe\",\n    \"copper_pickaxe\",\n    \"copper_shovel\",\n    \"copper_sword\",\n    \"diamond_axe\",\n    \"diamond_pickaxe\",\n    \"diamond_shovel\",\n    \"diamond_sword\",\n    \"golden_axe\",\n    \"golden_pickaxe\",\n    \"golden_shovel\",\n    \"golden_sword\",\n    \"iron_axe\",\n    \"iron_pickaxe\",\n    \"iron_shovel\",\n    \"iron_sword\",\n    \"netherite_axe\",\n    \"netherite_pickaxe\",\n    \"netherite_shovel\",\n    \"netherite_sword\",\n    \"stone_axe\",\n    \"stone_pickaxe\",\n    \"stone_shovel\",\n    \"stone_sword\",\n    \"wooden_axe\",\n    \"wooden_pickaxe\",\n    \"wooden_shovel\",\n    \"wooden_sword\"\n  ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/minecraft/enchantment/blast_protection.json",
    "content": "{\n    \"description\": {\n        \"translate\": \"enchantment.minecraft.blast_protection\"\n    },\n    \"exclusive_set\": \"#minecraft:exclusive_set/armor\",\n    \"supported_items\": \"#minecraft:enchantable/armor\",\n    \"weight\": 2,\n    \"max_level\": 4,\n    \"min_cost\": {\n        \"base\": 5,\n        \"per_level_above_first\": 8\n    },\n    \"max_cost\": {\n        \"base\": 13,\n        \"per_level_above_first\": 8\n    },\n    \"anvil_cost\": 4,\n    \"slots\": [\n        \"armor\"\n    ],\n    \"effects\": {\n        \"minecraft:attributes\": [\n            {\n                \"id\": \"minecraft:enchantment.blast_protection\",\n                \"attribute\": \"minecraft:explosion_knockback_resistance\",\n                \"amount\": {\n                    \"type\": \"minecraft:linear\",\n                    \"base\": 0.15,\n                    \"per_level_above_first\": 0.15\n                },\n                \"operation\": \"add_value\"\n            }\n        ],\n        \"minecraft:damage_protection\": [\n            {\n                \"effect\": {\n                    \"type\": \"minecraft:add\",\n                    \"value\": {\n                        \"type\": \"minecraft:linear\",\n                        \"base\": 1,\n                        \"per_level_above_first\": 1\n                    }\n                },\n                \"requirements\": {\n                    \"condition\": \"minecraft:damage_source_properties\",\n                    \"predicate\": {\n                        \"tags\": [\n                            {\n                                \"id\": \"minecraft:is_explosion\",\n                                \"expected\": true\n                            },\n                            {\n                                \"id\": \"minecraft:bypasses_invulnerability\",\n                                \"expected\": false\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/minecraft/enchantment/fire_protection.json",
    "content": "{\n    \"description\": {\n        \"translate\": \"enchantment.minecraft.fire_protection\"\n    },\n    \"exclusive_set\": \"#minecraft:exclusive_set/armor\",\n    \"supported_items\": \"#minecraft:enchantable/armor\",\n    \"weight\": 5,\n    \"max_level\": 4,\n    \"min_cost\": {\n        \"base\": 10,\n        \"per_level_above_first\": 8\n    },\n    \"max_cost\": {\n        \"base\": 18,\n        \"per_level_above_first\": 8\n    },\n    \"anvil_cost\": 2,\n    \"slots\": [\n        \"armor\"\n    ],\n    \"effects\": {\n        \"minecraft:attributes\": [\n            {\n                \"id\": \"minecraft:enchantment.fire_protection\",\n                \"attribute\": \"minecraft:burning_time\",\n                \"amount\": {\n                    \"type\": \"minecraft:linear\",\n                    \"base\": -0.15,\n                    \"per_level_above_first\": -0.15\n                },\n                \"operation\": \"add_multiplied_base\"\n            }\n        ],\n        \"minecraft:damage_protection\": [\n            {\n                \"effect\": {\n                    \"type\": \"minecraft:add\",\n                    \"value\": {\n                        \"type\": \"minecraft:linear\",\n                        \"base\": 1,\n                        \"per_level_above_first\": 1\n                    }\n                },\n                \"requirements\": {\n                    \"condition\": \"minecraft:all_of\",\n                    \"terms\": [\n                        {\n                            \"condition\": \"minecraft:damage_source_properties\",\n                            \"predicate\": {\n                                \"tags\": [\n                                    {\n                                        \"id\": \"minecraft:is_fire\",\n                                        \"expected\": true\n                                    },\n                                    {\n                                        \"id\": \"minecraft:bypasses_invulnerability\",\n                                        \"expected\": false\n                                    }\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        ]\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/minecraft/enchantment/projectile_protection.json",
    "content": "{\n    \"description\": {\n        \"translate\": \"enchantment.minecraft.projectile_protection\"\n    },\n    \"exclusive_set\": \"#minecraft:exclusive_set/armor\",\n    \"supported_items\": \"#minecraft:enchantable/armor\",\n    \"weight\": 5,\n    \"max_level\": 4,\n    \"min_cost\": {\n        \"base\": 3,\n        \"per_level_above_first\": 6\n    },\n    \"max_cost\": {\n        \"base\": 9,\n        \"per_level_above_first\": 6\n    },\n    \"anvil_cost\": 2,\n    \"slots\": [\n        \"armor\"\n    ],\n    \"effects\": {\n        \"minecraft:damage_protection\": [\n            {\n                \"effect\": {\n                    \"type\": \"minecraft:add\",\n                    \"value\": {\n                        \"type\": \"minecraft:linear\",\n                        \"base\": 1,\n                        \"per_level_above_first\": 1\n                    }\n                },\n                \"requirements\": {\n                    \"condition\": \"minecraft:damage_source_properties\",\n                    \"predicate\": {\n                        \"tags\": [\n                            {\n                                \"id\": \"minecraft:is_projectile\",\n                                \"expected\": true\n                            },\n                            {\n                                \"id\": \"minecraft:bypasses_invulnerability\",\n                                \"expected\": false\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/minecraft/enchantment/protection.json",
    "content": "{\n    \"description\": {\n        \"translate\": \"enchantment.minecraft.protection\"\n    },\n    \"exclusive_set\": \"#minecraft:exclusive_set/armor\",\n    \"supported_items\": \"#minecraft:enchantable/armor\",\n    \"weight\": 10,\n    \"max_level\": 4,\n    \"min_cost\": {\n        \"base\": 1,\n        \"per_level_above_first\": 11\n    },\n    \"max_cost\": {\n        \"base\": 12,\n        \"per_level_above_first\": 11\n    },\n    \"anvil_cost\": 1,\n    \"slots\": [\n        \"armor\"\n    ],\n    \"effects\": {\n        \"minecraft:damage_protection\": [\n            {\n                \"effect\": {\n                    \"type\": \"minecraft:add\",\n                    \"value\": {\n                        \"type\": \"minecraft:linear\",\n                        \"base\": 0.5,\n                        \"per_level_above_first\": 0.5\n                    }\n                },\n                \"requirements\": {\n                    \"condition\": \"minecraft:damage_source_properties\",\n                    \"predicate\": {\n                        \"tags\": [\n                            {\n                                \"id\": \"minecraft:bypasses_invulnerability\",\n                                \"expected\": false\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    }\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/data/minecraft/tags/damage_type/bypasses_armor.json",
    "content": "{\n    \"replace\": false,\n    \"values\": [\n      \"minecraft:arrow\",\n      \"minecraft:bad_respawn_point\",\n      \"minecraft:cactus\",\n      \"minecraft:campfire\",\n      \"minecraft:cramming\",\n      \"minecraft:dragon_breath\",\n      \"minecraft:drown\",\n      \"minecraft:dry_out\",\n      \"minecraft:explosion\",\n      \"minecraft:fall\",\n      \"minecraft:falling_anvil\",\n      \"minecraft:falling_block\",\n      \"minecraft:falling_stalactite\",\n      \"minecraft:fireball\",\n      \"minecraft:fireworks\",\n      \"minecraft:fireworks\",\n      \"minecraft:fly_into_wall\",\n      \"minecraft:freeze\",\n      \"minecraft:generic\",\n      \"minecraft:generic_kill\",\n      \"minecraft:hot_floor\",\n      \"minecraft:in_fire\",\n      \"minecraft:in_wall\",\n      \"minecraft:indirect_magic\",\n      \"minecraft:lava\",\n      \"minecraft:lightning_bolt\",\n      \"minecraft:magic\",\n      \"minecraft:mob_attack\",\n      \"minecraft:mob_attack_no_aggro\",\n      \"minecraft:mob_projectile\",\n      \"minecraft:on_fire\",\n      \"minecraft:out_of_world\",\n      \"minecraft:outside_border\",\n      \"minecraft:player_attack\",\n      \"minecraft:player_explosion\",\n      \"minecraft:sonic_boom\",\n      \"minecraft:spit\",\n      \"minecraft:stalagmite\",\n      \"minecraft:starve\",\n      \"minecraft:sting\",\n      \"minecraft:sweet_berry_bush\",\n      \"minecraft:thorns\",\n      \"minecraft:thrown\",\n      \"minecraft:trident\",\n      \"minecraft:unattributed_fireball\",\n      \"minecraft:wind_charge\",\n      \"minecraft:wither\",\n      \"minecraft:wither_skull\"\n    ]\n  }\n  "
  },
  {
    "path": "gm4_survival_refightalized/data/minecraft/tags/damage_type/bypasses_shield.json",
    "content": "{\n    \"replace\": true,\n    \"values\": [\n        \"minecraft:cramming\",\n        \"minecraft:dragon_breath\",\n        \"minecraft:drown\",\n        \"minecraft:ender_pearl\",\n        \"minecraft:fall\",\n        \"minecraft:fly_into_wall\",\n        \"minecraft:freeze\",\n        \"minecraft:generic\",\n        \"minecraft:generic_kill\",\n        \"minecraft:in_wall\",\n        \"minecraft:indirect_magic\",\n        \"minecraft:magic\",\n        \"minecraft:on_fire\",\n        \"minecraft:out_of_world\",\n        \"minecraft:outside_border\",\n        \"minecraft:sonic_boom\",\n        \"minecraft:stalagmite\",\n        \"minecraft:starve\",\n        \"minecraft:wither\",\n\n        \"minecraft:cactus\",\n        \"minecraft:campfire\",\n        \"minecraft:dry_out\",\n        \"minecraft:falling_anvil\",\n        \"minecraft:falling_stalactite\",\n        \"minecraft:hot_floor\",\n        \"minecraft:in_fire\",\n        \"minecraft:lava\",\n        \"minecraft:lightning_bolt\",\n        \"minecraft:sweet_berry_bush\"\n    ]\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/mod.mcdoc",
    "content": "use ::java::util::slot::SlottedItem\nuse ::java::util::effect::MobEffectInstance\n\ndispatch minecraft:storage[gm4_survival_refightalized:temp] to struct {\n  picked_stat?: struct {\n    damage_capped?: float,\n    health?: float,\n    damage?: float,\n    speed?: float,\n  },\n  set?: struct {\n    armor_reduction?: float,\n    damage?: int,\n    absorption_reduction?: float,\n  },\n  parry?: struct {\n    damage?: float,\n  },\n  heal_player?: struct {\n    remove_health?: float,\n  },\n  reapply_resistance?: struct {\n    ...MobEffectInstance,\n    show_icon: (boolean | \"true\" | \"false\"),\n    duration_set: (int | \"infinite\"),\n  },\n  Items?: [SlottedItem<byte>],\n  Item?: SlottedItem<byte>,\n  active_effects: [MobEffectInstance],\n}\n"
  },
  {
    "path": "gm4_survival_refightalized/translations.csv",
    "content": "key,en_us\nadvancement.gm4.survival_refightalized.armor_damage.title,Armor Up!\nadvancement.gm4.survival_refightalized.armor_damage.description,Discover that Armor works a bit differently now\nadvancement.gm4.survival_refightalized.parry.title,Not Today\nadvancement.gm4.survival_refightalized.parry.description,Parry with a Shield by blocking just before an attack\nadvancement.gm4.survival_refightalized.parry_lethal_damage.title,\"Not Today, Either\"\nadvancement.gm4.survival_refightalized.parry_lethal_damage.description,Block lethal damage with a Shield Parry\nitem.gm4.survival_refightalized.lore.wither_arrow,Arrow of Wither\ntext.gm4.survival_refightalized.death, ran out of health\ntext.gm4.guidebook.module_desc.survival_refightalized,A reworked survival experience with more varied mobs and new armor and shield mechanics.\ntext.gm4.guidebook.survival_refightalized.description.health,\"Damage taken is split in combat and non-combat damage.\\nCombat damage regenerates every 60 seconds, while non-combat damage regenerates rapidly when out of combat.\"\ntext.gm4.guidebook.survival_refightalized.description.mobs,\"Mobs are stronger based on their environment, such as being outside during a thunderstorm or full moon, or being deep underground.\\nSome mobs are altered, such as Skeletons firing slower, and Phantoms drowning.\"\ntext.gm4.guidebook.survival_refightalized.description.armor,\"Armor no longer reduces damage taken, instead serving as a second health bar. Armor recharges rapidly shortly after it takes damage.\\nProtection enchantments have reduced effectiveness.\"\ntext.gm4.guidebook.survival_refightalized.description.shield,\"Shields will go on cooldown after blocking any damage.\\n\\nBlocking damage within 0.25s of holding the Shield performs a Parry, releasing the Shield within that 0.25s will not disable it.\"\n"
  },
  {
    "path": "gm4_sweethearts/README.md",
    "content": "# Sweethearts<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nUse the power of Flowers to share your health to friends who may be a bit low. <!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Gather any Flower (except a Wither Rose) and sneak next to another player\r\n- If they are lower on health than you, they will receive some of your hearts\r\n"
  },
  {
    "path": "gm4_sweethearts/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.sweethearts.title,Selfless\nadvancement.gm4.sweethearts.description,Give your last heart to another\ntext.gm4.guidebook.module_desc.sweethearts,Transfer your health to another player using flowers.\ntext.gm4.guidebook.sweethearts.description,Sneaking while holding a small flower will transfer health to a nearby ally in need.\\n\\nAll small flowers work.\n"
  },
  {
    "path": "gm4_sweethearts/beet.yaml",
    "content": "id: gm4_sweethearts\nname: Sweethearts\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    model_data:\n      - item: poppy\n        reference: gui/advancement/sweethearts\n        template: advancement\n    website:\n      description: Transfer your health to another player using flowers.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: z33oiJCd\n    planetminecraft: \n      uid: 5484554\n    video: https://www.youtube.com/watch?v=mcopNZzY2dA\n    wiki: https://wiki.gm4.co/wiki/Sweethearts\n    credits:\n      Creator:\n        - The8BitMonkey\n      Updated by:\n        - BPR\n        - Djones\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_sweethearts/data/gm4/advancement/sweethearts.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"poppy\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_sweethearts:gui/advancement/sweethearts\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.sweethearts.title\",\n      \"fallback\": \"Selfless\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.sweethearts.description\",\n      \"fallback\": \"Give your last heart to another\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"sweethearts\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_sweethearts/data/gm4_sweethearts/function/delayed_revert.mcfunction",
    "content": "# @s = none\n# at undefined\n# scheduled from transfer_recipient\n\nexecute as @a[tag=gm4_sh_revert_health] run function gm4_sweethearts:revert_health\n"
  },
  {
    "path": "gm4_sweethearts/data/gm4_sweethearts/function/get_health.mcfunction",
    "content": "# @s = players near sneaking player holding flower (including player holding flower)\n# at player holding flower\n# run from transferring\n\n# get max health of player\nexecute store result score @s gm4_sh_data run attribute @s minecraft:max_health get\n\n# get current player health\n# health is stored as float, but displayed rounded up as integer (half hearts)\n# these commands copy that by multiplying by 10, adding 9 and dividing by 10 again\n# this can cause players to give/get more than 0.5f health\nexecute store result score @s gm4_sh_health run data get entity @s Health 10\nscoreboard players add @s gm4_sh_health 9\nscoreboard players operation @s gm4_sh_health /= #10 gm4_sh_health\n"
  },
  {
    "path": "gm4_sweethearts/data/gm4_sweethearts/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_sh_health dummy\nscoreboard objectives add gm4_sh_data dummy\nscoreboard players set #10 gm4_sh_health 10 \n\nexecute unless score sweethearts gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Sweethearts\"}\nexecute unless score sweethearts gm4_earliest_version < sweethearts gm4_modules run scoreboard players operation sweethearts gm4_earliest_version = sweethearts gm4_modules\nscoreboard players set sweethearts gm4_modules 1\n\nschedule function gm4_sweethearts:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_sweethearts/data/gm4_sweethearts/function/kill_donor.mcfunction",
    "content": "# @s = sneaking player donating health\n# at @s\n# run from transfer_donor\n\nadvancement grant @s only gm4:sweethearts\nexecute if score $deathmessage gm4_sh_data matches 1 run tellraw @a [{\"text\":\"\",\"color\":\"white\"},{\"selector\":\"@s\"},{\"text\":\" was shot through the heart and \"},{\"selector\":\"@p[tag=gm4_sh_recipient]\"},{\"text\":\" was to blame\"}]\n"
  },
  {
    "path": "gm4_sweethearts/data/gm4_sweethearts/function/main.mcfunction",
    "content": "# @s = none\n# at undefined\n# scheduled from init and self\n\nexecute as @a[gamemode=!creative,gamemode=!spectator,predicate=gm4_sweethearts:valid_donor] at @s run function gm4_sweethearts:transferring\n\nschedule function gm4_sweethearts:main 16t\n"
  },
  {
    "path": "gm4_sweethearts/data/gm4_sweethearts/function/revert_health.mcfunction",
    "content": "# @s = player that received health, tagged with gm4_sh_revert_health\n# at undefined\n# run from delayed_revert\n\n# revert max health\nattribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_512\nattribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_256\nattribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_128\nattribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_64\nattribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_32\nattribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_16\nattribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_8\nattribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_4\nattribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_2\nattribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_1\n\nattribute @s minecraft:max_health modifier remove gm4_sweethearts:health_add_1\n\ntag @s remove gm4_sh_revert_health\n"
  },
  {
    "path": "gm4_sweethearts/data/gm4_sweethearts/function/transfer_donor.mcfunction",
    "content": "# @s = sneaking player donating health\n# at @s\n# run from transfer_recipient\n\n# turn off death messages for potential death\nexecute store result score $deathmessage gm4_sh_data run gamerule show_death_messages\ngamerule show_death_messages false\n\n# damage player\ndamage @s 1 magic by @s\n\n# handle death (@e only selects entities which are alive)\nexecute at @s unless entity @e[type=player,tag=gm4_sh_donor,distance=0,limit=1] run function gm4_sweethearts:kill_donor\n\n# re-enable death messages\nexecute if score $deathmessage gm4_sh_data matches 1 run gamerule show_death_messages true\nscoreboard players reset $deathmessage gm4_sh_data\n\n# visuals\nparticle damage_indicator ~ ~2 ~ 0 0 0 .255 5\nplaysound minecraft:entity.player.hurt player @a[distance=..8] ~ ~ ~ 1 1\n"
  },
  {
    "path": "gm4_sweethearts/data/gm4_sweethearts/function/transfer_recipient.mcfunction",
    "content": "# @s = player near a sneaking player holding flower\n# at @s\n# run from transferring\n\n# tag player, for selection in death message of donor\ntag @s add gm4_sh_recipient\n\n# run donor transfer\nexecute as @p[tag=gm4_sh_donor,distance=..3] at @s run function gm4_sweethearts:transfer_donor\n\n# calculate amount of max_health to remove to get to current health\nexecute store result score $remove_health gm4_sh_data run attribute @s minecraft:max_health get\nscoreboard players operation $remove_health gm4_sh_data -= @s gm4_sh_health\n\n# lower player's max health to their current health\nexecute if score $remove_health gm4_sh_data matches 512.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_512 -512 add_value\nexecute if score $remove_health gm4_sh_data matches 512.. run scoreboard players remove $remove_health gm4_sh_data 512\nexecute if score $remove_health gm4_sh_data matches 256.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_256 -256 add_value\nexecute if score $remove_health gm4_sh_data matches 256.. run scoreboard players remove $remove_health gm4_sh_data 256\nexecute if score $remove_health gm4_sh_data matches 128.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_128 -128 add_value\nexecute if score $remove_health gm4_sh_data matches 128.. run scoreboard players remove $remove_health gm4_sh_data 128\nexecute if score $remove_health gm4_sh_data matches 64.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_64 -64 add_value\nexecute if score $remove_health gm4_sh_data matches 64.. run scoreboard players remove $remove_health gm4_sh_data 64\nexecute if score $remove_health gm4_sh_data matches 32.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_32 -32 add_value\nexecute if score $remove_health gm4_sh_data matches 32.. run scoreboard players remove $remove_health gm4_sh_data 32\nexecute if score $remove_health gm4_sh_data matches 16.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_16 -16 add_value\nexecute if score $remove_health gm4_sh_data matches 16.. run scoreboard players remove $remove_health gm4_sh_data 16\nexecute if score $remove_health gm4_sh_data matches 8.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_8 -8 add_value\nexecute if score $remove_health gm4_sh_data matches 8.. run scoreboard players remove $remove_health gm4_sh_data 8\nexecute if score $remove_health gm4_sh_data matches 4.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_4 -4 add_value\nexecute if score $remove_health gm4_sh_data matches 4.. run scoreboard players remove $remove_health gm4_sh_data 4\nexecute if score $remove_health gm4_sh_data matches 2.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_2 -2 add_value\nexecute if score $remove_health gm4_sh_data matches 2.. run scoreboard players remove $remove_health gm4_sh_data 2\nexecute if score $remove_health gm4_sh_data matches 1.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_1 -1 add_value\nexecute if score $remove_health gm4_sh_data matches 1.. run scoreboard players remove $remove_health gm4_sh_data 1\n\n# heal player\nattribute @s minecraft:max_health modifier add gm4_sweethearts:health_add_1 1 add_value\neffect give @s minecraft:instant_health 1 0 true\n\n# revert max health\ntag @s add gm4_sh_revert_health\nschedule function gm4_sweethearts:delayed_revert 1t\n\n# visuals\nparticle heart ~ ~2 ~ 0.2 0.2 0.2 1 2\n\ntag @s remove gm4_sh_recipient\n"
  },
  {
    "path": "gm4_sweethearts/data/gm4_sweethearts/function/transferring.mcfunction",
    "content": "# @s = sneaking player holding flower\n# at @s\n# run from main\n\ntag @s add gm4_sh_donor\n\n# get max and current health of players\nexecute as @a[gamemode=!creative,gamemode=!spectator,distance=..3] run function gm4_sweethearts:get_health\n\n# transfer health to nearest player\nexecute as @p[gamemode=!creative,gamemode=!spectator,tag=!gm4_sh_donor,distance=..3,predicate=!gm4_sweethearts:valid_donor] if score @s gm4_sh_health < @s gm4_sh_data at @s run function gm4_sweethearts:transfer_recipient\n\ntag @s remove gm4_sh_donor\n"
  },
  {
    "path": "gm4_sweethearts/data/gm4_sweethearts/guidebook/sweethearts.json",
    "content": "{\n  \"id\": \"sweethearts\",\n  \"name\": \"Sweethearts\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:poppy\"\n  },\n  \"criteria\": {\n    \"obtain_flower\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:small_flowers\"\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_flower\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.sweethearts.description\",\n            \"fallback\": \"Sneaking while holding a small flower will transfer health to a nearby ally in need.\\n\\nAll small flowers work.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_sweethearts/data/gm4_sweethearts/predicate/valid_donor.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"flags\": {\n      \"is_sneaking\": true\n    },\n    \"slots\": {\n      \"weapon.*\": {\n        \"items\": \"#minecraft:small_flowers\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/README.md",
    "content": "# Teleportation Anchors<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nSuppress and control chorus-based teleportation within a radius of an anchor!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Allows the jamming of most types of teleportation (Enderman, Shulker, eating Chorus Fruit)\r\n- Teleportation when blocked can be redirected to an anchor if connected to the jammer's multi-block structure\r\n\r\nA full list of blocked teleportation can be read on the [Wiki](https://gm4.co/modules/teleportation-anchors).\r\n"
  },
  {
    "path": "gm4_teleportation_anchors/assets/gm4_teleportation_anchors/models/block/teleportation_jammer.json",
    "content": "{\n\t\"textures\": {\n\t\t\"eye_top\": \"gm4_teleportation_anchors:block/eye_top\",\n\t\t\"eye_side1\": \"gm4_teleportation_anchors:block/eye_side1\",\n\t\t\"eye_side2\": \"gm4_teleportation_anchors:block/eye_side2\",\n\t\t\"eye_side3\": \"gm4_teleportation_anchors:block/eye_side3\",\n\t\t\"eye_side4\": \"gm4_teleportation_anchors:block/eye_side4\",\n\t\t\"top\": \"gm4_teleportation_anchors:block/teleportation_jammer_top\",\n\t\t\"particle\": \"gm4_teleportation_anchors:block/teleportation_jammer_side\",\n\t\t\"side\": \"gm4_teleportation_anchors:block/teleportation_jammer_side\",\n\t\t\"bottom\": \"minecraft:block/furnace_top\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t0\n\t\t\t],\n\t\t\t\"to\": [\n\t\t\t\t16,\n\t\t\t\t16,\n\t\t\t\t16\n\t\t\t],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\n\t\t\t\t\t\"uv\": [\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t16,\n\t\t\t\t\t\t16\n\t\t\t\t\t],\n\t\t\t\t\t\"texture\": \"#side\"\n\t\t\t\t},\n\t\t\t\t\"east\": {\n\t\t\t\t\t\"uv\": [\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t16,\n\t\t\t\t\t\t16\n\t\t\t\t\t],\n\t\t\t\t\t\"texture\": \"#side\"\n\t\t\t\t},\n\t\t\t\t\"south\": {\n\t\t\t\t\t\"uv\": [\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t16,\n\t\t\t\t\t\t16\n\t\t\t\t\t],\n\t\t\t\t\t\"texture\": \"#side\"\n\t\t\t\t},\n\t\t\t\t\"west\": {\n\t\t\t\t\t\"uv\": [\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t16,\n\t\t\t\t\t\t16\n\t\t\t\t\t],\n\t\t\t\t\t\"texture\": \"#side\"\n\t\t\t\t},\n\t\t\t\t\"up\": {\n\t\t\t\t\t\"uv\": [\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t16,\n\t\t\t\t\t\t16\n\t\t\t\t\t],\n\t\t\t\t\t\"rotation\": 180,\n\t\t\t\t\t\"texture\": \"#top\"\n\t\t\t\t},\n\t\t\t\t\"down\": {\n\t\t\t\t\t\"uv\": [\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t16,\n\t\t\t\t\t\t16\n\t\t\t\t\t],\n\t\t\t\t\t\"texture\": \"#bottom\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [\n\t\t\t\t5,\n\t\t\t\t16,\n\t\t\t\t5\n\t\t\t],\n\t\t\t\"to\": [\n\t\t\t\t11,\n\t\t\t\t21,\n\t\t\t\t11\n\t\t\t],\n\t\t\t\"rotation\": {\n\t\t\t\t\"angle\": 0,\n\t\t\t\t\"axis\": \"y\",\n\t\t\t\t\"origin\": [\n\t\t\t\t\t7,\n\t\t\t\t\t18,\n\t\t\t\t\t7\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\n\t\t\t\t\t\"uv\": [\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t12,\n\t\t\t\t\t\t10\n\t\t\t\t\t],\n\t\t\t\t\t\"texture\": \"#eye_side1\"\n\t\t\t\t},\n\t\t\t\t\"east\": {\n\t\t\t\t\t\"uv\": [\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t12,\n\t\t\t\t\t\t10\n\t\t\t\t\t],\n\t\t\t\t\t\"texture\": \"#eye_side4\"\n\t\t\t\t},\n\t\t\t\t\"south\": {\n\t\t\t\t\t\"uv\": [\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t12,\n\t\t\t\t\t\t10\n\t\t\t\t\t],\n\t\t\t\t\t\"texture\": \"#eye_side3\"\n\t\t\t\t},\n\t\t\t\t\"west\": {\n\t\t\t\t\t\"uv\": [\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t12,\n\t\t\t\t\t\t10\n\t\t\t\t\t],\n\t\t\t\t\t\"texture\": \"#eye_side2\"\n\t\t\t\t},\n\t\t\t\t\"up\": {\n\t\t\t\t\t\"uv\": [\n\t\t\t\t\t\t12,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t12\n\t\t\t\t\t],\n\t\t\t\t\t\"texture\": \"#eye_top\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t],\n\t\"display\": {\n\t\t\"thirdperson_righthand\": {\n\t\t\t\"rotation\": [\n\t\t\t\t75,\n\t\t\t\t45,\n\t\t\t\t0\n\t\t\t],\n\t\t\t\"translation\": [\n\t\t\t\t0,\n\t\t\t\t2.5,\n\t\t\t\t0\n\t\t\t],\n\t\t\t\"scale\": [\n\t\t\t\t0.375,\n\t\t\t\t0.375,\n\t\t\t\t0.375\n\t\t\t]\n\t\t},\n\t\t\"firstperson_righthand\": {\n\t\t\t\"rotation\": [\n\t\t\t\t0,\n\t\t\t\t45,\n\t\t\t\t0\n\t\t\t],\n\t\t\t\"scale\": [\n\t\t\t\t0.4,\n\t\t\t\t0.4,\n\t\t\t\t0.4\n\t\t\t]\n\t\t},\n\t\t\"firstperson_lefthand\": {\n\t\t\t\"rotation\": [\n\t\t\t\t0,\n\t\t\t\t225,\n\t\t\t\t0\n\t\t\t],\n\t\t\t\"scale\": [\n\t\t\t\t0.4,\n\t\t\t\t0.4,\n\t\t\t\t0.4\n\t\t\t]\n\t\t},\n\t\t\"ground\": {\n\t\t\t\"translation\": [\n\t\t\t\t0,\n\t\t\t\t3,\n\t\t\t\t0\n\t\t\t],\n\t\t\t\"scale\": [\n\t\t\t\t0.25,\n\t\t\t\t0.25,\n\t\t\t\t0.25\n\t\t\t]\n\t\t},\n\t\t\"gui\": {\n\t\t\t\"rotation\": [\n\t\t\t\t30,\n\t\t\t\t225,\n\t\t\t\t0\n\t\t\t],\n\t\t\t\"scale\": [\n\t\t\t\t0.625,\n\t\t\t\t0.625,\n\t\t\t\t0.625\n\t\t\t]\n\t\t},\n\t\t\"head\": {\n\t\t\t\"translation\": [\n\t\t\t\t0,\n\t\t\t\t-18.32,\n\t\t\t\t0\n\t\t\t],\n\t\t\t\"scale\": [\n\t\t\t\t2.288,\n\t\t\t\t2.288,\n\t\t\t\t2.288\n\t\t\t]\n\t\t},\n\t\t\"fixed\": {\n\t\t\t\"scale\": [\n\t\t\t\t0.5,\n\t\t\t\t0.5,\n\t\t\t\t0.5\n\t\t\t]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/assets/gm4_teleportation_anchors/textures/block/eye_side1.png.mcmeta",
    "content": "{\n  \"animation\": {\n    \"frametime\": 2,\n\t\"frames\": [\n\t\t0,\n\t\t{ \"index\": 1,\n\t\t\"time\": 10 },\n\t\t{ \"index\": 0,\n\t\t\"time\": 8 },\n\t\t{ \"index\": 1,\n\t\t\"time\": 8 },\t\n\t\t0,\n\t\t12,\n\t\t11,\n\t\t{ \"index\": 10,\n\t\t\"time\": 32 },\n\t\t11,\n\t\t12,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t{ \"index\": 4,\n\t\t\"time\": 30 },\t\n\t\t5,\n\t\t6,\n\t\t{ \"index\": 7,\n\t\t\"time\": 30 },\n\t\t8,\n\t\t9,\n\t\t10,\n\t\t11,\n\t\t12\n\t\t]\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/assets/gm4_teleportation_anchors/textures/block/eye_side2.png.mcmeta",
    "content": "{\n  \"animation\": {\n    \"frametime\": 2,\n\t\"frames\": [\n\t\t{ \"index\": 10,\n\t\t\"time\": 30 },\n\t\t9,\n\t\t8,\n\t\t{ \"index\": 7,\n\t\t\"time\": 32 },\n\t\t8,\n\t\t9,\n\t\t10,\n\t\t11,\n\t\t12,\n\t\t{ \"index\": 0,\n\t\t\"time\": 8 },\t\n\t\t{ \"index\": 1,\n\t\t\"time\": 10 },\n\t\t{ \"index\": 0,\n\t\t\"time\": 10 },\t\t\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t{ \"index\": 4,\n\t\t\"time\": 30 },\n\t\t5,\n\t\t6,\n\t\t7,\n\t\t8,\n\t\t9\n\t\t]\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/assets/gm4_teleportation_anchors/textures/block/eye_side3.png.mcmeta",
    "content": "{\n  \"animation\": {\n    \"frametime\": 2,\n\t\"frames\": [\n\t\t{ \"index\": 7,\n\t\t\"time\": 30 },\n\t\t6,\n\t\t5,\n\t\t{ \"index\": 4,\n\t\t\"time\": 32 },\n\t\t5,\n\t\t6,\n\t\t7,\n\t\t8,\n\t\t9,\n\t\t{ \"index\": 10,\n\t\t\"time\": 30 },\t\n\t\t11,\n\t\t12,\n\t\t0,\n\t\t{ \"index\": 1,\n\t\t\"time\": 12 },\n\t\t{ \"index\": 0,\n\t\t\"time\": 14 },\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6\n\t\t]\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/assets/gm4_teleportation_anchors/textures/block/eye_side4.png.mcmeta",
    "content": "{\n  \"animation\": {\n    \"frametime\": 2,\n\t\"frames\": [\n\t\t{ \"index\": 4,\n\t\t\"time\": 30 },\n\t\t3,\n\t\t2,\n\t\t{ \"index\": 1,\n\t\t\"time\": 14 },\n\t\t{ \"index\": 0,\n\t\t\"time\": 16 },\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6,\n\t\t{ \"index\": 7,\n\t\t\"time\": 30 },\t\n\t\t8,\n\t\t9,\n\t\t{ \"index\": 10,\n\t\t\"time\": 30 },\n\t\t11,\n\t\t12,\n\t\t1,\n\t\t2,\n\t\t3\n\t\t]\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/assets/translations.csv",
    "content": "key,en_us\nblock.gm4.teleportation_jammer,Teleportation Jammer\nblock.gm4.teleportation_anchor,Teleportation Anchor\ncontainer.gm4.teleportation_jammer,Teleportation Jammer\nadvancement.gm4.teleportation_anchors_anchor.title,\"Pinpoint Location\"\nadvancement.gm4.teleportation_anchors_anchor.description,\"Make a teleportation anchor to remove the randomness of chorus\"\nadvancement.gm4.teleportation_anchors_jammer.title,\"Make Some Noise\"\nadvancement.gm4.teleportation_anchors_jammer.description,\"Create a device to stop chorus in its tracks\"\ntext.gm4.guidebook.module_desc.teleportation_anchors,Suppress and control chorus-based teleportation!\ntext.gm4.guidebook.teleportation_jammer.description,Teleportation Jammers and Anchors can be used to supress and control chorus-based teleportation.\\n\\nThey can be crafted in a crafting table.\ntext.gm4.guidebook.teleportation_anchors.crafting_jammer,A Teleportation Jammer can be crafted in a crafting table:\ntext.gm4.guidebook.teleportation_anchors.jamming,\"A Teleportation Jammer is used to suppress chorus based teleportation.\\n\\nThis includes endermen, shulkers, chorus fruit, end gateways, and other random teleportation that doesn't require line-of-sight.\"\ntext.gm4.guidebook.teleportation_anchors.jammer_effects,\"When entities are jammed, any act of teleportation will cause them to jump back to their original location.\\n\\nWhen endermen are jammed, they are also prevented from picking up blocks.\"\ntext.gm4.guidebook.teleportation_anchors.jammer_power,\"In order for a TP Jammer to work, it needs to broadcast a signal through an end rod placed on top of it.\\n\\nChorus fruit must be placed inside the jammer as fuel. Five fruit is enough for two days.\"\ntext.gm4.guidebook.teleportation_anchors.jammer_range,\"Similar to a beacon, a pyramid of purpur blocks can be build to extend the range of a jammer.\\n\\nThe range can be either 4, 16, 32, or 64 blocks in radius, acheived by 0-3 layers of a pyramid.\"\ntext.gm4.guidebook.teleportation_anchors.crafting_anchor,A Teleportation Jammer can be used to craft an Anchor:\ntext.gm4.guidebook.teleportation_anchors.anchor_usage,\"A Teleportation Anchor is used to control chorus based teleportation.\\n\\nIf a Jammer is connected to an anchor, teleporters will be teleported to the anchor instead of being jammed to their original location.\"\ntext.gm4.guidebook.teleportation_anchors.pupur_wires,A Jammer can be connected to an Anchor using purpur pillars.\\n\\nThe pillars need to go from the bottom of a TP Jammer and eventually lead into a TP Anchor.\ntext.gm4.guidebook.teleportation_anchors.pupur_wires_1,\"If a purpur pillar points into a T-Junction, it will prioritize moving in the North, West, or Down direction.\\n\\nThese wires can be at most 64 blocks long.\"\ntext.gm4.guidebook.teleportation_anchors.chorus_fruit_cooldown,\"If a user eats chorus fruit, they can also be teleported to an anchor, but must wait some time before doing so again.\\n\\nIf they try to teleport during this cooldown, they will just be jammed.\"\n"
  },
  {
    "path": "gm4_teleportation_anchors/beet.yaml",
    "content": "id: gm4_teleportation_anchors\nname: Teleportation Anchors\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_machines\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_machines: 1.5.0\n      schedule_loops:\n        - main\n        - tick\n    model_data:\n      - item: player_head\n        reference: item/teleportation_anchor\n        model: block/teleportation_anchor\n      - item: end_portal_frame\n        reference: block/teleportation_anchor\n        template: legacy_machine_block\n        textures:\n          top: block/teleportation_anchor_top\n          side: block/teleportation_anchor_side\n          front: block/teleportation_anchor_side\n          bottom: block/teleportation_anchor_bottom\n      - item: player_head\n        reference: item/teleportation_jammer\n        model: block/teleportation_jammer\n      - item: purpur_pillar\n        reference: block/teleportation_jammer\n        template: custom\n      - item: end_rod\n        reference: gui/advancement/teleportation_jammer\n        template:\n          name: advancement\n          forward: block/teleportation_jammer\n      - item: lodestone\n        reference: gui/advancement/teleportation_anchor\n        template:\n          name: advancement\n          forward: block/teleportation_anchor\n    gui_fonts:\n      - translation: gui.gm4.teleportation_jammer\n        container: dropper\n        texture: gui/container/teleportation_jammer\n    website:\n      description: Suppress and control chorus-based teleportation!\n      recommended:\n        - gm4_orb_of_ankou\n        - gm4_zauber_cauldrons\n      notes: []\n    modrinth:\n      project_id: CQkaELVA\n    wiki: https://wiki.gm4.co/wiki/Teleportation_Anchors\n    credits:\n      Creator:\n        - BPR\n      Updated By:\n        - runcows\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4/advancement/teleportation_anchors_anchor.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:lodestone\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_teleportation_anchors:gui/advancement/teleportation_anchor\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.teleportation_anchors_anchor.title\",\n      \"fallback\": \"Pinpoint Location\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.teleportation_anchors_anchor.description\",\n      \"fallback\": \"Make a teleportation anchor to remove the randomness of chorus\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:teleportation_anchors_jammer\",\n  \"criteria\": {\n    \"impossible\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4/advancement/teleportation_anchors_jammer.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:end_rod\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_teleportation_anchors:gui/advancement/teleportation_jammer\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.teleportation_anchors_jammer.title\",\n      \"fallback\": \"Make Some Noise\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.teleportation_anchors_jammer.description\",\n      \"fallback\": \"Create a device to stop chorus in its tracks\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"impossible\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_machines/tags/function/destroy.json",
    "content": "{\n    \"values\": [\n        \"gm4_teleportation_anchors:machine/verify_destroy\"\n    ]\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_machines/tags/function/place_down.json",
    "content": "{\n    \"values\": [\n        \"gm4_teleportation_anchors:machine/verify_place_down\"\n    ]\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_orb_of_ankou/tags/function/pneumas/expeditious/tp_player.json",
    "content": "{\n    \"values\": [\n        \"gm4_teleportation_anchors:player/resolve_used_chorus\"\n    ]\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/advancement/consume_chorus.json",
    "content": "{\n    \"criteria\": {\n        \"consume chorus\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"items\": [\n                        \"minecraft:chorus_fruit\"\n                    ]\n                }\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_teleportation_anchors:player/used_chorus\"\n    }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/advancement/enter_end_gateway.json",
    "content": "{\n    \"criteria\": {\n        \"entered_end_gateway\": {\n            \"trigger\": \"minecraft:enter_block\",\n            \"conditions\": {\n                \"block\": \"minecraft:end_gateway\"\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_teleportation_anchors:player/enter_end_gateway\"\n    }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/advancement/join.json",
    "content": "{\n    \"criteria\": {\n        \"first_join\": {\n            \"trigger\": \"minecraft:tick\"\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_teleportation_anchors:player/set_id\"\n    }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/advancement/recipes/teleportation_anchor.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_teleportation_anchors:teleportation_anchor\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:end_stone_bricks\",\n              \"minecraft:lodestone\",\n              \"minecraft:ender_eye\"\n            ]\n          }\n        ]\n      }\n    },\n    \"has_jammer\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:player_head\",\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:'teleportation_jammer'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\",\n      \"has_jammer\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_teleportation_anchors:teleportation_anchor\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/advancement/recipes/teleportation_jammer.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_teleportation_anchors:teleportation_jammer\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:purpur_block\",\n              \"minecraft:purpur_pillar\",\n              \"minecraft:lodestone\",\n              \"minecraft:ender_eye\",\n              \"minecraft:end_crystal\"\n            ]\n          }\n        ]\n      }\n    },\n    \"has_anchor\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:player_head\",\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:'teleportation_anchor'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_materials\",\n      \"has_anchor\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_teleportation_anchors:teleportation_jammer\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/anchor/link.mcfunction",
    "content": "# @s = Anchor Finder marker that has found an anchor\n# run from blocks/anchor/scan\n\ntp @s ^ ^ ^-1\nscoreboard players operation @s gm4_ta_jam_id = @e[type=marker,tag=gm4_ta_selected_jammer,limit=1] gm4_ta_jam_id\ntag @s add gm4_ta_found_anchor\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/anchor/process.mcfunction",
    "content": "# @s = teleportation anchor\n# run from main\n\nparticle minecraft:portal ~ ~0.65 ~ 0 -0.2 0 0.2 20\nparticle minecraft:end_rod ~ ~0.8 ~ 0.1 -0.3 0.1 0.01 1\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/anchor/rotate.mcfunction",
    "content": "# @s = marker to find a teleportation anchor that hit a junction\n# run from blocks/anchor/scan\n\nexecute if block ~ ~ ~ purpur_pillar[axis=y] if block ~ ~1 ~ purpur_pillar run data merge entity @s {Rotation:[0f,-90f]}\nexecute if block ~ ~ ~ purpur_pillar[axis=y] if block ~ ~-1 ~ purpur_pillar run data merge entity @s {Rotation:[0f,90f]}\n\nexecute if block ~ ~ ~ purpur_pillar[axis=x] if block ~1 ~ ~ purpur_pillar run data merge entity @s {Rotation:[-90f,0f]}\nexecute if block ~ ~ ~ purpur_pillar[axis=x] if block ~-1 ~ ~ purpur_pillar run data merge entity @s {Rotation:[90f,0f]}\n\nexecute if block ~ ~ ~ purpur_pillar[axis=z] if block ~ ~ ~1 purpur_pillar run data merge entity @s {Rotation:[0f,0f]}\nexecute if block ~ ~ ~ purpur_pillar[axis=z] if block ~ ~ ~-1 purpur_pillar run data merge entity @s {Rotation:[180f,0f]}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/anchor/scan.mcfunction",
    "content": "# @s = marker to find a teleportation anchor\n# run from find_anchor\n\ntp @s ^ ^ ^1\nexecute unless block ~ ~ ~ purpur_pillar unless block ~ ~ ~ lodestone run tag @s add gm4_ta_kill\nkill @s[tag=gm4_ta_kill]\nexecute if block ~ ~ ~ lodestone align xyz positioned ~0.5 ~0.5 ~0.5 if entity @e[type=marker,tag=gm4_teleportation_anchor,distance=..0.1] at @s run function gm4_teleportation_anchors:blocks/anchor/link\n\n# rotate if at a junction\nexecute at @s[tag=!gm4_ta_found_anchor] unless blocks ~ ~ ~ ~ ~ ~ ^ ^ ^-1 all run function gm4_teleportation_anchors:blocks/anchor/rotate\n\nscoreboard players add scan_count gm4_ta_data 1\nexecute unless entity @s[tag=gm4_ta_kill] unless score scan_count gm4_ta_data matches 128.. at @s[tag=!gm4_ta_found_anchor] run function gm4_teleportation_anchors:blocks/anchor/scan\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/anchor/search.mcfunction",
    "content": "# @s = teleportation jammer that just jammed an entity\n# run from both player/jam_player and mob/move_mob\n\nsummon marker ~ ~-1 ~ {CustomName:\"gm4_ta_anchor_finder\",Rotation:[0f,90f],Tags:[\"gm4_ta_anchor_finder\"]}\n\nscoreboard players reset scan_count gm4_ta_data\ntag @s add gm4_ta_selected_jammer\nexecute as @e[type=marker,tag=gm4_ta_anchor_finder,limit=1,distance=..1.1] at @s run function gm4_teleportation_anchors:blocks/anchor/scan\ntag @s remove gm4_ta_selected_jammer\n\ntag @e[type=marker] remove gm4_ta_anchor_finder\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/jammer/active.mcfunction",
    "content": "# @s = teleportation jammer with fuel\n# run from blocks/jammer/check_fuel\n\n# check if purpur pillar \"wire\" is attached\nexecute if block ~ ~-1 ~ purpur_pillar[axis=y] run tag @s add gm4_ta_wired\n\n# tag nearby entities based on pyramid level\ntag @e[type=!#gm4:non_living,type=!armor_stand,distance=..4,nbt=!{NoAI:1b}] add gm4_ta_new_jammed\nexecute if predicate gm4_teleportation_anchors:has_pyramid_1 run tag @e[type=!#gm4:non_living,type=!armor_stand,distance=..16,nbt=!{NoAI:1b}] add gm4_ta_new_jammed\nexecute if predicate gm4_teleportation_anchors:has_pyramid_2 run tag @e[type=!#gm4:non_living,type=!armor_stand,distance=..64,nbt=!{NoAI:1b}] add gm4_ta_new_jammed\nexecute if predicate gm4_teleportation_anchors:has_pyramid_3 run tag @e[type=!#gm4:non_living,type=!armor_stand,distance=..128,nbt=!{NoAI:1b}] add gm4_ta_new_jammed\n\n# track which jammed affected which entity and set decay score\nscoreboard players set @e[tag=gm4_ta_new_jammed,distance=..129] gm4_ta_jam_time 3\ntag @e[tag=gm4_ta_new_jammed,distance=..129] add gm4_ta_jammed\n#  ZC compatibility\nexecute as @e[tag=gm4_ta_new_jammed,distance=..129] unless score @s gm4_zc_no_explode matches 3.. run scoreboard players set @s gm4_zc_no_explode 3\ntag @e[distance=..129] remove gm4_ta_new_jammed\n\nparticle minecraft:reverse_portal ~ ~0.5 ~ 0.01 0.7 0.01 0.01 30 force\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/jammer/check_fuel.mcfunction",
    "content": "# @s = teleportation jammer with antenna and at least one layer of pyramid\n# run from blocks/process_jammer\n\nscoreboard players remove @s[scores={gm4_ta_fuel=1..}] gm4_ta_fuel 1\nexecute unless score @s gm4_ta_fuel matches 1.. if data block ~ ~ ~ Items[{id:\"minecraft:chorus_fruit\"}] run function gm4_teleportation_anchors:blocks/jammer/load_fuel\n\nexecute if score @s gm4_ta_fuel matches 1.. run function gm4_teleportation_anchors:blocks/jammer/active\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/jammer/load_fuel.mcfunction",
    "content": "# @s = teleportation jammer without fuel\n# run from blocks/process_jammer\n\n# refuel 8 minutes of the jammer\nscoreboard players add @s gm4_ta_fuel 600\n\n# remove 1 chorus fruit from the dropper\ndata modify storage gm4_teleportation_anchors:data Items[] set from block ~ ~ ~ Items[{id:\"minecraft:chorus_fruit\"}]\nexecute store result storage gm4_teleportation_anchors:data Items[0].count byte 1 run data get storage gm4_teleportation_anchors:data Items[0].count 0.99\n\nexecute store result score count gm4_et_data run data get storage gm4_teleportation_anchors:data Items[0].count\ndata modify block ~ ~ ~ Items append from storage gm4_teleportation_anchors:data Items[0]\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/jammer/process.mcfunction",
    "content": "# @s = teleportation jammer\n# run from main\n\ntag @s remove gm4_ta_wired\nexecute if block ~ ~1 ~ end_rod[facing=up] run function gm4_teleportation_anchors:blocks/jammer/check_fuel\n\n# store which TP Jammer is closest to the jammed mob\nexecute as @e[tag=gm4_ta_jammed] at @s run scoreboard players operation @s gm4_ta_jam_id = @e[type=marker,tag=gm4_teleportation_jammer,distance=..129,limit=1,sort=nearest] gm4_ta_jam_id\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_ta_data dummy\nscoreboard objectives add gm4_ta_id dummy\nscoreboard objectives add gm4_ta_fuel dummy\nscoreboard objectives add gm4_ta_jam_time dummy\nscoreboard objectives add gm4_ta_cooldown dummy\nscoreboard objectives add gm4_ta_ignore dummy\nscoreboard objectives add gm4_ta_jam_id dummy\nscoreboard objectives add gm4_ta_pos_x dummy\nscoreboard objectives add gm4_ta_pos_y dummy\nscoreboard objectives add gm4_ta_pos_z dummy\n\nexecute unless score gm4_teleportation_anchors gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Teleportation Anchors\"}\nexecute unless score gm4_teleportation_anchors gm4_earliest_version < gm4_teleportation_anchors gm4_modules run scoreboard players operation gm4_teleportation_anchors gm4_earliest_version = gm4_teleportation_anchors gm4_modules\nscoreboard players set gm4_teleportation_anchors gm4_modules 1\n\nschedule function gm4_teleportation_anchors:main 1t\nschedule function gm4_teleportation_anchors:tick 1t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/machine/create_anchor.mcfunction",
    "content": "# places the teleportation_anchor down\n# @s = player who placed the teleportation_anchor\n# located at the center of the placed block\n# run from gm4_teleportation_anchors:machine/verify_place_down\n\n# place lodestone\nsetblock ~ ~ ~ lodestone\n\n# summon display and marker entity\nsummon minecraft:item_display ~ ~ ~ {\\\n  CustomName:\"gm4_teleportation_anchor_display\",\\\n  Tags:[\"gm4_no_edit\",\"gm4_teleportation_anchor_display\",\"gm4_machine_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],\\\n  item:{id:\"end_portal_frame\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_teleportation_anchors:block/teleportation_anchor\"]}}},\\\n  item_display:head,\\\n  brightness:{sky:15,block:15},\\\n  Rotation:[0.0f,0.0f],\\\n  transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.501f,0f],scale:[0.438,0.438,0.438]}\\\n}\nsummon marker ~ ~ ~ {Tags:[\"gm4_teleportation_anchor\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_teleportation_anchor\",Rotation:[0.0f,0.0f]}\n\n# mark block as placed\nplaysound minecraft:block.end_portal.spawn block @a[distance=..8] ~ ~ ~ 0.3 1.8\nscoreboard players set $placed_block gm4_machine_data 1\nscoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2\ntag @e[distance=..2] remove gm4_new_machine\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/machine/create_jammer.mcfunction",
    "content": "# places the teleportation_jammer down\n# @s = player who placed the teleportation_jammer\n# located at the center of the placed block\n# run from gm4_teleportation_anchors:machine/verify_place_down\n\n# place dropper\nsetblock ~ ~ ~ dropper[facing=up]{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.teleportation_jammer\",\"fallback\":\"Teleportation Jammer\"},[{\"text\":\" \",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.teleportation_jammer\",\"fallback\":\"Teleportation Jammer\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.teleportation_jammer\",\"fallback\":\"Teleportation Jammer\",\"font\":\"gm4:offscreen\"},{\"translate\":\"gui.gm4.teleportation_jammer\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"text\":\" \",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.teleportation_jammer\",\"fallback\":\"Teleportation Jammer\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.teleportation_jammer\",\"fallback\":\"Teleportation Jammer\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}}\n\n# summon display and marker entity\nsummon minecraft:item_display ~ ~ ~ {\\\n  CustomName:\"gm4_teleportation_jammer_display\",\\\n  Tags:[\"gm4_no_edit\",\"gm4_teleportation_jammer_display\",\"gm4_machine_display\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],\\\n  item:{id:\"purpur_pillar\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_teleportation_anchors:block/teleportation_jammer\"]}}},\\\n  item_display:head,\\\n  brightness:{sky:15,block:15},\\\n  Rotation:[0.0f,0.0f],\\\n  transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.501f,0f],scale:[0.438,0.438,0.438]}\\\n}\nsummon marker ~ ~ ~ {Tags:[\"gm4_teleportation_jammer\",\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"],CustomName:\"gm4_teleportation_jammer\",Rotation:[0.0f,0.0f]}\n\n# set id\nexecute store result score @e[type=marker,tag=gm4_new_machine,limit=1,distance=..0.01] gm4_ta_jam_id run data get entity @e[type=marker,tag=gm4_new_machine,limit=1,distance=..0.01] UUID[3]\n\n# mark block as placed\nplaysound minecraft:block.chorus_flower.death block @a[distance=..8] ~ ~ ~ 100 1.3\nplaysound minecraft:block.beacon.power_select block @a[distance=..8] ~ ~ ~ 0.3 0.3\nscoreboard players set $placed_block gm4_machine_data 1\nscoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2\ntag @e[distance=..2] remove gm4_new_machine\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/machine/destroy_anchor.mcfunction",
    "content": "# destroys the teleportation_anchor\n# @s = teleportation_anchor marker\n# located at @s\n# run from gm4_teleportation_anchors:machine/verify_destroy\n\n# legacy armor stand clean up - TODO: remove this when we stop supporting the upgrade path\nexecute positioned ~ ~-0.4 ~ run kill @e[type=armor_stand,tag=gm4_teleportation_anchor_stand,limit=1,distance=..0.01]\n# kill entities related to machine block\nkill @e[type=item_display,tag=gm4_teleportation_anchor_display,limit=1,distance=..0.01]\nexecute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:\"minecraft:lodestone\",count:1}},nbt=!{Item:{components:{}}},limit=1,sort=nearest]\nkill @s\n\n# drop item (unless broken in creative mode)\nparticle minecraft:block{block_state:\"minecraft:end_portal_frame\"} ~ ~0.6 ~ .1 .25 .1 .05 30 normal @a\nexecute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_teleportation_anchors:items/teleportation_anchor\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/machine/destroy_jammer.mcfunction",
    "content": "# destroys the teleportation_jammer\n# @s = teleportation_jammer marker\n# located at @s\n# run from gm4_teleportation_anchors:machine/verify_destroy\n\n# legacy armor stand cleanup - TODO: remove this when we stop supporting the upgrade path\nexecute positioned ~ ~-0.4 ~ run kill @e[type=armor_stand,tag=gm4_teleportation_jammer_stand,limit=1,distance=..0.01]\n# kill entities related to machine block\nkill @e[type=item_display,tag=gm4_teleportation_jammer_display,limit=1,distance=..0.01]\nexecute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:\"minecraft:dropper\",count:1,components:{}}},limit=1,sort=nearest]\nkill @s\n\n# drop item (unless broken in creative mode)\nparticle minecraft:block{block_state:\"minecraft:purpur_block\"} ~ ~0.6 ~ .1 .25 .1 .05 30 normal @a\nexecute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_teleportation_anchors:items/teleportation_jammer\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/machine/verify_destroy.mcfunction",
    "content": "# verifies that the destroyed machine was from this module\n# @s = machine block marker\n# located at @s\n# run from #gm4_machines:destroy\n\nexecute if entity @s[tag=gm4_teleportation_jammer] run function gm4_teleportation_anchors:machine/destroy_jammer\nexecute if entity @s[tag=gm4_teleportation_anchor] run function gm4_teleportation_anchors:machine/destroy_anchor\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/machine/verify_place_down.mcfunction",
    "content": "# verifies that the placed down machine was from this module\n# @s = player who placed down the machine\n# located at the machine block marker (at the center of the placed down block)\n# run from #gm4_machines:place_down\n\nexecute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:\"teleportation_jammer\"} run function gm4_teleportation_anchors:machine/create_jammer\nexecute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:\"teleportation_anchor\"} run function gm4_teleportation_anchors:machine/create_anchor\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/main.mcfunction",
    "content": "schedule function gm4_teleportation_anchors:main 16t\n\n# jam mobs every 8 ticks\nfunction gm4_teleportation_anchors:mob/jam_mob\nschedule function gm4_teleportation_anchors:mob/jam_mob 8t\n\n# teleportation jammers\n## decrease buffer score\nscoreboard players remove @e[scores={gm4_ta_jam_time=1..}] gm4_ta_jam_time 1\n## unjam entities\nscoreboard players reset @e[type=enderman,tag=gm4_ta_jammed,scores={gm4_ta_jam_time=..0}] gm4_ta_pos_x\nscoreboard players reset @e[type=shulker,tag=gm4_ta_jammed,scores={gm4_ta_jam_time=..0}] gm4_ta_pos_x\nexecute as @e[type=enderman,tag=gm4_ta_jammed,scores={gm4_ta_jam_time=..0}] run data remove entity @s carriedBlockState\ntag @e[tag=gm4_ta_jammed,scores={gm4_ta_jam_time=..0}] remove gm4_ta_jammed\n## kill blocker armor stands (used to prevent jammed players from breaking/using blocks)\nexecute as @e[type=armor_stand,tag=gm4_ta_blocker] at @s unless entity @a[limit=1,distance=..0.1,tag=gm4_ta_teleported_player] run kill @s\n## teleportation jammer processes\nexecute as @e[type=marker,tag=gm4_teleportation_jammer] at @s run function gm4_teleportation_anchors:blocks/jammer/process\n\n# teleportation anchors\nexecute as @e[type=marker,tag=gm4_teleportation_anchor] at @s run function gm4_teleportation_anchors:blocks/anchor/process\n## deal with jammed player\nexecute at @a[scores={gm4_ta_cooldown=1..}] run particle minecraft:block{block_state:\"minecraft:chorus_plant\"} ~ ~0.5 ~ 0 0 0 0 3 force\nscoreboard players remove @a[scores={gm4_ta_cooldown=1..}] gm4_ta_cooldown 1\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/anchor_tp.mcfunction",
    "content": "# @s = enderman or shulker to be moved to a tp anchor\n# located 1 block above the teleportation anchor\n# run from move_mob\n\ntp @s ~ ~-0.45 ~\nfunction gm4_teleportation_anchors:mob/track_movement/initialize_pos\ntag @s add gm4_ta_anchor_tp\n\nexecute if entity @s[type=enderman] run playsound minecraft:entity.enderman.teleport block @a[distance=..8] ~ ~ ~ 1 0.3\nexecute if entity @s[type=shulker] run playsound minecraft:entity.shulker.teleport block @a[distance=..8] ~ ~ ~ 1 0.3\nexecute if entity @s[type=enderman] run particle minecraft:portal ~ ~0.5 ~ 0.2 1.6 0.2 0.01 150\nexecute if entity @s[type=shulker] run particle minecraft:portal ~ ~0.5 ~ 0.2 0 0.2 0.01 50\nparticle minecraft:explosion ~ ~0.5 ~ 0 0 0 0 0\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/check_movement_type.mcfunction",
    "content": "# @s = endermen and shulkers near a teleporation jammer\n# run from mob/jam_mob\n\n# check if entity is in a minecart or boat\ntag @s[predicate=gm4_teleportation_anchors:in_vehicle] add gm4_ta_ignore\n\nexecute unless entity @s[tag=gm4_ta_ignore] run function gm4_teleportation_anchors:mob/check_pos\nscoreboard players reset @s[tag=gm4_ta_ignore] gm4_ta_pos_x\nscoreboard players reset @s[tag=gm4_ta_ignore] gm4_ta_pos_y\nscoreboard players reset @s[tag=gm4_ta_ignore] gm4_ta_pos_z\n\ntag @s remove gm4_ta_ignore\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/check_pos.mcfunction",
    "content": "# @s = endermen and shulkers near a teleporation jammer\n# run from mob/check_movement_type\n\nexecute unless score @s gm4_ta_pos_x = @s gm4_ta_pos_x run function gm4_teleportation_anchors:mob/track_movement/initialize_pos\n\nfunction gm4_teleportation_anchors:mob/track_movement/check_dx\nexecute unless entity @s[tag=gm4_ta_teleported] run function gm4_teleportation_anchors:mob/track_movement/check_dz\nexecute unless entity @s[tag=gm4_ta_teleported] run function gm4_teleportation_anchors:mob/track_movement/check_dy\nexecute if entity @s[type=enderman,tag=!gm4_ta_teleported,tag=!gm4_ta_falling] run function gm4_teleportation_anchors:mob/track_movement/check_d\n\nexecute if entity @s[tag=gm4_ta_teleported] run function gm4_teleportation_anchors:mob/move_mob\nexecute if entity @s[tag=!gm4_ta_teleported] run function gm4_teleportation_anchors:mob/track_movement/update_pos\n\ntag @s remove gm4_ta_teleported\ntag @s remove gm4_ta_falling\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/enter_end_gateway.mcfunction",
    "content": "# @s = mob (not player, shulker, or enderman) that just went through an end gateway\n# run from tick\n\ntag @s add gm4_ta_gateway\nfunction gm4_teleportation_anchors:player/jam_player\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/jam_mob.mcfunction",
    "content": "# @s = none\n# run from main\n\nscoreboard players remove @e[type=#gm4_teleportation_anchors:teleporters,scores={gm4_ta_ignore=1..}] gm4_ta_ignore 1\nexecute as @e[type=#gm4_teleportation_anchors:teleporters,scores={gm4_ta_ignore=1..}] run tag @s add gm4_ta_ignore\nexecute as @e[type=#gm4_teleportation_anchors:teleporters,scores={gm4_ta_ignore=-1}] run tag @s add gm4_ta_ignore\n\nexecute as @e[type=#gm4_teleportation_anchors:teleporters,tag=gm4_ta_jammed] at @s run function gm4_teleportation_anchors:mob/check_movement_type\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/move_mob.mcfunction",
    "content": "# jammed enderman or shulker that teleported\n# run from mob/check_pos\n\nexecute store result entity @s Pos[0] double 0.01 run scoreboard players get @s gm4_ta_pos_x\nexecute store result entity @s Pos[1] double 0.01 run scoreboard players get @s gm4_ta_pos_y\nexecute store result entity @s Pos[2] double 0.01 run scoreboard players get @s gm4_ta_pos_z\n\nscoreboard players set @s[type=enderman] gm4_ta_jam_time 3\n\n# teleportation anchors\ntag @s add gm4_ta_new_tp\nexecute at @s as @e[type=marker,tag=gm4_ta_wired,distance=..129] if score @s gm4_ta_jam_id = @e[limit=1,tag=gm4_ta_new_tp] gm4_ta_jam_id at @s run function gm4_teleportation_anchors:blocks/anchor/search\nexecute at @s as @e[type=marker,tag=gm4_ta_found_anchor] if score @s gm4_ta_jam_id = @e[limit=1,tag=gm4_ta_new_tp] gm4_ta_jam_id run tag @s add gm4_ta_anchor_loc\n\nexecute at @e[type=marker,tag=gm4_ta_anchor_loc,limit=1] positioned ~ ~1 ~ run function gm4_teleportation_anchors:mob/anchor_tp\n\nkill @e[type=marker,tag=gm4_ta_anchor_loc]\ntag @s remove gm4_ta_new_tp\n\n# visuals\nexecute at @s[tag=!gm4_ta_anchor_tp] run function gm4_teleportation_anchors:mob/visuals_jam\n\ntag @s remove gm4_ta_anchor_tp\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/check_d.mcfunction",
    "content": "# @s = endermen near a teleporation jammer\n# run from mob/check_pos\n\n# check total distance away from initial position\nsummon marker ~ ~ ~ {Tags:[\"gm4_ta_pos_tracker\"]}\nexecute store result entity @e[type=marker,tag=gm4_ta_pos_tracker,limit=1] Pos[0] double 0.01 run scoreboard players get @s gm4_ta_pos_x\nexecute store result entity @e[type=marker,tag=gm4_ta_pos_tracker,limit=1] Pos[1] double 0.01 run scoreboard players get @s gm4_ta_pos_y\nexecute store result entity @e[type=marker,tag=gm4_ta_pos_tracker,limit=1] Pos[2] double 0.01 run scoreboard players get @s gm4_ta_pos_z\n\nexecute at @e[type=marker,tag=gm4_ta_pos_tracker,limit=1] run tag @s[distance=5.8..] add gm4_ta_teleported\nexecute if entity @s[tag=gm4_ta_teleported] at @e[type=marker,tag=gm4_ta_pos_tracker,limit=1] run tag @s[type=enderman,distance=5.8..7.2,predicate=gm4_teleportation_anchors:has_speed_1] remove gm4_ta_teleported\nexecute if entity @s[tag=gm4_ta_teleported] at @e[type=marker,tag=gm4_ta_pos_tracker,limit=1] run tag @s[type=enderman,distance=5.8..10.1,predicate=gm4_teleportation_anchors:has_speed_2] remove gm4_ta_teleported\n\nkill @e[type=marker,tag=gm4_ta_pos_tracker,limit=1]\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/check_dx.mcfunction",
    "content": "# @s = endermen and shulkers near a teleporation jammer\n# run from mob/check_pos\n\n# get current x-coord\nexecute store result score current gm4_ta_pos_x run data get entity @s Pos[0] 100\n\n# compare current x-coord to previous x-coord\nscoreboard players operation difference gm4_ta_pos_x = current gm4_ta_pos_x\nscoreboard players operation difference gm4_ta_pos_x -= @s gm4_ta_pos_x\n\n# take absolute value of difference\nscoreboard players set -1 gm4_ta_pos_x -1\nexecute if score difference gm4_ta_pos_x matches ..0 run scoreboard players operation difference gm4_ta_pos_x *= -1 gm4_ta_pos_x\n\n# mark entity as teleported if they moved too far\nexecute if entity @s[type=enderman] if score difference gm4_ta_pos_x matches 360.. run tag @s add gm4_ta_teleported\nexecute if score difference gm4_ta_pos_x matches 360..510 run tag @s[type=enderman,predicate=gm4_teleportation_anchors:has_speed_1] remove gm4_ta_teleported\nexecute if score difference gm4_ta_pos_x matches 360..690 run tag @s[type=enderman,predicate=gm4_teleportation_anchors:has_speed_2] remove gm4_ta_teleported\n\nexecute if entity @s[type=shulker] if score difference gm4_ta_pos_x matches 90.. run tag @s add gm4_ta_teleported\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/check_dy.mcfunction",
    "content": "# @s = endermen and shulkers near a teleporation jammer\n# run from mob/check_pos\n\n# get current y-coord\nexecute store result score current gm4_ta_pos_y run data get entity @s Pos[1] 100\n\n# compare current y-coord to previous y-coord\nscoreboard players operation difference gm4_ta_pos_y = current gm4_ta_pos_y\nscoreboard players operation difference gm4_ta_pos_y -= @s gm4_ta_pos_y\n\n# take absolute value of difference\nscoreboard players set -1 gm4_ta_pos_y -1\nexecute if score difference gm4_ta_pos_y matches ..0 run scoreboard players operation difference gm4_ta_pos_y *= -1 gm4_ta_pos_y\n\n# mark shulker if they moved too far\nexecute if entity @s[type=shulker] if score difference gm4_ta_pos_y matches 90.. run tag @s add gm4_ta_teleported\n# mark endermen if they moved too far and is not falling\nexecute if entity @s[type=enderman] if score difference gm4_ta_pos_y matches 410.. run function gm4_teleportation_anchors:mob/track_movement/check_enderman_falling\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/check_dz.mcfunction",
    "content": "# @s = endermen and shulkers near a teleporation jammer\n# run from mob/check_pos\n\n# get current z-coord\nexecute store result score current gm4_ta_pos_z run data get entity @s Pos[2] 100\n\n# compare current z-coord to previous z-coord\nscoreboard players operation difference gm4_ta_pos_z = current gm4_ta_pos_z\nscoreboard players operation difference gm4_ta_pos_z -= @s gm4_ta_pos_z\n\n# take absolute value of difference\nscoreboard players set -1 gm4_ta_pos_z -1\nexecute if score difference gm4_ta_pos_z matches ..0 run scoreboard players operation difference gm4_ta_pos_z *= -1 gm4_ta_pos_z\n\n# mark entity as teleported if they moved too far\nexecute if entity @s[type=enderman] if score difference gm4_ta_pos_z matches 360.. run tag @s add gm4_ta_teleported\nexecute if score difference gm4_ta_pos_z matches 360..510 run tag @s[type=enderman,predicate=gm4_teleportation_anchors:has_speed_1] remove gm4_ta_teleported\nexecute if score difference gm4_ta_pos_z matches 360..690 run tag @s[type=enderman,predicate=gm4_teleportation_anchors:has_speed_2] remove gm4_ta_teleported\n\nexecute if entity @s[type=shulker] if score difference gm4_ta_pos_z matches 90.. run tag @s add gm4_ta_teleported\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/check_enderman_falling.mcfunction",
    "content": "# @s = endermen  near a teleporation jammer\n# run from mob/track_movement/check_dy\n\nexecute store result score fall gm4_ta_pos_y run data get entity @s fall_distance 100\nexecute if score fall gm4_ta_pos_y matches 0..90 run tag @s add gm4_ta_teleported\nexecute if score fall gm4_ta_pos_y matches 91.. run tag @s add gm4_ta_falling\n\nexecute if entity @s[type=enderman,tag=gm4_ta_teleported,predicate=gm4_teleportation_anchors:has_speed_1] if score difference gm4_ta_pos_x matches 410..510 run tag @s remove gm4_ta_teleported\nexecute if entity @s[type=enderman,tag=gm4_ta_teleported,predicate=gm4_teleportation_anchors:has_speed_2] if score difference gm4_ta_pos_x matches 410..690 run tag @s remove gm4_ta_teleported\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/initialize_pos.mcfunction",
    "content": "# endermen and shulker who has been jammed for the first time\n# run from mob/check_pos\n\nexecute store result score @s gm4_ta_pos_x run data get entity @s Pos[0] 100\nexecute store result score @s gm4_ta_pos_y run data get entity @s Pos[1] 100\nexecute store result score @s gm4_ta_pos_z run data get entity @s Pos[2] 100\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/update_pos.mcfunction",
    "content": "# jammed enderman or shulker that did not teleport\n# run from mob/check_pos\n\nscoreboard players operation @s gm4_ta_pos_x = current gm4_ta_pos_x\nscoreboard players operation @s gm4_ta_pos_y = current gm4_ta_pos_y\nscoreboard players operation @s gm4_ta_pos_z = current gm4_ta_pos_z\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/visuals_jam.mcfunction",
    "content": "# @s = mob that was prevented from teleporting\n# run from mob/move_mob\n\nexecute if entity @s[type=enderman] run particle minecraft:angry_villager ~ ~2.3 ~ 0.3 0.2 0.3 1 5\nexecute if entity @s[type=shulker] run particle minecraft:angry_villager ~ ~0.8 ~ 0.3 0.2 0.3 1 5\nparticle minecraft:block{block_state:\"minecraft:chorus_plant\"} ~ ~0.5 ~ 0 0 0 0 20 force\nplaysound minecraft:block.chorus_flower.death hostile @a[distance=..8] ~ ~ ~ 10 1.3\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/enter_end_gateway.mcfunction",
    "content": "# @s = player who just entered an end gateway\n# run from advancement \"enter_end_gateway\"\n\nadvancement revoke @s only gm4_teleportation_anchors:enter_end_gateway\n\n# spawn end gateway markers\nexecute positioned ~.3 ~256 ~.3 if block ~ ~-256 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~ ~0.5 {CustomName:\"End Gateway\",Tags:[\"gm4_ta_end_gateway\"]}\nexecute positioned ~.3 ~256 ~-.3 if block ~ ~-256 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~ ~0.5 {CustomName:\"End Gateway\",Tags:[\"gm4_ta_end_gateway\"]}\nexecute positioned ~-.3 ~256 ~.3 if block ~ ~-256 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~ ~0.5 {CustomName:\"End Gateway\",Tags:[\"gm4_ta_end_gateway\"]}\nexecute positioned ~-.3 ~256 ~-.3 if block ~ ~-256 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~ ~0.5 {CustomName:\"End Gateway\",Tags:[\"gm4_ta_end_gateway\"]}\n\nexecute positioned ~.3 ~256 ~.3 if block ~ ~-255 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:\"End Gateway\",Tags:[\"gm4_ta_end_gateway\"]}\nexecute positioned ~.3 ~256 ~-.3 if block ~ ~-255 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:\"End Gateway\",Tags:[\"gm4_ta_end_gateway\"]}\nexecute positioned ~-.3 ~256 ~.3 if block ~ ~-255 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:\"End Gateway\",Tags:[\"gm4_ta_end_gateway\"]}\nexecute positioned ~-.3 ~256 ~-.3 if block ~ ~-255 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:\"End Gateway\",Tags:[\"gm4_ta_end_gateway\"]}\n\nexecute positioned ~.3 ~256 ~.3 if block ~ ~-254.25 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:\"End Gateway\",Tags:[\"gm4_ta_end_gateway\"]}\nexecute positioned ~.3 ~256 ~-.3 if block ~ ~-254.25 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:\"End Gateway\",Tags:[\"gm4_ta_end_gateway\"]}\nexecute positioned ~-.3 ~256 ~.3 if block ~ ~-254.25 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:\"End Gateway\",Tags:[\"gm4_ta_end_gateway\"]}\nexecute positioned ~-.3 ~256 ~-.3 if block ~ ~-254.25 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:\"End Gateway\",Tags:[\"gm4_ta_end_gateway\"]}\n\ntag @s[tag=gm4_ta_jammed,tag=!gm4_ta_teleported_player] add gm4_ta_gateway\nexecute if entity @s[tag=gm4_ta_jammed,tag=!gm4_ta_teleported_player] run function gm4_teleportation_anchors:player/jam_player\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/jam_player.mcfunction",
    "content": "# @s = jammed player who just ate chorus fruit\n# run from player/used_chorus\n\ntag @s add gm4_ta_teleported_player\ntag @s add gm4_ta_store_pos\nsummon marker ~ ~ ~ {CustomName:\"gm4_ta_player_pos\",Tags:[\"gm4_ta_player_pos\",\"gm4_ta_new_player_pos\"]}\n\nexecute if entity @s[type=!player] store result score @s gm4_ta_id run data get entity @s UUID[3]\n\nscoreboard players operation @e[type=marker,distance=..0.01,tag=gm4_ta_new_player_pos,limit=1] gm4_ta_jam_id = @s gm4_ta_jam_id\nscoreboard players operation @e[type=marker,distance=..0.01,tag=gm4_ta_new_player_pos,limit=1] gm4_ta_id = @s gm4_ta_id\n\n# if player was in an end gateway, move the marker to 1 block in pos x\nexecute if entity @s[tag=gm4_ta_gateway] run tp @e[type=marker,distance=..0.01,tag=gm4_ta_new_player_pos,limit=1] ^ ^ ^-1\n\n# clean up\ntag @s remove gm4_ta_gateway\ntag @e[type=marker,tag=gm4_ta_player_pos,distance=..0.01] remove gm4_ta_new_player_pos\n\n# start 20hz clock to check for movement\nschedule function gm4_teleportation_anchors:player/temp_tick 1t\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/move_player.mcfunction",
    "content": "# @s = player who used chorus and has justed moved after teleporting\n# run from player/track_movement\n\n# find the marker that belongs to the player (match IDs)\nexecute if entity @s[type=player] as @e[type=marker,tag=gm4_ta_player_pos] if score @s gm4_ta_id = @p[distance=..0.001,tag=gm4_ta_teleported_player] gm4_ta_id run tag @s add gm4_ta_selected_marker\nexecute unless entity @s[type=player] as @e[type=marker,tag=gm4_ta_player_pos] if score @s gm4_ta_id = @e[distance=..0.001,tag=gm4_ta_teleported_player,limit=1] gm4_ta_id run tag @s add gm4_ta_selected_marker\n\n# if the marker is linked to a wired TP Jammer, then move the marker\nexecute unless score @s gm4_ta_cooldown matches 1.. at @e[type=marker,tag=gm4_ta_selected_marker,limit=1] as @e[type=marker,tag=gm4_ta_wired,distance=..129] if score @s gm4_ta_jam_id = @e[tag=gm4_ta_selected_marker,limit=1,distance=..0.0001] gm4_ta_jam_id at @s run function gm4_teleportation_anchors:blocks/anchor/search\nexecute if score @e[type=marker,tag=gm4_ta_found_anchor,limit=1] gm4_ta_jam_id = @e[type=marker,tag=gm4_ta_selected_marker,limit=1] gm4_ta_jam_id at @e[type=marker,tag=gm4_ta_found_anchor,limit=1] run tp @e[type=marker,tag=gm4_ta_selected_marker,limit=1] ~ ~1 ~\nexecute if entity @e[type=marker,tag=gm4_ta_found_anchor,limit=1] run tag @s add gm4_ta_anchor_tp\nscoreboard players set @s[type=player,tag=gm4_ta_anchor_tp] gm4_ta_cooldown 12\n\n# teleport player to the marker\nexecute at @e[type=marker,tag=gm4_ta_selected_marker,limit=1] run tp @s ~ ~ ~\n\nexecute at @s[tag=gm4_ta_anchor_tp] run function gm4_teleportation_anchors:player/visuals_anchor\nexecute at @s[tag=!gm4_ta_anchor_tp] run function gm4_teleportation_anchors:player/visuals_jam\n\n# clean up tags and scores\ntag @s remove gm4_ta_teleported_player\ntag @s remove gm4_ta_anchor_tp\ntag @s remove gm4_ta_track_movement\ntag @s remove gm4_ta_has_moved\nscoreboard players reset @s gm4_ta_pos_x\nscoreboard players reset @s gm4_ta_pos_y\nscoreboard players reset @s gm4_ta_pos_z\nscoreboard players reset @s[type=!player] gm4_ta_id\n\nkill @e[type=marker,tag=gm4_ta_selected_marker]\nkill @e[type=marker,tag=gm4_ta_found_anchor]\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/resolve_used_chorus.mcfunction",
    "content": "# check load.status\n# @s = player who ate chorus fruit\n# located at @s\n# run from #gm4_zauber_cauldrons:player/wormhole_targeting/prepare_teleport\n\nexecute if score gm4_teleportation_anchors load.status matches 1.. run function gm4_teleportation_anchors:player/used_chorus\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/set_id.mcfunction",
    "content": "# @s = player who joined for the first time\n# run from advancement gm4_teleportation_anchors:join\n\nexecute store result score @s gm4_ta_id run data get entity @s UUID[3]\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/store_position.mcfunction",
    "content": "# @s = player who just used chorus, after they've teleported with the chorus\n# run from temp_tick\n\nexecute store result score @s gm4_ta_pos_x run data get entity @s Pos[0] 100\nexecute store result score @s gm4_ta_pos_y run data get entity @s Pos[1] 100\nexecute store result score @s gm4_ta_pos_z run data get entity @s Pos[2] 100\ntag @s remove gm4_ta_store_pos\ntag @s add gm4_ta_track_movement\n\nexecute if entity @s[type=player] run summon armor_stand ~ ~ ~ {Invisible:1b,NoGravity:1b,Silent:1b,Invulnerable:1b,PortalCooldown:2147483647,Tags:[\"gm4_ta_blocker\"]}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/temp_tick.mcfunction",
    "content": "# @s = none\n# located at world spawn\n# run from player/jam_player\n\nexecute as @e[tag=gm4_ta_track_movement] run function gm4_teleportation_anchors:player/track_movement\nexecute as @e[tag=gm4_ta_store_pos] at @s run function gm4_teleportation_anchors:player/store_position\n\n# keep ticking if there are players with the tag\nexecute if entity @e[tag=gm4_ta_teleported_player] run schedule function gm4_teleportation_anchors:player/temp_tick 1t\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/track_movement.mcfunction",
    "content": "# @s = player who used chorus and has yet to move after teleporting\n# run from temp_tick\n\neffect give @s minecraft:blindness 2 255 true\n\ntag @s[type=!player] add gm4_ta_has_moved\n\nexecute unless entity @s[tag=gm4_ta_has_moved] store result score current gm4_ta_pos_x run data get entity @s Pos[0] 100\nexecute unless entity @s[tag=gm4_ta_has_moved] unless score current gm4_ta_pos_x = @s gm4_ta_pos_x run tag @s add gm4_ta_has_moved\n\nexecute unless entity @s[tag=gm4_ta_has_moved] store result score current gm4_ta_pos_y run data get entity @s Pos[1] 100\nexecute unless entity @s[tag=gm4_ta_has_moved] unless score current gm4_ta_pos_y = @s gm4_ta_pos_y run tag @s add gm4_ta_has_moved\n\nexecute unless entity @s[tag=gm4_ta_has_moved] store result score current gm4_ta_pos_z run data get entity @s Pos[2] 100\nexecute unless entity @s[tag=gm4_ta_has_moved] unless score current gm4_ta_pos_z = @s gm4_ta_pos_z run tag @s add gm4_ta_has_moved\n\nexecute if entity @s[tag=gm4_ta_has_moved] at @s run function gm4_teleportation_anchors:player/move_player\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/used_chorus.mcfunction",
    "content": "# @s = player who ate chorus fruit\n# run from advancement \"consume_chorus\" and any module that supports jamming (e.g. Wormholes, Expeditious)\n\nadvancement revoke @s only gm4_teleportation_anchors:consume_chorus\n\nexecute if entity @s[tag=gm4_ta_jammed,tag=!gm4_ta_teleported_player] run function gm4_teleportation_anchors:player/jam_player\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/visuals_anchor.mcfunction",
    "content": "# @s = player that teleported to an anchor\n# run from player/move_player\n\nplaysound minecraft:item.chorus_fruit.teleport block @a[distance=..8] ~ ~ ~ 1 0.3\nparticle minecraft:portal ~ ~0.5 ~ 0.2 0.6 0.2 0.01 100\nparticle minecraft:explosion ~ ~ ~ 0 0 0 0 0\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/visuals_jam.mcfunction",
    "content": "# @s = player that was jammed\n# run from player/move_player\n\nexecute positioned ~ ~1.3 ~ run particle minecraft:angry_villager ^ ^ ^0.7 0.4 0.4 0.4 1 5 force\nparticle minecraft:block{block_state:\"minecraft:chorus_plant\"} ~ ~0.5 ~ 0 0 0 0 20 force\nplaysound minecraft:block.chorus_flower.death player @a[distance=..8] ~ ~ ~ 100 1.3\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/tick.mcfunction",
    "content": "execute at @e[type=marker,tag=gm4_ta_end_gateway] positioned ~-.55 ~-256.55 ~-.55 align xyz as @e[type=!#gm4_teleportation_anchors:affected,tag=gm4_ta_jammed,tag=!gm4_ta_teleported_player,dx=2.1,dy=2.1,dz=2.1] at @s run function gm4_teleportation_anchors:mob/enter_end_gateway\n\nexecute as @e[type=enderman,tag=gm4_ta_jammed,scores={gm4_ta_jam_time=1..}] unless data entity @s carriedBlockState run data merge entity @s {carriedBlockState:{Name:\"tall_seagrass\",Properties:{half:\"upper\"}}}\n\nschedule function gm4_teleportation_anchors:tick 1t\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/upgrade_paths/1.7/create_item_display_anchor.mcfunction",
    "content": "# @s = gm4_teleportation_anchor_stand armor stand\n# at center of block\n# run from upgrade_paths/1.7\n\nsummon minecraft:item_display ~ ~ ~ {\\\n  CustomName:\"gm4_teleportation_anchor_display\",\\\n  Tags:[\"gm4_no_edit\",\"gm4_teleportation_anchor_display\",\"gm4_machine_display\",\"smithed.entity\",\"smithed.strict\"],\\\n  item:{id:\"end_portal_frame\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_teleportation_anchors:block/teleportation_anchor\"]}}},\\\n  item_display:head,\\\n  brightness:{sky:15,block:15},\\\n  Rotation:[0.0f,0.0f],\\\n  transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.501f,0f],scale:[0.438,0.438,0.438]}\\\n}\n\n# entity version\nscoreboard players set @e[type=item_display,tag=gm4_teleportation_anchor_display,distance=..0.01,limit=1] gm4_entity_version 2\nscoreboard players set @e[type=marker,tag=gm4_teleportation_anchor,distance=..0.01,limit=1] gm4_entity_version 2\n\nkill @s\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/upgrade_paths/1.7/create_item_display_jammer.mcfunction",
    "content": "# @s = gm4_teleportation_jammer_stand armor stand\n# at center of block\n# run from upgrade_paths/1.7\n\nsummon minecraft:item_display ~ ~ ~ {\\\n  CustomName:\"gm4_teleportation_jammer_display\",\\\n  Tags:[\"gm4_no_edit\",\"gm4_teleportation_jammer_display\",\"gm4_machine_display\",\"smithed.entity\",\"smithed.strict\"],\\\n  item:{id:\"purpur_pillar\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_teleportation_anchors:block/teleportation_jammer\"]}}},\\\n  item_display:head,\\\n  brightness:{sky:15,block:15},\\\n  Rotation:[0.0f,0.0f],\\\n  transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.501f,0f],scale:[0.438,0.438,0.438]}\\\n}\n\n# entity version\nscoreboard players set @e[type=item_display,tag=gm4_teleportation_jammer_display,distance=..0.01,limit=1] gm4_entity_version 2\nscoreboard players set @e[type=marker,tag=gm4_teleportation_jammer,distance=..0.01,limit=1] gm4_entity_version 2\n\nkill @s\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/upgrade_paths/1.7.mcfunction",
    "content": "# @s = player\n# at @s\n# run via upgrade paths util\n\nexecute as @e[type=minecraft:armor_stand,tag=gm4_teleportation_anchor_stand] at @s positioned ~ ~0.4 ~ \\\n  run function gm4_teleportation_anchors:upgrade_paths/1.7/create_item_display_anchor\n\nexecute as @e[type=minecraft:armor_stand,tag=gm4_teleportation_jammer_stand] at @s positioned ~ ~0.4 ~ \\\n  run function gm4_teleportation_anchors:upgrade_paths/1.7/create_item_display_jammer\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/guidebook/teleportation_anchors.json",
    "content": "{\n  \"id\": \"teleportation_anchors\",\n  \"name\": \"Teleportation Anchors\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:furnace\"\n  },\n  \"criteria\": {\n    \"obtain_chorus\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:chorus_fruit\",\n              \"minecraft:popped_chorus_fruit\",\n              \"minecraft:purpur_block\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_teleportation_jammer\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:'teleportation_jammer'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_teleportation_anchor\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:'teleportation_anchor'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"open_teleportation_jammer\": {\n      \"trigger\": \"minecraft:default_block_use\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": [\n                  \"minecraft:dropper\"\n                ],\n                \"nbt\": \"{CustomName:{\\\"translate\\\":\\\"gm4.second\\\",\\\"fallback\\\":\\\"%1$s\\\",\\\"with\\\":[{\\\"translate\\\":\\\"container.gm4.teleportation_jammer\\\",\\\"fallback\\\":\\\"Teleportation Jammer\\\"},{\\\"text\\\":\\\" \\\",\\\"extra\\\":[{\\\"translate\\\":\\\"container.gm4.teleportation_jammer\\\",\\\"fallback\\\":\\\"Teleportation Jammer\\\",\\\"font\\\":\\\"gm4:half_invert\\\"},{\\\"translate\\\":\\\"container.gm4.teleportation_jammer\\\",\\\"fallback\\\":\\\"Teleportation Jammer\\\",\\\"font\\\":\\\"gm4:offscreen\\\"},{\\\"translate\\\":\\\"gui.gm4.teleportation_jammer\\\",\\\"fallback\\\":\\\"\\\",\\\"font\\\":\\\"gm4:container_gui\\\",\\\"color\\\":\\\"white\\\"},{\\\"text\\\":\\\" \\\",\\\"font\\\":\\\"gm4:half_invert\\\"},{\\\"translate\\\":\\\"container.gm4.teleportation_jammer\\\",\\\"fallback\\\":\\\"Teleportation Jammer\\\",\\\"font\\\":\\\"gm4:half_invert\\\"},{\\\"translate\\\":\\\"container.gm4.teleportation_jammer\\\",\\\"fallback\\\":\\\"Teleportation Jammer\\\",\\\"font\\\":\\\"gm4:default\\\",\\\"color\\\":\\\"#404040\\\"}],\\\"font\\\":\\\"gm4:half_invert\\\"}]}}\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.teleportation_jammer.description\",\n            \"fallback\": \"Teleportation Jammers and Anchors can be used to supress and control chorus-based teleportation.\\n\\nThey can be crafted in a crafting table.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"crafting_jammer\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_chorus\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.teleportation_anchors.crafting_jammer\",\n            \"fallback\": \"A Teleportation Jammer can be crafted in a crafting table:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_teleportation_anchors:teleportation_jammer\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage_jammer\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_teleportation_jammer\",\n          \"open_teleportation_jammer\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.teleportation_anchors.jamming\",\n            \"fallback\": \"A Teleportation Jammer is used to suppress chorus based teleportation.\\n\\nThis includes endermen, shulkers, chorus fruit, end gateways, and other random teleportation that doesn't require line-of-sight.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.teleportation_anchors.jammer_effects\",\n            \"fallback\": \"When entities are jammed, any act of teleportation will cause them to jump back to their original location.\\n\\nWhen endermen are jammed, they are also prevented from picking up blocks.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.teleportation_anchors.jammer_power\",\n            \"fallback\": \"In order for a TP Jammer to work, it needs to broadcast a signal through an end rod placed on top of it.\\n\\nChorus fruit must be placed inside the jammer as fuel. Five fruit is enough for two days.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.teleportation_anchors.jammer_range\",\n            \"fallback\": \"Similar to a beacon, a pyramid of purpur blocks can be build to extend the range of a jammer.\\n\\nThe range can be either 4, 16, 32, or 64 blocks in radius, acheived by 0-3 layers of a pyramid.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.teleportation_anchors.crafting_anchor\",\n            \"fallback\": \"A Teleportation Jammer can be used to craft an Anchor:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_teleportation_anchors:teleportation_anchor\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"description\"\n      ]\n    },\n    {\n      \"name\": \"usage_anchor\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_teleportation_anchor\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.teleportation_anchors.anchor_usage\",\n            \"fallback\": \"A Teleportation Anchor is used to control chorus based teleportation.\\n\\nIf a Jammer is connected to an anchor, teleporters will be teleported to the anchor instead of being jammed to their original location.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.teleportation_anchors.pupur_wires\",\n            \"fallback\": \"A Jammer can be connected to an Anchor using purpur pillars.\\n\\nThe pillars need to go from the bottom of a TP Jammer and eventually lead into a TP Anchor.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.teleportation_anchors.pupur_wires_1\",\n            \"fallback\": \"If a purpur pillar points into a T-Junction, it will prioritize moving in the North, West, or Down direction.\\n\\nThese wires can be at most 64 blocks long.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.teleportation_anchors.chorus_fruit_cooldown\",\n            \"fallback\": \"If a user eats chorus fruit, they can also be teleported to an anchor, but must wait some time before doing so again.\\n\\nIf they try to teleport during this cooldown, they will just be jammed.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"description\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/loot_table/items/teleportation_anchor.json",
    "content": "{\n  \"type\": \"block\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_teleportation_anchors:item/teleportation_anchor\"]},\n                \"minecraft:profile\": \"$teleportation_anchor\"\n              }\n            },\n            {\n              \"function\": \"set_custom_data\",\n              \"tag\": \"{gm4_machines:{id:'teleportation_anchor'}}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"translate\": \"block.gm4.teleportation_anchor\",\n                  \"fallback\": \"Teleportation Anchor\",\n                  \"color\": \"white\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/loot_table/items/teleportation_jammer.json",
    "content": "{\n  \"type\": \"block\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"set_components\",\n              \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_teleportation_anchors:item/teleportation_jammer\"]},\n                \"minecraft:profile\": \"$teleportation_jammer\"\n              }\n            },\n            {\n              \"function\": \"set_custom_data\",\n              \"tag\": \"{gm4_machines:{id:'teleportation_jammer'}}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"translate\": \"block.gm4.teleportation_jammer\",\n                  \"fallback\": \"Teleportation Jammer\",\n                  \"color\": \"white\",\n                  \"italic\": false\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/has_pyramid_1.json",
    "content": "{\n  \"condition\": \"minecraft:inverted\",\n  \"term\": {\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -1,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -1,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -1,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -1,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -1,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -1,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -1,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -1,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -1,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": 1,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": [\n                \"minecraft:end_rod\"\n              ],\n              \"state\": {\n                \"facing\": \"up\"\n              }\n            }\n          }\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/has_pyramid_2.json",
    "content": "{\n  \"condition\": \"minecraft:inverted\",\n  \"term\": {\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:reference\",\n          \"name\": \"gm4_teleportation_anchors:has_pyramid_1\"\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -2,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -2,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -2,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -2,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -2,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -2,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -2,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -2,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -2,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -2,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -2,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -2,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -2,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -2,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -2,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -2,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -2,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -2,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -2,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -2,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -2,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -2,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -2,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -2,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -2,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/has_pyramid_3.json",
    "content": "{\n  \"condition\": \"minecraft:inverted\",\n  \"term\": {\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:reference\",\n          \"name\": \"gm4_teleportation_anchors:has_pyramid_2\"\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -3,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -3,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -3,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -3,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -3,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -3,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -3,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -3,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -3,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -3,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -3,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -3,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -3,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -3,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -3,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -3,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -3,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -3,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -3,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -3,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -3,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -3,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -3,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -3,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -3,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -3,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -3,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -3,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -3,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -3,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -3,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -3,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -3,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -3,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -3,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -3,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -3,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -3,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -3,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -3,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -3,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -3,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -3,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -3,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -3,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -3,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -3,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -3,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -3,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/has_pyramid_4.json",
    "content": "{\n  \"condition\": \"minecraft:inverted\",\n  \"term\": {\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:reference\",\n          \"name\": \"gm4_teleportation_anchors:has_pyramid_3\"\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -4,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -4,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -4,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -4,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -4,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -4,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -4,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -4,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -4,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -4,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -4,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -4,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -4,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -4,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -4,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -4,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -4,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -4,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -4,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -4,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -4,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -4,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -4,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -4,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -4,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -4,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -4,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -4,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -4,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -4,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -4,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -4,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -4,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -4,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -4,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -4,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -4,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -4,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -4,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -4,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -4,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -4,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -4,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -4,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -4,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -4,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -4,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -4,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -3,\n          \"offsetY\": -4,\n          \"offsetZ\": -3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 4,\n          \"offsetY\": -4,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -4,\n          \"offsetY\": -4,\n          \"offsetZ\": 0,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -4,\n          \"offsetZ\": 4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 0,\n          \"offsetY\": -4,\n          \"offsetZ\": -4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 4,\n          \"offsetY\": -4,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -4,\n          \"offsetY\": -4,\n          \"offsetZ\": 1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -4,\n          \"offsetZ\": 4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 1,\n          \"offsetY\": -4,\n          \"offsetZ\": -4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 4,\n          \"offsetY\": -4,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -4,\n          \"offsetY\": -4,\n          \"offsetZ\": -1,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -4,\n          \"offsetZ\": 4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -1,\n          \"offsetY\": -4,\n          \"offsetZ\": -4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 4,\n          \"offsetY\": -4,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -4,\n          \"offsetY\": -4,\n          \"offsetZ\": 2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -4,\n          \"offsetZ\": 4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 2,\n          \"offsetY\": -4,\n          \"offsetZ\": -4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 4,\n          \"offsetY\": -4,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -4,\n          \"offsetY\": -4,\n          \"offsetZ\": -2,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -4,\n          \"offsetZ\": 4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -2,\n          \"offsetY\": -4,\n          \"offsetZ\": -4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 4,\n          \"offsetY\": -4,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -4,\n          \"offsetY\": -4,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -4,\n          \"offsetZ\": 4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -4,\n          \"offsetZ\": -4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 4,\n          \"offsetY\": -4,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -4,\n          \"offsetY\": -4,\n          \"offsetZ\": 3,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -4,\n          \"offsetZ\": 4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 3,\n          \"offsetY\": -4,\n          \"offsetZ\": -4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 4,\n          \"offsetY\": -4,\n          \"offsetZ\": 4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -4,\n          \"offsetY\": -4,\n          \"offsetZ\": 4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": 4,\n          \"offsetY\": -4,\n          \"offsetZ\": -4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:inverted\",\n        \"term\": {\n          \"condition\": \"minecraft:location_check\",\n          \"offsetX\": -4,\n          \"offsetY\": -4,\n          \"offsetZ\": -4,\n          \"predicate\": {\n            \"block\": {\n              \"blocks\": \"#gm4_teleportation_anchors:jammer_base_blocks\"\n            }\n          }\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/has_speed_1.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"effects\": {\n      \"minecraft:speed\": {\n        \"amplifier\": 0\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/has_speed_2.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"effects\": {\n      \"minecraft:speed\": {\n        \"amplifier\": 1\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/in_vehicle.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"vehicle\": {}\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/recipe/teleportation_anchor.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"redstone\",\n  \"pattern\": [\n    \"EPE\",\n    \"OLO\",\n    \"CCC\"\n  ],\n  \"key\": {\n    \"E\": \"minecraft:end_stone_bricks\",\n    \"P\": \"minecraft:ender_pearl\",\n    \"O\": \"minecraft:crying_obsidian\",\n    \"L\": \"minecraft:lodestone\",\n    \"C\": \"minecraft:chiseled_stone_bricks\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:player_head\",\n    \"components\": {\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_teleportation_anchors:item/teleportation_anchor\"]},\n      \"minecraft:profile\": \"$teleportation_anchor\",\n      \"minecraft:custom_data\": \"{gm4_machines:{id:'teleportation_anchor'}}\",\n      \"minecraft:custom_name\": {\"translate\":\"block.gm4.teleportation_anchor\",\"fallback\":\"Teleportation Anchor\",\"color\":\"white\",\"italic\":false}\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/recipe/teleportation_jammer.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"redstone\",\n  \"pattern\": [\n    \" P \",\n    \"OEO\",\n    \"CeC\"\n  ],\n  \"key\": {\n    \"P\": [\n      \"minecraft:purpur_block\",\n      \"minecraft:purpur_pillar\"\n    ],\n    \"O\": \"minecraft:crying_obsidian\",\n    \"E\": \"minecraft:ender_eye\",\n    \"C\": \"minecraft:cobblestone\",\n    \"e\": \"minecraft:end_crystal\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:player_head\",\n    \"components\": {\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_teleportation_anchors:item/teleportation_jammer\"]},\n      \"minecraft:profile\": \"$teleportation_jammer\",\n      \"minecraft:custom_data\": \"{gm4_machines:{id:'teleportation_jammer'}}\",\n      \"minecraft:custom_name\": {\"translate\":\"block.gm4.teleportation_jammer\",\"fallback\":\"Teleportation Jammer\",\"color\":\"white\",\"italic\":false}\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/tags/block/jammer_base_blocks.json",
    "content": "{\n    \"values\": [\n        \"minecraft:purpur_block\",\n        \"minecraft:purpur_pillar\"\n    ]\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/tags/entity_type/affected.json",
    "content": "{\n    \"values\": [\n        \"#gm4_teleportation_anchors:teleporters\",\n        \"minecraft:player\"\n    ]\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_teleportation_anchors/tags/entity_type/teleporters.json",
    "content": "{\n    \"values\": [\n        \"minecraft:enderman\",\n        \"minecraft:shulker\"\n    ]\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/data/gm4_zauber_cauldrons/tags/function/player/wormhole_targeting/prepare_teleport.json",
    "content": "{\n    \"values\": [\n        \"gm4_teleportation_anchors:player/resolve_used_chorus\"\n    ]\n}\n"
  },
  {
    "path": "gm4_teleportation_anchors/mod.mcdoc",
    "content": "use ::java::util::slot::SlottedItem\n\ndispatch minecraft:storage[gm4_teleportation_anchors:data] to struct {\n  Items?: [SlottedItem<byte>]\n}\n"
  },
  {
    "path": "gm4_tower_structures/README.md",
    "content": "# Tower Structures<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nA custom terrain expansion pack that adds new tower structures to the world. <!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Towers can spawn in Desert, Ocean, Badlands and Snowy biomes\r\n- Each tower can have a variety of spawners and loot, they are close to vanilla spawn rates\r\n- The quality of loot in towers depends on the height of the tower\r\n"
  },
  {
    "path": "gm4_tower_structures/beet.yaml",
    "content": "id: gm4_tower_structures\nname: Tower Structures\nversion: 3.6.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.pfb_orbis\n  - gm4.plugins.prefabs.module_asset_rename\n\nmeta:\n  gm4:\n    prefabs:\n      - gm4_orbis\n    model_data:\n      - item: bow\n        reference: item/pirate_bow\n        template: vanilla\n      - item: leather_helmet\n        reference: item/pirate_hat\n        template: vanilla\n      - item: stone_sword\n        reference: item/pirate_sword\n        template: vanilla\n      - item: turtle_helmet\n        reference: item/pirate_turtle_helmet\n        template: vanilla\n    website:\n      description: A custom terrain expansion pack that adds new tower structures to the world.\n      recommended:\n        - gm4_dangerous_dungeons\n        - gm4_cooler_caves\n      notes: []\n    modrinth:\n      project_id: FvGL10DQ\n    wiki: https://wiki.gm4.co/wiki/Orbis/Tower_Structures\n    credits:\n      Creator:\n        - Sparks\n      Updated by:\n        - Misode\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/function/init.mcfunction",
    "content": "execute unless score tower_structures gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Tower Structures\"}\nexecute unless score tower_structures gm4_earliest_version < tower_structures gm4_modules run scoreboard players operation tower_structures gm4_earliest_version = tower_structures gm4_modules\nscoreboard players set tower_structures gm4_modules 1\n\nteam add gm4_hide_name\nteam modify gm4_hide_name nametagVisibility never\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/guidebook/tower_structures.json",
    "content": "{\n  \"id\": \"tower_structures\",\n  \"name\": \"Tower Structures\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:ladder\"\n  },\n  \"criteria\": {\n    \"enter_badlands_tower\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_tower_structures:badlands\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_default_tower\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_tower_structures:default\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_desert_tower\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_tower_structures:desert\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_snowy_tower\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_tower_structures:snowy\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_large_ship\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_tower_structures:ocean/large_ship\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_medium_ship\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_tower_structures:ocean/medium_ship\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_raft\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_tower_structures:ocean/raft\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_small_ship\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_tower_structures:ocean/small_ship\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_segmented_cold_frozen_tower\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_tower_structures:segmented/cold_frozen\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_segmented_frozen_tower\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_tower_structures:segmented/frozen\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_segmented_hot_tower\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_tower_structures:segmented/hot\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_segmented_hot_warm_tower\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_tower_structures:segmented/hot_warm\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"enter_segmented_warm_cold_tower\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"location\": {\n                \"structures\": \"gm4_tower_structures:segmented/warm_cold\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"enter_badlands_tower\",\n          \"enter_default_tower\",\n          \"enter_desert_tower\",\n          \"enter_snowy_tower\",\n          \"enter_large_ship\",\n          \"enter_medium_ship\",\n          \"enter_raft\",\n          \"enter_small_ship\",\n          \"enter_segmented_cold_frozen_tower\",\n          \"enter_segmented_frozen_tower\",\n          \"enter_segmented_hot_tower\",\n          \"enter_segmented_hot_warm_tower\",\n          \"enter_segmented_warm_cold_tower\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.tower_structures.description\",\n            \"fallback\": \"Towers can be found on the surface.\\n\\nThese towers contain rare loot and special spawners.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.tower_structures.description.types\",\n            \"fallback\": \"Stone towers can be found in most biomes.\\n\\nThe Badlands, Desert, and Snowy biomes have special towers that match the terrain.\\n\\nOcean dungeons and ships can be found at sea.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/loot_table/chests/ship.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 2,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:gold_nugget\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:gold_ingot\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 12\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:gold_block\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": 2,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:kelp\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"type\": \"minecraft:binomial\",\n                \"n\": 8,\n                \"p\": 0.2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:nautilus_shell\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:turtle_egg\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": 1\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_orbis:chests/tower\"\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:spyglass\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 0,\n                \"max\": 1\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/loot_table/entities/bow_pirate.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_tower_structures:entities/skeleton\"\n                }\n            ]\n        },\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_tower_structures:items/pirate_hat\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_damage\",\n                            \"damage\": 0\n                        }\n                    ]\n                },\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_tower_structures:items/pirate_bow\"\n                }\n            ],\n            \"functions\": [\n                {\n                    \"function\": \"minecraft:set_damage\",\n                    \"damage\": {\n                        \"min\": 0,\n                        \"max\": 1\n                    }\n                }\n            ],\n            \"conditions\": [\n                {\n                    \"condition\": \"minecraft:killed_by_player\"\n                },\n                {\n                    \"condition\": \"minecraft:table_bonus\",\n                    \"enchantment\": \"minecraft:looting\",\n                    \"chances\": [\n                        0.085,\n                        0.095,\n                        0.105,\n                        0.115\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/loot_table/entities/sword_pirate.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_tower_structures:entities/skeleton\"\n                }\n            ]\n        },\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_tower_structures:items/pirate_hat\"\n                },\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_tower_structures:items/pirate_sword\"\n                }\n            ],\n            \"functions\": [\n                {\n                    \"function\": \"minecraft:set_damage\",\n                    \"damage\": {\n                        \"min\": 0,\n                        \"max\": 1\n                    }\n                }\n            ],\n            \"conditions\": [\n                {\n                    \"condition\": \"minecraft:killed_by_player\"\n                },\n                {\n                    \"condition\": \"minecraft:table_bonus\",\n                    \"enchantment\": \"minecraft:looting\",\n                    \"chances\": [\n                        0.085,\n                        0.095,\n                        0.105,\n                        0.115\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/loot_table/entities/turtle_bow_pirate.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_tower_structures:entities/skeleton\"\n                }\n            ]\n        },\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_tower_structures:items/pirate_hat\"\n                },\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_tower_structures:items/pirate_bow\"\n                }\n            ],\n            \"functions\": [\n                {\n                    \"function\": \"minecraft:set_damage\",\n                    \"damage\": {\n                        \"min\": 0,\n                        \"max\": 1\n                    }\n                }\n            ],\n            \"conditions\": [\n                {\n                    \"condition\": \"minecraft:killed_by_player\"\n                },\n                {\n                    \"condition\": \"minecraft:table_bonus\",\n                    \"enchantment\": \"minecraft:looting\",\n                    \"chances\": [\n                        0.085,\n                        0.095,\n                        0.105,\n                        0.115\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/loot_table/entities/turtle_sword_pirate.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_tower_structures:entities/skeleton\"\n                }\n            ]\n        },\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_tower_structures:items/pirate_hat\"\n                },\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_tower_structures:items/pirate_sword\"\n                }\n            ],\n            \"functions\": [\n                {\n                    \"function\": \"minecraft:set_damage\",\n                    \"damage\": {\n                        \"min\": 0,\n                        \"max\": 1\n                    }\n                }\n            ],\n            \"conditions\": [\n                {\n                    \"condition\": \"minecraft:killed_by_player\"\n                },\n                {\n                    \"condition\": \"minecraft:table_bonus\",\n                    \"enchantment\": \"minecraft:looting\",\n                    \"chances\": [\n                        0.085,\n                        0.095,\n                        0.105,\n                        0.115\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/loot_table/items/pirate_bow.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:bow\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": 1\n                        },\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                              \"minecraft:custom_model_data\": {\"strings\":[\"gm4_tower_structures:item/pirate_bow\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.tower_structures.pirate_bow\",\n                                \"fallback\": \"Pirate Bow\"\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/loot_table/items/pirate_hat.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:leather_helmet\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": 1\n                        },\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:dyed_color\": 4013373,\n                                \"minecraft:tooltip_display\": {\n                                  \"hidden_components\": [\n                                    \"minecraft:dyed_color\"\n                                  ]\n                                },\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_tower_structures:item/pirate_hat\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.tower_structures.pirate_hat\",\n                                \"fallback\": \"Pirate Hat\"\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/loot_table/items/pirate_sword.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:stone_sword\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": 1\n                        },\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                              \"minecraft:custom_model_data\": {\"strings\":[\"gm4_tower_structures:item/pirate_sword\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.tower_structures.pirate_sword\",\n                                \"fallback\": \"Pirate Sword\"\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/loot_table/items/pirate_turtle_helmet.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:turtle_helmet\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": 1\n                        },\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                              \"minecraft:custom_model_data\": {\"strings\":[\"gm4_tower_structures:item/pirate_turtle_helmet\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.tower_structures.pirate_turtle_helmet\",\n                                \"fallback\": \"Pirate Turtle Helmet\"\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/is_default_spawnable.json",
    "content": "{\n  \"values\": [\n    \"#is_forest\",\n    \"#is_jungle\",\n    \"#is_taiga\",\n    \"windswept_hills\",\n    \"windswept_gravelly_hills\",\n    \"plains\",\n    \"sunflower_plains\",\n    \"mushroom_fields\",\n    \"meadow\",\n    \"stony_peaks\",\n    \"savanna_plateau\",\n    \"windswept_savanna\"\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/is_desert.json",
    "content": "{\n  \"values\": [\n    \"desert\"\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/is_snowy.json",
    "content": "{\n  \"values\": [\n    \"minecraft:snowy_plains\",\n    \"minecraft:ice_spikes\",\n    \"minecraft:snowy_taiga\",\n    \"minecraft:snowy_beach\",\n    \"minecraft:grove\",\n    \"minecraft:snowy_slopes\",\n    \"minecraft:jagged_peaks\",\n    \"minecraft:frozen_peaks\"\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/segmented/is_cold_frozen.json",
    "content": "{\n  \"values\": [\n    \"#is_mountain\",\n    \"taiga\",\n    \"old_growth_spruce_taiga\",\n    \"old_growth_pine_taiga\"\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/segmented/is_frozen.json",
    "content": "{\n  \"values\": [\n    \"frozen_peaks\",\n    \"snowy_plains\",\n    \"snowy_taiga\",\n    \"ice_spikes\"\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/segmented/is_hot.json",
    "content": "{\n  \"values\": [\n    \"desert\",\n    \"#is_badlands\"\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/segmented/is_hot_warm.json",
    "content": "{\n  \"values\": [\n    \"#is_jungle\",\n    \"#is_savanna\"\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/segmented/is_warm_cold.json",
    "content": "{\n  \"values\": [\n    \"#is_forest\",\n    \"plains\",\n    \"sunflower_plains\"\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/badlands.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#minecraft:is_badlands\",\n  \"step\": \"surface_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"beard_thin\",\n  \"start_pool\": \"gm4_tower_structures:tower/badlands\",\n  \"size\": 2,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"project_start_to_heightmap\": \"WORLD_SURFACE_WG\",\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/default.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_tower_structures:is_default_spawnable\",\n  \"step\": \"surface_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"beard_thin\",\n  \"start_pool\": \"gm4_tower_structures:tower/default\",\n  \"size\": 2,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"project_start_to_heightmap\": \"WORLD_SURFACE_WG\",\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": true\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/desert.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_tower_structures:is_desert\",\n  \"step\": \"surface_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"beard_thin\",\n  \"start_pool\": \"gm4_tower_structures:tower/desert\",\n  \"size\": 2,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"project_start_to_heightmap\": \"WORLD_SURFACE_WG\",\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/ocean/large_ship.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#minecraft:is_ocean\",\n  \"step\": \"surface_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_tower_structures:tower/ocean/large_ship\",\n  \"size\": 2,\n  \"start_height\": {\n    \"absolute\": -3\n  },\n  \"project_start_to_heightmap\": \"WORLD_SURFACE_WG\",\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/ocean/medium_ship.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#minecraft:is_ocean\",\n  \"step\": \"surface_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_tower_structures:tower/ocean/medium_ship\",\n  \"size\": 2,\n  \"start_height\": {\n    \"absolute\": -2\n  },\n  \"project_start_to_heightmap\": \"WORLD_SURFACE_WG\",\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/ocean/raft.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#minecraft:is_ocean\",\n  \"step\": \"surface_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_tower_structures:tower/ocean/raft\",\n  \"size\": 2,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"project_start_to_heightmap\": \"WORLD_SURFACE_WG\",\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/ocean/small_ship.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#minecraft:is_ocean\",\n  \"step\": \"surface_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"none\",\n  \"start_pool\": \"gm4_tower_structures:tower/ocean/small_ship\",\n  \"size\": 2,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"project_start_to_heightmap\": \"WORLD_SURFACE_WG\",\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/segmented/cold_frozen.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_tower_structures:segmented/is_cold_frozen\",\n  \"step\": \"surface_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"beard_thin\",\n  \"start_pool\": \"gm4_tower_structures:tower/segmented/cold_frozen\",\n  \"size\": 7,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"project_start_to_heightmap\": \"WORLD_SURFACE_WG\",\n  \"max_distance_from_center\": 80,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/segmented/frozen.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_tower_structures:segmented/is_frozen\",\n  \"step\": \"surface_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"beard_thin\",\n  \"start_pool\": \"gm4_tower_structures:tower/segmented/frozen\",\n  \"size\": 7,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"project_start_to_heightmap\": \"WORLD_SURFACE_WG\",\n  \"max_distance_from_center\": 80,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/segmented/hot.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_tower_structures:segmented/is_hot\",\n  \"step\": \"surface_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"beard_thin\",\n  \"start_pool\": \"gm4_tower_structures:tower/segmented/hot\",\n  \"size\": 7,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"project_start_to_heightmap\": \"WORLD_SURFACE_WG\",\n  \"max_distance_from_center\": 116,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/segmented/hot_warm.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_tower_structures:segmented/is_hot_warm\",\n  \"step\": \"surface_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"beard_thin\",\n  \"start_pool\": \"gm4_tower_structures:tower/segmented/hot_warm\",\n  \"size\": 7,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"project_start_to_heightmap\": \"WORLD_SURFACE_WG\",\n  \"max_distance_from_center\": 80,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/segmented/warm_cold.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_tower_structures:segmented/is_warm_cold\",\n  \"step\": \"surface_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"beard_thin\",\n  \"start_pool\": \"gm4_tower_structures:tower/segmented/warm_cold\",\n  \"size\": 7,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"project_start_to_heightmap\": \"WORLD_SURFACE_WG\",\n  \"max_distance_from_center\": 80,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/snowy.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_tower_structures:is_snowy\",\n  \"step\": \"surface_structures\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"beard_thin\",\n  \"start_pool\": \"gm4_tower_structures:tower/snowy\",\n  \"size\": 2,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"project_start_to_heightmap\": \"WORLD_SURFACE_WG\",\n  \"max_distance_from_center\": 1,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure_set/ships.json",
    "content": "{\n  \"structures\": [\n    {\n      \"structure\": \"gm4_tower_structures:ocean/large_ship\",\n      \"weight\": 9\n    },\n    {\n      \"structure\": \"gm4_tower_structures:ocean/medium_ship\",\n      \"weight\": 9\n    },\n    {\n      \"structure\": \"gm4_tower_structures:ocean/small_ship\",\n      \"weight\": 10\n    },\n    {\n      \"structure\": \"gm4_tower_structures:ocean/raft\",\n      \"weight\": 10\n    }\n  ],\n  \"placement\": {\n    \"type\": \"minecraft:random_spread\",\n    \"salt\": 1800186508,\n    \"spacing\": 17,\n    \"separation\": 5\n  }\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/structure_set/towers.json",
    "content": "{\n  \"structures\": [\n    {\n      \"structure\": \"gm4_tower_structures:badlands\",\n      \"weight\": 6\n    },\n    {\n      \"structure\": \"gm4_tower_structures:default\",\n      \"weight\": 6\n    },\n    {\n      \"structure\": \"gm4_tower_structures:desert\",\n      \"weight\": 6\n    },\n    {\n      \"structure\": \"gm4_tower_structures:snowy\",\n      \"weight\": 6\n    },\n    {\n      \"structure\": \"gm4_tower_structures:segmented/cold_frozen\",\n      \"weight\": 10\n    },\n    {\n      \"structure\": \"gm4_tower_structures:segmented/frozen\",\n      \"weight\": 10\n    },\n    {\n      \"structure\": \"gm4_tower_structures:segmented/hot_warm\",\n      \"weight\": 10\n    },\n    {\n      \"structure\": \"gm4_tower_structures:segmented/hot\",\n      \"weight\": 10\n    },\n    {\n      \"structure\": \"gm4_tower_structures:segmented/warm_cold\",\n      \"weight\": 10\n    }\n  ],\n  \"placement\": {\n    \"type\": \"minecraft:random_spread\",\n    \"salt\": 1948932716,\n    \"spacing\": 30,\n    \"separation\": 12,\n    \"frequency\": 0.8\n  }\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/cold_frozen/middle.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segment/cold_frozen/middle\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 3,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/cold/middle/frozen/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 3,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/cold/middle/frozen/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 3,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/frozen/middle/cold/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 3,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/frozen/middle/cold/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/cold_frozen/top.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segment/cold_frozen/top\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/cold/top/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/cold/top/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/frozen/top/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/frozen/top/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:empty_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/frozen/middle.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segment/frozen/middle\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/frozen/middle/frozen/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/frozen/middle/frozen/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/frozen/top.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segment/frozen/top\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 4,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/frozen/top/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 4,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/frozen/top/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:empty_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/hot/middle.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segment/hot/middle\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/hot/middle/hot/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/hot/middle/hot/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/hot/top.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segment/hot/top\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 4,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/hot/top/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 4,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/hot/top/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:empty_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/hot_warm/middle.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segment/hot_warm/middle\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/hot/middle/warm/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/hot/middle/warm/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/warm/middle/hot/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/warm/middle/hot/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/hot_warm/top.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segment/hot_warm/top\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/hot/top/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/hot/top/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/warm/top/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/warm/top/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:empty_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/warm_cold/middle.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segment/warm_cold/middle\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/warm/middle/cold/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/warm/middle/cold/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/cold/middle/warm/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/cold/middle/warm/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/warm_cold/top.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segment/warm_cold/top\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/cold/top/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/cold/top/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/warm/top/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/warm/top/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:empty_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/spawner/ship.json",
    "content": "{\n  \"name\": \"gm4_orbis:spawner/default\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_tower_structures:spawner/ship/drowned_up\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_tower_structures:spawner/ship/drowned_side\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_tower_structures:spawner/ship/drowned_down\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_tower_structures:spawner/ship/skeleton_bow_up\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_tower_structures:spawner/ship/skeleton_bow_side\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_tower_structures:spawner/ship/skeleton_bow_down\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_tower_structures:spawner/ship/skeleton_sword_up\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_tower_structures:spawner/ship/skeleton_sword_side\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_tower_structures:spawner/ship/skeleton_sword_down\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/subpart/large_ship/features.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:subpart/large_ship/features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/ocean/large_ship/features/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/ocean/large_ship/features/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/ocean/large_ship/features/3\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/ocean/large_ship/features/4\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/subpart/large_ship/sail.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:subpart/large_ship/sail\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/black\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/blue\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/brown\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/cyan\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/green\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/grey\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/light_blue\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/light_grey\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/lime\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/magenta\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/orange\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/pink\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/purple\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/red\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/white\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/large_ship/sail/yellow\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/subpart/medium_ship/features.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:subpart/medium_ship/features\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/features/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/features/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/features/3\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/features/4\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/subpart/medium_ship/sail.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:subpart/medium_ship/sail\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/black\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/blue\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/brown\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/cyan\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/green\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/grey\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/light_blue\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/light_grey\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/lime\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/magenta\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/orange\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/pink\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/purple\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/red\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/white\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/sail/yellow\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/subpart/raft_sail.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:subpart/raft_sail\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/black\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/blue\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/brown\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/cyan\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/green\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/grey\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/light_blue\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/light_grey\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/lime\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/magenta\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/orange\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/pink\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/purple\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/red\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/white\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/raft/sail/yellow\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/subpart/small_ship_sail.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:subpart/small_ship_sail\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/black\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/blue\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/brown\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/cyan\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/green\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/grey\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/light_blue\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/light_grey\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/lime\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/magenta\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/orange\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/pink\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/purple\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/red\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/white\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    },\n    {\n      \"element\": {\n          \"element_type\": \"minecraft:single_pool_element\",\n          \"projection\": \"rigid\",\n          \"location\": \"gm4_tower_structures:tower/ocean/small_ship/sail/yellow\",\n          \"processors\": \"minecraft:empty\"\n      },\n      \"weight\": 1\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/badlands.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:badlands\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/badlands/acacia\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/badlands/basic\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:terracotta\",\n                    \"probability\": 0.25\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:orange_terracotta\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:terracotta\",\n                    \"probability\": 0.333\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:red_terracotta\" }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/badlands/sandy\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/badlands/tall\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cut_red_sandstone\",\n                    \"probability\": 0.1\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:smooth_red_sandstone\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cut_red_sandstone\",\n                    \"probability\": 0.04\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:chiseled_red_sandstone\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cut_red_sandstone\",\n                    \"probability\": 0.9\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:red_sandstone\" }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/acacia\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/default.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:default\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/default/basic\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:stone\",\n                    \"probability\": 0.08\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:cracked_stone_bricks\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:stone\",\n                    \"probability\": 0.16\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:cobblestone\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:stone\",\n                    \"probability\": 0.22\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:andesite\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:stone\",\n                    \"probability\": 0.12\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:polished_andesite\" }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/default/cobblestone1\",\n        \"processors\": \"empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/default/cobblestone2\",\n        \"processors\": \"empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/default/diorite\",\n        \"processors\": \"empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/default/granite\",\n        \"processors\": \"empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/default/small\",\n        \"processors\": \"empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/default/small2\",\n        \"processors\": \"empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/default/tall\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.2\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:cracked_stone_bricks\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:stone_bricks\",\n                    \"probability\": 0.07\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:polished_andesite\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cobblestone\",\n                    \"probability\": 0.04\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:stone\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cobblestone\",\n                    \"probability\": 0.15\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:gravel\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cobblestone\",\n                    \"probability\": 0.87\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:andesite\" }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/default/diorite_dark\",\n        \"processors\": \"empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/default/spruce\",\n        \"processors\": \"empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/acacia\",\n        \"processors\": \"empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/desert.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:default\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/desert/basic\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:smooth_sandstone\",\n                    \"probability\": 0.25\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:sandstone\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:smooth_sandstone\",\n                    \"probability\": 0.10\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:cut_sandstone\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:smooth_sandstone\",\n                    \"probability\": 0.10\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:chiseled_sandstone\" }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/desert/sandstone\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/desert/tall\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"minecraft:rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cut_sandstone\",\n                    \"probability\": 0.2\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:smooth_sandstone\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cut_sandstone\",\n                    \"probability\": 0.07\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:chiseled_sandstone\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"minecraft:always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"minecraft:random_block_match\",\n                    \"block\": \"minecraft:cut_sandstone\",\n                    \"probability\": 0.8\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:sandstone\" }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/ocean/large_ship.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:tower/ocean/large_ship\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/ocean/large_ship/base\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/ocean/medium_ship.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:tower/ocean/medium_ship\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/ocean/medium_ship/base\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/ocean/raft.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:tower/ocean/raft\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/ocean/raft/base\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/ocean/small_ship.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:tower/ocean/small_ship\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/ocean/small_ship/base\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/segmented/cold_frozen.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segmented/cold\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/cold/base/frozen/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/cold/base/frozen/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/frozen/base/cold/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/frozen/base/cold/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/segmented/frozen.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segmented/hot\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/frozen/base/frozen/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/frozen/base/frozen/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/segmented/hot.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segmented/hot\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/hot/base/hot/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/hot/base/hot/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/segmented/hot_warm.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segmented/hot\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/hot/base/warm/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/hot/base/warm/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/warm/base/hot/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/warm/base/hot/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/segmented/warm_cold.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:segmented/warm\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/warm/base/cold/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/warm/base/cold/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/cold/base/warm/1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:segmented/cold/base/warm/2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/snowy.json",
    "content": "{\n  \"name\": \"gm4_tower_structures:snowy\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/snowy/basic\",\n        \"processors\": {\n          \"processors\": [\n            {\n              \"processor_type\": \"rule\",\n              \"rules\": [\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:ice\",\n                    \"probability\": 0.2\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:packed_ice\" }\n                },\n                {\n                  \"location_predicate\": { \"predicate_type\": \"always_true\" },\n                  \"input_predicate\": {\n                    \"predicate_type\": \"random_block_match\",\n                    \"block\": \"minecraft:ice\",\n                    \"probability\": 0.8\n                  },\n                  \"output_state\": { \"Name\": \"minecraft:snow_block\" }\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_tower_structures:tower/snowy/boxy\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "gm4_tower_structures/translations.csv",
    "content": "key,en_us\nitem.gm4.tower_structures.pirate_sword,Pirate Sword\nitem.gm4.tower_structures.pirate_turtle_helmet,Pirate Turtle Helmet\nitem.gm4.tower_structures.pirate_hat,Pirate Hat\nitem.gm4.tower_structures.pirate_bow,Pirate Bow\ntext.gm4.guidebook.module_desc.tower_structures,A custom terrain expansion pack that adds new tower structures to the world.\ntext.gm4.guidebook.tower_structures.description,Towers can be found on the surface.\\n\\nThese towers contain rare loot and special spawners.\ntext.gm4.guidebook.tower_structures.description.types,\"Stone towers can be found in most biomes.\\n\\nThe Badlands, Desert, and Snowy biomes have special towers that match the terrain.\\n\\nOcean dungeons and ships can be found at sea.\"\n"
  },
  {
    "path": "gm4_towering_trees/README.md",
    "content": "# Towering Trees<!--$headerTitle--><!--$pmc:delete-->\n\nAdds mega and small tree variants to any sapling that is missing one! <!--$pmc:headerSize-->\n\n![Mega Oak Tree](images/towering_trees.png)<!--$localAssetToURL--><!--$modrinth:replaceWithVideo--><!--$pmc:delete-->\n\n### Features\n- Adds mega and small tree variants to any vanilla sapling that is missing one.\n- Grow a mega mangrove tree and admire it! Or chop it down, your choice!\n- Works with natural growth or bonemeal, no special interaction required, just plant a 2x2 of saplings!\n"
  },
  {
    "path": "gm4_towering_trees/assets/translations.csv",
    "content": "key,en_us,de_de,en_ws\ntext.gm4.guidebook.towering_trees.description,\"Oak, Birch, Acacia, Cherry and Mangrove trees have mega (2x2) variants.\\n\\nDark Oak and Pale Oak have small variants.\"\ntext.gm4.guidebook.module_desc.towering_trees,\"Adds mega and small tree variants to any sapling that is missing one!\"\n"
  },
  {
    "path": "gm4_towering_trees/beet.yaml",
    "content": "id: gm4_towering_trees\nname: Towering Trees\nversion: 1.1.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4_towering_trees.generate\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_trees\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_trees: 1.5.0\n    website:\n      description: Adds mega and small tree variants to any sapling that is missing one!\n      recommended:\n        - gm4_metallurgy\n    wiki: https://wiki.gm4.co/wiki/Towering_Trees\n    credits:\n      Creator:\n        - Djones\n        - Kyrius\n      Tree Structures:\n        - BPR\n        - rednls\n        - Dinoguin_Jess\n        - Lune6\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/advancement/place_sapling.json",
    "content": "{\n    \"criteria\": {\n        \"place_sapling\": {\n            \"trigger\": \"minecraft:placed_block\",\n            \"conditions\": {\n                \"location\": [\n                    {\n                        \"condition\": \"minecraft:match_tool\",\n                        \"predicate\": {\n                            \"items\": \"#gm4_towering_trees:supported_sapling\"\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_towering_trees:place_sapling\"\n    }\n}\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/check_for_mega_tree.mcfunction",
    "content": "# check what orientation this big tree has (if it is a big tree)\n# @s = sapling marker\n# located at @s\n# run from generate_tree\n\n# SE = 1\nexecute if blocks ~1 ~ ~ ~1 ~ ~ ~ ~ ~ all if blocks ~1 ~ ~1 ~1 ~ ~1 ~ ~ ~ all if blocks ~ ~ ~1 ~ ~ ~1 ~ ~ ~ all run return 1\n# NE = 2\nexecute if blocks ~1 ~ ~ ~1 ~ ~ ~ ~ ~ all if blocks ~1 ~ ~-1 ~1 ~ ~-1 ~ ~ ~ all if blocks ~ ~ ~-1 ~ ~ ~-1 ~ ~ ~ all run return 2\n# SW = 3\nexecute if blocks ~-1 ~ ~ ~-1 ~ ~ ~ ~ ~ all if blocks ~-1 ~ ~1 ~-1 ~ ~1 ~ ~ ~ all if blocks ~ ~ ~1 ~ ~ ~1 ~ ~ ~ all run return 3\n# NW = 4\nexecute if blocks ~-1 ~ ~ ~-1 ~ ~ ~ ~ ~ all if blocks ~-1 ~ ~-1 ~-1 ~ ~-1 ~ ~ ~ all if blocks ~ ~ ~-1 ~ ~ ~-1 ~ ~ ~ all run return 4\n\nreturn 0\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/clear_sapling.mcfunction",
    "content": "# removes this sapling so features can be placed\n# @s = sapling marker\n# at @s\n# run from generate_mega_tree\n# run from generate_small_tree\n\nexecute if block ~ ~ ~ mangrove_propagule[waterlogged=true] run tag @s add gm4_mangrove_tree_sapling.waterlogged\nexecute unless entity @s[tag=gm4_mangrove_tree_sapling.waterlogged] run fill ~ ~ ~ ~ ~ ~ air replace #gm4_towering_trees:supported_sapling\nexecute if entity @s[tag=gm4_mangrove_tree_sapling.waterlogged] run setblock ~ ~ ~ water\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/generate_mega_tree.mcfunction",
    "content": "# generates the tree - mega\n# @s = sapling marker\n# located at @s (offset to be at the negative corner of the 2x2)\n# run from generate_tree\n\n# towering\nexecute if entity @s[tag=gm4_oak_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/oak/pick_variant\nexecute if entity @s[tag=gm4_acacia_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/acacia/pick_variant\nexecute if entity @s[tag=gm4_cherry_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/cherry/pick_variant\nexecute if entity @s[tag=gm4_mangrove_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/mangrove/pick_variant\nexecute if entity @s[tag=gm4_birch_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/birch/pick_variant\n\n# vanilla - needs to remove the saplings first so they can be placed\nexecute align xyz as @e[type=marker,tag=gm4_towering_trees_sapling,dx=1,dy=0,dz=1] at @s run function gm4_towering_trees:clear_sapling\n\nexecute if entity @s[tag=gm4_pale_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:pale_oak_bonemeal\nexecute if entity @s[tag=gm4_dark_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:dark_oak\n\n# replace sapling if placement failed\nexecute if score $tree_placed gm4_towering_trees_data matches 0 align xyz as @e[type=marker,tag=gm4_towering_trees_sapling,dx=1,dy=0,dz=1] at @s run function gm4_towering_trees:replace_sapling\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/generate_small_tree.mcfunction",
    "content": "# generates the tree - small\n# @s = sapling marker\n# located at @s\n# run from generate_tree\n\n# remove sapling to clear the space\nfunction gm4_towering_trees:clear_sapling\n\n# vanilla\nexecute if entity @s[tag=gm4_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:oak\nexecute if entity @s[tag=gm4_acacia_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:acacia\nexecute if entity @s[tag=gm4_cherry_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:cherry\nexecute if entity @s[tag=gm4_mangrove_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:mangrove\nexecute if entity @s[tag=gm4_birch_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:birch\n\n# towering\nexecute if entity @s[tag=gm4_pale_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run function gm4_towering_trees:generate_tree_type/pale_oak/pick_variant\nexecute if entity @s[tag=gm4_dark_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run function gm4_towering_trees:generate_tree_type/dark_oak/pick_variant\n\n# replace sapling if placement failed\nexecute if score $tree_placed gm4_towering_trees_data matches 0 run function gm4_towering_trees:replace_sapling\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/generate_tree.mcfunction",
    "content": "# generates the tree\n# @s = sapling marker\n# located at @s\n# run from gm4_towering_trees:verify/generate_tree\n\nscoreboard players set $tree_placed gm4_towering_trees_data 0\n\n# check if this is a big tree\nexecute store result score $big_tree gm4_towering_trees_data run function gm4_towering_trees:check_for_mega_tree\n\n# generate mega tree positionionally based on which sapling grew\nexecute if score $big_tree gm4_towering_trees_data matches 1 run function gm4_towering_trees:generate_mega_tree\nexecute if score $big_tree gm4_towering_trees_data matches 2 positioned ~ ~ ~-1 run function gm4_towering_trees:generate_mega_tree\nexecute if score $big_tree gm4_towering_trees_data matches 3 positioned ~-1 ~ ~ run function gm4_towering_trees:generate_mega_tree\nexecute if score $big_tree gm4_towering_trees_data matches 4 positioned ~-1 ~ ~-1 run function gm4_towering_trees:generate_mega_tree\n# small trees\nexecute if score $big_tree gm4_towering_trees_data matches 0 run function gm4_towering_trees:generate_small_tree\n\n# remove the saplings\nexecute if score $tree_placed gm4_towering_trees_data matches 1 run kill @e[type=marker,tag=gm4_towering_trees_sapling.target,limit=4,distance=..3]\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/extra.mcfunction",
    "content": "# extra function for mangrove trees\n# @s = sapling marker\n# located at @s\n# run from generate_tree_type/mangrove/place_tree\n\n# remove the saplings, this doesn't always happen for mangrove trees\nfill ~ ~ ~ ~1 ~ ~1 air replace mangrove_propagule[waterlogged=false]\nfill ~ ~ ~ ~1 ~ ~1 water replace mangrove_propagule[waterlogged=true]\n\n# place the roots after 1 tick to allow markers to load in\nschedule function gm4_towering_trees:generate_tree_type/mangrove/roots/schedule 1t\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/loop.mcfunction",
    "content": "# build mangrove tree roots\n# @s = mangrove tree root marker\n# at @s positioned ^ ^-y ^z, randomly offset\n# run from generate_tree_type/mangrove/roots/start\n# run from here\n\n# if block cannot be replaced with root or max length was reached return\nexecute unless block ~ ~ ~ #gm4_towering_trees:mangrove_root_replaceable run return fail\nscoreboard players remove $max_length gm4_towering_trees_data 1\nexecute unless score $max_length gm4_towering_trees_data matches 1.. run return fail\n\n# fill with muddy / waterlogged / normal roots\nfill ~ ~ ~ ~ ~ ~ muddy_mangrove_roots replace mud\nfill ~ ~ ~ ~ ~ ~ mangrove_roots[waterlogged=true] replace #gm4:water\nexecute unless block ~ ~ ~ mangrove_roots unless block ~ ~ ~ muddy_mangrove_roots run setblock ~ ~ ~ mangrove_roots\n\n# random carpets\nexecute if predicate {condition:\"random_chance\",chance:0.5} run fill ~ ~1 ~ ~ ~1 ~ moss_carpet replace #air\n\n# small chance to skew to ground from now on\nexecute if predicate {condition:\"random_chance\",chance:0.02} run tag @s add gm4_towering_trees.mangrove_root_skewed\n\n# pick direction\nexecute if predicate {condition:\"random_chance\",chance:0.8} positioned ~ ~-1 ~ run return run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop\nexecute if score $max_distance_from_tree gm4_towering_trees_data matches 0 positioned ~ ~-1 ~ run return run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop\n\n# if skewed to ground start a loop down if the root is going forward\nscoreboard players set $max_skew_length gm4_towering_trees_data 5\nexecute if entity @s[tag=gm4_towering_trees.mangrove_root_skewed] positioned ~ ~-1 ~ run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop_to_ground\n\nscoreboard players remove $max_distance_from_tree gm4_towering_trees_data 1\nexecute positioned ^ ^ ^1 run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/loop_to_ground.mcfunction",
    "content": "# build mangrove tree roots\n# @s = mangrove tree root marker\n# at @s positioned ^ ^-y ^z, randomly offset, then positioned ~ ~-n ~\n# run from generate_tree_type/mangrove/roots/loop\n# run from here\n\n# if block cannot be replaced with root return\nexecute unless block ~ ~ ~ #gm4_towering_trees:mangrove_root_replaceable run return fail\nscoreboard players remove $max_skew_length gm4_towering_trees_data 1\nexecute unless score $max_skew_length gm4_towering_trees_data matches 1.. run return fail\n\n# fill with (muddy) roots\nfill ~ ~ ~ ~ ~ ~ muddy_mangrove_roots replace mud\nfill ~ ~ ~ ~ ~ ~ mangrove_roots[waterlogged=true] replace #gm4:water\nexecute unless block ~ ~ ~ mangrove_roots unless block ~ ~ ~ muddy_mangrove_roots run setblock ~ ~ ~ mangrove_roots\n\n# go down to ground\nexecute positioned ~ ~-1 ~ run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop_to_ground\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/schedule.mcfunction",
    "content": "# look for mangrove tree root markers\n# @s = unspecified\n# at unspecified\n# run from generate_tree_type/mangrove/extra\n\nexecute as @e[type=marker,tag=gm4_towering_trees.mangrove_root] at @s run function gm4_towering_trees:generate_tree_type/mangrove/roots/start\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/start.mcfunction",
    "content": "# build mangrove tree roots\n# @s = mangrove tree root marker\n# at @s\n# run from generate_tree_type/mangrove/roots/schedule\n\nscoreboard players set $max_distance_from_tree gm4_towering_trees_data 7\nscoreboard players set $max_length gm4_towering_trees_data 16\nfunction gm4_towering_trees:generate_tree_type/mangrove/roots/loop\nkill @s\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/init.mcfunction",
    "content": "execute unless score towering_trees gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Towering Trees\"}\nexecute unless score towering_trees gm4_earliest_version < towering_trees gm4_modules run scoreboard players operation towering_trees gm4_earliest_version = towering_trees gm4_modules\nscoreboard players set towering_trees gm4_modules 1\n\n# to tree or not to tree\n\n# scoreboards and constants\nscoreboard objectives add gm4_towering_trees_data dummy\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/initialize_sapling.mcfunction",
    "content": "# initializes the vanilla tree's marker\n# @s = player who placed down the vanilla tree sapling\n# located at the center of the placed sapling\n# run from verify/initialize_sapling\n\n# summon marker\n# spruce and jungle are not included as they already have both variants of tree\nexecute if block ~ ~ ~ oak_sapling run summon marker ~ ~ ~ {CustomName:\"gm4_oak_tree_sapling\",Tags:[\"gm4_tree_sapling\",\"gm4_towering_trees_sapling\",\"gm4_oak_tree_sapling\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"]}\nexecute if block ~ ~ ~ birch_sapling run summon marker ~ ~ ~ {CustomName:\"gm4_birch_tree_sapling\",Tags:[\"gm4_tree_sapling\",\"gm4_towering_trees_sapling\",\"gm4_birch_tree_sapling\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"]}\nexecute if block ~ ~ ~ acacia_sapling run summon marker ~ ~ ~ {CustomName:\"gm4_acacia_tree_sapling\",Tags:[\"gm4_tree_sapling\",\"gm4_towering_trees_sapling\",\"gm4_acacia_tree_sapling\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"]}\nexecute if block ~ ~ ~ dark_oak_sapling run summon marker ~ ~ ~ {CustomName:\"gm4_dark_oak_tree_sapling\",Tags:[\"gm4_tree_sapling\",\"gm4_towering_trees_sapling\",\"gm4_dark_oak_tree_sapling\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"]}\nexecute if block ~ ~ ~ cherry_sapling run summon marker ~ ~ ~ {CustomName:\"gm4_cherry_tree_sapling\",Tags:[\"gm4_tree_sapling\",\"gm4_towering_trees_sapling\",\"gm4_cherry_tree_sapling\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"]}\nexecute if block ~ ~ ~ pale_oak_sapling run summon marker ~ ~ ~ {CustomName:\"gm4_pale_oak_tree_sapling\",Tags:[\"gm4_tree_sapling\",\"gm4_towering_trees_sapling\",\"gm4_pale_oak_tree_sapling\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"]}\nexecute if block ~ ~ ~ mangrove_propagule run summon marker ~ ~ ~ {CustomName:\"gm4_mangrove_tree_sapling\",Tags:[\"gm4_tree_sapling\",\"gm4_towering_trees_sapling\",\"gm4_mangrove_tree_sapling\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"]}\n# set stage requirement (higher = longer to grow)\nscoreboard players set @e[type=marker,tag=gm4_towering_trees_sapling,distance=..0.1] gm4_sap_growth 2\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/place_sapling.mcfunction",
    "content": "# Initiates the search for the placed sapling\n# @s = player that just placed a custom sapling\n# at @s\nadvancement revoke @s only gm4_towering_trees:place_sapling\n\n# have to engage lib_trees from here since this module works with vanilla saplings\nfunction #gm4_trees:place_sapling\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/replace_sapling.mcfunction",
    "content": "# replaces this sapling if the tree could not be placed\n# @s = sapling marker\n# at @s\n# run from generate_mega_tree\n# run from generate_small_tree\n\nexecute if entity @s[tag=gm4_oak_tree_sapling] run setblock ~ ~ ~ oak_sapling[stage=0]\nexecute if entity @s[tag=gm4_acacia_tree_sapling] run setblock ~ ~ ~ acacia_sapling[stage=0]\nexecute if entity @s[tag=gm4_cherry_tree_sapling] run setblock ~ ~ ~ cherry_sapling[stage=0]\nexecute if entity @s[tag=gm4_mangrove_tree_sapling.waterlogged] run setblock ~ ~ ~ mangrove_propagule[stage=0,age=4,waterlogged=true]\nexecute if entity @s[tag=!gm4_mangrove_tree_sapling.waterlogged,tag=gm4_mangrove_tree_sapling] run setblock ~ ~ ~ mangrove_propagule[stage=0,age=4,waterlogged=false]\nexecute if entity @s[tag=gm4_birch_tree_sapling] run setblock ~ ~ ~ birch_sapling[stage=0]\nexecute if entity @s[tag=gm4_pale_oak_tree_sapling] run setblock ~ ~ ~ pale_oak_sapling[stage=0]\nexecute if entity @s[tag=gm4_dark_oak_tree_sapling] run setblock ~ ~ ~ dark_oak_sapling[stage=0]\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/verify/generate_tree.mcfunction",
    "content": "# verifies that the sapling type is from this module\n# @s = gm4_tree_sapling marker\n# located at @s\n# run from gm4_trees:advance_stage via #gm4_trees:generate_tree\n\nexecute if entity @s[tag=gm4_towering_trees_sapling] run function gm4_towering_trees:generate_tree\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/function/verify/initialize_sapling.mcfunction",
    "content": "# verifies that the sapling type is from this module\n# @s = player who just placed down a custom sapling\n# located at the center sapling block\n# run from gm4_trees:sapling/summon marker via #gm4_trees:initialize_sapling\n\n# this module runs on vanilla saplings, so we want to check for no specific type\nexecute unless data storage gm4_trees:temp sapling{} align xyz unless entity @e[tag=smithed.block,dx=0,dy=0,dz=0,limit=1] positioned ~.5 ~.5 ~.5 run function gm4_towering_trees:initialize_sapling\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/guidebook/towering_trees.json",
    "content": "{\n  \"id\": \"towering_trees\",\n  \"name\": \"Towering Trees\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:oak_sapling\"\n  },\n  \"criteria\": {\n    \"obtain_sapling\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#gm4_towering_trees:supported_sapling\"\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"towering_trees\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_sapling\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.towering_trees.description\",\n            \"fallback\": \"Oak, Birch, Acacia, Cherry and Mangrove trees have mega (2x2) variants.\\n\\nDark Oak and Pale Oak have small variants.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/tags/block/mangrove_root_replaceable.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:air\",\n        \"#minecraft:mangrove_roots_can_grow_through\",\n        \"#minecraft:replaceable_by_trees\"\n    ]\n}\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/tags/block/supported_sapling.json",
    "content": "{\n    \"values\": [\n        \"acacia_sapling\",\n        \"birch_sapling\",\n        \"cherry_sapling\",\n        \"dark_oak_sapling\",\n        \"mangrove_propagule\",\n        \"oak_sapling\",\n        \"pale_oak_sapling\"\n    ]\n}\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/tags/block/tree_placeable.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:air\",\n        \"#minecraft:logs\",\n        \"#minecraft:replaceable_by_trees\",\n        \"#gm4_towering_trees:supported_sapling\"\n    ]\n}\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/tags/item/supported_sapling.json",
    "content": "{\n    \"values\": [\n        \"oak_sapling\",\n        \"birch_sapling\",\n        \"acacia_sapling\",\n        \"dark_oak_sapling\",\n        \"cherry_sapling\",\n        \"pale_oak_sapling\",\n        \"mangrove_propagule\"\n    ]\n}\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/worldgen/configured_feature/leaf_litter.json",
    "content": "{\n    \"type\": \"minecraft:tree\",\n    \"config\": {\n        \"decorators\": [\n            {\n                \"type\": \"minecraft:place_on_ground\",\n                \"block_state_provider\": {\n                    \"type\": \"minecraft:weighted_state_provider\",\n                    \"entries\": [\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"segment_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"segment_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"segment_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"segment_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"segment_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"segment_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"segment_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"segment_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"segment_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"segment_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"segment_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"segment_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        }\n                    ]\n                },\n                \"height\": 3,\n                \"radius\": 7,\n                \"tries\": 150\n            },\n            {\n                \"type\": \"minecraft:place_on_ground\",\n                \"block_state_provider\": {\n                    \"type\": \"minecraft:weighted_state_provider\",\n                    \"entries\": [\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"segment_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"segment_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"segment_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"segment_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"segment_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"segment_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"segment_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"segment_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"segment_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"segment_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"segment_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"segment_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"segment_amount\": \"4\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"segment_amount\": \"4\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"segment_amount\": \"4\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:leaf_litter\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"segment_amount\": \"4\"\n                                }\n                            },\n                            \"weight\": 1\n                        }\n                    ]\n                },\n                \"height\": 3,\n                \"radius\": 3,\n                \"tries\": 300\n            }\n        ],\n        \"dirt_provider\": {\n            \"type\": \"minecraft:simple_state_provider\",\n            \"state\": {\n                \"Name\": \"minecraft:air\"\n            }\n        },\n        \"foliage_placer\": {\n            \"type\": \"minecraft:bush_foliage_placer\",\n            \"height\": 0,\n            \"offset\": 0,\n            \"radius\": 0\n        },\n        \"foliage_provider\": {\n            \"type\": \"minecraft:simple_state_provider\",\n            \"state\": {\n                \"Name\": \"minecraft:air\"\n            }\n        },\n        \"force_dirt\": false,\n        \"ignore_vines\": true,\n        \"minimum_size\": {\n            \"type\": \"minecraft:two_layers_feature_size\",\n            \"limit\": 0,\n            \"lower_size\": 0,\n            \"upper_size\": 0\n        },\n        \"trunk_placer\": {\n            \"type\": \"minecraft:dark_oak_trunk_placer\",\n            \"base_height\": 0,\n            \"height_rand_a\": 0,\n            \"height_rand_b\": 0\n        },\n        \"trunk_provider\": {\n            \"type\": \"minecraft:simple_state_provider\",\n            \"state\": {\n                \"Name\": \"minecraft:air\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_towering_trees/worldgen/configured_feature/pink_petals.json",
    "content": "{\n    \"type\": \"minecraft:tree\",\n    \"config\": {\n        \"decorators\": [\n            {\n                \"type\": \"minecraft:place_on_ground\",\n                \"block_state_provider\": {\n                    \"type\": \"minecraft:weighted_state_provider\",\n                    \"entries\": [\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"flower_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"flower_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"flower_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"flower_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"flower_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"flower_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"flower_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"flower_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"flower_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"flower_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"flower_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"flower_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        }\n                    ]\n                },\n                \"height\": 3,\n                \"radius\": 7,\n                \"tries\": 150\n            },\n            {\n                \"type\": \"minecraft:place_on_ground\",\n                \"block_state_provider\": {\n                    \"type\": \"minecraft:weighted_state_provider\",\n                    \"entries\": [\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"flower_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"flower_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"flower_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"flower_amount\": \"1\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"flower_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"flower_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"flower_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"flower_amount\": \"2\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"flower_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"flower_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"flower_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"flower_amount\": \"3\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"north\",\n                                    \"flower_amount\": \"4\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"east\",\n                                    \"flower_amount\": \"4\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"south\",\n                                    \"flower_amount\": \"4\"\n                                }\n                            },\n                            \"weight\": 1\n                        },\n                        {\n                            \"data\": {\n                                \"Name\": \"minecraft:pink_petals\",\n                                \"Properties\": {\n                                    \"facing\": \"west\",\n                                    \"flower_amount\": \"4\"\n                                }\n                            },\n                            \"weight\": 1\n                        }\n                    ]\n                },\n                \"height\": 3,\n                \"radius\": 3,\n                \"tries\": 300\n            }\n        ],\n        \"dirt_provider\": {\n            \"type\": \"minecraft:simple_state_provider\",\n            \"state\": {\n                \"Name\": \"minecraft:air\"\n            }\n        },\n        \"foliage_placer\": {\n            \"type\": \"minecraft:bush_foliage_placer\",\n            \"height\": 0,\n            \"offset\": 0,\n            \"radius\": 0\n        },\n        \"foliage_provider\": {\n            \"type\": \"minecraft:simple_state_provider\",\n            \"state\": {\n                \"Name\": \"minecraft:air\"\n            }\n        },\n        \"force_dirt\": false,\n        \"ignore_vines\": true,\n        \"minimum_size\": {\n            \"type\": \"minecraft:two_layers_feature_size\",\n            \"limit\": 0,\n            \"lower_size\": 0,\n            \"upper_size\": 0\n        },\n        \"trunk_placer\": {\n            \"type\": \"minecraft:dark_oak_trunk_placer\",\n            \"base_height\": 0,\n            \"height_rand_a\": 0,\n            \"height_rand_b\": 0\n        },\n        \"trunk_provider\": {\n            \"type\": \"minecraft:simple_state_provider\",\n            \"state\": {\n                \"Name\": \"minecraft:air\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_trees/tags/functions/generate_tree.json",
    "content": "{\n  \"values\": [\n    \"gm4_towering_trees:verify/generate_tree\"\n  ]\n}\n"
  },
  {
    "path": "gm4_towering_trees/data/gm4_trees/tags/functions/initialize_sapling.json",
    "content": "{\n  \"values\": [\n    \"gm4_towering_trees:verify/initialize_sapling\"\n  ]\n}\n"
  },
  {
    "path": "gm4_towering_trees/generate.py",
    "content": "from pathlib import Path\nfrom typing import Any\nfrom gm4.utils import CSV # type: ignore\nimport json\n\nfrom beet import Context, subproject # type: ignore\n\ndef read_json(path: Path) -> CSV:\n    \"\"\"\n    Reads in a json file and returns a python object representing the json.\n    \"\"\"\n    with open(path, mode='r') as file:\n        json_file = json.load(file)\n        return json_file\n\ndef beet_default(ctx: Context):\n\n    # read raw data\n    tree_data: CSV = CSV.from_file(Path('gm4_towering_trees', 'tree_data.csv'))\n    \n    generate_tree_files(ctx, tree_data)\n\ndef generate_tree_files(ctx: Context, tree_data: CSV):\n    \"\"\"\n    Generates tree placement functions based on parameters.\n    \"\"\"\n\n    variant_randomizer: dict[str,Any] = {}\n\n    for tree in tree_data:\n\n        size_x: int = tree['size_x'].as_integer()\n        size_y: int = tree['size_y'].as_integer()\n        size_z: int = tree['size_z'].as_integer()\n        base_x_offset: int = tree['base_x_offset'].as_integer() * -1\n        base_z_offset: int = tree['base_z_offset'].as_integer() * -1\n        branch_height: int = tree['branch_start_height'].as_integer() - 1\n        is_mega: int = tree[\"is_mega\"].as_integer()\n\n        tree_type = tree['type']\n        type_variant = tree['variant']\n\n        variant_entry = variant_randomizer.setdefault(\n            tree_type,\n            {\"count\": 0, \"variants\": [], \"ground_replacement\": \"execute if score $tree_placed gm4_towering_trees_data matches 1 run fill ~ ~-1 ~ ~1 ~-1 ~1 dirt replace grass_block\"}\n        )\n        variant_entry[\"count\"] += 1\n        variant_entry[\"variants\"].append(type_variant)\n        if tree_type == \"mangrove\":\n            variant_entry[\"ground_replacement\"] = \"# mangrove trees do not replace the ground since they are placed in the air\"\n        if is_mega == 0:\n            variant_entry[\"ground_replacement\"] = \"execute if score $tree_placed gm4_towering_trees_data matches 1 run fill ~ ~-1 ~ ~ ~-1 ~ dirt replace grass_block\"\n\n        subproject_config = {\n            \"data_pack\": {\n                \"load\": [\n                    {\n                        f\"data/gm4_towering_trees/function/generate_tree_type/{tree['type']}/{tree['variant']}.mcfunction\": \"templates/place_tree.mcfunction\",\n                    }\n                ],\n                \"render\": {\n                    \"functions\": \"*\"\n                }\n            },\n            \"meta\": {\n                \"type\": tree_type,\n                \"variant\": type_variant,\n                \"branch_height\": branch_height,\n                \"is_mega\": is_mega,\n                \"check_1_height\": size_y - 1,\n                \"check_1_count\": size_y * (is_mega + 1)**2,\n                \"check_2_x\": size_x - 1,\n                \"check_2_height\": size_y - branch_height - 1,\n                \"check_2_z\": size_z - 1,\n                \"check_2_count\": size_x * (size_y - branch_height) * size_z,\n                \"feature\": tree['feature'],\n                \"x_offset\": base_x_offset,\n                \"z_offset\": base_z_offset,\n                \"x_offset_180\": base_x_offset * -1 + is_mega,\n                \"z_offset_180\": base_z_offset * -1 + is_mega,\n                \"x_offset_c90\": base_z_offset * -1 + is_mega,\n                \"z_offset_c90\": base_x_offset,\n                \"x_offset_cc90\": base_z_offset,\n                \"z_offset_cc90\": base_x_offset * -1 + is_mega\n            }\n        }\n        ctx.require(subproject(subproject_config))\n\n\n    for type, data in variant_randomizer.items():\n\n        functions: str = \"\"\n        index = 0\n        for variant in data[\"variants\"]:\n            index += 1\n            functions += f\"execute if score $tree_variant gm4_towering_trees_data matches {index} run function gm4_towering_trees:generate_tree_type/{type}/{variant}\\n\"\n\n        subproject_config = {\n            \"data_pack\": {\n                \"load\": [\n                    {\n                        f\"data/gm4_towering_trees/function/generate_tree_type/{type}/pick_variant.mcfunction\": \"templates/pick_variant.mcfunction\",\n                    }\n                ],\n                \"render\": {\n                    \"functions\": \"*\"\n                }\n            },\n            \"meta\": {\n                \"variant_count\": data[\"count\"],\n                \"functions\": functions,\n                \"ground_replacement\": data[\"ground_replacement\"]\n            }\n        }\n        ctx.require(subproject(subproject_config))\n"
  },
  {
    "path": "gm4_towering_trees/templates/pick_variant.mcfunction",
    "content": "# generates the tree - mega {{type}}\n# @s = sapling marker\n# located at @s (offset to be at the negative corner of the 2x2)\n# run from generate_mega_tree\n\nexecute store result score $tree_variant gm4_towering_trees_data run random value 1..{{variant_count}}\n\n{{functions}}\n\n{{ground_replacement}}\n"
  },
  {
    "path": "gm4_towering_trees/templates/place_tree.mcfunction",
    "content": "# generates the tree - mega {{type}}\n# @s = sapling marker\n# located at @s (offset to be at the negative corner of the 2x2)\n# run from generate_tree_type/{{type}}/pick_variant\n\n# check trunk\nexecute store result score $blocks_moved gm4_towering_trees_data positioned ~ ~ ~ run clone ~ ~ ~ ~{{is_mega}} ~{{check_1_height}} ~{{is_mega}} ~ ~ ~ filtered #gm4_towering_trees:tree_placeable move\nexecute unless score $blocks_moved gm4_towering_trees_data matches {{check_1_count}} run return fail\n\n# check box 2\nexecute store result score $blocks_moved gm4_towering_trees_data positioned ~{{base_x_offset}} ~{{branch_height}} ~{{base_z_offset}} run clone ~ ~ ~ ~{{check_2_x}} ~{{check_2_height}} ~{{check_2_z}} ~ ~ ~ filtered #gm4_towering_trees:tree_placeable move\nexecute unless score $blocks_moved gm4_towering_trees_data matches {{check_2_count}} run return fail\n\n# optional feature\n{{feature}}\n\n# place tree\nexecute store result score $tree_rotation gm4_towering_trees_data run random value 1..4\nexecute if score $tree_rotation gm4_towering_trees_data matches 1 run place template gm4_towering_trees:{{type}}/{{variant}} ~{{x_offset}} ~ ~{{z_offset}}\nexecute if score $tree_rotation gm4_towering_trees_data matches 2 run place template gm4_towering_trees:{{type}}/{{variant}} ~{{x_offset_180}} ~ ~{{z_offset_180}} 180\nexecute if score $tree_rotation gm4_towering_trees_data matches 3 run place template gm4_towering_trees:{{type}}/{{variant}} ~{{x_offset_c90}} ~ ~{{z_offset_c90}} clockwise_90\nexecute if score $tree_rotation gm4_towering_trees_data matches 4 run place template gm4_towering_trees:{{type}}/{{variant}} ~{{x_offset_cc90}} ~ ~{{z_offset_cc90}} counterclockwise_90\n\n# mark as placed\nscoreboard players set $tree_placed gm4_towering_trees_data 1\n"
  },
  {
    "path": "gm4_towering_trees/tree_data.csv",
    "content": "type,variant,size_x,size_y,size_z,base_x_offset,base_z_offset,branch_start_height,feature,is_mega\noak,a,19,14,18,8,9,3,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true\noak,b,14,15,14,6,6,3,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true\noak,c,18,15,19,8,8,4,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true\noak,d,18,16,19,8,8,4,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true\noak,e,14,13,14,6,6,3,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true\nacacia,a,16,21,14,7,6,15,#,true\nacacia,b,12,18,13,5,6,14,#,true\nacacia,c,13,22,16,6,6,17,#,true\nacacia,d,15,21,13,6,6,17,#,true\nacacia,e,13,23,14,7,6,19,#,true\nbirch,a,10,30,10,4,4,12,#,true\nbirch,b,10,28,10,4,4,8,#,true\nbirch,c,10,33,10,4,4,13,#,true\nbirch,d,10,32,10,4,4,12,#,true\nbirch,e,10,30,10,4,4,10,#,true\nbirch,f,10,28,10,4,4,10,#,true\ncherry,a,24,15,17,12,7,5,place feature gm4_towering_trees:pink_petals ~ ~1 ~,true\ncherry,b,27,17,17,14,8,5,place feature gm4_towering_trees:pink_petals ~ ~1 ~,true\ncherry,c,24,17,16,15,7,5,place feature gm4_towering_trees:pink_petals ~ ~1 ~,true\ncherry,d,29,19,17,12,8,4,place feature gm4_towering_trees:pink_petals ~ ~1 ~,true\nmangrove,a,16,33,14,5,8,16,function gm4_towering_trees:generate_tree_type/mangrove/extra,true\nmangrove,b,17,29,14,7,6,13,function gm4_towering_trees:generate_tree_type/mangrove/extra,true\nmangrove,c,17,30,15,5,6,14,function gm4_towering_trees:generate_tree_type/mangrove/extra,true\nmangrove,d,17,28,14,8,5,14,function gm4_towering_trees:generate_tree_type/mangrove/extra,true\npale_oak,a,7,6,7,3,4,4,#,false\npale_oak,b,7,7,7,3,3,5,#,false\npale_oak,c,8,8,7,4,4,5,#,false\npale_oak,d,8,9,7,4,3,7,#,false\npale_oak,e,8,10,7,4,3,7,#,false\npale_oak,f,7,7,7,4,3,5,#,false\npale_oak,g,7,7,7,4,3,5,#,false\npale_oak,h,7,8,8,4,4,6,#,false\npale_oak,i,8,9,8,4,4,7,#,false\npale_oak,j,7,10,8,3,3,8,#,false\ndark_oak,a,7,6,7,3,4,4,#,false\ndark_oak,b,7,7,7,3,3,5,#,false\ndark_oak,c,8,8,7,4,4,5,#,false\ndark_oak,d,8,9,7,4,3,7,#,false\ndark_oak,e,8,10,7,4,3,7,#,false\ndark_oak,f,7,7,7,4,3,5,#,false\ndark_oak,g,7,7,7,4,3,5,#,false\ndark_oak,h,7,8,8,4,4,6,#,false\ndark_oak,i,8,9,8,4,4,7,#,false\ndark_oak,j,7,10,8,3,3,8,#,false\n"
  },
  {
    "path": "gm4_tunnel_bores/README.md",
    "content": ""
  },
  {
    "path": "gm4_tunnel_bores/assets/translations.csv",
    "content": "key,en_us\nitem.gm4.minecart.bore,Minecart with Piston\nadvancement.gm4.tunnel_bores.title,\"Isn't It \"\"Groundbreaking\"\"?\"\nadvancement.gm4.tunnel_bores.description,Obtain a Minecart with Piston\ntext.gm4.guidebook.module_desc.tunnel_bores,\"Ever wondered how mineshafts came to be? This is it! Tunnel Bores allow you to easily dig 3\\u2a093 tunnels, and even lay rails behind themselves.\"\ntext.gm4.guidebook.tunnel_bores.description,\"Tunnel Bores can be crafted to aid in excavation. Piston Minecarts will break blocks and place rails, moving forward.\\n\\nThey can be crafted in a crafting table.\"\ntext.gm4.guidebook.tunnel_bores.crafting,Tunnel bores can be crafted as follows:\ntext.gm4.guidebook.tunnel_bores.start_up,\"Piston Minecarts are upgraded furnace minecarts and require coal as fuel. To start the bore, use a piece of coal on the bore.\\n\\nPiston Minecarts will mine piston-movable blocks in a 3x3 area centered at the block above it.\"\ntext.gm4.guidebook.tunnel_bores.supply,These tunnel bores can place rails on solid blocks in front of it.\\n\\nChest Minecarts can be attached to supply the Piston Minecart with rails and coal.\ntext.gm4.guidebook.tunnel_bores.mining,\"Tunnel bores will continuously mine blocks when it hits a breakable block, but will always try to mine and refuel when on a powered activator rail.\\n\\nThis makes it possible to keep a stationary bore.\"\n"
  },
  {
    "path": "gm4_tunnel_bores/beet.yaml",
    "content": "id: gm4_tunnel_bores\nname: Tunnel Bores\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_machines\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_machines: 1.5.0\n      schedule_loops: [pulse_check]\n    model_data:\n      - item: furnace_minecart\n        reference: item/piston_minecart\n        template: generated\n      - item: piston\n        reference: gui/advancement/tunnel_bores\n        template:\n          name: advancement\n          forward: item/piston_minecart\n    website:\n      description: Ever wondered how mineshafts came to be? This is it! Tunnel Bores allow you to easily dig 3⨉3 tunnels, and even lay rails behind themselves.\n      recommended:\n        - gm4_ziprails\n        - gm4_vertical_rails\n      notes: []\n    modrinth:\n      project_id: L32wQVcn\n    wiki: https://wiki.gm4.co/wiki/Tunnel_Bores\n    credits:\n      Creator:\n        - Bloo\n      Updated by:\n        - Bloo\n        - BPR\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4/advancement/tunnel_bores.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"piston\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_tunnel_bores:gui/advancement/tunnel_bores\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.tunnel_bores.title\",\n      \"fallback\": \"Isn't It \\\"Groundbreaking\\\"?\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.tunnel_bores.description\",\n      \"fallback\": \"Obtain a Minecart with Piston\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"obtain_tunnel_bore\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:furnace_minecart\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"tunnel_bore\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_machines/tags/function/destroy_cart.json",
    "content": "{\n    \"values\": [\n        \"gm4_tunnel_bores:machine/verify_destroy_cart\"\n    ]\n}\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_machines/tags/function/place_cart.json",
    "content": "{\n    \"values\": [\n        \"gm4_tunnel_bores:machine/verify_place_cart\"\n    ]\n}\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/advancement/recipes/piston_minecart.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_tunnel_bores:piston_minecart\"\n      }\n    },\n    \"has_the_minecart_recipe\": {\n      \"trigger\": \"minecraft:recipe_unlocked\",\n      \"conditions\": {\n        \"recipe\": \"gm4_tunnel_bores:piston_minecart_from_furnace_minecart\"\n      }\n    },\n    \"has_materials\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:furnace\",\n              \"minecraft:minecart\",\n              \"minecraft:furnace_minecart\",\n              \"minecraft:piston\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_the_minecart_recipe\",\n      \"has_materials\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"gm4_tunnel_bores:piston_minecart\",\n      \"gm4_tunnel_bores:piston_minecart_from_furnace_minecart\"\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/activator_rail/force_mine.mcfunction",
    "content": "# @s = tunnel bores on powered activator rail\n# at world spawn\n# called by gm4_tunnel_bores:bore/check_cart_environment\n\n# force try refuel\nfunction gm4_tunnel_bores:bore/item_consumption/fuel/check_fuel_level\n\n# perform mining operation\nexecute at @s align xyz positioned ~.5 ~.5 ~.5 run function gm4_tunnel_bores:bore/mine/break_block\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/check_cart_environment.mcfunction",
    "content": "# @s = tunnel bores on top of #minecraft:rails\n# at @s\n# called by gm4_tunnel_bores:bore/tunnel_bore_5hz\n\n# check for rails ahead of the cart and initiate rail placement. Use at @s to adjust position to updated rotation\nexecute if block ^ ^ ^1 #gm4_tunnel_bores:rail_replacable as @e[type=area_effect_cloud,tag=gm4_bore_storage,distance=..0.5,limit=1,sort=nearest] run function gm4_tunnel_bores:bore/item_consumption/rail/handle_rail\n\n# stop cart if rail placement failed\nexecute if score placed_rail gm4_bore_rail matches 0 run function gm4_tunnel_bores:bore/mine/stop_cart\n\n# force mine\nexecute if entity @s[tag=!gm4_tunnel_bore_on_cooldown] if block ~ ~ ~ minecraft:activator_rail[powered=true] run function gm4_tunnel_bores:bore/activator_rail/force_mine\n\n# reset fake player\nscoreboard players reset placed_rail gm4_bore_rail\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/clear_rotation.mcfunction",
    "content": "# @s = tunnel bores that left their tracks\n# at world spawn\n# called by gm4_tunnel_bores:update_direction\n\ndata merge entity @s {DisplayState:{Properties:{facing:\"up\"}}}\n\ntag @s remove gm4_tunnel_bore_south\ntag @s remove gm4_tunnel_bore_north\ntag @s remove gm4_tunnel_bore_east\ntag @s remove gm4_tunnel_bore_west\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/restore_previous_direction.mcfunction",
    "content": "# @s = tunnel bores\n# at world spawn\n# called by gm4_tunnel_bores:bore/direction/store_push_east_west and gm4_tunnel_bores:bore/direction/store_push_north_south\n\n# check cart fuel level\nexecute store result score Fuel gm4_bore_fuel run data get entity @s Fuel\n\n# restore direction if cart still has fuel\nexecute if score Fuel gm4_bore_fuel matches 1.. run scoreboard players operation @s gm4_bore_data = previous_direction gm4_bore_data\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/store_push_east_west.mcfunction",
    "content": "# @s = tunnel bores\n# at world spawn\n# called by gm4_tunnel_bores:bore/direction/update_direction\n\n# get force values\nexecute store result score PushX gm4_bore_data run data get entity @s PushX 10\n\n# check force direction (+/-) and store to scoreboard\nexecute if score PushX gm4_bore_data matches 9.. run scoreboard players set @s gm4_bore_data -90\nexecute if score PushX gm4_bore_data matches ..-9 run scoreboard players set @s gm4_bore_data 90\n\n# keep previous direction, if code couldn't decide on new one and the previous direction alligns with rail beneath\nexecute if score @s gm4_bore_data matches -1 unless score previous_direction gm4_bore_data matches -1 run function gm4_tunnel_bores:bore/direction/restore_previous_direction\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/store_push_north_south.mcfunction",
    "content": "# @s = tunnel bores\n# at world spawn\n# called by gm4_tunnel_bores:bore/direction/update_direction\n\n# get force values\nexecute store result score PushZ gm4_bore_data run data get entity @s PushZ 10\n\n# check force direction (+/-) and store to scoreboard\nexecute if score PushZ gm4_bore_data matches 9.. run scoreboard players set @s gm4_bore_data 0\nexecute if score PushZ gm4_bore_data matches ..-9 run scoreboard players set @s gm4_bore_data 180\n\n# keep previous direction, if code couldn't decide on new one and the previous direction alligns with rail beneath\nexecute if score @s gm4_bore_data matches -1 unless score previous_direction gm4_bore_data matches -1 run function gm4_tunnel_bores:bore/direction/restore_previous_direction\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/update_direction.mcfunction",
    "content": "# @s = tunnel bores\n# at world spawn\n# called by gm4_tunnel_bores:bore/tunnel_bore_5hz\n\n# store previous direction for use in gm4_tunnel_bores:bore/direction/store_push_east_west and gm4_tunnel_bores:bore/direction/store_push_north_south\nscoreboard players operation previous_direction gm4_bore_data = @s gm4_bore_data\n\n# clear tunnel bore orientation tags and visuals if not on valid rails\nexecute at @s if score @s gm4_bore_data matches -1 unless entity @s[tag=!gm4_tunnel_bore_south,tag=!gm4_tunnel_bore_west,tag=!gm4_tunnel_bore_east,tag=!gm4_tunnel_bore_north] run function gm4_tunnel_bores:bore/direction/clear_rotation\n\n# set direction to -1. This will stay if cart is not on a valid rail\nscoreboard players set @s gm4_bore_data -1\n\n# check rail facing to determine orientation\nexecute at @s if block ~ ~ ~ #minecraft:rails[shape=east_west] run function gm4_tunnel_bores:bore/direction/store_push_east_west\nexecute at @s if block ~ ~ ~ #minecraft:rails[shape=north_south] run function gm4_tunnel_bores:bore/direction/store_push_north_south\n\n\n# update rotation vector\nexecute unless score @s gm4_bore_data matches -1 run function gm4_tunnel_bores:bore/direction/update_rotation\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/update_rotation.mcfunction",
    "content": "# @s = tunnel bores\n# at world spawn\n# called by gm4_tunnel_bores:update_direction\n\nexecute if entity @s[tag=!gm4_tunnel_bore_south] if score @s gm4_bore_data matches 0 at @s run function gm4_tunnel_bores:bore/direction/update_rotation_south\nexecute if entity @s[tag=!gm4_tunnel_bore_west] if score @s gm4_bore_data matches 90 at @s run function gm4_tunnel_bores:bore/direction/update_rotation_west\nexecute if entity @s[tag=!gm4_tunnel_bore_east] if score @s gm4_bore_data matches -90 at @s run function gm4_tunnel_bores:bore/direction/update_rotation_east\nexecute if entity @s[tag=!gm4_tunnel_bore_north] if score @s gm4_bore_data matches 180 at @s run function gm4_tunnel_bores:bore/direction/update_rotation_north\n\nexecute if score @s gm4_bore_data matches 0 at @s run tp @s ~ ~ ~ 0 ~\nexecute if score @s gm4_bore_data matches 90 at @s run tp @s ~ ~ ~ 90 ~\nexecute if score @s gm4_bore_data matches -90 at @s run tp @s ~ ~ ~ -90 ~\nexecute if score @s gm4_bore_data matches 180 at @s run tp @s ~ ~ ~ 180 ~\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/update_rotation_east.mcfunction",
    "content": "# @s = tunnel bores on tracks facing east\n# at world spawn\n# called by gm4_tunnel_bores:update_rotation\n\ndata merge entity @s {DisplayState:{Properties:{facing:\"south\"}}}\ntag @s add gm4_tunnel_bore_east\ntag @s remove gm4_tunnel_bore_west\ntag @s remove gm4_tunnel_bore_south\ntag @s remove gm4_tunnel_bore_north\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/update_rotation_north.mcfunction",
    "content": "# @s = tunnel bores on tracks facing north\n# at world spawn\n# called by gm4_tunnel_bores:update_rotation\n\ndata merge entity @s {DisplayState:{Properties:{facing:\"north\"}}}\ntag @s add gm4_tunnel_bore_north\ntag @s remove gm4_tunnel_bore_east\ntag @s remove gm4_tunnel_bore_west\ntag @s remove gm4_tunnel_bore_south\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/update_rotation_south.mcfunction",
    "content": "# @s = tunnel bores on tracks facing south\n# at world spawn\n# called by gm4_tunnel_bores:update_rotation\n\ndata merge entity @s {DisplayState:{Properties:{facing:\"south\"}}}\ntag @s add gm4_tunnel_bore_south\ntag @s remove gm4_tunnel_bore_east\ntag @s remove gm4_tunnel_bore_west\ntag @s remove gm4_tunnel_bore_north\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/update_rotation_west.mcfunction",
    "content": "# @s = tunnel bores on tracks facing west\n# at world spawn\n# called by gm4_tunnel_bores:update_rotation\n\ndata merge entity @s {DisplayState:{Properties:{facing:\"north\"}}}\ntag @s add gm4_tunnel_bore_west\ntag @s remove gm4_tunnel_bore_east\ntag @s remove gm4_tunnel_bore_south\ntag @s remove gm4_tunnel_bore_north\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/check_fuel_level.mcfunction",
    "content": "# @s = tunnel bores\n# at world spawn\n# called by gm4_tunnel_bores:bore/mine/auto_mine on a 2.9 min slow clock and by gm4_tunnel_bores:bore/activator_rail/force_mine when a cart is on an activator rail\n\n# get fuel level from nbt if this wasn't done in gm4_tunnel_bores:bore/direction/restore_previous_direction\nexecute unless score Fuel gm4_bore_fuel matches 1.. store result score Fuel gm4_bore_fuel run data get entity @s Fuel\n\n# look for coal and charcoal\nexecute if score Fuel gm4_bore_fuel matches 1..3600 run function gm4_tunnel_bores:bore/item_consumption/fuel/search_fuel\n\n# clear fuel score\nscoreboard players reset Fuel gm4_bore_fuel\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/found_charcoal.mcfunction",
    "content": "# @s = tunnel bores with low fuel\n# at world spawn\n# called by gm4_tunnel_bores:bore/item_consumption/fuel/load_charcoal\n\n# use one charcoal item\nexecute store result storage gm4_tunnel_bores:bore_container Items[0].count byte 1 run data get storage gm4_tunnel_bores:bore_container Items[0].count 0.99\n\n# return items into supply cart\ndata modify entity @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] Items append from storage gm4_tunnel_bores:bore_container Items[0]\n\n# add fuel to bore\nexecute store result entity @s Fuel short 1 run scoreboard players operation Fuel gm4_bore_fuel += #3600 gm4_bore_fuel\n\n# clean up storage\ndata remove storage gm4_tunnel_bores:bore_container Items\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/found_coal.mcfunction",
    "content": "# @s = tunnel bores with low fuel\n# at world spawn\n# called by gm4_tunnel_bores:bore/item_consumption/fuel/load_coal\n\n# use one coal item\nexecute store result storage gm4_tunnel_bores:bore_container Items[0].count byte 1 run data get storage gm4_tunnel_bores:bore_container Items[0].count 0.99\n\n# return items into supply cart\ndata modify entity @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] Items append from storage gm4_tunnel_bores:bore_container Items[0]\n\n# add fuel to bore\nexecute store result entity @s Fuel short 1 run scoreboard players operation Fuel gm4_bore_fuel += #3600 gm4_bore_fuel\n\n# clean up storage\ndata remove storage gm4_tunnel_bores:bore_container Items\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/found_supply_cart.mcfunction",
    "content": "# @s = tunnel bores with low fuel\n# at world spawn\n# called by gm4_tunnel_bores:bore/item_consumption/fuel/search_fuel\n\n# check and try to fuel using charcoal\nfunction gm4_tunnel_bores:bore/item_consumption/fuel/load_charcoal\n# if still out of fuel, look for coal\nexecute if score Fuel gm4_bore_fuel matches 1..3600 run function gm4_tunnel_bores:bore/item_consumption/fuel/load_coal\n\n# revoke tag\ntag @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] remove gm4_bore_supply_minecart\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/load_charcoal.mcfunction",
    "content": "# @s = tunnel bores with low fuel\n# at world spawn\n# called by gm4_tunnel_bores:bore/item_consumption/fuel/found_supply_cart\n\n# copy the last stone slot to a temp array\nexecute store success score found_charcoal gm4_bore_fuel run data modify storage gm4_tunnel_bores:bore_container Items[] set from entity @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] Items[{id:\"minecraft:charcoal\"}]\n\n# refuel if charcoal was found\nexecute if score found_charcoal gm4_bore_fuel matches 1.. run function gm4_tunnel_bores:bore/item_consumption/fuel/found_charcoal\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/load_coal.mcfunction",
    "content": "# @s = tunnel bores with low fuel\n# at world spawn\n# called by gm4_tunnel_bores:bore/item_consumption/fuel/found_supply_cart\n\n# copy the last stone slot to a temp array\nexecute store success score found_coal gm4_bore_fuel run data modify storage gm4_tunnel_bores:bore_container Items[] set from entity @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] Items[{id:\"minecraft:coal\"}]\n\n# refuel if coal was found\nexecute if score found_coal gm4_bore_fuel matches 1.. run function gm4_tunnel_bores:bore/item_consumption/fuel/found_coal\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/search_fuel.mcfunction",
    "content": "# @s = tunnel bores with low fuel\n# at world spawn\n# called by gm4_tunnel_bores:bore/item_consumption/check_fuel_level\n\n# find nearby chest minecart\nexecute at @s align xyz positioned ~.5 ~.5 ~.5 store success score found_supply_cart gm4_bore_fuel run tag @e[type=minecraft:chest_minecart,distance=..1.4,limit=1] add gm4_bore_supply_minecart\n\n# if a supply cart was found, continue fueling operation\nexecute if score found_supply_cart gm4_bore_fuel matches 1.. run function gm4_tunnel_bores:bore/item_consumption/fuel/found_supply_cart\n\n# play horn sound if cart is nearly out of fuel and couldn't find any to refuel. Only do this when this function is called by a 2.9 fuel check, not an activator rail.\nexecute if score Fuel gm4_bore_fuel matches 1..3600 if score refuel_clock gm4_bore_fuel matches 220.. at @s run playsound block.note_block.flute neutral @a[distance=..16] ~ ~ ~ 1 0.6 0\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/rail/check_solidity.mcfunction",
    "content": "# @s = tunnel bore storage aec that has a rail to place\n# at tunnel bore minecart\n# called by gm4_tunnel_bores:bore/item_consumption/rail/handle_rail\n\n# remember that the bore tried to place a rail\nscoreboard players set placed_rail gm4_bore_rail 0\n\n# place a rail if there is a support block beneath\nexecute unless block ^ ^-1 ^1 #gm4_tunnel_bores:not_rail_solid run function gm4_tunnel_bores:bore/item_consumption/rail/place_rail\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/rail/found_rail.mcfunction",
    "content": "# @s = bore aec that found rails in a supply cart\n# at bore minecart (aligned to block center)\n# run from gm4_tunnel_bores:bore/item_consumption/rail/found_supply_cart\n\n# load rails into AEC score\nexecute store result score @s gm4_bore_rail run data get storage gm4_tunnel_bores:bore_container Items[0].count\n\n# delete rail items in original inventory\ndata remove entity @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] Items[0]\n\n# clean up storage\ndata remove storage gm4_tunnel_bores:bore_container Items\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/rail/found_supply_cart.mcfunction",
    "content": "# @s = bore aec that found rails in a supply cart\n# at bore minecart (aligned to block center)\n# run from gm4_tunnel_bores:bore/item_consumption/rail/load_rail\n\n# Copy the last rail item into temporary inventory\nexecute store success score found_rail gm4_bore_rail run data modify storage gm4_tunnel_bores:bore_container Items[] set from entity @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] Items[{id:\"minecraft:rail\"}]\n# get the count in a scoreboard and deplete stack\nexecute if score found_rail gm4_bore_rail matches 1.. run function gm4_tunnel_bores:bore/item_consumption/rail/found_rail\n\n# revoke tag\ntag @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart] remove gm4_bore_supply_minecart\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/rail/handle_rail.mcfunction",
    "content": "# @s = tunnel bore storage aec that has a rail to place\n# at tunnel bore minecart\n# called by gm4_tunnel_bores:bore/mine/break block and gm4_tunnel_bores:bore/check_cart_environment\n\nexecute if score @s gm4_bore_rail matches 0 run function gm4_tunnel_bores:bore/item_consumption/rail/load_rail\n\nexecute if score @s gm4_bore_rail matches 1.. run function gm4_tunnel_bores:bore/item_consumption/rail/check_solidity\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/rail/load_rail.mcfunction",
    "content": "# @s = bore aec without rails looking for more rails\n# at bore minecart (aligned to block center)\n# run from gm4_tunnel_bores:bore/item_consumption/rail/handle_rail\n\n# find nearby chest minecart\nexecute store success score found_supply_cart gm4_bore_rail run tag @e[type=minecraft:chest_minecart,distance=..1.4,limit=1] add gm4_bore_supply_minecart\n\n# continue rail loading operation if a supply cart was found\nexecute if score found_supply_cart gm4_bore_rail matches 1.. run function gm4_tunnel_bores:bore/item_consumption/rail/found_supply_cart\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/rail/place_rail.mcfunction",
    "content": "# @s = tunnel bore storage aec that has a rail to place and solid groudn beneath\n# at tunnel bore minecart\n# called by gm4_tunnel_bores:bore/item_consumption/rail/check_solidity\n\nexecute unless block ^ ^ ^1 #gm4:water run setblock ^ ^ ^1 rail destroy\nexecute if block ^ ^ ^1 #gm4:water run setblock ^ ^ ^1 rail[waterlogged=true] destroy\nscoreboard players remove @s gm4_bore_rail 1\n\n# playsound\nplaysound block.lantern.place block @a[distance=..8] ~ ~ ~ 0.5 0.5 0\n\n# store operation\nscoreboard players add placed_rail gm4_bore_rail 1\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/mine/auto_mine.mcfunction",
    "content": "# @s = tunnel bores\n# at world spawn\n# called by gm4_tunnel_bores:main if any bores are loaded\n# handles default breaking operations. === 1.25Hz ===\n\n# slow clock for refueling\nexecute if score refuel_clock gm4_bore_fuel matches 220.. run function gm4_tunnel_bores:bore/item_consumption/fuel/check_fuel_level\n\n# detect mineable object infront and start auto mining\nexecute unless entity @s[tag=gm4_tunnel_bore_on_cooldown] if score @s gm4_bore_data matches 90 at @s if block ~ ~ ~ #minecraft:rails[shape=east_west] align xyz positioned ~.5 ~.5 ~.5 unless block ^ ^ ^1 #gm4_tunnel_bores:unbreakable unless block ^ ^ ^1 #minecraft:rails run function gm4_tunnel_bores:bore/mine/break_block\nexecute unless entity @s[tag=gm4_tunnel_bore_on_cooldown] if score @s gm4_bore_data matches -90 at @s if block ~ ~ ~ #minecraft:rails[shape=east_west] align xyz positioned ~.5 ~.5 ~.5 unless block ^ ^ ^1 #gm4_tunnel_bores:unbreakable unless block ^ ^ ^1 #minecraft:rails run function gm4_tunnel_bores:bore/mine/break_block\nexecute unless entity @s[tag=gm4_tunnel_bore_on_cooldown] if score @s gm4_bore_data matches 0 at @s if block ~ ~ ~ #minecraft:rails[shape=north_south] align xyz positioned ~.5 ~.5 ~.5 unless block ^ ^ ^1 #gm4_tunnel_bores:unbreakable unless block ^ ^ ^1 #minecraft:rails run function gm4_tunnel_bores:bore/mine/break_block\nexecute unless entity @s[tag=gm4_tunnel_bore_on_cooldown] if score @s gm4_bore_data matches 180 at @s if block ~ ~ ~ #minecraft:rails[shape=north_south] align xyz positioned ~.5 ~.5 ~.5 unless block ^ ^ ^1 #gm4_tunnel_bores:unbreakable unless block ^ ^ ^1 #minecraft:rails run function gm4_tunnel_bores:bore/mine/break_block\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/mine/break_block.mcfunction",
    "content": "# @s = tunnel bores with mineable block infront\n# at @s (aligned to block center)\n# called by gm4_tunnel_bores:bore/mine/auto_mine and gm4_tunnel_bores:bore/activator_rail/force_mine upon breaking operation\n\n# mine tunnel use fill to circumvent MC-163286\nexecute positioned ^1 ^ ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy\nexecute positioned ^ ^ ^1 unless block ~ ~ ~ #minecraft:rails unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy\nexecute positioned ^-1 ^ ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy\nexecute positioned ^1 ^1 ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy\nexecute positioned ^ ^1 ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy\nexecute positioned ^-1 ^1 ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy\nexecute positioned ^1 ^2 ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy\nexecute positioned ^ ^2 ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy\nexecute positioned ^-1 ^2 ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy\n\n# playsound\nplaysound minecraft:entity.iron_golem.step block @a[distance=..8] ~ ~ ~ 0.6 0.2 0\n\n# check for rails ahead of the cart and initiate rail placement. Use at @s to adjust position to updated rotation\nexecute if block ^ ^ ^1 #minecraft:air as @e[type=area_effect_cloud,tag=gm4_bore_storage,distance=..0.5,limit=1,sort=nearest] run function gm4_tunnel_bores:bore/item_consumption/rail/handle_rail\n\n# stop cart if rail placement failed\nexecute if score placed_rail gm4_bore_rail matches 0 run function gm4_tunnel_bores:bore/mine/stop_cart\n\n# reset fake player\nscoreboard players reset placed_rail gm4_bore_rail\n\n# put cart on cooldown\ntag @s add gm4_tunnel_bore_on_cooldown\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/mine/cooldown/calculate_clock_timings.mcfunction",
    "content": "# no @s\n# at world spawn\n# called by gm4_tunnel_bores:init\n\n# figure out tick values in a 5 tick intervall for 5Hz clock\nscoreboard players operation 5hz_pulse_1 gm4_bore_data = trigger_tick gm4_bore_data\nscoreboard players add 5hz_pulse_1 gm4_bore_data 4\n\nscoreboard players operation 5hz_pulse_2 gm4_bore_data = 5hz_pulse_1 gm4_bore_data\nscoreboard players add 5hz_pulse_2 gm4_bore_data 4\n\nscoreboard players operation 5hz_pulse_3 gm4_bore_data = 5hz_pulse_2 gm4_bore_data\nscoreboard players add 5hz_pulse_3 gm4_bore_data 4\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/mine/cooldown/clock_control.mcfunction",
    "content": "# @s = tunnel bores\n# at world spawn\n# called by gm4_tunnel_bores:pulse_check on a 1.25Hz pulse\n\n# control slow clock\nscoreboard players add slow_clock gm4_bore_data 1\nexecute if score slow_clock gm4_bore_data matches 3.. run scoreboard players set slow_clock gm4_bore_data 0\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/mine/stop_cart.mcfunction",
    "content": "# @s = tunnel bore that failed to place a rail\n# at tunnel bore minecart\n# called by gm4_tunnel_bores:bore/mine/break_block and gm4_tunnel_bores:bore/check_cart_environment\n\n# stop cart (physically) (and visually)\ndata merge entity @s {DisplayState:{Properties:{facing:\"up\"}},Motion:[0.0,0.0,0.0],PushX:0.0,PushZ:0.0}\n\n# stop cart (code flag)\nscoreboard players set @s gm4_bore_data -1\n\n# sound effect and particle effect\nplaysound minecraft:block.redstone_torch.burnout neutral @a[distance=..8] ~ ~ ~ 0.5 0.01 0\nparticle minecraft:poof ~ ~.3 ~ 0.1 0.2 0.1 0.01 12\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/tunnel_bore_5hz.mcfunction",
    "content": "# @s = tunnel bores\n# at world spawn\n# called by gm4_tunnel_bores:furnace_cart_20hz\n# handles cart facing vector and stores push direction properly. === 5Hz ===\n#execute if score slow_clock gm4_bore_data = trigger_tick gm4_bore_data run say 5Hz and main\n#execute unless score clock gm4_bore_data = trigger_tick gm4_bore_data run say 5Hz\n\n# re-activate cart after cooldown\nexecute if score slow_clock gm4_bore_data matches 0 if score main_clock gm4_bore_data = trigger_tick gm4_bore_data run tag @s remove gm4_tunnel_bore_on_cooldown\n\n# calculate cart movement direction and supossed bore facing\nfunction gm4_tunnel_bores:bore/direction/update_direction\n\n# DEBUG PARTICLE. ENABLE TO DEBUG CART FACING.\n#execute unless score @s gm4_bore_data matches -1 at @s run particle minecraft:flame ^ ^ ^1 0 0 0 0 1 force\n\n# reassign rotation if cart is ontop of rail (heading =|= -1)\nexecute unless score @s gm4_bore_data matches -1 at @s run function gm4_tunnel_bores:bore/check_cart_environment\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/furnace_cart_20hz.mcfunction",
    "content": "# @s = furnace_minecart\n# at world spawn\n# called by gm4_tunnel_bores:pulse_check\n\n# handle cart orientation and environment (rail interactions, cart push direction) on 5Hz\nexecute if score main_clock gm4_bore_data = trigger_tick gm4_bore_data if entity @s[tag=gm4_tunnel_bore] run function gm4_tunnel_bores:bore/tunnel_bore_5hz\nexecute if score main_clock gm4_bore_data = 5hz_pulse_1 gm4_bore_data if entity @s[tag=gm4_tunnel_bore] run function gm4_tunnel_bores:bore/tunnel_bore_5hz\nexecute if score main_clock gm4_bore_data = 5hz_pulse_2 gm4_bore_data if entity @s[tag=gm4_tunnel_bore] run function gm4_tunnel_bores:bore/tunnel_bore_5hz\nexecute if score main_clock gm4_bore_data = 5hz_pulse_3 gm4_bore_data if entity @s[tag=gm4_tunnel_bore] run function gm4_tunnel_bores:bore/tunnel_bore_5hz\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/init.mcfunction",
    "content": "# init module scoreboards\nscoreboard objectives add gm4_bore_data dummy\nscoreboard players set trigger_tick gm4_bore_data 0\nscoreboard players set #-1 gm4_bore_data -1\n\nfunction gm4_tunnel_bores:bore/mine/cooldown/calculate_clock_timings\n\nscoreboard objectives add gm4_bore_fuel dummy\nscoreboard players set #3600 gm4_bore_fuel 3600\nscoreboard objectives add gm4_bore_rail dummy\n\n# base\n\nexecute unless score tunnel_bores gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Tunnel Bores\"}\nexecute unless score tunnel_bores gm4_earliest_version < tunnel_bores gm4_modules run scoreboard players operation tunnel_bores gm4_earliest_version = tunnel_bores gm4_modules\nscoreboard players set tunnel_bores gm4_modules 1\n\nschedule function gm4_tunnel_bores:pulse_check 10t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/create_cart.mcfunction",
    "content": "# places the tunnel_bore down\n# @s = hopper_minecart with the tunnel_bore name\n# located at @s\n# run from gm4_tunnel_bores:machine/verify_place_cart\n\nscoreboard players set $placed_block gm4_machine_data 1\n\n# summon new command block minecart\nsummon furnace_minecart ~ ~ ~ {CustomName:{\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"},DisplayState:{Name:\"minecraft:piston\",Properties:{facing:\"up\"}},DisplayOffset:6,Tags:[\"gm4_tunnel_bore\",\"gm4_new_machine\"],Passengers:[{id:\"minecraft:area_effect_cloud\",custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"},Duration:-1,CustomName:{\"text\":\"gm4_bore_storage\"},Tags:[\"gm4_bore_storage\",\"gm4_machine_cart\",\"smithed.entity\",\"smithed.strict\",\"gm4_new_machine\"]}]}\nscoreboard players add @e[type=area_effect_cloud,tag=gm4_bore_storage,tag=gm4_new_machine,distance=..2] gm4_bore_rail 0\n\ntp @e[type=furnace_minecart,distance=..0.1,tag=gm4_new_machine] @s\nscoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 1\n\n# clean up\nkill @s\ntag @e[distance=..2] remove gm4_new_machine\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/destroy_cart/drop_item.mcfunction",
    "content": "# drops the correct item\n# @s = invalid item entity\n# located at @s\n# run from gm4_tunnel_bores:machine/destroy_cart\n\n# drop item, and set flag\nexecute store success score $dropped_item gm4_machine_data as @e[type=area_effect_cloud,limit=1,tag=gm4_destroyed_bore_storage] run loot spawn ~ ~ ~ loot gm4_tunnel_bores:entities/piston_minecart\n\n# kill original (invalid) item\nkill @s\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/destroy_cart/scan_hoppers.mcfunction",
    "content": "# searches for hoppers with invalid items\n# @s = tunnel_bore marker\n# located at @s\n# run from gm4_tunnel_bores:machine/destroy_cart\n\n# find hopper with the invalid item\nscoreboard players set $found_item gm4_machine_data 0\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\n\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\n\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\nexecute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper\n\n# if no hoppers found, find hopper minecarts with the invalid item\nexecute if score $found_item gm4_machine_data matches 0 as @e[type=hopper_minecart,distance=..3] if items entity @s container.* minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper_minecart\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/destroy_cart/update_hopper.mcfunction",
    "content": "# updates hoppers with invalid items\n# @s = tunnel_bore marker\n# located at the hopper with an invalid item\n# run from gm4_tunnel_bores:machine/destroy_cart/scan_hoppers\n\n# replace correct slot with proper item\nexecute if items block ~ ~ ~ container.0 minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run loot replace block ~ ~ ~ container.0 loot gm4_tunnel_bores:entities/piston_minecart\nexecute if items block ~ ~ ~ container.1 minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run loot replace block ~ ~ ~ container.1 loot gm4_tunnel_bores:entities/piston_minecart\nexecute if items block ~ ~ ~ container.2 minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run loot replace block ~ ~ ~ container.2 loot gm4_tunnel_bores:entities/piston_minecart\nexecute if items block ~ ~ ~ container.3 minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run loot replace block ~ ~ ~ container.3 loot gm4_tunnel_bores:entities/piston_minecart\nexecute if items block ~ ~ ~ container.4 minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run loot replace block ~ ~ ~ container.4 loot gm4_tunnel_bores:entities/piston_minecart\n\nscoreboard players set $found_item gm4_machine_data 1\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/destroy_cart/update_hopper_minecart.mcfunction",
    "content": "# updates hopper minecarts with invalid items\n# @s = hopper minecart with invalid item\n# located at @s\n# run from gm4_tunnel_bores:machine/destroy_cart/scan_hoppers\n\n# replace correct slot with proper item\nexecute if items entity @s container.0 minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run loot replace entity @s container.0 loot gm4_tunnel_bores:entities/piston_minecart\nexecute if items entity @s container.1 minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run loot replace entity @s container.1 loot gm4_tunnel_bores:entities/piston_minecart\nexecute if items entity @s container.2 minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run loot replace entity @s container.2 loot gm4_tunnel_bores:entities/piston_minecart\nexecute if items entity @s container.3 minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run loot replace entity @s container.3 loot gm4_tunnel_bores:entities/piston_minecart\nexecute if items entity @s container.4 minecraft:furnace_minecart[custom_name={\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\"}] run loot replace entity @s container.4 loot gm4_tunnel_bores:entities/piston_minecart\n\nscoreboard players set $found_item gm4_machine_data 1\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/destroy_cart.mcfunction",
    "content": "# destroys the tunnel_bore\n# @s = tunnel_bore marker\n# located at @s\n# run from gm4_tunnel_bores:machine/verify_destroy\n\ntag @s add gm4_destroyed_bore_storage\n\n# drop item\nscoreboard players set $dropped_item gm4_machine_data 0\nexecute as @e[type=item,distance=..3,nbt={Age:0s,Item:{id:\"minecraft:furnace_minecart\",count:1,components:{\"minecraft:custom_name\":{\"fallback\":\"Minecart with Piston\",\"translate\":\"item.gm4.minecart.bore\"}}}},limit=1,sort=nearest] at @s run function gm4_tunnel_bores:machine/destroy_cart/drop_item\n\n# scan hoppers if no item was broken\nexecute if score $dropped_item gm4_machine_data matches 0 run function gm4_tunnel_bores:machine/destroy_cart/scan_hoppers\n\n# kill marker\nkill @s\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/verify_destroy_cart.mcfunction",
    "content": "# verifies that the destroyed machine was from this module\n# @s = machine block marker\n# located at @s\n# run from #gm4_machines:destroy\n\nexecute if entity @s[tag=gm4_bore_storage] run function gm4_tunnel_bores:machine/destroy_cart\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/verify_place_cart.mcfunction",
    "content": "# verifies that the placed down machine minecart was from this module\n# @s = machine minecart\n# located at the machine minecart\n# run from #gm4_machines:place_cart\n\nexecute if score $placed_block gm4_machine_data matches 0 if data entity @s {CustomName:{\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\",\"italic\":false,\"color\":\"white\"}} run function gm4_tunnel_bores:machine/create_cart\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/main.mcfunction",
    "content": "# slow clock for refueling\nexecute if score refuel_clock gm4_bore_fuel matches 220.. run scoreboard players set refuel_clock gm4_bore_fuel 0\nscoreboard players add refuel_clock gm4_bore_fuel 1\n\n# bore handling\nexecute as @e[type=furnace_minecart,tag=gm4_tunnel_bore] run function gm4_tunnel_bores:bore/mine/auto_mine\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/function/pulse_check.mcfunction",
    "content": "\nschedule function gm4_tunnel_bores:pulse_check 1t\n\n# control main module clock\nscoreboard players add main_clock gm4_bore_data 1\nexecute if score main_clock gm4_bore_data matches 16.. run scoreboard players set main_clock gm4_bore_data 0\n\n# control slow clock for cart cooldown\n\nexecute if score main_clock gm4_bore_data = trigger_tick gm4_bore_data run function gm4_tunnel_bores:bore/mine/cooldown/clock_control\n\n# handle all furnace carts\nexecute as @e[type=furnace_minecart] run function gm4_tunnel_bores:furnace_cart_20hz\n\n#compares assigned run tick to current tick and calls main\nexecute if score main_clock gm4_bore_data = trigger_tick gm4_bore_data run function gm4_tunnel_bores:main\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/guidebook/tunnel_bores.json",
    "content": "{\n  \"id\": \"tunnel_bores\",\n  \"name\": \"Tunnel Bores\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:piston\"\n  },\n  \"criteria\": {\n    \"obtain_minecart\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:minecart\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_piston\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:piston\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_tunnel_bore\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:furnace_minecart\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"tunnel_bore\\\"}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.tunnel_bores.description\",\n            \"fallback\": \"Tunnel Bores can be crafted to aid in excavation. Piston Minecarts will break blocks and place rails, moving forward.\\n\\nThey can be crafted in a crafting table.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"crafting\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_piston\"\n        ],\n        [\n          \"obtain_minecart\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.tunnel_bores.crafting\",\n            \"fallback\": \"Tunnel bores can be crafted as follows:\"\n          },\n          \"\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_tunnel_bores:piston_minecart\"\n          }\n        ],\n        [\n          \"\\n\\n\",\n          {\n            \"insert\": \"recipe\",\n            \"recipe\": \"gm4_tunnel_bores:piston_minecart_from_furnace_minecart\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_tunnel_bore\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.tunnel_bores.start_up\",\n            \"fallback\": \"Piston Minecarts are upgraded furnace minecarts and require coal as fuel. To start the bore, use a piece of coal on the bore.\\n\\nPiston Minecarts will mine piston-movable blocks in a 3x3 area centered at the block above it.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.tunnel_bores.supply\",\n            \"fallback\": \"These tunnel bores can place rails on solid blocks in front of it.\\n\\nChest Minecarts can be attached to supply the Piston Minecart with rails and coal.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.tunnel_bores.mining\",\n            \"fallback\": \"Tunnel bores will continuously mine blocks when it hits a breakable block, but will always try to mine and refuel when on a powered activator rail.\\n\\nThis makes it possible to keep a stationary bore.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"crafting\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/loot_table/entities/piston_minecart.json",
    "content": "{\n  \"type\": \"minecraft:entity\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"gm4_tunnel_bores:items/piston_minecart\"\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:rail\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"type\": \"minecraft:score\",\n                \"target\": \"this\",\n                \"score\": \"gm4_bore_rail\"\n              }\n            }\n          ],\n          \"conditions\": [\n            {\n              \"condition\": \"minecraft:value_check\",\n              \"value\": {\n                \"type\": \"minecraft:score\",\n                \"target\": \"this\",\n                \"score\": \"gm4_bore_rail\"\n              },\n              \"range\": {\n                \"min\": 1\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/loot_table/items/piston_minecart.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:furnace_minecart\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_tunnel_bores:item/piston_minecart\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_machines:{id:'tunnel_bore'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.minecart.bore\",\n                                \"fallback\": \"Minecart with Piston\",\n                                \"italic\": false,\n                                \"color\": \"white\"\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/recipe/piston_minecart.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"redstone\",\n  \"group\": \"gm4_tunnel_bores:piston_minecart\",\n  \"pattern\": [\n    \" F \",\n    \"TMP\"\n  ],\n  \"key\": {\n    \"F\": \"minecraft:furnace\",\n    \"T\": \"minecraft:tripwire_hook\",\n    \"M\": \"minecraft:minecart\",\n    \"P\": \"minecraft:piston\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:furnace_minecart\",\n    \"components\": {\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_tunnel_bores:item/piston_minecart\"]},\n      \"minecraft:custom_data\": \"{gm4_machines:{id:'tunnel_bore'}}\",\n      \"minecraft:custom_name\": {\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\",\"color\":\"white\",\"italic\":false}\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/recipe/piston_minecart_from_furnace_minecart.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"redstone\",\n  \"group\": \"gm4_tunnel_bores:piston_minecart\",\n  \"pattern\": [\n    \"TMP\"\n  ],\n  \"key\": {\n    \"T\": \"minecraft:tripwire_hook\",\n    \"M\": \"minecraft:furnace_minecart\",\n    \"P\": \"minecraft:piston\"\n  },\n  \"result\": {\n    \"id\": \"minecraft:furnace_minecart\",\n    \"components\": {\n      \"minecraft:custom_model_data\": {\"strings\":[\"gm4_tunnel_bores:item/piston_minecart\"]},\n      \"minecraft:custom_data\": \"{gm4_machines:{id:'tunnel_bore'}}\",\n      \"minecraft:custom_name\": {\"translate\":\"item.gm4.minecart.bore\",\"fallback\":\"Minecart with Piston\",\"color\":\"white\",\"italic\":false}\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/tags/block/liquids.json",
    "content": "{\n  \"values\": [\n    \"#gm4:water\",\n    \"minecraft:lava\"\n  ]\n}\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/tags/block/not_rail_solid.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:air\",\n    \"#minecraft:chains\",\n    \"#gm4_tunnel_bores:liquids\",\n    \"#minecraft:small_flowers\",\n    \"minecraft:brown_mushroom\",\n    \"minecraft:red_mushroom\",\n    \"minecraft:tripwire\",\n    \"minecraft:short_grass\",\n    \"minecraft:kelp\",\n    \"minecraft:seagrass\",\n    \"minecraft:tall_grass\",\n    \"minecraft:large_fern\",\n    \"minecraft:rose_bush\",\n    \"minecraft:sunflower\",\n    \"minecraft:lilac\",\n    \"minecraft:peony\",\n    \"minecraft:oak_sapling\",\n    \"minecraft:spruce_sapling\",\n    \"minecraft:birch_sapling\",\n    \"minecraft:jungle_sapling\",\n    \"minecraft:acacia_sapling\",\n    \"minecraft:dark_oak_sapling\",\n    \"minecraft:dead_bush\",\n    \"minecraft:torch\",\n    \"minecraft:wall_torch\",\n    \"minecraft:snow\",\n    \"minecraft:fire\",\n    \"minecraft:farmland\",\n    \"minecraft:dirt_path\",\n    \"minecraft:cactus\",\n    \"#minecraft:leaves\",\n    \"#minecraft:slabs\",\n    \"#minecraft:stairs\",\n    \"minecraft:nether_portal\",\n    \"#minecraft:fences\",\n    \"minecraft:chorus_plant\",\n    \"minecraft:chorus_flower\",\n    \"minecraft:end_rod\",\n    \"minecraft:end_portal_frame\",\n    \"minecraft:end_portal\",\n    \"minecraft:dragon_egg\",\n    \"minecraft:end_gateway\",\n    \"minecraft:white_stained_glass_pane\",\n    \"minecraft:orange_stained_glass_pane\",\n    \"minecraft:magenta_stained_glass_pane\",\n    \"minecraft:light_blue_stained_glass_pane\",\n    \"minecraft:yellow_stained_glass_pane\",\n    \"minecraft:lime_stained_glass_pane\",\n    \"minecraft:pink_stained_glass_pane\",\n    \"minecraft:gray_stained_glass_pane\",\n    \"minecraft:light_gray_stained_glass_pane\",\n    \"minecraft:cyan_stained_glass_pane\",\n    \"minecraft:purple_stained_glass_pane\",\n    \"minecraft:blue_stained_glass_pane\",\n    \"minecraft:brown_stained_glass_pane\",\n    \"minecraft:green_stained_glass_pane\",\n    \"minecraft:red_stained_glass_pane\",\n    \"minecraft:black_stained_glass_pane\",\n    \"#minecraft:wool_carpets\",\n    \"#minecraft:banners\",\n    \"#minecraft:beds\",\n    \"minecraft:stonecutter\",\n    \"minecraft:grindstone\",\n    \"minecraft:chest\",\n    \"minecraft:trapped_chest\",\n    \"minecraft:ender_chest\",\n    \"minecraft:enchanting_table\",\n    \"#minecraft:campfires\",\n    \"#minecraft:anvil\",\n    \"minecraft:conduit\",\n    \"minecraft:bell\",\n    \"minecraft:lectern\",\n    \"minecraft:brewing_stand\",\n    \"minecraft:cake\",\n    \"#minecraft:wooden_pressure_plates\",\n    \"minecraft:stone_pressure_plate\",\n    \"minecraft:light_weighted_pressure_plate\",\n    \"minecraft:heavy_weighted_pressure_plate\",\n    \"minecraft:daylight_detector\",\n    \"#minecraft:buttons\",\n    \"minecraft:repeater\",\n    \"minecraft:comparator\",\n    \"minecraft:redstone_wire\",\n    \"#minecraft:trapdoors\",\n    \"#minecraft:doors\",\n    \"minecraft:tripwire_hook\",\n    \"minecraft:redstone_torch\",\n    \"minecraft:redstone_wall_torch\",\n    \"minecraft:lever\",\n    \"#minecraft:rails\",\n    \"minecraft:oak_fence_gate\",\n    \"minecraft:acacia_fence_gate\",\n    \"minecraft:dark_oak_fence_gate\",\n    \"minecraft:spruce_fence_gate\",\n    \"minecraft:birch_fence_gate\",\n    \"minecraft:jungle_fence_gate\",\n    \"#minecraft:walls\",\n    \"minecraft:glass_pane\",\n    \"minecraft:iron_bars\",\n    \"minecraft:lantern\",\n    \"minecraft:ladder\",\n    \"minecraft:cobweb\",\n    \"#minecraft:signs\",\n    \"#minecraft:flower_pots\",\n    \"minecraft:sea_pickle\",\n    \"minecraft:turtle_egg\",\n    \"minecraft:dragon_head\",\n    \"minecraft:skeleton_skull\",\n    \"minecraft:player_head\",\n    \"minecraft:wither_skeleton_skull\",\n    \"minecraft:creeper_head\",\n    \"minecraft:zombie_head\",\n    \"minecraft:dragon_wall_head\",\n    \"minecraft:skeleton_wall_skull\",\n    \"minecraft:player_wall_head\",\n    \"minecraft:wither_skeleton_wall_skull\",\n    \"minecraft:creeper_wall_head\",\n    \"minecraft:zombie_wall_head\",\n    \"#minecraft:underwater_bonemeals\",\n    \"minecraft:melon_stem\",\n    \"minecraft:pumpkin_stem\",\n    \"minecraft:wheat\",\n    \"minecraft:beetroots\",\n    \"minecraft:potatoes\",\n    \"minecraft:carrots\",\n    \"minecraft:sugar_cane\",\n    \"minecraft:cocoa\",\n    \"minecraft:bamboo\",\n    \"minecraft:bamboo_sapling\",\n    \"minecraft:vine\",\n    \"minecraft:lily_pad\",\n    \"minecraft:structure_void\",\n    \"minecraft:soul_torch\",\n    \"minecraft:soul_wall_torch\",\n    \"minecraft:soul_lantern\",\n    \"minecraft:crimson_fungus\",\n    \"minecraft:warped_fungus\",\n    \"minecraft:weeping_vines\",\n    \"minecraft:weeping_vines_plant\",\n    \"minecraft:twisting_vines\",\n    \"minecraft:twisting_vines_plant\",\n    \"minecraft:crimson_roots\",\n    \"minecraft:warped_roots\",\n    \"minecraft:nether_sprouts\",\n    \"minecraft:warped_fence\",\n    \"minecraft:crimson_fence_gate\",\n    \"minecraft:sweet_berry_bush\",\n    \"minecraft:sculk_shrieker\",\n    \"minecraft:mangrove_propagule\",\n    \"minecraft:heavy_core\"\n  ]\n}\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/tags/block/rail_replacable.json",
    "content": "{\n    \"values\": [\n        \"#gm4:replaceable\",\n        \"#gm4:foliage\"\n    ]\n}\n"
  },
  {
    "path": "gm4_tunnel_bores/data/gm4_tunnel_bores/tags/block/unbreakable.json",
    "content": "{\n  \"values\": [\n    \"#gm4_tunnel_bores:liquids\",\n    \"minecraft:obsidian\",\n    \"minecraft:air\",\n    \"minecraft:void_air\",\n    \"minecraft:cave_air\",\n    \"minecraft:ancient_debris\",\n    \"minecraft:barrier\",\n    \"minecraft:bedrock\",\n    \"minecraft:end_portal\",\n    \"minecraft:end_portal_frame\",\n    \"minecraft:end_gateway\",\n    \"minecraft:command_block\",\n    \"minecraft:repeating_command_block\",\n    \"minecraft:chain_command_block\",\n    \"minecraft:structure_block\",\n    \"minecraft:jigsaw\",\n    \"minecraft:structure_void\",\n    \"minecraft:moving_piston\",\n    \"minecraft:chest\",\n    \"minecraft:barrel\",\n    \"minecraft:dispenser\",\n    \"minecraft:dropper\",\n    \"minecraft:hopper\",\n    \"minecraft:furnace\",\n    \"minecraft:jukebox\",\n    \"minecraft:trapped_chest\",\n    \"minecraft:ender_chest\",\n    \"minecraft:lectern\",\n    \"minecraft:piston\",\n    \"minecraft:sticky_piston\",\n    \"minecraft:beacon\",\n    \"minecraft:daylight_detector\",\n    \"minecraft:conduit\",\n    \"minecraft:enchanting_table\",\n    \"#minecraft:banners\",\n    \"#minecraft:campfires\",\n    \"minecraft:blast_furnace\",\n    \"minecraft:smoker\",\n    \"minecraft:spawner\",\n    \"minecraft:fire\",\n    \"#minecraft:signs\",\n    \"minecraft:piston_head\",\n    \"minecraft:nether_portal\",\n    \"minecraft:crying_obsidian\",\n    \"minecraft:respawn_anchor\",\n    \"minecraft:lodestone\",\n    \"minecraft:reinforced_deepslate\",\n    \"minecraft:crafter\",\n    \"minecraft:trial_spawner\",\n    \"minecraft:vault\"\n  ]\n}\n"
  },
  {
    "path": "gm4_tunnel_bores/mod.mcdoc",
    "content": "use ::java::util::slot::SlottedItem\n\ndispatch minecraft:storage[gm4_tunnel_bores:bore_container] to struct {\n  Items?: [SlottedItem<byte>],\n}\n"
  },
  {
    "path": "gm4_undead_players/README.md",
    "content": "# Undead Players<!--$headerTitle-->\n\nEver wonder what happens to your player's body after you die? Well wonder no longer. This modular data pack reanimates your fallen-corpse as a zombie. <!--$pmc:headerSize-->\n\n### Features\n- Players summon a zombie at their location upon death.\n- The \"Undead Player\" is named, and won't despawn, helping you track down where you died.\n- The \"Undead Player\" can pickup items, potentially saving some of your gear from despawning.\n- Adds a custom advancement for those who \"rise again\" as an undead player.\n"
  },
  {
    "path": "gm4_undead_players/beet.yaml",
    "content": "id: gm4_undead_players\nname: Undead Players\nversion: 1.8.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_player_death\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_player_death: 1.4.0\n      schedule_loops: [main]\n    model_data:\n      - item: zombie_head\n        reference: gui/advancement/undead_players\n        template: advancement\n    website:\n      description: You'll find your death point faster, but you'll have to fight your corpse for your stuff back!\n      recommended: []\n      notes:\n        - Modifies items right after a player died, and might fight over those items with other Datapacks that do the same.\n    modrinth:\n      project_id: jx6D06Q4\n    planetminecraft:\n      uid: 4294228\n    video: https://www.youtube.com/watch?v=dD8nChP8t9A\n    wiki: https://wiki.gm4.co/wiki/Undead_Players\n    credits:\n      Creator:\n        - Sparks\n      Updated by:\n        - SunderB\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_undead_players/data/gm4/advancement/undead_players.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"zombie_head\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_undead_players:gui/advancement/undead_players\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.undead_players.title\",\n      \"fallback\": \"Risen\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.undead_players.description\",\n      \"fallback\": \"Die and raise up an undead zombie in your body's place\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"player_death\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_undead_players/data/gm4_player_death/tags/function/grave.json",
    "content": "{\n  \"values\": [\n    \"gm4_undead_players:died\"\n  ]\n}\n"
  },
  {
    "path": "gm4_undead_players/data/gm4_undead_players/function/died.mcfunction",
    "content": "#run from #gm4_player_death:grave\n#@s = player who took fatal damage\n\n# Summon undead player unless player has ignore tag or is in creative/spectator.\nexecute if entity @s[tag=!gm4_undead_ignore,gamemode=!creative,gamemode=!spectator] run function gm4_undead_players:summon_zombie\n"
  },
  {
    "path": "gm4_undead_players/data/gm4_undead_players/function/init.mcfunction",
    "content": "# Add scoreboard used to implement custom logic for undead player drowned conversion.\nscoreboard objectives add gm4_undead_drown dummy\n\nexecute unless score undead_players gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Undead Players\"}\nexecute unless score undead_players gm4_earliest_version < undead_players gm4_modules run scoreboard players operation undead_players gm4_earliest_version = undead_players gm4_modules\nscoreboard players set undead_players gm4_modules 1\n\nschedule function gm4_undead_players:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_undead_players/data/gm4_undead_players/function/init_drowned.mcfunction",
    "content": "#run from gm4_undead_players:summon_drowned\n#@s = newly spawned drowned player\n\n# Copy the equipment from the zombie to the drowned.\ndata modify entity @s equipment merge from storage gm4_undead_players:temp zombie_data.equipment\n\n# Update the name from \"Undead <name>\" to \"Drowned <name>\"\ndata modify storage gm4_undead_players:temp zombie_data.CustomName merge value {translate:\"entity.gm4.drowned_player_name\",\"fallback\":\"Drowned %s\"}\ndata modify entity @s CustomName merge from storage gm4_undead_players:temp zombie_data.CustomName\n\n# Remove the temporary \"new\" tag from the drowned.\ntag @s remove gm4_undead_player_new\n"
  },
  {
    "path": "gm4_undead_players/data/gm4_undead_players/function/init_zombie.mcfunction",
    "content": "#run from gm4_undead_players:summon_zombie\n#@s = newly spawned undead player\n\n# Store the player's name to storage\ndata modify storage gm4_undead_players:temp name_attribute.Name set from entity @s equipment.head.components.\"minecraft:profile\".name\n\n# Use an item modifier to generate the undead player's CustomName (\"Undead <Name>\").\nitem modify entity @s armor.head gm4_undead_players:zombie_name\ndata modify entity @s CustomName set from entity @s equipment.head.components.\"minecraft:custom_name\"\ndata remove storage gm4_undead_players:temp name_attribute\n\n# Clear the temporary item from the undead player's hand and remove the temporary \"new\" tag.\ntag @s remove gm4_undead_player_new\nitem replace entity @s armor.head with air\n"
  },
  {
    "path": "gm4_undead_players/data/gm4_undead_players/function/main.mcfunction",
    "content": "schedule function gm4_undead_players:main 16t\nexecute as @e[type=zombie,tag=gm4_undead_player,nbt=!{DrownedConversionTime:-1}] run function gm4_undead_players:process_drowning\n"
  },
  {
    "path": "gm4_undead_players/data/gm4_undead_players/function/process_drowning.mcfunction",
    "content": "#run from gm4_undead_players:main\n#@s = undead player who is undergoing drowned conversion\n\n# Store DrownedConversionTime in a temporary scoreboard to use in calculations.\nexecute store result score #conversion_time gm4_undead_drown run data get entity @s DrownedConversionTime\n\n# Initialize drowning score to (15s * 20t/s) if the zombie just started drowning.\nexecute unless score @s gm4_undead_drown = @s gm4_undead_drown run scoreboard players set @s gm4_undead_drown 300\n\n# Calculate how much the zombie has drowned since the last call to this function.\nscoreboard players set #conversion_diff gm4_undead_drown 300\nscoreboard players operation #conversion_diff gm4_undead_drown -= #conversion_time gm4_undead_drown\nscoreboard players operation @s gm4_undead_drown -= #conversion_diff gm4_undead_drown\n\n# Reset the zombie's DrownedConversionTime so it doesn't drown naturally.\nexecute if score @s gm4_undead_drown matches 0.. run data modify entity @s DrownedConversionTime set value 300\n\n# The conversion is now complete; spawn a new drowned and copy the zombie's data.\nexecute if score @s gm4_undead_drown matches ..-1 at @s run function gm4_undead_players:summon_drowned\n"
  },
  {
    "path": "gm4_undead_players/data/gm4_undead_players/function/summon_drowned.mcfunction",
    "content": "#run from gm4_undead_players:process_drowning\n#@s = undead player who is being converted into a drowned\n\n# Copy the zombie's NBT to storage, then kill the zombie instantly and without drops.\ndata modify storage gm4_undead_players:temp zombie_data set from entity @s\nteleport @s ~ -10000 ~\ndata merge entity @s {Health:0f,DeathTime:19s}\n\n# Summon the drowned and initialize it based on the contents of storage. \nsummon drowned ~ ~ ~ {Tags:[\"gm4_undead_player\",\"gm4_undead_player_new\"],PersistenceRequired:1b,CustomNameVisible:1b,drop_chances:{mainhand:1F,offhand:1F,feet:1F,legs:1F,chest:1F,head:1F}}\nexecute as @e[type=drowned,tag=gm4_undead_player_new,distance=0,limit=1] run function gm4_undead_players:init_drowned\n\n# Clear storage to avoid deep comparison when this function is next called.\ndata remove storage gm4_undead_players:temp zombie_data\n"
  },
  {
    "path": "gm4_undead_players/data/gm4_undead_players/function/summon_zombie.mcfunction",
    "content": "#run from gm4_undead_players:died\n#@s = player who has died and is not excluded from undead player spawning (via tag or gamemode)\n\n# Summon zombie to be initialized.\nsummon zombie ~ ~1 ~ {CustomNameVisible:1b,CanPickUpLoot:1b,PersistenceRequired:1b,Tags:[\"gm4_undead_player\",\"gm4_undead_player_new\"]}\n\n# Use a loot table to extract the player's username.\nloot replace entity @e[type=zombie,tag=gm4_undead_player_new,dy=2,limit=1] armor.head loot gm4_undead_players:player_head\n\n# Run a function as the zombie to initialize its NBT.\nexecute as @e[type=zombie,tag=gm4_undead_player_new,dy=1,limit=1] run function gm4_undead_players:init_zombie\n\n# Grant the \"Risen\" advancement to the player.\nadvancement grant @s only gm4:undead_players\n"
  },
  {
    "path": "gm4_undead_players/data/gm4_undead_players/guidebook/undead_players.json",
    "content": "{\n  \"id\": \"undead_players\",\n  \"name\": \"Undead Players\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:rotten_flesh\"\n  },\n  \"criteria\": {\n    \"summon_undead_player\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"player\",\n                \"advancements\": {\n                  \"gm4:undead_players\": true\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"summon_undead_player\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.undead_players.description\",\n            \"fallback\": \"When one dies, an undead version of them will spawn at the death site.\\n\\nThis zombie have a visible name, will never despawn, and will pick up armor and weapons.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_undead_players/data/gm4_undead_players/item_modifier/zombie_name.json",
    "content": "{\n  \"function\": \"minecraft:set_name\",\n  \"entity\": \"this\",\n  \"name\": {\n    \"translate\": \"entity.gm4.undead_player_name\",\n    \"fallback\": \"Undead %s\",\n    \"with\": [\n      {\n        \"storage\": \"gm4_undead_players:temp\",\n        \"nbt\": \"name_attribute.Name\"\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "gm4_undead_players/data/gm4_undead_players/loot_table/player_head.json",
    "content": "{\n  \"type\": \"minecraft:generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:player_head\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:fill_player_head\",\n              \"entity\": \"this\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_undead_players/mod.mcdoc",
    "content": "use ::java::world::entity::mob::zombie::Zombie\nuse ::java::util::text::Text\n\ndispatch minecraft:storage[gm4_undead_players:temp] to struct {\n  zombie_data?: Zombie,\n  name_attribute?: struct {\n    Name: string,\n  },\n}\n"
  },
  {
    "path": "gm4_undead_players/translations.csv",
    "content": "key,en_us\nadvancement.gm4.undead_players.description,Die and raise up an undead zombie in your body's place\nadvancement.gm4.undead_players.title,Risen\nentity.gm4.drowned_player_name,Drowned %s\nentity.gm4.undead_player_name,Undead %s\ntext.gm4.guidebook.module_desc.undead_players,\"You'll find your death point faster, but you'll have to fight your corpse for your stuff back!\"\ntext.gm4.guidebook.undead_players.description,\"When one dies, an undead version of them will spawn at the death site.\\n\\nThis zombie have a visible name, will never despawn, and will pick up armor and weapons.\"\n"
  },
  {
    "path": "gm4_vecto_shamir/README.md",
    "content": "# Vecto Shamir<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nSummon a Boat or Minecart out of thin air when in need, no more wasting an inventory slot!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Sneak on top of Water, Ice or Rails to spawn a temporary Boat or Minecart\r\n- The mode of transport disappears once the summoning player moves away from it\r\n- Boats spawned reflect the biome it spawns in\r\n- Builds on Gamemode 4's expansion on the Echantment system, [Metallurgy]($dynamicLink:gm4_metallurgy)\r\n"
  },
  {
    "path": "gm4_vecto_shamir/beet.yaml",
    "content": "id: gm4_vecto_shamir\nname: Vecto Shamir\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: ../gm4_metallurgy\n\npipeline:\n  - gm4_metallurgy.shamir_model_template\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_metallurgy: 1.8.0\n      schedule_loops: [main]\n    model_data:\n      - item: boots\n        reference: shamir/vecto\n        template:\n          name: shamir\n          metal: bismuth\n          textures_path: gm4_metallurgy:item/shamir/bismuth\n    website:\n      description: Adds the 'Vecto' Shamir to Metallurgy. Summon a Boat or Minecart out of thin air when in need, no more wasting an inventory slot!\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: wwe9xfEp\n    wiki: https://wiki.gm4.co/wiki/Metallurgy/Vecto_Shamir\n    credits:\n      Creator:\n        - Denniss\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json",
    "content": "{\n\t\"values\": [\n\t\t\"gm4_vecto_shamir:check_item_validity\"\n\t]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_metallurgy/tags/function/summon_band/bismuth.json",
    "content": "{\n\t\"values\": [\n\t\t\"gm4_vecto_shamir:summon_band\"\n\t]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/advancement/join.json",
    "content": "{\n  \"criteria\": {\n    \"join\": {\n      \"trigger\": \"minecraft:location\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_vecto_shamir:get_id\"\n  }\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/advancement/vehicle_check.json",
    "content": "{\n  \"criteria\": {\n    \"not_in_vehicle\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"nbt\": \"{Tags:[\\\"gm4_vecto_active\\\"]}\"\n            }\n          },\n          {\n            \"condition\": \"minecraft:inverted\",\n            \"term\": {\n              \"condition\": \"minecraft:reference\",\n              \"name\": \"gm4_vecto_shamir:in_vehicle\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_vecto_shamir:vehicle/check\"\n  }\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/active.mcfunction",
    "content": "# @s = player with shamir equipped, sneaking\n# at @s\n# run from main\n\n# minecart\nexecute if block ~ ~ ~ #minecraft:rails run function gm4_vecto_shamir:vehicle/spawn_minecart\n\n# boat\nexecute if predicate gm4_vecto_shamir:water run function gm4_vecto_shamir:vehicle/position_check\nexecute if block ~ ~-1 ~ #minecraft:ice if block ~ ~ ~ #gm4:no_collision if block ~0.7 ~ ~ #gm4:no_collision if block ~-0.7 ~ ~ #gm4:no_collision if block ~ ~ ~0.7 #gm4:no_collision if block ~ ~ ~-0.7 #gm4:no_collision if block ~0.7 ~ ~0.7 #gm4:no_collision if block ~0.7 ~ ~-0.7 #gm4:no_collision if block ~-0.7 ~ ~0.7 #gm4:no_collision if block ~-0.7 ~ ~-0.7 #gm4:no_collision run function gm4_vecto_shamir:vehicle/spawn_boat\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/check_item_validity.mcfunction",
    "content": "# @s = band is trying to apply to\n# at @s\n# run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'vecto'}}] if items entity @s contents #gm4_vecto_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/get_id.mcfunction",
    "content": "# @s = new player\n# at @s\n# run from advancement join\n\nexecute store result score @s gm4_vecto_id run data get entity @s UUID[0]\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_vecto_id dummy\n\nteam add gm4_vecto_nocoll\nteam modify gm4_vecto_nocoll collisionRule never\n\nexecute unless score vecto_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Vecto Shamir\"}\nexecute unless score vecto_shamir gm4_earliest_version < vecto_shamir gm4_modules run scoreboard players operation vecto_shamir gm4_earliest_version = vecto_shamir gm4_modules\nscoreboard players set vecto_shamir gm4_modules 1\n\nschedule function gm4_vecto_shamir:main 4t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/main.mcfunction",
    "content": "execute as @a[gamemode=!spectator,predicate=gm4_vecto_shamir:sneak_validblock,tag=!gm4_vecto_active] at @s run function gm4_vecto_shamir:active\n\nschedule function gm4_vecto_shamir:main 16t\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n# at @s\n# run from metallurgy:casting/summon_band/template via #gm4_metallurgy:summon_band/template\n\nloot spawn ~ ~ ~ loot gm4_vecto_shamir:band\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/check.mcfunction",
    "content": "# @s = player with tag gm4_vecto_active and not in vehicle\n# at @s\n# run from advancement vehicle_check\n\nadvancement revoke @s only gm4_vecto_shamir:vehicle_check\n\n# copy player id\nscoreboard players operation $current gm4_vecto_id = @s gm4_vecto_id\n\n# remove vehicle if too far away from player\nexecute as @e[type=#gm4_vecto_shamir:vehicle,tag=gm4_vecto_vehicle,distance=2..] if score @s gm4_vecto_id = $current gm4_vecto_id run function gm4_vecto_shamir:vehicle/remove\n\n# enable collision if not sneaking\nexecute unless predicate gm4_vecto_shamir:sneaking as @e[type=#gm4_vecto_shamir:vehicle,tag=gm4_vecto_vehicle,distance=..2] if score @s gm4_vecto_id = $current gm4_vecto_id run team leave @s\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/check_boat_collision.mcfunction",
    "content": "# @s = player with shamir equipped, sneaking above water\n# positioned in water\n# run from position_check\n\nexecute positioned ^ ^-.4 ^1 if block ^.7 ^ ^ #gm4:no_collision if block ^-.7 ^ ^ #gm4:no_collision if block ^ ^ ^1 #gm4:no_collision if block ^.7 ^ ^1 #gm4:no_collision if block ^-.7 ^ ^1 #gm4:no_collision if block ^.7 ^1 ^ #gm4:no_collision if block ^ ^1 ^ #gm4:no_collision if block ^-.7 ^1 ^ #gm4:no_collision if block ^ ^1 ^1 #gm4:no_collision if block ^.7 ^1 ^1 #gm4:no_collision if block ^-.7 ^1 ^1 #gm4:no_collision run function gm4_vecto_shamir:vehicle/spawn_boat\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/position_check.mcfunction",
    "content": "# @s = player with shamir equipped, sneaking above water\n# at @s\n# run from active\n\n# rotate check towards water\nexecute if block ~ ~-1 ~-1 #gm4:full_collision rotated 0 0 run function gm4_vecto_shamir:vehicle/check_boat_collision\nexecute unless entity @s[tag=gm4_vecto_active] if block ~1 ~-1 ~ #gm4:full_collision rotated 90 0 run function gm4_vecto_shamir:vehicle/check_boat_collision\nexecute unless entity @s[tag=gm4_vecto_active] if block ~ ~-1 ~1 #gm4:full_collision rotated 180 0 run function gm4_vecto_shamir:vehicle/check_boat_collision\nexecute unless entity @s[tag=gm4_vecto_active] if block ~-1 ~-1 ~ #gm4:full_collision rotated -90 0 run function gm4_vecto_shamir:vehicle/check_boat_collision\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/remove.mcfunction",
    "content": "# @s = temporary vehicle with no player\n# at @p[tag=gm4_vecto_active] not in vehicle\n# run from vehicle/check\n\nexecute at @s run particle minecraft:cloud ~ ~ ~ .2 .2 .2 .05 20\nexecute at @s run playsound minecraft:entity.player.attack.nodamage neutral @a[distance=..15] ~ ~ ~ 1 .6\n\nkill @s\ntag @p[tag=gm4_vecto_active] remove gm4_vecto_active\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/spawn_boat.mcfunction",
    "content": "# @s = player with shamir equipped, sneaking above water OR ice\n# at @s\n# run from active and vehicle/check_boat_collision\n\ntag @s add gm4_vecto_active\n\n# spawn boat\nexecute if entity @s[y_rotation=-45..45] run function gm4_vecto_shamir:vehicle/spawn_boat_south\nexecute if entity @s[y_rotation=45..135] run function gm4_vecto_shamir:vehicle/spawn_boat_west\nexecute if entity @s[y_rotation=135..225] run function gm4_vecto_shamir:vehicle/spawn_boat_north\nexecute if entity @s[y_rotation=-135..-45] run function gm4_vecto_shamir:vehicle/spawn_boat_east\n\nteam join gm4_vecto_nocoll @e[type=#minecraft:boat,tag=gm4_vecto_new_vehicle,distance=..1,sort=nearest,limit=1]\n\n# link player to boat with id\nscoreboard players operation @e[type=#minecraft:boat,tag=gm4_vecto_new_vehicle,distance=..1,sort=nearest,limit=1] gm4_vecto_id = @s gm4_vecto_id\n\n# remove new tag\ntag @e[type=#minecraft:boat,tag=gm4_vecto_new_vehicle,distance=..1,sort=nearest,limit=1] remove gm4_vecto_new_vehicle\n\n# effects\nexecute if block ~ ~-1 ~ #minecraft:ice run playsound minecraft:entity.boat.paddle_land player @a[distance=..15] ~ ~ ~ 2 1\nexecute unless block ~ ~-1 ~ #minecraft:ice run playsound minecraft:entity.boat.paddle_water player @a[distance=..15] ~ ~ ~ 2 1\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/spawn_boat_east.mcfunction",
    "content": "# run from spawn_boat\n\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:acacia run summon minecraft:acacia_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[270f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:bamboo run summon minecraft:bamboo_raft ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[270f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:birch run summon minecraft:birch_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[270f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:cherry run summon minecraft:cherry_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[270f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:dark_oak run summon minecraft:dark_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[270f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:jungle run summon minecraft:jungle_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[270f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:mangrove run summon minecraft:mangrove_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[270f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:pale_oak run summon minecraft:pale_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[270f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:spruce run summon minecraft:spruce_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[270f,0f]}\n\nexecute unless biome ~ ~ ~ #gm4_vecto_shamir:non_oak run summon minecraft:oak_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[270f,0f]}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/spawn_boat_north.mcfunction",
    "content": "# run from spawn_boat\n\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:acacia run summon minecraft:acacia_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[180f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:bamboo run summon minecraft:bamboo_raft ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[180f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:birch run summon minecraft:birch_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[180f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:cherry run summon minecraft:cherry_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[180f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:dark_oak run summon minecraft:dark_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[180f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:jungle run summon minecraft:jungle_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[180f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:mangrove run summon minecraft:mangrove_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[180f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:pale_oak run summon minecraft:pale_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[180f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:spruce run summon minecraft:spruce_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[180f,0f]}\n\nexecute unless biome ~ ~ ~ #gm4_vecto_shamir:non_oak run summon minecraft:oak_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[180f,0f]}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/spawn_boat_south.mcfunction",
    "content": "# run from spawn_boat\n\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:acacia run summon minecraft:acacia_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[0f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:bamboo run summon minecraft:bamboo_raft ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[0f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:birch run summon minecraft:birch_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[0f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:cherry run summon minecraft:cherry_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[0f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:dark_oak run summon minecraft:dark_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[0f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:jungle run summon minecraft:jungle_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[0f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:mangrove run summon minecraft:mangrove_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[0f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:pale_oak run summon minecraft:pale_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[0f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:spruce run summon minecraft:spruce_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[0f,0f]}\n\nexecute unless biome ~ ~ ~ #gm4_vecto_shamir:non_oak run summon minecraft:oak_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[0f,0f]}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/spawn_boat_west.mcfunction",
    "content": "# run from spawn_boat\n\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:acacia run summon minecraft:acacia_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[90f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:bamboo run summon minecraft:bamboo_raft ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[90f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:birch run summon minecraft:birch_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[90f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:cherry run summon minecraft:cherry_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[90f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:dark_oak run summon minecraft:dark_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[90f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:jungle run summon minecraft:jungle_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[90f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:mangrove run summon minecraft:mangrove_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[90f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:pale_oak run summon minecraft:pale_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[90f,0f]}\nexecute if biome ~ ~ ~ #gm4_vecto_shamir:spruce run summon minecraft:spruce_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[90f,0f]}\n\nexecute unless biome ~ ~ ~ #gm4_vecto_shamir:non_oak run summon minecraft:oak_boat ~ ~ ~ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"],Rotation:[90f,0f]}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/spawn_minecart.mcfunction",
    "content": "# @s = player with shamir equipped, sneaking on rails\n# at @s\n# run from active\n\ntag @s add gm4_vecto_active\n\n# spawn minecart\nsummon minecraft:minecart ^ ^.1 ^ {Invulnerable:1b,Tags:[\"gm4_vecto_vehicle\",\"gm4_vecto_new_vehicle\"]}\nteam join gm4_vecto_nocoll @e[type=minecraft:minecart,tag=gm4_vecto_new_vehicle,distance=..1,sort=nearest,limit=1]\n\n# link player to minecart with id\nscoreboard players operation @e[type=minecraft:minecart,tag=gm4_vecto_new_vehicle,distance=..1,sort=nearest,limit=1] gm4_vecto_id = @s gm4_vecto_id\n\n# effects\nplaysound minecraft:block.metal.place neutral @a[distance=..15] ~ ~ ~ 1 2\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/guidebook/vecto_shamir.json",
    "content": "{\n  \"id\": \"vecto_shamir\",\n  \"name\": \"Vecto Shamir\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"metallurgy\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_vecto_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'vecto'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_vecto_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'vecto'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.vecto_shamir.description\",\n            \"fallback\": \"Vecto creates temporary boats and minecarts for easy travel.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_vecto_shamir\",\n          \"obtain_vecto_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.vecto_shamir.usage\",\n            \"fallback\": \"The Vecto Shamir is found on Bismuth Bands. It can be placed onto boots.\\n\\nSneak on top of water, ice, or rails to summon a temporary boat or minecart.\\nThis vehicle disappears once the owner is not nearby.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/loot_table/band.json",
    "content": "{\n\t\"pools\": [\n\t\t{\n\t\t\t\"rolls\": 1,\n\t\t\t\"entries\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"minecraft:loot_table\",\n\t\t\t\t\t\"value\": \"gm4_metallurgy:bismuth_band\",\n\t\t\t\t\t\"functions\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_components\",\n\t\t\t\t\t\t\t\"components\": {\n\t\t\t\t\t\t\t\t\"minecraft:custom_model_data\": {\"strings\":[\"gm4_vecto_shamir:shamir/vecto\"]}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_custom_data\",\n\t\t\t\t\t\t\t\"tag\": \"{gm4_metallurgy:{stored_shamir:'vecto'}}\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_lore\",\n\t\t\t\t\t\t\t\"mode\": \"append\",\n\t\t\t\t\t\t\t\"lore\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"translate\": \"item.gm4.shamir.vecto\",\n\t\t\t\t\t\t\t\t\t\"fallback\": \"Vecto Shamir\",\n\t\t\t\t\t\t\t\t\t\"italic\": false,\n\t\t\t\t\t\t\t\t\t\"color\": \"gray\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/predicate/in_vehicle.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"vehicle\": {\n      \"nbt\": \"{Tags:[\\\"gm4_vecto_vehicle\\\"]}\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/predicate/sneak_validblock.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n      \"flags\": {\n        \"is_sneaking\": true\n      },\n      \"equipment\": {\n        \"feet\": {\n          \"items\": \"#minecraft:foot_armor\",\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'vecto'}}\"\n          }\n        }\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:any_of\",\n    \"terms\": [\n      {\n        \"condition\": \"minecraft:location_check\",\n        \"predicate\": {\n          \"block\": {\n            \"blocks\": \"#minecraft:rails\"\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:location_check\",\n        \"offsetX\": 0,\n        \"offsetY\": -1,\n        \"offsetZ\": 0,\n        \"predicate\": {\n          \"block\": {\n            \"blocks\": \"#minecraft:ice\"\n          }\n        }\n      },\n      {\n        \"condition\": \"minecraft:location_check\",\n        \"offsetX\": 0,\n        \"offsetY\": -1,\n        \"offsetZ\": 0,\n        \"predicate\": {\n          \"fluid\": {\n            \"fluids\": \"#minecraft:water\"\n          }\n        }\n      }\n    ]\n  },\n  {\n    \"condition\": \"minecraft:inverted\",\n    \"term\": {\n      \"condition\": \"minecraft:location_check\",\n      \"predicate\": {\n        \"fluid\": {\n          \"fluids\": \"#minecraft:water\"\n        }\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/predicate/sneaking.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"flags\": {\n      \"is_sneaking\": true\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/predicate/water.json",
    "content": "[\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetX\": 0,\n    \"offsetY\": -1,\n    \"offsetZ\": 0,\n    \"predicate\": {\n      \"block\": {\n        \"blocks\": \"#gm4:no_collision\"\n      }\n    }\n  },\n  {\n    \"condition\": \"minecraft:location_check\",\n    \"offsetX\": 0,\n    \"offsetY\": -1,\n    \"offsetZ\": 0,\n    \"predicate\": {\n      \"fluid\": {\n        \"fluid\": \"minecraft:water\"\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/tags/entity_type/vehicle.json",
    "content": "{\n    \"values\": [\n        \"#minecraft:boat\",\n        \"minecraft:minecart\"\n    ]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:foot_armor\"\n  ]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/acacia.json",
    "content": "{\n  \"values\": [\n    \"minecraft:savanna\",\n    \"minecraft:savanna_plateau\",\n    \"minecraft:windswept_savanna\"\n  ]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/bamboo.json",
    "content": "{\n  \"values\": [\n    \"minecraft:bamboo_jungle\"\n  ]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/birch.json",
    "content": "{\n  \"values\": [\n    \"minecraft:birch_forest\",\n    \"minecraft:old_growth_birch_forest\"\n  ]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/cherry.json",
    "content": "{\n  \"values\": [\n    \"minecraft:cherry_grove\"\n  ]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/dark_oak.json",
    "content": "{\n  \"values\": [\n    \"minecraft:dark_forest\"\n  ]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/jungle.json",
    "content": "{\n  \"values\": [\n    \"minecraft:jungle\",\n    \"minecraft:sparse_jungle\"\n  ]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/mangrove.json",
    "content": "{\n  \"values\": [\n    \"minecraft:mangrove_swamp\"\n  ]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/non_oak.json",
    "content": "{\n  \"values\": [\n    \"#gm4_vecto_shamir:acacia\",\n    \"#gm4_vecto_shamir:bamboo\",\n    \"#gm4_vecto_shamir:birch\",\n    \"#gm4_vecto_shamir:cherry\",\n    \"#gm4_vecto_shamir:dark_oak\",\n    \"#gm4_vecto_shamir:jungle\",\n    \"#gm4_vecto_shamir:mangrove\",\n    \"#gm4_vecto_shamir:pale_oak\",\n    \"#gm4_vecto_shamir:spruce\"\n  ]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/pale_oak.json",
    "content": "{\n  \"values\": [\n    \"minecraft:pale_garden\"\n  ]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/spruce.json",
    "content": "{\n  \"values\": [\n    \"minecraft:taiga\",\n    \"minecraft:snowy_taiga\",\n    \"minecraft:snowy_plains\",\n    \"minecraft:snowy_beach\",\n    \"minecraft:snowy_slopes\",\n    \"minecraft:old_growth_pine_taiga\",\n    \"minecraft:old_growth_spruce_taiga\",\n    \"minecraft:windswept_forest\",\n    \"minecraft:windswept_hills\",\n    \"minecraft:windswept_gravelly_hills\",\n    \"minecraft:grove\"\n  ]\n}\n"
  },
  {
    "path": "gm4_vecto_shamir/translations.csv",
    "content": "key,en_us\nitem.gm4.shamir.vecto,Vecto Shamir\ntext.gm4.guidebook.module_desc.vecto_shamir,\"Adds the 'Vecto' Shamir to Metallurgy. Summon a Boat or Minecart out of thin air when in need, no more wasting an inventory slot!\"\ntext.gm4.guidebook.vecto_shamir.description,Vecto creates temporary boats and minecarts for easy travel.\ntext.gm4.guidebook.vecto_shamir.usage,\"The Vecto Shamir is found on Bismuth Bands. It can be placed onto boots.\\n\\nSneak on top of water, ice, or rails to summon a temporary boat or minecart.\\nThis vehicle disappears once the owner is not nearby.\"\n"
  },
  {
    "path": "gm4_vertical_rails/README.md",
    "content": "# Vertical Rails<!--$headerTitle--><!--$pmc:delete-->\n\nTurn ladders into vertical railways for your minecarts! This simple data pack is great way to travel from the depths of a mineshaft to the top of a mountian, without the need for dizzying railway corkscrews<!--$pmc:headerSize-->\n\n![Note Block Interface Example](images/vertical_rails.webp)<!--$localAssetToURL--><!--$modrinth:replaceWithVideo--><!--$pmc:delete-->\n\n### Features\n- Minecarts inside ladders automatically travel upwards until the reach the top, where they continue on regular rails.\n- Adds a custom advancement for your first ride up a wall\n"
  },
  {
    "path": "gm4_vertical_rails/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.vertical_rails.title,\"Up, Up and Away!\"\nadvancement.gm4.vertical_rails.description,Ride a minecart going up a vertical rail\ntext.gm4.guidebook.module_desc.vertical_rails,Use ladders as vertical Minecart tracks.\ntext.gm4.guidebook.vertical_rails.description,Ladder will provide a vertical track for minecarts.\\n\\nMinecarts that enter a ladder block will travel upwards.\ntext.gm4.guidebook.vertical_rails.behavior,\"Once a minecart reaches the top of a ladder, it will have some upward and forward velocity to continue along normal rails.\"\n"
  },
  {
    "path": "gm4_vertical_rails/beet.yaml",
    "content": "id: gm4_vertical_rails\nname: Vertical Rails\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops:\n        - main\n        - tick\n    model_data:\n      - item: ladder\n        reference: gui/advancement/vertical_rails\n        template: advancement\n    website:\n      description: Use ladders as vertical Minecart tracks.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: PL3P0wBS\n    video: https://www.youtube.com/watch?v=LJoN7CmJL4Q\n    wiki: https://wiki.gm4.co/wiki/Vertical_Rails\n    credits:\n      Creators:\n        - Sparks\n        - SiberianHat\n      Updated by:\n        - SpecialBuilder32\n        - Kruthers\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_vertical_rails/data/gm4/advancement/vertical_rails.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"ladder\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_vertical_rails:gui/advancement/vertical_rails\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.vertical_rails.title\",\n      \"fallback\": \"Up, Up and Away!\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.vertical_rails.description\",\n      \"fallback\": \"Ride a minecart going up a vertical rail\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"ride_vertical_rail\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_vertical_rails/data/gm4_vertical_rails/function/init.mcfunction",
    "content": "execute unless score vertical_rails gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Vertical Rails\"}\nexecute unless score vertical_rails gm4_earliest_version < vertical_rails gm4_modules run scoreboard players operation vertical_rails gm4_earliest_version = vertical_rails gm4_modules\nscoreboard players set vertical_rails gm4_modules 1\n\nschedule function gm4_vertical_rails:main 1t\nschedule function gm4_vertical_rails:tick 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_vertical_rails/data/gm4_vertical_rails/function/main.mcfunction",
    "content": "execute as @e[type=minecart,tag=!smithed.entity] at @s if block ~ ~ ~ ladder on passengers run advancement grant @s only gm4:vertical_rails\n\nschedule function gm4_vertical_rails:main 16t\n"
  },
  {
    "path": "gm4_vertical_rails/data/gm4_vertical_rails/function/momentum.mcfunction",
    "content": "execute if block ~ ~ ~ ladder[facing=north] run data merge entity @s {Motion:[0.0,0.32,0.15]}\nexecute if block ~ ~ ~ ladder[facing=south] run data merge entity @s {Motion:[0.0,0.32,-0.15]}\nexecute if block ~ ~ ~ ladder[facing=east] run data merge entity @s {Motion:[-0.15,0.32,0.0]}\nexecute if block ~ ~ ~ ladder[facing=west] run data merge entity @s {Motion:[0.15,0.32,0.0]}\n"
  },
  {
    "path": "gm4_vertical_rails/data/gm4_vertical_rails/function/tick.mcfunction",
    "content": "execute as @e[type=#gm4:minecarts,tag=!smithed.entity] at @s if block ~ ~ ~ ladder run function gm4_vertical_rails:momentum\n\nschedule function gm4_vertical_rails:tick 2t\n"
  },
  {
    "path": "gm4_vertical_rails/data/gm4_vertical_rails/guidebook/vertical_rails.json",
    "content": "{\n  \"id\": \"vertical_rails\",\n  \"name\": \"Vertical Rails\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:ladder\"\n  },\n  \"criteria\": {\n    \"obtain_ladder\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:ladder\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_ladder\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.vertical_rails.description\",\n            \"fallback\": \"Ladder will provide a vertical track for minecarts.\\n\\nMinecarts that enter a ladder block will travel upwards.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.vertical_rails.behavior\",\n            \"fallback\": \"Once a minecart reaches the top of a ladder, it will have some upward and forward velocity to continue along normal rails.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_vertical_rails/data/gm4_vertical_rails/test/go_up.mcfunction",
    "content": "# @template gm4_vertical_rails:test_track\n\nsummon minecart ~1.5 ~1.0 ~1.5\n\nawait delay 3s\n\nexecute positioned ~4.5 ~4.5 ~1.5 run assert entity @e[type=minecart,dx=0]\n"
  },
  {
    "path": "gm4_vigere_shamir/README.md",
    "content": "# Vigere Shamir<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nWhen added to a Shield, you are healed when you block<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Successfully blocking an attack heals the player 1.5 hearts, but applies Mining Fatigue 6.\r\n- Builds on Gamemode 4's extension of the enchantment system, [Metallurgy]($dynamicLink:gm4_metallurgy)\r\n"
  },
  {
    "path": "gm4_vigere_shamir/beet.yaml",
    "content": "id: gm4_vigere_shamir\nname: Vigere Shamir\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: ../gm4_metallurgy\n\npipeline:\n  - gm4_metallurgy.shamir_model_template\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_metallurgy: 1.8.0\n      schedule_loops: [main]\n    model_data:\n      - item: shield\n        reference: shamir/vigere\n        template:\n          name: shamir\n          metal: barimium\n          textures_path: gm4_metallurgy:item/shamir/barimium\n    website:\n      description: Adds the shamir 'Vigere' to Metallurgy. It heals you when you block with a shield.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: 9QdXJeGc\n    wiki: https://wiki.gm4.co/wiki/Metallurgy/Vigere_Shamir\n    credits:\n      Creator:\n        - Djones\n        - TheEpyonProject\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json",
    "content": "{\n    \"values\": [\n      \"gm4_vigere_shamir:check_item_validity\"\n    ]\n  }\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_metallurgy/tags/function/summon_band/barimium.json",
    "content": "{\n    \"values\":[\n      \"gm4_vigere_shamir:summon_band\"\n    ]\n  }\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/function/check_heal.mcfunction",
    "content": "# checks for players who have recently healed from Vigere and removes the attributes from gm4_vigere_shamir:heal\n# run from main\n\nexecute as @a[tag=gm4_vs_healed] run function gm4_vigere_shamir:revert_health\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/function/check_item_validity.mcfunction",
    "content": "#@s = band is trying to apply to\n#run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'vigere'}}] if items entity @s contents #gm4_vigere_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/function/heal.mcfunction",
    "content": "# Heals the player for 1.5 hearts after blocking with a Vigere Shield\n# at @s, player blocking with a Vigere Shield\n# runs from gm4_vigere_shamir:main\n\nexecute store result score $remove_health gm4_ml_data run attribute @s minecraft:max_health get\nscoreboard players operation $remove_health gm4_ml_data -= @s gm4_health\n\n# lower player's max health to their current health\nexecute if score $remove_health gm4_ml_data matches 512.. run attribute @s minecraft:max_health modifier add minecraft:e0c18b32-4caf-4193-8899-74ad1cc0dba2 -512 add_value\nexecute if score $remove_health gm4_ml_data matches 512.. run scoreboard players remove $remove_health gm4_ml_data 512\nexecute if score $remove_health gm4_ml_data matches 256.. run attribute @s minecraft:max_health modifier add minecraft:f7676355-5de1-4167-9c01-2a274b5ee6bc -256 add_value\nexecute if score $remove_health gm4_ml_data matches 256.. run scoreboard players remove $remove_health gm4_ml_data 256\nexecute if score $remove_health gm4_ml_data matches 128.. run attribute @s minecraft:max_health modifier add minecraft:2df88b31-a47f-4c31-a5b8-aa51ed1c35bb -128 add_value\nexecute if score $remove_health gm4_ml_data matches 128.. run scoreboard players remove $remove_health gm4_ml_data 128\nexecute if score $remove_health gm4_ml_data matches 64.. run attribute @s minecraft:max_health modifier add minecraft:41fd129e-322f-4147-b2fa-8185206f5b8e -64 add_value\nexecute if score $remove_health gm4_ml_data matches 64.. run scoreboard players remove $remove_health gm4_ml_data 64\nexecute if score $remove_health gm4_ml_data matches 32.. run attribute @s minecraft:max_health modifier add minecraft:1afb3106-b947-46ca-942a-cad1a78f5df7 -32 add_value\nexecute if score $remove_health gm4_ml_data matches 32.. run scoreboard players remove $remove_health gm4_ml_data 32\nexecute if score $remove_health gm4_ml_data matches 16.. run attribute @s minecraft:max_health modifier add minecraft:04f2b196-ca85-4ac8-b8e0-a7d569b415c8 -16 add_value\nexecute if score $remove_health gm4_ml_data matches 16.. run scoreboard players remove $remove_health gm4_ml_data 16\nexecute if score $remove_health gm4_ml_data matches 8.. run attribute @s minecraft:max_health modifier add minecraft:1f624b8a-89a4-4951-b4ce-f21890adbf89 -8 add_value\nexecute if score $remove_health gm4_ml_data matches 8.. run scoreboard players remove $remove_health gm4_ml_data 8\nexecute if score $remove_health gm4_ml_data matches 4.. run attribute @s minecraft:max_health modifier add minecraft:52b90103-a8c1-40a1-b2dd-9e7feb978b52 -4 add_value\nexecute if score $remove_health gm4_ml_data matches 4.. run scoreboard players remove $remove_health gm4_ml_data 4\nexecute if score $remove_health gm4_ml_data matches 2.. run attribute @s minecraft:max_health modifier add minecraft:c875bec0-f7e4-4479-a030-dc92eb39d29a -2 add_value\nexecute if score $remove_health gm4_ml_data matches 2.. run scoreboard players remove $remove_health gm4_ml_data 2\nexecute if score $remove_health gm4_ml_data matches 1.. run attribute @s minecraft:max_health modifier add minecraft:41b9fe4f-ce8e-4025-8215-d47f9321b853 -1 add_value\nexecute if score $remove_health gm4_ml_data matches 1.. run scoreboard players remove $remove_health gm4_ml_data 1\n\n# heal player\nattribute @s minecraft:max_health modifier add minecraft:f32329fb-6205-4eda-9db8-9f9ccc85605f 3 add_value\neffect give @s minecraft:instant_health 1 0 true\n\n# revert max health\ntag @s add gm4_vs_healed\nscoreboard players reset $remove_health gm4_ml_data\n\n# visuals\nexecute anchored eyes run particle minecraft:heart ^ ^-.2 ^.7 .2 .1 .2 1 3 normal\nplaysound minecraft:block.brewing_stand.brew player @s ~ ~ ~ 0.3 0.8\n\n# debuff\neffect give @s minecraft:mining_fatigue 3 5 true\nexecute store success score $in_mainhand gm4_ml_data if predicate gm4_vigere_shamir:vigere_in_mainhand run item modify entity @s weapon.mainhand gm4_vigere_shamir:use_durability_mainhand\nexecute unless score $in_mainhand gm4_ml_data matches 1.. run item modify entity @s weapon.offhand gm4_vigere_shamir:use_durability_offhand\nscoreboard players reset $in_mainhand gm4_ml_data\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_vigere_use minecraft.used:minecraft.shield\nscoreboard objectives add gm4_health health\n\nexecute unless score vigere_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Vigere Shamir\"}\nexecute unless score vigere_shamir gm4_earliest_version < vigere_shamir gm4_modules run scoreboard players operation vigere_shamir gm4_earliest_version = vigere_shamir gm4_modules\nscoreboard players set vigere_shamir gm4_modules 1\n\nschedule function gm4_vigere_shamir:main 1t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/function/main.mcfunction",
    "content": "execute as @a[gamemode=!spectator] if score @s gm4_vigere_use matches 1.. at @s[predicate=gm4_vigere_shamir:vigere_active] run function gm4_vigere_shamir:heal\nscoreboard players reset @a gm4_vigere_use\n\nschedule function gm4_vigere_shamir:check_heal 1t\nschedule function gm4_vigere_shamir:main 16t\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/function/revert_health.mcfunction",
    "content": "# @s = player that health from Vigere\n# run from check_heal\n\n# revert max health\nattribute @s minecraft:max_health modifier remove minecraft:e0c18b32-4caf-4193-8899-74ad1cc0dba2\nattribute @s minecraft:max_health modifier remove minecraft:f7676355-5de1-4167-9c01-2a274b5ee6bc\nattribute @s minecraft:max_health modifier remove minecraft:2df88b31-a47f-4c31-a5b8-aa51ed1c35bb\nattribute @s minecraft:max_health modifier remove minecraft:41fd129e-322f-4147-b2fa-8185206f5b8e\nattribute @s minecraft:max_health modifier remove minecraft:1afb3106-b947-46ca-942a-cad1a78f5df7\nattribute @s minecraft:max_health modifier remove minecraft:04f2b196-ca85-4ac8-b8e0-a7d569b415c8\nattribute @s minecraft:max_health modifier remove minecraft:1f624b8a-89a4-4951-b4ce-f21890adbf89\nattribute @s minecraft:max_health modifier remove minecraft:52b90103-a8c1-40a1-b2dd-9e7feb978b52\nattribute @s minecraft:max_health modifier remove minecraft:c875bec0-f7e4-4479-a030-dc92eb39d29a\nattribute @s minecraft:max_health modifier remove minecraft:41b9fe4f-ce8e-4025-8215-d47f9321b853\n\nattribute @s minecraft:max_health modifier remove minecraft:f32329fb-6205-4eda-9db8-9f9ccc85605f\n\ntag @s remove gm4_vs_healed\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/aluminium via #gm4_metallurgy:summon_band/aluminium\n\nloot spawn ~ ~ ~ loot gm4_vigere_shamir:band\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/guidebook/vigere_shamir.json",
    "content": "{\n  \"id\": \"vigere_shamir\",\n  \"name\": \"Vigere Shamir\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"metallurgy\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_vigere_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'vigere'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_vigere_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'vigere'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.vigere_shamir.description\",\n            \"fallback\": \"Vigere alters shields to heal the user upon blocking an attack.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_vigere_shamir\",\n          \"obtain_vigere_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.vigere_shamir.usage\",\n            \"fallback\": \"The Vigere Shamir is found on Barimium Bands. It can be placed onto shields.\\n\\nBlocking an attack will heal the user 1.5 hearts and apply Mining Fatigue VI for 3 seconds.\\nHealing damages the shield more.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/item_modifier/use_durability_mainhand.json",
    "content": "[\n    {\n        \"function\": \"minecraft:set_damage\",\n        \"damage\": {\n            \"type\": \"minecraft:uniform\",\n            \"min\": -0.003,\n            \"max\": -0.024\n        },\n        \"add\": true,\n        \"conditions\": [\n            {\n                \"condition\": \"minecraft:inverted\",\n                \"term\": {\n                    \"condition\": \"minecraft:entity_properties\",\n                    \"entity\": \"this\",\n                    \"predicate\": {\n                        \"equipment\": {\n                            \"mainhand\": {\n                                \"items\": [\n                                    \"minecraft:shield\"\n                                ],\n                                \"predicates\": {\n                                    \"minecraft:enchantments\": [\n                                        {\n                                            \"enchantments\": \"minecraft:unbreaking\",\n                                            \"levels\": {\n                                                \"min\": 1,\n                                                \"max\": 255\n                                            }\n                                        }\n                                    ]\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"function\": \"minecraft:set_damage\",\n        \"damage\": {\n            \"type\": \"minecraft:uniform\",\n            \"min\": -0.003,\n            \"max\": -0.024\n        },\n        \"add\": true,\n        \"conditions\": [\n            {\n                \"condition\": \"minecraft:random_chance\",\n                \"chance\": 0.5\n            },\n            {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                    \"equipment\": {\n                        \"mainhand\": {\n                            \"items\": [\n                                \"minecraft:shield\"\n                            ],\n                            \"predicates\": {\n                                \"minecraft:enchantments\": [\n                                  {\n                                      \"enchantments\": \"minecraft:unbreaking\",\n                                      \"levels\": 1\n                                  }\n                              ]\n                            }\n                        }\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"function\": \"minecraft:set_damage\",\n        \"damage\": {\n            \"type\": \"minecraft:uniform\",\n            \"min\": -0.003,\n            \"max\": -0.024\n        },\n        \"add\": true,\n        \"conditions\": [\n            {\n                \"condition\": \"minecraft:random_chance\",\n                \"chance\": 0.33\n            },\n            {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                    \"equipment\": {\n                        \"mainhand\": {\n                            \"items\": [\n                                \"minecraft:shield\"\n                            ],\n                            \"predicates\": {\n                                \"minecraft:enchantments\": [\n                                  {\n                                      \"enchantments\": \"minecraft:unbreaking\",\n                                      \"levels\": 2\n                                  }\n                              ]\n                            }\n                        }\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"function\": \"minecraft:set_damage\",\n        \"damage\": {\n            \"type\": \"minecraft:uniform\",\n            \"min\": -0.003,\n            \"max\": -0.024\n        },\n        \"add\": true,\n        \"conditions\": [\n            {\n                \"condition\": \"minecraft:random_chance\",\n                \"chance\": 0.25\n            },\n            {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                    \"equipment\": {\n                        \"mainhand\": {\n                            \"items\": [\n                                \"minecraft:shield\"\n                            ],\n                            \"predicates\": {\n                                \"minecraft:enchantments\": [\n                                    {\n                                        \"enchantments\": \"minecraft:unbreaking\",\n                                        \"levels\": {\n                                            \"min\": 3,\n                                            \"max\": 255\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/item_modifier/use_durability_offhand.json",
    "content": "[\n    {\n        \"function\": \"minecraft:set_damage\",\n        \"damage\": {\n            \"type\": \"minecraft:uniform\",\n            \"min\": -0.003,\n            \"max\": -0.024\n        },\n        \"add\": true,\n        \"conditions\": [\n            {\n                \"condition\": \"minecraft:inverted\",\n                \"term\": {\n                    \"condition\": \"minecraft:entity_properties\",\n                    \"entity\": \"this\",\n                    \"predicate\": {\n                        \"equipment\": {\n                            \"offhand\": {\n                                \"items\": [\n                                    \"minecraft:shield\"\n                                ],\n                                \"predicates\": {\n                                    \"minecraft:enchantments\": [\n                                        {\n                                            \"enchantments\": \"minecraft:unbreaking\",\n                                            \"levels\": {\n                                                \"min\": 1,\n                                                \"max\": 255\n                                            }\n                                        }\n                                    ]\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"function\": \"minecraft:set_damage\",\n        \"damage\": {\n            \"type\": \"minecraft:uniform\",\n            \"min\": -0.003,\n            \"max\": -0.024\n        },\n        \"add\": true,\n        \"conditions\": [\n            {\n                \"condition\": \"minecraft:random_chance\",\n                \"chance\": 0.5\n            },\n            {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                    \"equipment\": {\n                        \"offhand\": {\n                            \"items\": [\n                                \"minecraft:shield\"\n                            ],\n                            \"predicates\": {\n                                \"minecraft:enchantments\": [\n                                  {\n                                      \"enchantments\": \"minecraft:unbreaking\",\n                                      \"levels\": 1\n                                  }\n                              ]\n                            }\n                        }\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"function\": \"minecraft:set_damage\",\n        \"damage\": {\n            \"type\": \"minecraft:uniform\",\n            \"min\": -0.003,\n            \"max\": -0.024\n        },\n        \"add\": true,\n        \"conditions\": [\n            {\n                \"condition\": \"minecraft:random_chance\",\n                \"chance\": 0.33\n            },\n            {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                    \"equipment\": {\n                        \"offhand\": {\n                            \"items\": [\n                                \"minecraft:shield\"\n                            ],\n                            \"predicates\": {\n                                \"minecraft:enchantments\": [\n                                  {\n                                      \"enchantments\": \"minecraft:unbreaking\",\n                                      \"levels\": 2\n                                  }\n                              ]\n                            }\n                        }\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"function\": \"minecraft:set_damage\",\n        \"damage\": {\n            \"type\": \"minecraft:uniform\",\n            \"min\": -0.003,\n            \"max\": -0.024\n        },\n        \"add\": true,\n        \"conditions\": [\n            {\n                \"condition\": \"minecraft:random_chance\",\n                \"chance\": 0.25\n            },\n            {\n                \"condition\": \"minecraft:entity_properties\",\n                \"entity\": \"this\",\n                \"predicate\": {\n                    \"equipment\": {\n                        \"offhand\": {\n                            \"items\": [\n                                \"minecraft:shield\"\n                            ],\n                            \"predicates\": {\n                                \"minecraft:enchantments\": [\n                                    {\n                                        \"enchantments\": \"minecraft:unbreaking\",\n                                        \"levels\": {\n                                            \"min\": 3,\n                                            \"max\": 255\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:barimium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_vigere_shamir:shamir/vigere\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'vigere'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.vigere\",\n                                    \"fallback\": \"Vigere Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/predicate/vigere_active.json",
    "content": "{\n  \"condition\": \"minecraft:any_of\",\n  \"terms\": [\n    {\n      \"condition\": \"minecraft:reference\",\n      \"name\": \"gm4_vigere_shamir:vigere_in_mainhand\"\n    },\n    {\n      \"condition\": \"minecraft:entity_properties\",\n      \"entity\": \"this\",\n      \"predicate\": {\n        \"equipment\": {\n          \"offhand\": {\n            \"items\": [\n              \"minecraft:shield\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'vigere'}}\"\n            }\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/predicate/vigere_in_mainhand.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"mainhand\": {\n                \"items\": [\n                    \"minecraft:shield\"\n                ],\n                \"predicates\": {\n                  \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'vigere'}}\"\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_vigere_shamir/data/gm4_vigere_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"minecraft:shield\"\n  ]\n}\n"
  },
  {
    "path": "gm4_vigere_shamir/translations.csv",
    "content": "key,en_us\nitem.gm4.shamir.vigere,Vigere Shamir\ntext.gm4.guidebook.module_desc.vigere_shamir,Adds the shamir 'Vigere' to Metallurgy. It heals you when you block with a shield.\ntext.gm4.guidebook.vigere_shamir.description,Vigere alters shields to heal the user upon blocking an attack.\ntext.gm4.guidebook.vigere_shamir.usage,The Vigere Shamir is found on Barimium Bands. It can be placed onto shields.\\n\\nBlocking an attack will heal the user 1.5 hearts and apply Mining Fatigue VI for 3 seconds.\\nHealing damages the shield more.\n"
  },
  {
    "path": "gm4_washing_tanks/README.md",
    "content": "# Washing Tanks<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nRemove dye from items in a Liquid Tank filled with Water!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Extends the features of the Gamemode 4 [Liquid Tanks]($dynamicLink:gm4_liquid_tanks) data pack\r\n- Remove the dye from any item by putting it in a Liquid Tank with Water\r\n- All other info on the item (name/lore) is retained\r\n"
  },
  {
    "path": "gm4_washing_tanks/beet.yaml",
    "content": "id: gm4_washing_tanks\nname: Washing Tanks\nversion: 1.6.X\n\ndata_pack:\n  load: .\n\nrequire:\n  - bolt\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        gm4_liquid_tanks: 3.1.0\n    website:\n      description: Die! Dye! Remove die from items in a Liquid Tank filled with Water, at the cost of ⅓ of a bucket.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: ipiZnkaE\n    wiki: https://wiki.gm4.co/wiki/Liquid_Tanks/Washing_Tanks\n    credits:\n      Creators:\n        - Bunnygamers\n        - Misode\n      Icon Design:\n        - BPR\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_liquid_tanks/tags/function/item_fill.json",
    "content": "{\n    \"values\":[\n      \"gm4_washing_tanks:item_fill\"\n    ]\n}\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/function/init.mcfunction",
    "content": "execute unless score washing_tanks gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Washing Tanks\"}\nexecute unless score washing_tanks gm4_earliest_version < washing_tanks gm4_modules run scoreboard players operation washing_tanks gm4_earliest_version = washing_tanks gm4_modules\nscoreboard players set washing_tanks gm4_modules 1\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/function/item_fill.mcfunction",
    "content": "#@s = liquid tank with item in first slot\n#run from liquid_tanks:item_process\n\nexecute if entity @s[tag=gm4_lt_water] run function gm4_washing_tanks:wash\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/function/wash.mcfunction",
    "content": "#@s = water tank liquid_tank_stand with item in first slot\n#run from item_fill\n\nconversions = {\n    \"glass\": \"glass\",\n    \"glass_pane\": \"glass_pane\",\n    \"terracotta\": \"terracotta\",\n    \"wool\": \"white_wool\",\n    \"bed\": \"white_bed\",\n    \"carpet\": \"white_carpet\",\n    \"shulker_box\": \"shulker_box\",\n    \"harness\": \"white_harness\",\n    \"bundle\": \"bundle\",\n    \"candle\": \"candle\"\n}\n\nfor from_id, to_id in conversions.items():\n    execute if items block ~ ~ ~ container.0 f\"#gm4_washing_tanks:{from_id}\" run function f\"gm4_washing_tanks:washing_recipes/{from_id}\":\n        scoreboard players set $item_value gm4_lt_value -1\n        item replace entity 00344d47-0004-0004-0004-000f04ce104d weapon.mainhand from block ~ ~ ~ container.0\n        item modify entity 00344d47-0004-0004-0004-000f04ce104d weapon.mainhand {\"function\":\"minecraft:set_item\", \"item\":f\"minecraft:{to_id}\"}\n        function gm4_liquid_tanks:smart_item_fill\n        tag @s add gm4_lt_fill\n\nexecute if items block ~ ~ ~ container.0 #gm4_washing_tanks:armour[dyed_color] run function gm4_washing_tanks:washing_recipes/armour:\n        scoreboard players set $item_value gm4_lt_value -1\n        item replace entity 00344d47-0004-0004-0004-000f04ce104d weapon.mainhand from block ~ ~ ~ container.0\n        item modify entity 00344d47-0004-0004-0004-000f04ce104d weapon.mainhand {\"function\":\"minecraft:set_components\", \"components\":{\"!minecraft:dyed_color\":{}}}\n        function gm4_liquid_tanks:smart_item_fill\n        tag @s add gm4_lt_fill\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/guidebook/washing_tanks.json",
    "content": "{\n  \"id\": \"washing_tanks\",\n  \"name\": \"Washing Tanks\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"liquid_tanks\",\n  \"icon\": {\n    \"id\": \"minecraft:leather_leggings\"\n  },\n  \"criteria\": {\n    \"obtain_liquid_tank\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_machines:{id:\\\"liquid_tank\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_water_bucket\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:water_bucket\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_liquid_tank\"\n        ],\n        [\n          \"obtain_water_bucket\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.washing_tanks.usage\",\n            \"fallback\": \"Water tanks can wash dyed items placed inside the tank.\\n\\nTerracotta, beds, wool, carpet, glass, glass panes, leather armour, and shulker boxes can be undyed.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/tags/item/armour.json",
    "content": "{\n  \"values\": [\n    \"minecraft:leather_boots\",\n    \"minecraft:leather_leggings\",\n    \"minecraft:leather_chestplate\",\n    \"minecraft:leather_helmet\",\n    \"minecraft:leather_horse_armor\",\n    \"minecraft:wolf_armor\"\n  ]\n}\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/tags/item/bed.json",
    "content": "{\n  \"values\": [\n    \"minecraft:orange_bed\",\n    \"minecraft:magenta_bed\",\n    \"minecraft:light_blue_bed\",\n    \"minecraft:yellow_bed\",\n    \"minecraft:lime_bed\",\n    \"minecraft:pink_bed\",\n    \"minecraft:gray_bed\",\n    \"minecraft:light_gray_bed\",\n    \"minecraft:cyan_bed\",\n    \"minecraft:purple_bed\",\n    \"minecraft:blue_bed\",\n    \"minecraft:brown_bed\",\n    \"minecraft:green_bed\",\n    \"minecraft:red_bed\",\n    \"minecraft:black_bed\"\n  ]\n}\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/tags/item/bundle.json",
    "content": "{\n    \"values\": [\n        \"minecraft:black_bundle\",\n        \"minecraft:blue_bundle\",\n        \"minecraft:brown_bundle\",\n        \"minecraft:cyan_bundle\",\n        \"minecraft:gray_bundle\",\n        \"minecraft:green_bundle\",\n        \"minecraft:light_blue_bundle\",\n        \"minecraft:light_gray_bundle\",\n        \"minecraft:lime_bundle\",\n        \"minecraft:magenta_bundle\",\n        \"minecraft:orange_bundle\",\n        \"minecraft:pink_bundle\",\n        \"minecraft:purple_bundle\",\n        \"minecraft:red_bundle\",\n        \"minecraft:yellow_bundle\",\n        \"minecraft:white_bundle\"\n    ]\n}\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/tags/item/candle.json",
    "content": "{\n    \"values\": [\n        \"minecraft:white_candle\",\n        \"minecraft:orange_candle\",\n        \"minecraft:magenta_candle\",\n        \"minecraft:light_blue_candle\",\n        \"minecraft:yellow_candle\",\n        \"minecraft:lime_candle\",\n        \"minecraft:pink_candle\",\n        \"minecraft:gray_candle\",\n        \"minecraft:light_gray_candle\",\n        \"minecraft:cyan_candle\",\n        \"minecraft:purple_candle\",\n        \"minecraft:blue_candle\",\n        \"minecraft:brown_candle\",\n        \"minecraft:green_candle\",\n        \"minecraft:red_candle\",\n        \"minecraft:black_candle\"\n    ]\n}\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/tags/item/carpet.json",
    "content": "{\n  \"values\": [\n    \"minecraft:orange_carpet\",\n    \"minecraft:magenta_carpet\",\n    \"minecraft:light_blue_carpet\",\n    \"minecraft:yellow_carpet\",\n    \"minecraft:lime_carpet\",\n    \"minecraft:pink_carpet\",\n    \"minecraft:gray_carpet\",\n    \"minecraft:light_gray_carpet\",\n    \"minecraft:cyan_carpet\",\n    \"minecraft:purple_carpet\",\n    \"minecraft:blue_carpet\",\n    \"minecraft:brown_carpet\",\n    \"minecraft:green_carpet\",\n    \"minecraft:red_carpet\",\n    \"minecraft:black_carpet\"\n  ]\n}\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/tags/item/glass.json",
    "content": "{\n  \"values\": [\n    \"minecraft:white_stained_glass\",\n    \"minecraft:orange_stained_glass\",\n    \"minecraft:magenta_stained_glass\",\n    \"minecraft:light_blue_stained_glass\",\n    \"minecraft:yellow_stained_glass\",\n    \"minecraft:lime_stained_glass\",\n    \"minecraft:pink_stained_glass\",\n    \"minecraft:gray_stained_glass\",\n    \"minecraft:light_gray_stained_glass\",\n    \"minecraft:cyan_stained_glass\",\n    \"minecraft:purple_stained_glass\",\n    \"minecraft:blue_stained_glass\",\n    \"minecraft:brown_stained_glass\",\n    \"minecraft:green_stained_glass\",\n    \"minecraft:red_stained_glass\",\n    \"minecraft:black_stained_glass\"\n  ]\n}\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/tags/item/glass_pane.json",
    "content": "{\n  \"values\": [\n    \"minecraft:white_stained_glass_pane\",\n    \"minecraft:orange_stained_glass_pane\",\n    \"minecraft:magenta_stained_glass_pane\",\n    \"minecraft:light_blue_stained_glass_pane\",\n    \"minecraft:yellow_stained_glass_pane\",\n    \"minecraft:lime_stained_glass_pane\",\n    \"minecraft:pink_stained_glass_pane\",\n    \"minecraft:gray_stained_glass_pane\",\n    \"minecraft:light_gray_stained_glass_pane\",\n    \"minecraft:cyan_stained_glass_pane\",\n    \"minecraft:purple_stained_glass_pane\",\n    \"minecraft:blue_stained_glass_pane\",\n    \"minecraft:brown_stained_glass_pane\",\n    \"minecraft:green_stained_glass_pane\",\n    \"minecraft:red_stained_glass_pane\",\n    \"minecraft:black_stained_glass_pane\"\n  ]\n}\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/tags/item/harness.json",
    "content": "{\n  \"values\": [\n    \"minecraft:orange_harness\",\n    \"minecraft:magenta_harness\",\n    \"minecraft:light_blue_harness\",\n    \"minecraft:yellow_harness\",\n    \"minecraft:lime_harness\",\n    \"minecraft:pink_harness\",\n    \"minecraft:gray_harness\",\n    \"minecraft:light_gray_harness\",\n    \"minecraft:cyan_harness\",\n    \"minecraft:purple_harness\",\n    \"minecraft:blue_harness\",\n    \"minecraft:brown_harness\",\n    \"minecraft:green_harness\",\n    \"minecraft:red_harness\",\n    \"minecraft:black_harness\"\n  ]\n}\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/tags/item/shulker_box.json",
    "content": "{\n  \"values\": [\n    \"minecraft:white_shulker_box\",\n    \"minecraft:orange_shulker_box\",\n    \"minecraft:magenta_shulker_box\",\n    \"minecraft:light_blue_shulker_box\",\n    \"minecraft:yellow_shulker_box\",\n    \"minecraft:lime_shulker_box\",\n    \"minecraft:pink_shulker_box\",\n    \"minecraft:gray_shulker_box\",\n    \"minecraft:light_gray_shulker_box\",\n    \"minecraft:cyan_shulker_box\",\n    \"minecraft:purple_shulker_box\",\n    \"minecraft:blue_shulker_box\",\n    \"minecraft:brown_shulker_box\",\n    \"minecraft:green_shulker_box\",\n    \"minecraft:red_shulker_box\",\n    \"minecraft:black_shulker_box\"\n  ]\n}\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/tags/item/terracotta.json",
    "content": "{\n  \"values\": [\n    \"minecraft:white_terracotta\",\n    \"minecraft:orange_terracotta\",\n    \"minecraft:magenta_terracotta\",\n    \"minecraft:light_blue_terracotta\",\n    \"minecraft:yellow_terracotta\",\n    \"minecraft:lime_terracotta\",\n    \"minecraft:pink_terracotta\",\n    \"minecraft:gray_terracotta\",\n    \"minecraft:light_gray_terracotta\",\n    \"minecraft:cyan_terracotta\",\n    \"minecraft:purple_terracotta\",\n    \"minecraft:blue_terracotta\",\n    \"minecraft:brown_terracotta\",\n    \"minecraft:green_terracotta\",\n    \"minecraft:red_terracotta\",\n    \"minecraft:black_terracotta\"\n  ]\n}\n"
  },
  {
    "path": "gm4_washing_tanks/data/gm4_washing_tanks/tags/item/wool.json",
    "content": "{\n  \"values\": [\n    \"minecraft:orange_wool\",\n    \"minecraft:magenta_wool\",\n    \"minecraft:light_blue_wool\",\n    \"minecraft:yellow_wool\",\n    \"minecraft:lime_wool\",\n    \"minecraft:pink_wool\",\n    \"minecraft:gray_wool\",\n    \"minecraft:light_gray_wool\",\n    \"minecraft:cyan_wool\",\n    \"minecraft:purple_wool\",\n    \"minecraft:blue_wool\",\n    \"minecraft:brown_wool\",\n    \"minecraft:green_wool\",\n    \"minecraft:red_wool\",\n    \"minecraft:black_wool\"\n  ]\n}\n"
  },
  {
    "path": "gm4_washing_tanks/translations.csv",
    "content": "key,en_us\ntext.gm4.guidebook.module_desc.washing_tanks,\"Die! Dye! Remove die from items in a Liquid Tank filled with Water, at the cost of ⅓ of a bucket.\"\ntext.gm4.guidebook.washing_tanks.usage,\"Water tanks can wash dyed items placed inside the tank.\\n\\nTerracotta, beds, wool, carpet, glass, glass panes, leather armour, and shulker boxes can be undyed.\"\n"
  },
  {
    "path": "gm4_weighted_armour/README.md",
    "content": "# Weighted Armour<!--$headerTitle--><!--$pmc:delete-->\n\nA great way to add some variety to your UHC tournaments, or just some spice for everyday monster fighting. Weighted armour slows the player down depending on their armour points. Players now have the tactical choice between speed and protection. <!--$pmc:headerSize-->\n\n### Features\n- Slowness levels increase with armour points.\n- Full leather armour causes no slowness, while full diamond armour causes slowness III.\n- Players should consider what level of protection they need for different activities, and have a few different outfits to wear accordingly\n- When used together with [Metallurgy]($dynamicLink:gm4_metallurgy) data pack, the Helious shamir can be used to counteract the weight of armour.\n"
  },
  {
    "path": "gm4_weighted_armour/assets/translations.csv",
    "content": "key,en_us\nitem.gm4.shamir.helious,Helious Shamir\ntext.gm4.guidebook.module_desc.helious_shamir,\"Perfect for UHCs, this module forces you to balance protection with speed.\"\ntext.gm4.guidebook.helious_shamir.description,\"Helious hinders weighted armour, allowing users to wear more armour without slowing down.\"\ntext.gm4.guidebook.helious_shamir.usage,The Helious Shamir is found on Aluminium Bands. It can be placed onto armour.\\n\\nEach Helious piece will reduce weighted armour by one slowness level. Too little of weight will cause levitation and wither effects.\ntext.gm4.guidebook.module_desc.weighted_armour,\"Perfect for UHCs, this module forces you to balance protection with speed.\"\ntext.gm4.guidebook.weighted_armour.description,Users will be slowed down based on how much armour they have on.\ntext.gm4.guidebook.weighted_armour.weight,The weight is purely based on how much armor one has on. Slowness III is applied for full armor points.\ntext.gm4.guidebook.weighted_armour.weight_and_helious,The weight is purely based on how much armor one has on. Slowness III is applied for full armor points.\\n\\nThe Helious Shamir can help prevent armour slowness.\n"
  },
  {
    "path": "gm4_weighted_armour/beet.yaml",
    "content": "id: gm4_weighted_armour\nname: Weighted Armour\nversion: 1.9.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: ../gm4_metallurgy\n\npipeline:\n  - gm4_metallurgy.shamir_model_template\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    model_data:\n      - item: armor\n        reference: shamir/helious\n        template:\n          name: shamir\n          metal: aluminium\n          textures_path: gm4_metallurgy:item/shamir/aluminium\n    website:\n      description: Perfect for UHCs, this module forces you to balance protection with speed.\n      recommended: []\n      notes: []\n    modrinth:\n      project_id: ReZCIa6j\n    video: https://www.youtube.com/watch?v=rVRSXTGQPbg\n    wiki: https://wiki.gm4.co/wiki/Weighted_Armour\n    credits:\n      Creator:\n        - Sparks\n      Icon Design:\n        - Hozz\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_helious_shamir/function/apply_weight_effects.mcfunction",
    "content": "#@s = all players\n#run from weighted_armour:main via #gm4_weighted_armor:apply_weight_effects\n\neffect give @s[scores={gm4_armor_weight=..-1}] levitation 1 0\neffect give @s[scores={gm4_armor_weight=..-1}] wither 1 1\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_helious_shamir/function/check_item_validity.mcfunction",
    "content": "#@s = band is trying to apply to\n#run from #gm4_metallurgy:check_item_validity\n\nexecute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'helious'}}] if items entity @s contents #gm4_helious_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_helious_shamir/function/summon_band.mcfunction",
    "content": "# @s = a mould with matching metal inside\n#run from metallurgy:casting/summon_band/aluminium via #gm4_metallurgy:summon_band/aluminium\n\nloot spawn ~ ~ ~ loot gm4_helious_shamir:band\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_helious_shamir/function/weight_modifier.mcfunction",
    "content": "#@s = all players\n#run from weighted_armour:main via #gm4_weighted_armor:weight_modifiers\n\nscoreboard players remove @s[predicate=gm4_helious_shamir:helious_head] gm4_armor_weight 1\nscoreboard players remove @s[predicate=gm4_helious_shamir:helious_chest] gm4_armor_weight 1\nscoreboard players remove @s[predicate=gm4_helious_shamir:helious_legs] gm4_armor_weight 1\nscoreboard players remove @s[predicate=gm4_helious_shamir:helious_feet] gm4_armor_weight 1\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_helious_shamir/guidebook/helious_shamir.json",
    "content": "{\n  \"id\": \"helious_shamir\",\n  \"name\": \"Helious Shamir\",\n  \"module_type\": \"expansion\",\n  \"load_check\": \"weighted_armour\",\n  \"base_module\": \"metallurgy\",\n  \"wiki_link\": \"https://wiki.gm4.co/Metallurgy/Helious_Shamir\",\n  \"icon\": {\n    \"id\": \"minecraft:anvil\"\n  },\n  \"criteria\": {\n    \"obtain_helious_shamir\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,stored_shamir:'helious'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_helious_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_metallurgy:{has_shamir:1b,active_shamir:'helious'}}\"\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.helious_shamir.description\",\n            \"fallback\": \"Helious hinders weighted armour, allowing users to wear more armour without slowing down.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_helious_shamir\",\n          \"obtain_helious_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.helious_shamir.usage\",\n            \"fallback\": \"The Helious Shamir is found on Aluminium Bands. It can be placed onto armour.\\n\\nEach Helious piece will reduce weighted armour by one slowness level. Too little of weight will cause levitation and wither effects.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_helious_shamir/loot_table/band.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_metallurgy:aluminium_band\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_weighted_armour:shamir/helious\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_metallurgy:{stored_shamir:'helious'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"translate\": \"item.gm4.shamir.helious\",\n                                    \"fallback\": \"Helious Shamir\",\n                                    \"italic\": false,\n                                    \"color\": \"gray\"\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_helious_shamir/predicate/helious_chest.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"chest\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:'helious'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_helious_shamir/predicate/helious_feet.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"feet\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:'helious'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_helious_shamir/predicate/helious_head.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"head\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:'helious'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_helious_shamir/predicate/helious_legs.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"legs\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_metallurgy:{active_shamir:'helious'}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_helious_shamir/tags/item/valid_items.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:foot_armor\",\n    \"#minecraft:leg_armor\",\n    \"#minecraft:chest_armor\",\n    \"#minecraft:head_armor\"\n  ]\n}\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_metallurgy/tags/function/check_item_validity.json",
    "content": "{\n    \"values\": [\n      \"gm4_helious_shamir:check_item_validity\"\n    ]\n  }\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_metallurgy/tags/function/summon_band/aluminium.json",
    "content": "{\n    \"values\":[\n      \"gm4_helious_shamir:summon_band\"\n    ]\n  }\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_weighted_armour/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_armor armor\nscoreboard objectives add gm4_armor_weight dummy\n\nexecute unless score weighted_armour gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Weighted Armour\"}\nexecute unless score weighted_armour gm4_earliest_version < weighted_armour gm4_modules run scoreboard players operation weighted_armour gm4_earliest_version = weighted_armour gm4_modules\nscoreboard players set weighted_armour gm4_modules 1\n\nschedule function gm4_weighted_armour:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_weighted_armour/function/main.mcfunction",
    "content": "execute as @a run function gm4_weighted_armour:player\n\nschedule function gm4_weighted_armour:main 16t\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_weighted_armour/function/player.mcfunction",
    "content": "#@s = as @a\n#at world spawn\n\nscoreboard players set @s gm4_armor_weight 0\nscoreboard players set @s[scores={gm4_armor=8..15}] gm4_armor_weight 1\nscoreboard players set @s[scores={gm4_armor=16..19}] gm4_armor_weight 2\nscoreboard players set @s[scores={gm4_armor=20..}] gm4_armor_weight 3\n\n# allow other modules to modify weight\nfunction #gm4_weighted_armour:weight_modifiers\n\n# allow other modules to apply effects depending on weight\nfunction #gm4_weighted_armour:weight_effects\n\neffect give @s[scores={gm4_armor_weight=1}] slowness 2 0 true\neffect give @s[scores={gm4_armor_weight=2}] slowness 2 1 true\neffect give @s[scores={gm4_armor_weight=3}] slowness 2 2 true\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_weighted_armour/guidebook/weighted_armour.json",
    "content": "{\n  \"id\": \"weighted_armour\",\n  \"name\": \"Weighted Armour\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:iron_chestplate\"\n  },\n  \"criteria\": {\n    \"wear_armor\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": \"this\",\n              \"score\": \"gm4_armor\"\n            },\n            \"range\": {\n              \"min\": 8\n            }\n          }\n        ]\n      }\n    },\n    \"wear_heavy_armor\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:value_check\",\n            \"value\": {\n              \"type\": \"minecraft:score\",\n              \"target\": \"this\",\n              \"score\": \"gm4_armor\"\n            },\n            \"range\": {\n              \"min\": 16\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"wear_armor\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.weighted_armour.description\",\n            \"fallback\": \"Users will be slowed down based on how much armour they have on.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"weight\",\n      \"enable\": [\n        {\n          \"id\": \"gm4_metallurgy\",\n          \"load\": -1\n        }\n      ],\n      \"requirements\": [\n        [\n          \"wear_heavy_armor\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.weighted_armour.weight\",\n            \"fallback\": \"The weight is purely based on how much armor one has on. Slowness III is applied for full armor points.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"weight_and_helious\",\n      \"enable\": [\n        {\n          \"id\": \"gm4_metallurgy\",\n          \"load\": 1\n        }\n      ],\n      \"requirements\": [\n        [\n          \"wear_heavy_armor\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.weighted_armour.weight_and_helious\",\n            \"fallback\": \"The weight is purely based on how much armor one has on. Slowness III is applied for full armor points.\\n\\nThe Helious Shamir can help prevent armour slowness.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_weighted_armour/tags/function/weight_effects.json",
    "content": "{\n  \"values\":[\"gm4_helious_shamir:apply_weight_effects\"]\n}\n"
  },
  {
    "path": "gm4_weighted_armour/data/gm4_weighted_armour/tags/function/weight_modifiers.json",
    "content": "{\n  \"values\":[\"gm4_helious_shamir:weight_modifier\"]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/README.md",
    "content": "# Zauber Cauldrons<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nPowerful potions, Wormholes, portable Beacons and special armour that makes you stronger!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Adds the creation for higher tier Potions above a Brewing Stand\r\n- Allows the player to create teleportation Potions\r\n- Adds a set of permanent Potion crystals if the player has enough Luck\r\n- To balance the data pack, crafting powerful Potions can have... side effects\r\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/models/block/zauber_cauldron.json",
    "content": "{\n\t\"ambientocclusion\": false,\n\t\"textures\": {\n\t\t\"4\": \"gm4_zauber_cauldrons:block/cauldron_inside\",\n\t\t\"top\": \"gm4_zauber_cauldrons:block/cauldron_top\",\n\t\t\"bottom\": \"gm4_zauber_cauldrons:block/cauldron_bottom\",\n\t\t\"particle\": \"gm4_zauber_cauldrons:block/cauldron_side\",\n\t\t\"side\": \"gm4_zauber_cauldrons:block/cauldron_side\",\n\t\t\"inside\": \"gm4_zauber_cauldrons:block/cauldron_inner\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [2.1, 2.9, 2.1],\n\t\t\t\"to\": [13.9, 4.1, 13.9],\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#inside\"},\n\t\t\t\t\"down\": {\"uv\": [2.1, 2.1, 13.9, 13.9], \"texture\": \"#inside\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [-0.1, 2.9, 13.9],\n\t\t\t\"to\": [13.9, 16.1, 16.1],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 8, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [14, 0, 0, 13], \"texture\": \"#4\", \"cullface\": \"south\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 14, 13], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [14, 0, 16, 13], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"up\": {\"uv\": [0, 13.8, 14, 16], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 0, 14, 2], \"texture\": \"#inside\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [13.9, -0.1, 11.9],\n\t\t\t\"to\": [16.1, 2.9, 13.9],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 8, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 13, 2.2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"east\": {\"uv\": [2.2, 13, 4.2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"south\": {\"uv\": [0, 13, 2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [12, 13, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"down\": {\"uv\": [4.4, 13.8, 2.2, 16], \"rotation\": 270, \"texture\": \"#bottom\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [11.9, -0.1, 13.9],\n\t\t\t\"to\": [16.1, 2.9, 16.1],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 8, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [12, 13, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"east\": {\"uv\": [0, 13, 2.2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"south\": {\"uv\": [12.1, 13, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 13, 2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"down\": {\"uv\": [0, 13.8, 4.2, 16], \"rotation\": 180, \"texture\": \"#bottom\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [13.9, 2.9, 2.1],\n\t\t\t\"to\": [16.1, 16.1, 16.1],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 8, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"east\": {\"uv\": [0, 0, 14, 13], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"south\": {\"uv\": [14, 0, 16, 13], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [14, 0, 0, 13], \"texture\": \"#4\", \"cullface\": \"south\"},\n\t\t\t\t\"up\": {\"uv\": [0, 13.8, 14, 16], \"rotation\": 270, \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 0, 14, 2], \"rotation\": 90, \"texture\": \"#inside\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [11.9, -0.1, -0.1],\n\t\t\t\"to\": [13.9, 2.9, 2.1],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 8, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2.2, 13, 4.2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"east\": {\"uv\": [0, 13, 2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"south\": {\"uv\": [12, 13, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 13, 2.2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"down\": {\"uv\": [4.4, 13.8, 2.2, 16], \"texture\": \"#bottom\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [13.9, -0.1, -0.1],\n\t\t\t\"to\": [16.1, 2.9, 4.1],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 8, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 13, 2.2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"east\": {\"uv\": [12.1, 13, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"south\": {\"uv\": [0, 13, 2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [12, 13, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"down\": {\"uv\": [0, 13.8, 4.2, 16], \"rotation\": 270, \"texture\": \"#bottom\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2.1, 2.9, -0.1],\n\t\t\t\"to\": [16.1, 16.1, 2.1],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 8, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 14, 13], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"east\": {\"uv\": [14, 0, 16, 13], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"south\": {\"uv\": [14, 0, 0, 13], \"texture\": \"#4\", \"cullface\": \"south\"},\n\t\t\t\t\"up\": {\"uv\": [0, 13.8, 14, 16], \"rotation\": 180, \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 0, 14, 2], \"rotation\": 180, \"texture\": \"#inside\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [-0.1, -0.1, 2.1],\n\t\t\t\"to\": [2.1, 2.9, 4.1],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 8, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 13, 2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"east\": {\"uv\": [12, 13, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"south\": {\"uv\": [0, 13, 2.2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [2.2, 13, 4.2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"down\": {\"uv\": [4.4, 13.8, 2.2, 16], \"rotation\": 90, \"texture\": \"#bottom\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [-0.1, -0.1, -0.1],\n\t\t\t\"to\": [4.1, 2.9, 2.1],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 8, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [12.1, 13, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"east\": {\"uv\": [0, 13, 2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"south\": {\"uv\": [12, 13, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 13, 2.2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"down\": {\"uv\": [0, 13.8, 4.2, 16], \"texture\": \"#bottom\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [-0.1, 2.9, -0.1],\n\t\t\t\"to\": [2.1, 16.1, 13.9],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 8, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [14, 0, 16, 13], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"east\": {\"uv\": [14, 0, 0, 13], \"texture\": \"#4\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 14, 13], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"up\": {\"uv\": [0, 13.8, 14, 16], \"rotation\": 90, \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 0, 14, 2], \"rotation\": 270, \"texture\": \"#inside\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [-0.1, -0.1, 11.9],\n\t\t\t\"to\": [2.1, 2.9, 16.1],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 8, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 13, 2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"east\": {\"uv\": [12, 13, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"south\": {\"uv\": [0, 13, 2.2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [12.1, 13, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"down\": {\"uv\": [0, 13.8, 4.2, 16], \"rotation\": 90, \"texture\": \"#bottom\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2.1, -0.1, 13.9],\n\t\t\t\"to\": [4.1, 2.9, 16.1],\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 8, 8]},\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [12, 13, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"east\": {\"uv\": [0, 13, 2.2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"south\": {\"uv\": [2.2, 13, 4.2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 13, 2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"down\": {\"uv\": [4.4, 13.8, 2.2, 16], \"rotation\": 180, \"texture\": \"#bottom\"}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_armor_layer_1.properties",
    "content": "from=gm4_zauber_cauldrons:optifine/cit/zauber_armor_layer_1_anim.png\nto=gm4_zauber_cauldrons:optifine/cit/zauber_armor_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=30\ntile.1=0\nduration.1=2\ntile.2=1\nduration.2=2\ntile.3=2\nduration.3=2\ntile.4=3\nduration.4=2\ntile.5=4\nduration.5=2\ntile.6=5\nduration.6=2\ntile.7=6\nduration.7=2\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_armor_layer_2.properties",
    "content": "from=gm4_zauber_cauldrons:optifine/cit/zauber_armor_layer_2_anim.png\nto=gm4_zauber_cauldrons:optifine/cit/zauber_armor_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=30\ntile.1=0\nduration.1=2\ntile.2=1\nduration.2=2\ntile.3=2\nduration.3=2\ntile.4=3\nduration.4=2\ntile.5=4\nduration.5=2\ntile.6=5\nduration.6=2\ntile.7=6\nduration.7=2\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_attack_layer_1.properties",
    "content": "from=gm4_zauber_cauldrons:optifine/cit/zauber_attack_layer_1_anim.png\nto=gm4_zauber_cauldrons:optifine/cit/zauber_attack_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=30\ntile.1=0\nduration.1=2\ntile.2=1\nduration.2=2\ntile.3=2\nduration.3=2\ntile.4=3\nduration.4=2\ntile.5=4\nduration.5=2\ntile.6=5\nduration.6=2\ntile.7=6\nduration.7=2\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_attack_layer_2.properties",
    "content": "from=gm4_zauber_cauldrons:optifine/cit/zauber_attack_layer_2_anim.png\nto=gm4_zauber_cauldrons:optifine/cit/zauber_attack_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=30\ntile.1=0\nduration.1=2\ntile.2=1\nduration.2=2\ntile.3=2\nduration.3=2\ntile.4=3\nduration.4=2\ntile.5=4\nduration.5=2\ntile.6=5\nduration.6=2\ntile.7=6\nduration.7=2\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_health_layer_1.properties",
    "content": "from=gm4_zauber_cauldrons:optifine/cit/zauber_health_layer_1_anim.png\nto=gm4_zauber_cauldrons:optifine/cit/zauber_health_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=30\ntile.1=0\nduration.1=2\ntile.2=1\nduration.2=2\ntile.3=2\nduration.3=2\ntile.4=3\nduration.4=2\ntile.5=4\nduration.5=2\ntile.6=5\nduration.6=2\ntile.7=6\nduration.7=2\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_health_layer_2.properties",
    "content": "from=gm4_zauber_cauldrons:optifine/cit/zauber_health_layer_2_anim.png\nto=gm4_zauber_cauldrons:optifine/cit/zauber_health_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=30\ntile.1=0\nduration.1=2\ntile.2=1\nduration.2=2\ntile.3=2\nduration.3=2\ntile.4=3\nduration.4=2\ntile.5=4\nduration.5=2\ntile.6=5\nduration.6=2\ntile.7=6\nduration.7=2\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_speed_layer_1.properties",
    "content": "from=gm4_zauber_cauldrons:optifine/cit/zauber_speed_layer_1_anim.png\nto=gm4_zauber_cauldrons:optifine/cit/zauber_speed_layer_1.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=30\ntile.1=0\nduration.1=2\ntile.2=1\nduration.2=2\ntile.3=2\nduration.3=2\ntile.4=3\nduration.4=2\ntile.5=4\nduration.5=2\ntile.6=5\nduration.6=2\ntile.7=6\nduration.7=2\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_speed_layer_2.properties",
    "content": "from=gm4_zauber_cauldrons:optifine/cit/zauber_speed_layer_2_anim.png\nto=gm4_zauber_cauldrons:optifine/cit/zauber_speed_layer_2.png\nx=0\ny=0\nw=64\nh=32\ninterpolate=true\ntile.0=0\nduration.0=30\ntile.1=0\nduration.1=2\ntile.2=1\nduration.2=2\ntile.3=2\nduration.3=2\ntile.4=3\nduration.4=2\ntile.5=4\nduration.5=2\ntile.6=5\nduration.6=2\ntile.7=6\nduration.7=2\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_boots_armor.properties",
    "content": "type=armor\nmatchItems=golden_boots\ntexture.gold_layer_1=zauber_armor_layer_1\nnbt.CustomModelData=$item/zauber_armor/armor_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_boots_attack.properties",
    "content": "type=armor\nmatchItems=golden_boots\ntexture.gold_layer_1=zauber_attack_layer_1\nnbt.CustomModelData=$item/zauber_armor/attack_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_boots_health.properties",
    "content": "type=armor\nmatchItems=golden_boots\ntexture.gold_layer_1=zauber_health_layer_1\nnbt.CustomModelData=$item/zauber_armor/health_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_boots_speed.properties",
    "content": "type=armor\nmatchItems=golden_boots\ntexture.gold_layer_1=zauber_speed_layer_1\nnbt.CustomModelData=$item/zauber_armor/speed_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_chestplate_armor.properties",
    "content": "type=armor\nmatchItems=golden_chestplate\ntexture.gold_layer_1=zauber_armor_layer_1\nnbt.CustomModelData=$item/zauber_armor/armor_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_chestplate_attack.properties",
    "content": "type=armor\nmatchItems=golden_chestplate\ntexture.gold_layer_1=zauber_attack_layer_1\nnbt.CustomModelData=$item/zauber_armor/attack_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_chestplate_health.properties",
    "content": "type=armor\nmatchItems=golden_chestplate\ntexture.gold_layer_1=zauber_health_layer_1\nnbt.CustomModelData=$item/zauber_armor/health_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_chestplate_speed.properties",
    "content": "type=armor\nmatchItems=golden_chestplate\ntexture.gold_layer_1=zauber_speed_layer_1\nnbt.CustomModelData=$item/zauber_armor/speed_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_helmet_armor.properties",
    "content": "type=armor\nmatchItems=golden_helmet\ntexture.gold_layer_1=zauber_armor_layer_1\nnbt.CustomModelData=$item/zauber_armor/armor_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_helmet_attack.properties",
    "content": "type=armor\nmatchItems=golden_helmet\ntexture.gold_layer_1=zauber_attack_layer_1\nnbt.CustomModelData=$item/zauber_armor/attack_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_helmet_health.properties",
    "content": "type=armor\nmatchItems=golden_helmet\ntexture.gold_layer_1=zauber_health_layer_1\nnbt.CustomModelData=$item/zauber_armor/health_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_helmet_speed.properties",
    "content": "type=armor\nmatchItems=golden_helmet\ntexture.gold_layer_1=zauber_speed_layer_1\nnbt.CustomModelData=$item/zauber_armor/speed_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_leggings_armor.properties",
    "content": "type=armor\nmatchItems=golden_leggings\ntexture.gold_layer_2=zauber_armor_layer_2\nnbt.CustomModelData=$item/zauber_armor/armor_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_leggings_attack.properties",
    "content": "type=armor\nmatchItems=golden_leggings\ntexture.gold_layer_2=zauber_attack_layer_2\nnbt.CustomModelData=r$item/zauber_armor/attack_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_leggings_health.properties",
    "content": "type=armor\nmatchItems=golden_leggings\ntexture.gold_layer_2=zauber_health_layer_2\nnbt.CustomModelData=$item/zauber_armor/health_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_leggings_speed.properties",
    "content": "type=armor\nmatchItems=golden_leggings\ntexture.gold_layer_2=zauber_speed_layer_2\nnbt.CustomModelData=$item/zauber_armor/speed_boost\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/crystal.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 1,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 55 },\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/instant_damage.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 8,\n\t\t\"interpolate\": true\n\t}\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/instant_health.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 8,\n\t\t\"interpolate\": true\n\t}\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/jump_boost.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 8,\n\t\t\"interpolate\": true\n\t}\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/poison.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 8,\n\t\t\"interpolate\": true\n\t}\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/regeneration.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 8,\n\t\t\"interpolate\": true\n\t}\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/speed.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 8,\n\t\t\"interpolate\": true\n\t}\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/strength.png.mcmeta",
    "content": "{\n\t\"animation\": {\n\t\t\"frametime\": 8,\n\t\t\"interpolate\": true\n\t}\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/enchanted_prismarine_shard.png.mcmeta",
    "content": "{\n    \"animation\": {\n        \"frametime\": 20,\n        \"interpolate\": true\n\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/magic_in_a_bottle.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 12,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/wormhole_in_a_bottle.png.mcmeta",
    "content": "{\n    \"animation\": {\n        \"frametime\": 12,\n        \"interpolate\": true\n\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/wormhole_in_a_bottle_overlay.png.mcmeta",
    "content": "{\n    \"animation\": {\n        \"frametime\": 6,\n        \"interpolate\": true\n\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/armor_boost/boots.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/armor_boost/chestplate.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/armor_boost/helmet.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/armor_boost/leggings.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/attack_boost/boots.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/attack_boost/chestplate.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/attack_boost/helmet.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/attack_boost/leggings.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/health_boost/boots.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/health_boost/chestplate.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/health_boost/helmet.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/health_boost/leggings.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/speed_boost/boots.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/speed_boost/chestplate.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/speed_boost/helmet.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/speed_boost/leggings.png.mcmeta",
    "content": "{ \n\t\"animation\": {\n\t\t\"frametime\": 2,\n\t\t\"interpolate\": true,\n\t\t\"frames\": [\n\t\t{ \"index\": 0,\n\t\t\"time\": 19 },\n\t\t0,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6]\t\n\t} \n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/model_data.yaml",
    "content": "model_data:\n  - item: prismarine_shard\n    reference: item/enchanted_prismarine_shard\n    template: generated\n  - item: glass_bottle\n    reference: item/magic_in_a_bottle\n    template: generated\n  - item: potion\n    reference: item/wormhole_in_a_bottle\n    template: generated_overlay\n  - item: player_head\n    template: generated\n    broadcast:\n      - reference: item/crystal/instant_damage\n      - reference: item/crystal/instant_health\n      - reference: item/crystal/jump_boost\n      - reference: item/crystal/poison\n      - reference: item/crystal/regeneration\n      - reference: item/crystal/speed\n      - reference: item/crystal/strength\n  # potion solutions registered by generate.py\n  # armor registered by generate.py\n  # magicol liquid registered by generate.py\n  - item: [potion, splash_potion, lingering_potion]\n    template: vanilla\n    broadcast:\n      - reference: item/bottled_magicol/polar\n      - reference: item/bottled_magicol/temperate\n      - reference: item/bottled_magicol/arid\n  - item: [potion, splash_potion, lingering_potion]\n    template: vanilla\n    broadcast:\n      - reference: item/bottled_magicol_soulution/polar\n      - reference: item/bottled_magicol_soulution/temperate\n      - reference: item/bottled_magicol_soulution/arid\n  - item: structure_void\n    reference: block/zauber_cauldron\n    transforms:\n      - name: item_display\n        origin: [0.5,0.5,0.125]\n        scale: [1,1,1]\n        display: thirdperson_righthand\n  - item: cauldron\n    reference: gui/advancement/zauber_cauldrons_create\n    template: advancement\n  - item: chorus_fruit\n    reference: gui/advancement/zauber_cauldrons_wormhole\n    template:\n      name: advancement\n      forward: item/wormhole_in_a_bottle\n  - item: glass_bottle\n    reference: gui/advancement/zauber_cauldron_drink_multi_use_bottle\n    template: advancement\n  - item: golden_chestplate\n    reference: gui/advancement/zauber_cauldrons_full_armor\n    template:\n      name: advancement\n      forward: item/zauber_armor/attack_boost/chestplate\n  - item: rabbit_foot\n    reference: gui/advancement/zauber_cauldrons_rabbit\n    template: advancement\n  - item: potion\n    reference: gui/advancement/zauber_cauldrons_drink_all_magicol\n    template:\n      name: advancement\n      forward: item/bottled_magicol/temperate_potion\n  - item: clock\n    reference: gui/advancement/zauber_cauldrons_make_magicol\n    template: \n      name: advancement\n      forward: minecraft:clock_00\n  - item: grass_block\n    reference: gui/advancement/zauber_cauldrons_paint_biome\n    template: advancement\n"
  },
  {
    "path": "gm4_zauber_cauldrons/assets/translations.csv",
    "content": "key,en_us\nadvancement.gm4.zauber_cauldrons.creation.description,Create a Zauber Cauldron\nadvancement.gm4.zauber_cauldrons.creation.title,Potion Chef\nadvancement.gm4.zauber_cauldrons.drink_all_magicol.description,Drink all colors of Magicol\nadvancement.gm4.zauber_cauldrons.drink_all_magicol.title,Taste the Rainbow\nadvancement.gm4.zauber_cauldrons.drink_multi_use_bottle.description,Take the ninth sip out of a single bottle\nadvancement.gm4.zauber_cauldrons.drink_multi_use_bottle.title,Clean Plate Club\nadvancement.gm4.zauber_cauldrons.full_armour.description,Suit up with a full suit of Zauber Armor\nadvancement.gm4.zauber_cauldrons.full_armour.title,Underrated Materials\nadvancement.gm4.zauber_cauldrons.make_magicol.description,Wait for the right Moon phase to make some Magicol\nadvancement.gm4.zauber_cauldrons.make_magicol.title,Seeing Things in a New Light\nadvancement.gm4.zauber_cauldrons.paint_biome.description,Use Bottled Magicol to give a biome a new look\nadvancement.gm4.zauber_cauldrons.paint_biome.title,Spreading the Magic\nadvancement.gm4.zauber_cauldrons.rabbit.description,Where did my lunch go?\nadvancement.gm4.zauber_cauldrons.rabbit.title,Soup Kitchen Magician\nadvancement.gm4.zauber_cauldrons.wormhole.description,Just like the rabbits!\nadvancement.gm4.zauber_cauldrons.wormhole.title,Questionable Ingredients\nentity.gm4.possessed_item,Possessed Item\\u00A7\nentity.gm4.zauber_cauldrons.smog.instant_health,their own incompetence\nentity.gm4.zauber_cauldrons.smog.regeneration,the mess they made\nentity.gm4.zauber_cauldrons.smog.poison,the mess they made\nitem.gm4.enchanted_prismarine_shard,Enchanted Prismarine Shard\nitem.gm4.magic_in_a_bottle,Magic in a Bottle\nitem.gm4.wormhole_in_a_bottle,Wormhole in a Bottle\nitem.gm4.zauber_cauldrons.bottled_magicol.arid,Bottle of Arid Magicol\nitem.gm4.zauber_cauldrons.bottled_magicol.polar,Bottle of Polar Magicol\nitem.gm4.zauber_cauldrons.bottled_magicol.temperate,Bottle of Temperate Magicol\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.black,Black Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.blue,Blue Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.brown,Brown Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.cyan,Cyan Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.gray,Gray Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.green,Green Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.light_blue,Light Blue Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.light_gray,Light Gray Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.lime,Lime Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.magenta,Magenta Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.orange,Orange Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.pink,Pink Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.purple,Purple Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.red,Red Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.white,White Tint\nitem.gm4.zauber_cauldrons.bottled_magicol.tint.yellow,Yellow Tint\nitem.gm4.zauber_cauldrons.crystal.instant_damage,Crystal of Harming\nitem.gm4.zauber_cauldrons.crystal.instant_health,Crystal of Healing\nitem.gm4.zauber_cauldrons.crystal.jump_boost,Crystal of Leaping\nitem.gm4.zauber_cauldrons.crystal.poison,Crystal of Poison\nitem.gm4.zauber_cauldrons.crystal.regeneration,Crystal of Regeneration\nitem.gm4.zauber_cauldrons.crystal.speed,Crystal of Swiftness\nitem.gm4.zauber_cauldrons.crystal.strength,Crystal of Strength\nitem.gm4.zauber_cauldrons.multi_use_bottle.bottled_magicol.arid,Soulution of Arid Magicol\nitem.gm4.zauber_cauldrons.multi_use_bottle.bottled_magicol.polar,Soulution of Polar Magicol\nitem.gm4.zauber_cauldrons.multi_use_bottle.bottled_magicol.temperate,Soulution of Temperate Magicol\nitem.gm4.zauber_cauldrons.multi_use_bottle.lingering.harming,Lingering Soulution of Harming\nitem.gm4.zauber_cauldrons.multi_use_bottle.lingering.healing,Lingering Soulution of Healing\nitem.gm4.zauber_cauldrons.multi_use_bottle.lingering.leaping,Lingering Soulution of Leaping\nitem.gm4.zauber_cauldrons.multi_use_bottle.lingering.poison,Lingering Soulution of Poison\nitem.gm4.zauber_cauldrons.multi_use_bottle.lingering.regeneration,Lingering Soulution of Regeneration\nitem.gm4.zauber_cauldrons.multi_use_bottle.lingering.strength,Lingering Soulution of Strength\nitem.gm4.zauber_cauldrons.multi_use_bottle.lingering.swiftness,Lingering Soulution of Swiftness\nitem.gm4.zauber_cauldrons.multi_use_bottle.lore.sips,Sips\nitem.gm4.zauber_cauldrons.multi_use_bottle.lore.throws,Throws\nitem.gm4.zauber_cauldrons.multi_use_bottle.drinkable.harming,Soulution of Harming\nitem.gm4.zauber_cauldrons.multi_use_bottle.drinkable.healing,Soulution of Healing\nitem.gm4.zauber_cauldrons.multi_use_bottle.drinkable.leaping,Soulution of Leaping\nitem.gm4.zauber_cauldrons.multi_use_bottle.drinkable.poison,Soulution of Poison\nitem.gm4.zauber_cauldrons.multi_use_bottle.drinkable.regeneration,Soulution of Regeneration\nitem.gm4.zauber_cauldrons.multi_use_bottle.drinkable.strength,Soulution of Strength\nitem.gm4.zauber_cauldrons.multi_use_bottle.drinkable.swiftness,Soulution of Swiftness\nitem.gm4.zauber_cauldrons.multi_use_bottle.splash.harming,Splash Soulution of Harming\nitem.gm4.zauber_cauldrons.multi_use_bottle.splash.healing,Splash Soulution of Healing\nitem.gm4.zauber_cauldrons.multi_use_bottle.splash.leaping,Splash Soulution of Leaping\nitem.gm4.zauber_cauldrons.multi_use_bottle.splash.poison,Splash Soulution of Poison\nitem.gm4.zauber_cauldrons.multi_use_bottle.splash.regeneration,Splash Soulution of Regeneration\nitem.gm4.zauber_cauldrons.multi_use_bottle.splash.strength,Splash Soulution of Strength\nitem.gm4.zauber_cauldrons.multi_use_bottle.splash.swiftness,Splash Soulution of Swiftness\nitem.gm4.zauber_cauldrons.zauber_armor.boots,Zauber Boots\nitem.gm4.zauber_cauldrons.zauber_armor.chestplate,Zauber Chestplate\nitem.gm4.zauber_cauldrons.zauber_armor.helmet,Zauber Helmet\nitem.gm4.zauber_cauldrons.zauber_armor.leggings,Zauber Leggings\nitem.gm4.zauber_cauldrons.zauber_armor.magic,+%s%% Magic\ntext.gm4.guidebook.module_desc.zauber_cauldrons,\"Powerful potions, Wormholes, portable Beacons and special armour that makes you stronger! Zauber Cauldrons adds an entire magic branch to the game.\"\ntext.gm4.guidebook.zauber_cauldrons.description,\"Zauber Cauldrons expand the magic system, allowing the creation of stronger potions, magical armour, effect granting crystals, and bottled wormholes.\"\ntext.gm4.guidebook.zauber_cauldrons.section.creation,Creation\ntext.gm4.guidebook.zauber_cauldrons.creation,A Zauber Cauldron is created by holding an enchanted book while looking into a water-filled cauldron over fire.\\n\\nSoul fire and campfires work as well.\ntext.gm4.guidebook.zauber_cauldrons.recipes,\"Zauber recipes are performed by dropping items into the cauldron, consuming some water for each recipe.\\n\\nWhen looking at a Zauber Cauldron, items inside the cauldron won't be picked up.\"\ntext.gm4.guidebook.zauber_cauldrons.section.potions,Zauber Potions\ntext.gm4.guidebook.zauber_cauldrons.tier_4_potions,\"Powerful tier IV potions can be created by dropping a tier II potion, prismarine crystals, and golden apple into the cauldron.\\n\\nThere are some side effects when creating the tier IV potions.\"\ntext.gm4.guidebook.zauber_cauldrons.splash_and_lingering_potions,Splash and Lingering potions create an excess of heat and will explode if used in a tier IV potion recipe.\\n\\nUsing a snow powder cauldron will absorb the heat and successfully create a splash or lingering tier IV potion.\ntext.gm4.guidebook.zauber_cauldrons.soulutions,Using soul fire underneath the cauldron will cause all brewed potions to be brewed as a Soulution.\\n\\nSoulutions can be drank 9 times before emptying.\ntext.gm4.guidebook.zauber_cauldrons.splash_and_lingering_soulutions,\"Splash and Lingering soulutions can be created in the same way.\\n\\nWhen it lands, a splash or lingering soulution will summon a new soulution bottle at the location.\"\ntext.gm4.guidebook.zauber_cauldrons.section.enchanted_prismarine_shard,Advanced Reactants\ntext.gm4.guidebook.zauber_cauldrons.enchanted_prismarine_shard,An enchanted prismarine shard is used to upgrade armour and as a way to get Luck.\\n\\nThey can be created in a Zauber Cauldron or bought from a wandering trader.\ntext.gm4.guidebook.zauber_cauldrons.enchanted_prismarine_shard_creation,They can be created by dropping a prismarine shard in the cauldron while standing nearby with at least 30 experience levels.\\n\\nThis will consume 30 levels from the nearest applicable observer.\ntext.gm4.guidebook.zauber_cauldrons.section.armor,Zauber Armour\ntext.gm4.guidebook.zauber_cauldrons.armor,\"Zauber armour can be made with a piece of gold armour, an enchanted prismarine shard and a modifier item.\"\ntext.gm4.guidebook.zauber_cauldrons.armor_modifiers,The following items can be used as a modifier.\\n\\nGlistering Melon\\n  +6 health\\nBlaze Powder\\n  +35% Attack Damage\\nSugar\\n  +12% Speed\\nTurtle Helmet\\n  +1 Armour\\n\\nWearing a full set buffs the most prevalent modifier(s).\ntext.gm4.guidebook.zauber_cauldrons.armor_effects,\"Zauber armour has about a 55% increase in defense compared to normal gold armour.\\n\\nEach piece of Zauber Armour also has an Armour Toughness of 3, making it comparable to diamond armour.\"\ntext.gm4.guidebook.zauber_cauldrons.section.crystals,Zauber Crystals\ntext.gm4.guidebook.zauber_cauldrons.crystals,\"Zauber Crystals can be created with a sea lantern, nether star and tier IV potion.\\n\\nCrystals only function in the offhand of someone with the luck effect.\"\ntext.gm4.guidebook.zauber_cauldrons.section.luck,Luck\ntext.gm4.guidebook.zauber_cauldrons.lucky_flowers,Each world has a different set of 'lucky' and 'poisonous' flowers.\\n\\nEach of the twelve small flowers fall under one of those categories.\ntext.gm4.guidebook.zauber_cauldrons.luck_output,\"These flowers are used for the Luck recipe, which grants the nearest one with Luck until death.\\n\\nIf some of the lucky flowers are missing from the Luck recipe, then nothing will happen.\"\ntext.gm4.guidebook.zauber_cauldrons.luck_output_poison,\"However, if a poisonous flower is added to the recipe, the cauldron will emit a poisonous cloud.\"\ntext.gm4.guidebook.zauber_cauldrons.luck,\"Luck can be granted to the nearest user by throwing lucky flowers, an enchanted prismarine shard, and short grass into a zauber cauldron.\"\ntext.gm4.guidebook.zauber_cauldrons.section.extra_ingredients,Magic in a Bottle\ntext.gm4.guidebook.zauber_cauldrons.extra_ingredients,\"Any extra ingredients added to a Zauber recipe will leave the cauldron as Possessed Items, weaponless vexes.\"\ntext.gm4.guidebook.zauber_cauldrons.bottling_vexes,\"If a glass bottle is added to a recipe with extra ingredients, it can instead capture multiples of 3 Possessed Items.\\n\\nSo if 4 possessed items would normally spawn, 3 would be contained and 1 would be free.\"\ntext.gm4.guidebook.zauber_cauldrons.magic_in_a_bottle,\"If a Magic in a Bottle is left on the ground, the bottle will break and release the vexes.\\n\\nA Magic in a Bottle stores the location it was created which is useful in creating wormholes.\"\ntext.gm4.guidebook.zauber_cauldrons.bottled_vex_moon_phase,\"Each Magic in a Bottle has a preferred moon phase.\\n\\nDuring this moon phase, the bottle doesn't break as quickly and will sparkle to players wearing full zauber armor.\"\ntext.gm4.guidebook.zauber_cauldrons.section.magicol,Magicol\ntext.gm4.guidebook.zauber_cauldrons.magicol_description,\"Water inside a Cauldron can be converted into a liquid called Magicol.\\n\\nMagicol is useful for converting areas into colored, spawn-proof biomes.\"\ntext.gm4.guidebook.zauber_cauldrons.magicol_creation,\"Dropping Magic in a Bottle, an enchanted prismarine shard and a dye into a water-filled zauber cauldron will dye the liquid into magicol.\\n\\nThe level of the liquid is conserved through this process.\"\ntext.gm4.guidebook.zauber_cauldrons.magicol_bottling,\"Magicol can be bottled only during the preferred moon phase of the magic in a bottle used to create it.\"\ntext.gm4.guidebook.zauber_cauldrons.magicol_bottling_1,\"Magicol can be bottled by dropping a splash or lingering water bottle and one piece of prismarine crystals, along with either a slime ball, magma cream, or snowball.\"\ntext.gm4.guidebook.zauber_cauldrons.downfall,\"Magicol bottled with slime balls will be temperate with rain.\\n\\nWith magma cream they will be arid with no rain, and with snowballs they will be polar with snow.\"\ntext.gm4.guidebook.zauber_cauldrons.magicol_potion_types,\"Soulutions can be created as normal.\\n\\nLingering bottles of magicol will create permanent particles inside the biome.\\n\\nDrinkable bottles of magicol can be created, but have no effect.\"\ntext.gm4.guidebook.zauber_cauldrons.bottled_magicol_usage,Throwing a magicol bottle will cause the splashed area to turn into a new biome.\\n\\nThese biomes are colored according to the magicol liquid and do not spawn any mobs.\ntext.gm4.guidebook.zauber_cauldrons.magicol_biome_colors,\"When a new magicol biome is created, short grass and flowers will grow.\\n\\nLucky flowers are the only ones that grow when first splashing an area.\"\ntext.gm4.guidebook.zauber_cauldrons.section.wormholes,Wormholes\ntext.gm4.guidebook.zauber_cauldrons.wormhole_creation,\"Throwing an Enchanted Shard, Magic in a Bottle, and some quantity of both Chorus Fruit and Popped Chorus Fruit will create a Wormhole in a Bottle with the location of the Magic in a Bottle.\"\ntext.gm4.guidebook.zauber_cauldrons.wormhole_chorus_amounts,\"The precise amount of fruit is different for each world, and requires experiments with blurry wormholes and possessed items.\\n\\nToo few chorus will result in blurry wormholes, locating to a random nearby location.\"\ntext.gm4.guidebook.zauber_cauldrons.wormhole_chorus_amounts_1,\"If too many chorus or popped chorus are used, the excess fruit will transform into possessed items, but a precise wormhole will be created.\"\ntext.gm4.guidebook.zauber_cauldrons.wormhole_teleportation,\"Wormholes explode when the drinker reaches their destination, damaging surrounding blocks without harming the drinker.\\n\\nIf they end up in a cauldron, there no is explosion.\"\n"
  },
  {
    "path": "gm4_zauber_cauldrons/beet.yaml",
    "content": "id: gm4_zauber_cauldrons\nname: Zauber Cauldrons\nversion: 2.0.X\n\ndata_pack:\n  load: .\n\nresource_pack:\n  load: .\n  \nrequire:\n  - bolt\n\npipeline:\n  - gm4_zauber_cauldrons.generate\n  - gm4.plugins.extend.module\n  - gm4.plugins.include.lib_forceload\n  - gm4.plugins.include.lib_brewing\n  - gm4.plugins.include.lib_potion_tracking\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_forceload: 1.6.0\n        lib_brewing: 1.5.0\n        lib_potion_tracking: 1.4.0\n      schedule_loops:\n        - main\n        - cauldron/extra_items/process_bottled_vex_items\n    website:\n      description: Powerful potions, Wormholes, portable Beacons and special armour that makes you stronger! Zauber Cauldrons adds an entire magic branch to the game.\n      recommended:\n        - gm4_resource_pack\n        - gm4_zauber_liquids\n      notes: []\n    video: https://www.youtube.com/watch?v=Io1JTFUzyrc\n    wiki: https://wiki.gm4.co/wiki/Zauber_Cauldrons\n    credits:\n      Creator:\n        - Bloo\n      Updated by:\n        - Bloo\n        - Lue\n        - BPR\n        - Misode\n      Textures:\n        - Memo\n        - Kyrius\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_create.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"cauldron\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_create\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.zauber_cauldrons.creation.title\",\n      \"fallback\": \"Potion Chef\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.zauber_cauldrons.creation.description\",\n      \"fallback\": \"Create a Zauber Cauldron\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"create_zauber_cauldron\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_drink_all_magicol.json",
    "content": "{\n    \"display\": {\n        \"icon\": {\n            \"id\": \"minecraft:potion\",\n            \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_drink_all_magicol\"]}\n            }\n        },\n        \"title\": {\n            \"translate\": \"advancement.gm4.zauber_cauldrons.drink_all_magicol.title\",\n            \"fallback\": \"Taste the Rainbow\"\n        },\n        \"description\": {\n            \"translate\": \"advancement.gm4.zauber_cauldrons.drink_all_magicol.description\",\n            \"fallback\": \"Drink all colors of Magicol\",\n            \"color\": \"gray\"\n        },\n        \"frame\": \"challenge\",\n        \"hidden\": false\n    },\n    \"parent\": \"gm4:zauber_cauldrons_make_magicol\",\n    \"criteria\": {\n        \"white_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"white\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"light_gray_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"light_gray\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"gray_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"gray\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"black_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"black\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"brown_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"brown\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"red_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"red\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"orange_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"orange\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"yellow_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"yellow\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"lime_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"lime\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"green_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"green\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"cyan_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"cyan\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"light_blue_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"light_blue\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"blue_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"blue\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"purple_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"purple\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"magenta_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"magenta\\\"}}\"\n                    }\n                }\n            }\n        },\n        \"pink_magicol\": {\n            \"trigger\": \"minecraft:consume_item\",\n            \"conditions\": {\n                \"item\": {\n                    \"predicates\": {\n                      \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"pink\\\"}}\"\n                    }\n                }\n            }\n        }\n    },\n    \"requirements\": [\n        [\n            \"white_magicol\"\n        ],\n        [\n            \"light_gray_magicol\"\n        ],\n        [\n            \"gray_magicol\"\n        ],\n        [\n            \"black_magicol\"\n        ],\n        [\n            \"brown_magicol\"\n        ],\n        [\n            \"red_magicol\"\n        ],\n        [\n            \"orange_magicol\"\n        ],\n        [\n            \"yellow_magicol\"\n        ],\n        [\n            \"lime_magicol\"\n        ],\n        [\n            \"green_magicol\"\n        ],\n        [\n            \"cyan_magicol\"\n        ],\n        [\n            \"light_blue_magicol\"\n        ],\n        [\n            \"blue_magicol\"\n        ],\n        [\n            \"purple_magicol\"\n        ],\n        [\n            \"magenta_magicol\"\n        ],\n        [\n            \"pink_magicol\"\n        ]\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_drink_multi_use_bottle.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"glass_bottle\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:gui/advancement/zauber_cauldron_drink_multi_use_bottle\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.zauber_cauldrons.drink_multi_use_bottle.title\",\n      \"fallback\": \"Clean Plate Club\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.zauber_cauldrons.drink_multi_use_bottle.description\",\n      \"fallback\": \"Take the ninth sip out of a single bottle\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:zauber_cauldrons_create\",\n  \"criteria\": {\n    \"consume_multi_use_bottle\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{bottle:{multi_use:1b,sips:1}}}\"\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_full_armor.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:golden_chestplate\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_full_armor\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.zauber_cauldrons.full_armour.title\",\n      \"fallback\": \"Underrated Materials\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.zauber_cauldrons.full_armour.description\",\n      \"fallback\": \"Suit up with a full suit of Zauber Armor\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:zauber_cauldrons_create\",\n  \"criteria\": {\n    \"wear_full_zauber_armor\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:reference\",\n            \"name\": \"gm4_zauber_cauldrons:player/equipment/armor/full\"\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_make_magicol.json",
    "content": "{\n    \"display\": {\n        \"icon\": {\n            \"id\": \"clock\",\n            \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_make_magicol\"]}\n            }\n        },\n        \"title\": {\n            \"translate\": \"advancement.gm4.zauber_cauldrons.make_magicol.title\",\n            \"fallback\": \"Seeing Things in a New Light\"\n        },\n        \"description\": {\n            \"translate\": \"advancement.gm4.zauber_cauldrons.make_magicol.description\",\n            \"fallback\": \"Wait for the right Moon phase to make some Magicol\",\n            \"color\": \"gray\"\n        },\n        \"frame\": \"task\",\n        \"hidden\": false\n    },\n    \"parent\": \"gm4:zauber_cauldrons_full_armor\",\n    \"criteria\": {\n        \"make_magicol\": {\n            \"trigger\": \"minecraft:impossible\"\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_paint_biome.json",
    "content": "{\n    \"display\": {\n        \"icon\": {\n            \"id\": \"grass_block\",\n            \"components\": {\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_paint_biome\"]}\n            }\n        },\n        \"title\": {\n            \"translate\": \"advancement.gm4.zauber_cauldrons.paint_biome.title\",\n            \"fallback\": \"Spreading the Magic\"\n        },\n        \"description\": {\n            \"translate\": \"advancement.gm4.zauber_cauldrons.paint_biome.description\",\n            \"fallback\": \"Use Bottled Magicol to give a biome a new look\",\n            \"color\": \"gray\"\n        },\n        \"frame\": \"goal\",\n        \"hidden\": false\n    },\n    \"parent\": \"gm4:zauber_cauldrons_make_magicol\",\n    \"criteria\": {\n        \"paint_biome\": {\n            \"trigger\": \"minecraft:impossible\"\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_rabbit.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"rabbit_foot\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_rabbit\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.zauber_cauldrons.rabbit.title\",\n      \"fallback\": \"Soup Kitchen Magician\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.zauber_cauldrons.rabbit.description\",\n      \"fallback\": \"Where did my lunch go?\",\n      \"color\": \"gray\"\n    },\n    \"frame\": \"goal\",\n    \"hidden\": true\n  },\n  \"parent\": \"gm4:zauber_cauldrons_full_armor\",\n  \"criteria\": {\n    \"teleport_rabbit\": {\n      \"trigger\": \"minecraft:impossible\"\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_wormhole.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"chorus_fruit\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_wormhole\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.zauber_cauldrons.wormhole.title\",\n      \"fallback\": \"Questionable Ingredients\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.zauber_cauldrons.wormhole.description\",\n      \"fallback\": \"Just like the rabbits!\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:zauber_cauldrons_create\",\n  \"criteria\": {\n    \"use_wormhole_bottle\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"wormhole_bottle\\\"}}\"\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_brewing/tags/function/insert/lingering.json",
    "content": "{\n    \"values\": [\n        \"gm4_zauber_cauldrons:brewing_stand/lingering\"\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_brewing/tags/function/insert/splash.json",
    "content": "{\n    \"values\": [\n        \"gm4_zauber_cauldrons:brewing_stand/splash\"\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_potion_tracking/tags/function/potion_landed.json",
    "content": "{\n    \"values\": [\n        \"gm4_zauber_cauldrons:thrown_potion_tracking/verify_potion_nbt\"\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_potion_tracking/tags/function/tag_potion.json",
    "content": "{\n    \"values\": [\n        \"gm4_zauber_cauldrons:thrown_potion_tracking/tag_potion\"\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/cauldron/level_0.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:item_used_on_block\",\n            \"conditions\": {\n                \"location\": [\n                    {\n                        \"condition\": \"minecraft:location_check\",\n                        \"predicate\": {\n                            \"block\": {\n                                \"blocks\": [\n                                    \"minecraft:cauldron\"\n                                ]\n                            }\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_zauber_cauldrons:cauldron/liquid/update/level_0/find_cauldron\"\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/cauldron/level_1.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:item_used_on_block\",\n            \"conditions\": {\n                \"location\": [\n                    {\n                        \"condition\": \"minecraft:location_check\",\n                        \"predicate\": {\n                            \"block\": {\n                                \"blocks\": [\n                                    \"minecraft:water_cauldron\"\n                                ],\n                                \"state\": {\n                                    \"level\": \"1\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_zauber_cauldrons:cauldron/liquid/update/level_1/find_cauldron\"\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/cauldron/level_2.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:item_used_on_block\",\n            \"conditions\": {\n                \"location\": [\n                    {\n                        \"condition\": \"minecraft:location_check\",\n                        \"predicate\": {\n                            \"block\": {\n                                \"blocks\": [\n                                    \"minecraft:water_cauldron\"\n                                ],\n                                \"state\": {\n                                    \"level\": \"2\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_zauber_cauldrons:cauldron/liquid/update/level_2/find_cauldron\"\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/cauldron/level_3.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:item_used_on_block\",\n            \"conditions\": {\n                \"location\": [\n                    {\n                        \"condition\": \"minecraft:any_of\",\n                        \"terms\": [\n                            {\n                                \"condition\": \"minecraft:location_check\",\n                                \"predicate\": {\n                                    \"block\": {\n                                        \"blocks\": [\n                                            \"minecraft:water_cauldron\"\n                                        ],\n                                        \"state\": {\n                                            \"level\": \"3\"\n                                        }\n                                    }\n                                }\n                            },\n                            {\n                                \"condition\": \"minecraft:location_check\",\n                                \"predicate\": {\n                                    \"block\": {\n                                        \"blocks\": [\n                                            \"minecraft:lava_cauldron\",\n                                            \"minecraft:powder_snow\"\n                                        ]\n                                    }\n                                }\n                            }\n                        ]\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_zauber_cauldrons:cauldron/liquid/update/level_3/find_cauldron\"\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/equipment/has_full_armor.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:reference\",\n                        \"name\": \"gm4_zauber_cauldrons:player/equipment/armor/full\"\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_zauber_cauldrons:player/armor/apply_set_bonus\"\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/equipment/unequipped_armor.json",
    "content": "{\n    \"criteria\": {\n        \"requirement\": {\n            \"trigger\": \"minecraft:inventory_changed\",\n            \"conditions\": {\n                \"player\": [\n                    {\n                        \"condition\": \"minecraft:entity_properties\",\n                        \"entity\": \"this\",\n                        \"predicate\": {\n                            \"type_specific\": {\n                                \"type\": \"player\",\n                                \"advancements\": {\n                                    \"gm4_zauber_cauldrons:equipment/has_full_armor\": true\n                                }\n                            }\n                        }\n                    },\n                    {\n                        \"condition\": \"minecraft:inverted\",\n                        \"term\": {\n                            \"condition\": \"minecraft:reference\",\n                            \"name\": \"gm4_zauber_cauldrons:player/equipment/armor/full\"\n                        }\n                    }\n                ]\n            }\n        }\n    },\n    \"rewards\": {\n        \"function\": \"gm4_zauber_cauldrons:player/armor/revoke_set_bonus\"\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/join.json",
    "content": "{\n  \"criteria\": {\n    \"join_world\": {\n      \"trigger\": \"location\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_zauber_cauldrons:player/assign_id\"\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/use/multi_use_bottle.json",
    "content": "{\n  \"criteria\": {\n    \"use_multi_sip\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{bottle:{multi_use:1b}}}\"\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_zauber_cauldrons:player/multi_use_bottle/check_gamemode\"\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/use/wormhole.json",
    "content": "{\n  \"criteria\": {\n    \"consume_wormhole_bottle\": {\n      \"trigger\": \"minecraft:consume_item\",\n      \"conditions\": {\n        \"item\": {\n          \"predicates\": {\n            \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"wormhole_bottle\\\"}}\"\n          }\n        }\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_zauber_cauldrons:player/wormhole_targeting/prepare_teleport\"\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/bottled_magicol/age_painters.mcfunction",
    "content": "# Commands painters to paint at specific age values\n# @s = @e[type=marker,tag=gm4_zc_magicol_painter]\n# at @s\n# run from bottled_magicol/maintain_magicol_painters\n\n# time fillbiome\nscoreboard players add @s gm4_zc_magicol_painter_timer 1\nexecute if score @s gm4_zc_magicol_painter_timer matches 1 run playsound minecraft:entity.illusioner.prepare_mirror block @a[distance=..16] ~ ~ ~ 0.2 0.5 0.5\nexecute if score @s gm4_zc_magicol_painter_timer matches 6 run function gm4_zauber_cauldrons:bottled_magicol/prepare_fillbiome\nexecute if score @s gm4_zc_magicol_painter_timer matches 13 run function gm4_zauber_cauldrons:bottled_magicol/prepare_fillbiome\nexecute if score @s gm4_zc_magicol_painter_timer matches 20 run function gm4_zauber_cauldrons:bottled_magicol/prepare_fillbiome\nexecute if score @s gm4_zc_magicol_painter_timer matches 20 run kill @s\n\n# set flag\nexecute unless score @s gm4_zc_magicol_painter_timer matches 20.. run scoreboard players set $found_painter gm4_zc_data 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/bottled_magicol/fillbiome.mcfunction",
    "content": "# Fills the biome around a magicol painter\n# @s = @e[type=marker,tag=gm4_zc_magicol_painter]\n# at @s\n# run from bottled_magicol/prepare_fillbiome\n\n# change biome\n$fillbiome ~-$(radius) ~-$(radius) ~-$(radius) ~$(radius) ~$(radius) ~$(radius) $(biome)\n\n# place lucky (non-poisonous) flowers\n$execute if score $$(flower) gm4_zc_flowers matches 0 run place feature gm4_zauber_cauldrons:$(flower)_patch ~ ~ ~\n$execute if score $$(flower) gm4_zc_flowers matches 0 run effect give @a[gamemode=!spectator,distance=..5] minecraft:luck 90 0 true\n\n# place tall grass\nparticle minecraft:composter ~ ~ ~ 2 0.3 2 0 24\nplace feature gm4_zauber_cauldrons:short_grass_patch ~ ~ ~\n\n# sound effect & particles\nplaysound minecraft:block.chorus_flower.grow block @a[distance=..16] ~ ~ ~ 1 0.77\n$particle minecraft:end_rod ~$(random_x_1) ~$(random_y_1) ~$(random_z_1) 0.2 0.2 0.2 0.1 24\n$particle minecraft:end_rod ~$(random_x_2) ~$(random_y_2) ~$(random_z_2) 0.2 0.2 0.2 0.1 24\n\n# grant advancement\nadvancement grant @a[distance=..12,gamemode=!spectator] only gm4:zauber_cauldrons_paint_biome\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/bottled_magicol/maintain_magicol_painters.mcfunction",
    "content": "# Maintains magicol painters during their painting animation\n# @s = none\n# at world spawn\n# scheduled by bottled_magicol/<color>/<weather_modifier> functions when a magicol potion hits the ground\n\nexecute as @e[type=marker,tag=gm4_zc_magicol_painter] at @s run function gm4_zauber_cauldrons:bottled_magicol/age_painters\n\n# reschedule\nexecute if score $found_painter gm4_zc_data matches 1.. run schedule function gm4_zauber_cauldrons:bottled_magicol/maintain_magicol_painters 1t\nscoreboard players reset $found_painter gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/bottled_magicol/potion_landed.mcfunction",
    "content": "# Selects color of magicol thrown\n# @s = @e[type=marker,tag=gm4_potion_tracker]\n# at @s\n# run from zauber_cauldrons:soulution/thrown_potion_tracking/verify_potion_nbt\n\n# pull data of thrown potion into storage\ndata modify storage gm4_zauber_cauldrons:temp/item/bottled_magicol Item set from storage gm4_potion_tracking:temp entity_data.Item\n\n# select color\n# called functions are generated via beet from templates\n# generated with the help of bolt\nfor color_data in ctx.meta['magicol_colors']:\n    execute unless score $selected_color gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/item/bottled_magicol Item.components.\"minecraft:custom_data\".gm4_zauber_cauldrons{color:color_data['color']} run function f\"gm4_zauber_cauldrons:bottled_magicol/{color_data['color']}/select_weather_modifier\"\n\n# reset storage and fake players\ndata remove storage gm4_zauber_cauldrons:temp/item/bottled_magicol Item\nscoreboard players reset $selected_color gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/bottled_magicol/prepare_fillbiome.mcfunction",
    "content": "# Loads data from the marker to initiate the fillbiome command\n# @s = @e[type=marker,tag=gm4_zc_magicol_painter]\n# at @s\n# run from bottled_magicol/age_painters\n\n# load biome name into storage\ndata modify storage gm4_zauber_cauldrons:temp/bottled_magicol/painter biome set from entity @s data.gm4_zauber_cauldrons.biome\ndata modify storage gm4_zauber_cauldrons:temp/bottled_magicol/painter flower set from entity @s data.gm4_zauber_cauldrons.flower\nexecute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter radius int 0.25 run scoreboard players get @s gm4_zc_magicol_painter_timer\nexecute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter random_x_1 int 1 run random value -3..3 gm4_zauber_cauldrons:bottled_magicol/particle_coordinates\nexecute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter random_y_1 int 1 run random value 0..3 gm4_zauber_cauldrons:bottled_magicol/particle_coordinates\nexecute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter random_z_1 int 1 run random value -3..3 gm4_zauber_cauldrons:bottled_magicol/particle_coordinates\nexecute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter random_x_2 int 1 run random value -5..5 gm4_zauber_cauldrons:bottled_magicol/particle_coordinates\nexecute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter random_y_2 int 1 run random value 0..5 gm4_zauber_cauldrons:bottled_magicol/particle_coordinates\nexecute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter random_z_2 int 1 run random value -5..5 gm4_zauber_cauldrons:bottled_magicol/particle_coordinates\n\n\n# fillbiome\nfunction gm4_zauber_cauldrons:bottled_magicol/fillbiome with storage gm4_zauber_cauldrons:temp/bottled_magicol/painter\n\n# reset storage\ndata remove storage gm4_zauber_cauldrons:temp/bottled_magicol/painter biome\ndata remove storage gm4_zauber_cauldrons:temp/bottled_magicol/painter flower\ndata remove storage gm4_zauber_cauldrons:temp/bottled_magicol/painter radius\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/brewing_stand/lingering.mcfunction",
    "content": "# @s = brewing stand marker with a custom splash potion to be converted to a lingering potion\n# run from #gm4_brewing:insert/lingering\n\nexecute if data entity @s data.gm4_brewing.insert.components.\"minecraft:custom_data\".gm4_zauber_cauldrons{item:\"splash_potion\"} run scoreboard players set $insert gm4_brewing_data -1\nexecute if score $insert gm4_brewing_data matches -1 run summon tnt\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/brewing_stand/splash.mcfunction",
    "content": "# @s = brewing stand marker with a custom potion to be converted to a splash potion\n# run from #gm4_brewing:insert/splash\n\nexecute if data entity @s data.gm4_brewing.insert.components.\"minecraft:custom_data\".gm4_zauber_cauldrons{item:\"potion\"} run scoreboard players set $insert gm4_brewing_data -1\nexecute if score $insert gm4_brewing_data matches -1 run summon tnt\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/catch_possessed_items.mcfunction",
    "content": "# @s = zauber cauldron with overflow items and bottle(s) inside\n# run from prepare_bottle\n# at @s\n\n# read amount of excess items\nexecute store result storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons.vex_count int 1 run scoreboard players get @s gm4_zc_fullness\n\n# copy coordinates and dimension of cauldron to bottled vex item\ndata modify storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons.cauldron_pos set from storage gm4_zauber_cauldrons:temp/cauldron/ingredients location\n\n# calculate and store preferred moon phase\nexecute store result score $cauldron_x gm4_zc_data run data get storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons.cauldron_pos.x\nexecute store result score $cauldron_y gm4_zc_data run data get storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons.cauldron_pos.y\nexecute store result score $cauldron_z gm4_zc_data run data get storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons.cauldron_pos.z\nscoreboard players operation $cauldron_x gm4_zc_data /= #256 gm4_zc_moon_phase\nscoreboard players operation $cauldron_y gm4_zc_data /= #256 gm4_zc_moon_phase\nscoreboard players operation $cauldron_z gm4_zc_data /= #256 gm4_zc_moon_phase\nscoreboard players operation $cauldron_x gm4_zc_data += $cauldron_y gm4_zc_data\nscoreboard players operation $cauldron_x gm4_zc_data += $cauldron_z gm4_zc_data\nscoreboard players operation $cauldron_x gm4_zc_data += $magicol_offset gm4_zc_moon_phase\nscoreboard players operation $cauldron_x gm4_zc_data %= #8 gm4_zc_moon_phase\nexecute store result storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons.preferred_moon_phase int 1 run scoreboard players get $cauldron_x gm4_zc_data\n\n# spawn item\nloot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/bottled_vex\n\n# make items in cauldron pickup-able instantly\nexecute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s\n\n# reset storage\ndata remove storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons\n\n# reset fake players\nscoreboard players reset $cauldron_x gm4_zc_data\nscoreboard players reset $cauldron_y gm4_zc_data\nscoreboard players reset $cauldron_z gm4_zc_data\n\n# store success\nscoreboard players set $bottled_possessed_items gm4_zc_data 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/create_possessed_items.mcfunction",
    "content": "# @s = zauber cauldron with overflow items OR bottled_vex item on ground\n# run from use_extra_items AND release_from_bottle\n# at @s\n\n# summons 1 vex for every unused item entity in a cauldron or every vex in bottle (on recipe processing)\nsummon vex ~ ~ ~ {CustomName:{translate:\"entity.gm4.possessed_item\",fallback:\"Possessed Item§\"},CustomNameVisible:false,Team:\"gm4_hide_name\",life_ticks:320,attributes:[{id:\"minecraft:attack_damage\",base:2}],Health:4.0f,Motion:[0.0,0.25,0.0],active_effects:[{id:\"minecraft:resistance\",amplifier:10,duration:20,show_particles:false}]}\nscoreboard players remove @s gm4_zc_fullness 1\nexecute if score @s gm4_zc_fullness matches 1.. run function gm4_zauber_cauldrons:cauldron/extra_items/create_possessed_items\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/failed_catch_possessed_items.mcfunction",
    "content": "# @s = zauber cauldron with overflow items and bottle(s) inside\n# at align xyz\n# run from prepare_bottle\n\n# animation\nparticle minecraft:block{block_state:\"minecraft:glass\"} ~ ~.3 ~ 0.12 0.12 0.12 0 23\nplaysound minecraft:block.glass.break block @a[distance=..8] ~ ~ ~ 1 1.3\n\n# re-add one to fullness (shards of broken bottle)\nscoreboard players add @s gm4_zc_fullness 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/prepare_bottle.mcfunction",
    "content": "# @s = zauber cauldron with overflow items and bottle(s) inside\n# run from cauldron/structure/use_extra_items\n# at center of block\n\n# remove one from fullness (bottle to be bottled into)\nscoreboard players remove @s gm4_zc_fullness 1\n\n# copy fullness and take mod 3\nscoreboard players operation $mod_fullness gm4_zc_fullness = @s gm4_zc_fullness\nscoreboard players operation $mod_fullness gm4_zc_fullness %= #modulo gm4_zc_fullness\n\n# catch possessed items if modulo returns 0\nexecute if score $mod_fullness gm4_zc_fullness matches 0 run function gm4_zauber_cauldrons:cauldron/extra_items/catch_possessed_items\n\n# failed catch\nexecute if score $mod_fullness gm4_zc_fullness matches 1.. at @s run function gm4_zauber_cauldrons:cauldron/extra_items/failed_catch_possessed_items\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/process_bottled_vex_items.mcfunction",
    "content": "# @s = none\n# at world spawn\n# scheduled every 48t\n\n# get current moon phase\nexecute store result score $current gm4_zc_moon_phase run time query minecraft:moon\nscoreboard players operation $current gm4_zc_moon_phase /= #24000 gm4_zc_moon_phase\nscoreboard players operation $current gm4_zc_moon_phase %= #8 gm4_zc_moon_phase\n\n# release vexes from bottled vexes\nexecute as @e[type=item] if items entity @s contents *[custom_data~{gm4_zauber_cauldrons:{item:\"bottled_vex\"}}] at @s run function gm4_zauber_cauldrons:cauldron/extra_items/release_from_bottle/check_timer\n\n# reschedule\nschedule function gm4_zauber_cauldrons:cauldron/extra_items/process_bottled_vex_items 48t\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/release_from_bottle/check_timer.mcfunction",
    "content": "# @s = bottled vex item\n# run from cauldron/extra_items/process_bottled_vex_items\n# at @s\n\n# initialize newly thrown bottles\nexecute unless score @s gm4_zc_bottled_vex_escape_timer matches -2147483648..2147483647 run function gm4_zauber_cauldrons:cauldron/extra_items/release_from_bottle/initialize_bottle\n\n# decrease timer\nexecute if score @s gm4_zc_bottled_vex_escape_timer matches 0.. run function gm4_zauber_cauldrons:cauldron/extra_items/release_from_bottle/crack_bottle\n\n# break free (if the moon phase is right, the bottle survives an additional tick)\nexecute if score @s gm4_zc_bottled_vex_escape_timer matches 1 unless function gm4_zauber_cauldrons:cauldron/liquid/magicol/check_moon_phase run function gm4_zauber_cauldrons:cauldron/extra_items/release_from_bottle/release\nexecute if score @s gm4_zc_bottled_vex_escape_timer matches ..0 run function gm4_zauber_cauldrons:cauldron/extra_items/release_from_bottle/release\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/release_from_bottle/crack_bottle.mcfunction",
    "content": "# @s = bottled vex item\n# run from cauldron/extra_items/release_from_bottle/check_timer\n# at @s\n\n# decrease timer\nscoreboard players remove @s gm4_zc_bottled_vex_escape_timer 1\n\n# play sound and particles\nplaysound minecraft:block.glass.break block @a[distance=..8] ~ ~ ~ 0.1 1.9\nparticle minecraft:block{block_state:\"minecraft:glass\"} ~ ~ ~ 0.1 0.1 0.1 0 1\n\n# players wearing zauber armor can tell if its the right moon phase\nexecute if score @s gm4_zc_moon_phase = $current gm4_zc_moon_phase if function gm4_zauber_cauldrons:cauldron/liquid/magicol/check_moon_phase run particle minecraft:electric_spark ~ ~.2 ~ 0.15 0.15 0.15 0.01 3 normal @a[distance=..8,advancements={gm4_zauber_cauldrons:equipment/has_full_armor=true}]\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/release_from_bottle/initialize_bottle.mcfunction",
    "content": "# @s = bottled vex item\n# run from cauldron/extra_items/release_from_bottle/check_timer\n# at @s\n\n# set initial score\nscoreboard players set @s gm4_zc_bottled_vex_escape_timer 3\n\n# load data from item\ndata modify storage gm4_zauber_cauldrons:temp/cauldron/extra_items bottled_vex set from entity @s Item.components.\"minecraft:custom_data\".gm4_zauber_cauldrons\nexecute store result score @s gm4_zc_moon_phase run data get storage gm4_zauber_cauldrons:temp/cauldron/extra_items bottled_vex.preferred_moon_phase\nexecute store result score @s gm4_zc_fullness run data get storage gm4_zauber_cauldrons:temp/cauldron/extra_items bottled_vex.vex_count\n\n# reset storage\ndata remove storage gm4_zauber_cauldrons:temp/cauldron/extra_items bottled_vex\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/release_from_bottle/release.mcfunction",
    "content": "# @s = bottled vex item\n# run from cauldron/extra_items/release_from_bottle/prepare_release\n# at @s\n\n# release vex and kill bottled vex item\nfunction gm4_zauber_cauldrons:cauldron/extra_items/create_possessed_items\nplaysound minecraft:block.glass.break block @a[distance=..8] ~ ~ ~ 1 1.3\nparticle minecraft:block{block_state:\"minecraft:glass\"} ~ ~ ~ 0.12 0.12 0.12 0 16\nkill @s\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/magicol/check_liquid_id.mcfunction",
    "content": "# confirms the liquid id to be 'magicol' before displaying particles\n# @s = zauber cauldron with valid structure\n# at @s align xyz\n# run via function tag #gm4_zauber_cauldrons:cauldron/liquid/cauldron_particles from cauldron/structure/valid\n\n# check liquid id unless another expansion already displayed a particle\nexecute unless score $displayed_liquid_particle gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients liquid{id:\"magicol\"} run function gm4_zauber_cauldrons:cauldron/liquid/magicol/particles\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/magicol/check_moon_phase.mcfunction",
    "content": "# Checks the moon phase, time, and weather for the correct conditions for magicol bottling. Used to display sparkle particles and to bottle magicol.\n# @s = varies\n# at varies\n# run in if function conditions from gm4_zauber_cauldrons:cauldron/extra_items/release_from_bottle/check_timer, gm4_zauber_cauldrons:recipes/magicol/bottled/<...>/<...>/<...>, and gm4_zauber_cauldrons:cauldron/liquid/magicol/particles\n\n# require clear night and correct moon phase\nexecute unless predicate gm4_zauber_cauldrons:cauldron/clear_night run return fail\nexecute unless score $preferred gm4_zc_moon_phase = $current gm4_zc_moon_phase run return fail\nreturn 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/magicol/particles.mcfunction",
    "content": "# particles displayed over a cauldron when it is filled with magicol\n# @s = zauber cauldron with valid structure\n# at @s align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/magicol/check_liquid_id\n\n# display enchant particles for players with full zauber armor during the correct moon phase\nscoreboard players reset $preferred gm4_zc_moon_phase\nexecute store result score $preferred gm4_zc_moon_phase run data get storage gm4_zauber_cauldrons:temp/cauldron/ingredients liquid.magicol.moon_phase\nexecute if function gm4_zauber_cauldrons:cauldron/liquid/magicol/check_moon_phase run particle minecraft:electric_spark ~.5 ~.78 ~.5 0.25 0.25 0.25 0.01 6 normal @a[distance=..8,advancements={gm4_zauber_cauldrons:equipment/has_full_armor=true}]\n\n# make sure the cauldron is in loaded chunks to avoid entity buildup\nexecute unless loaded ~ ~ ~ run return -1\n\n# if liquid id is magicol, display particles\n# generated with the help of bolt\nfor color_data in ctx.meta['magicol_colors']:\n    # TODO 1.20.5: figure out how this particle looked in 1.20.4\n    execute unless score $displayed_magicol_particle gm4_zc_data matches 1.. store success score $displayed_magicol_particle gm4_zc_data if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients liquid{id:\"magicol\",magicol:{color:color_data['color']}} unless entity @e[type=area_effect_cloud,dx=0,limit=1] run summon area_effect_cloud ~.5 ~.75 ~.5 {CustomName:\"gm4_zc_magicol_particle\",Tags:[\"gm4_zc_magicol_particle\"],custom_particle:{type:\"minecraft:entity_effect\",color:[1.0,1.0,1.0,1.0]},Radius:0.1f,Duration:10,Color:int(color_data['potion_color'].to_color_code('dec'))}\n\n# set flag\nscoreboard players set $displayed_liquid_particle gm4_zc_data 1\n\n# reset fake player\nscoreboard players reset $displayed_magicol_particle gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/from_score.mcfunction",
    "content": "# loads the liquid level into the blockstate of the cauldron from its liquid level score\n# @s = zauber cauldron\n# at @s align xyz\n# run from cauldron/structure/analyze/liquid and recipes which need to update the liquid level\n\nexecute if score @s gm4_zc_liquid_level matches 0 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/set\nexecute if score @s gm4_zc_liquid_level matches 1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/set\nexecute if score @s gm4_zc_liquid_level matches 2 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/set\nexecute if score @s gm4_zc_liquid_level matches 3 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/set\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_0/find_cauldron.mcfunction",
    "content": "# initiates a raycast to locate a zauber cauldron which was set to level=0 (minecraft:cauldron) by a player\n# @s = player who has interacted with the cauldron. May be survival or creative and may have used the offhand or the mainhand.\n# at @s\n# run from advancement cauldron/level_0\n\nadvancement revoke @s only gm4_zauber_cauldrons:cauldron/level_0\n\n# remember player who has interacted with the cauldron\ntag @s add gm4_zc_actor\n\n# find cauldron that was interacted with\nscoreboard players set $ray gm4_zc_data 50\nscoreboard players set $found gm4_zc_data 0\nexecute anchored eyes positioned ^ ^ ^ run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/ray\n\n# remove tag\ntag @s remove gm4_zc_actor\n\n# reset fake players\nscoreboard players reset $ray gm4_zc_data\nscoreboard players reset $found gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_0/item_used/bucket.mcfunction",
    "content": "# hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question\n# @s = cauldron that was emptied\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_0/reconstruct_interaction\n\n# check if an expansion handles this liquid type being removed via bucket.\n# expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction.\n# checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts.\n# expansions can check the currently present liquid type via checking for the corrosponding tag on the present item_display (at dx=0).\n# the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player\n# $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative.\n# the previous fill level is available via fake player $previous_fill_level gm4_zc_data.\nfunction #gm4_zauber_cauldrons:cauldron/liquid/fill_bucket_from_cauldron\n\n# if no expansion handles this liquid type being removed via bucket, fall back to default behavior:\n# reset the cauldron to to its previous level and return the bucket to the player\n# gamemode doesn't matter in this case\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/set\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_bucket\n\n# reset fake player\nscoreboard players reset $interaction_intercepted gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_0/item_used/glass_bottle.mcfunction",
    "content": "# hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question\n# @s = cauldron that was emptied\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_0/reconstruct_interaction\n\n# check if an expansion handles this liquid type being removed via bottle.\n# expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction.\n# checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts.\n# expansions can check the currently present liquid type via checking for the corrosponding tag on the present item_display (at dx=0).\n# the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player\n# $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative.\n# the previous fill level is available via fake player $previous_fill_level gm4_zc_data.\nfunction #gm4_zauber_cauldrons:cauldron/liquid/fill_bottle_from_cauldron\n\n# if no expansion handles this liquid type being removed via bottle, fall back to default behavior:\n# reset the cauldron to to its previous level and return the bottle to the player\n# gamemode doesn't matter in this case\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/set\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_glass_bottle\n\n# reset fake player\nscoreboard players reset $interaction_intercepted gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_0/ray.mcfunction",
    "content": "# ray cast to find cauldron\n# @s = player that used a bucket (or bottle) to empty a cauldron\n# at @s anchored eyes positioned ^ ^ ^0.X where X = step count\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_0/find_cauldron\n\n# check block\nscoreboard players set $found gm4_zc_data 0\nexecute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ #minecraft:cauldrons align xyz as @e[type=marker,tag=gm4_zauber_cauldron,dx=0,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/reconstruct_interaction\n\n# runs the loop again\nscoreboard players remove $ray gm4_zc_data 1\nexecute unless score $found gm4_zc_data matches 1 if score $ray gm4_zc_data matches 1.. positioned ^ ^ ^0.1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/ray\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_0/reconstruct_interaction.mcfunction",
    "content": "# reconstruct in which way the player has interacted with the cauldron to get it into its minecraft:cauldron (level=0) state based on the previous state of the cauldron.\n# @s = cauldron that was emptied\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_0/ray\n\nscoreboard players set $found gm4_zc_data 1\n\n# check whether the player who caused the interaction was in creative or survival/adventure\nexecute as @a[tag=gm4_zc_actor,limit=1] store result score $actor_gamemode gm4_zc_data run function gm4_zauber_cauldrons:player/check_gamemode\n\n# store fill level to fake player to enable easier access for expansions\n# make sure the operation doesn't set @s's gm4_zc_liquid_level from NaN to 0\nexecute if score @s gm4_zc_liquid_level matches 1.. run scoreboard players operation $previous_fill_level gm4_zc_data = @s gm4_zc_liquid_level\nscoreboard players add $previous_fill_level gm4_zc_data 0\n\n# if the cauldron was at level=3 previously a bucket must have been used on the cauldron\nexecute if score $previous_fill_level gm4_zc_data matches 3 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/item_used/bucket\n\n# if the cauldron was at level=1 previously a glass bottle must have been used on the cauldron\nexecute if score $previous_fill_level gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/item_used/glass_bottle\n\n# reset fake player\nscoreboard players reset $actor_gamemode gm4_zc_data\nscoreboard players reset $previous_fill_level gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_0/set.mcfunction",
    "content": "# removes the custom liquid from a cauldron\n# @s = zauber cauldron\n# at @s align xyz\n# run from cauldron/liquid/level_update and cauldron/liquid/update/<level>/item_used/\n\nfill ~ ~ ~ ~ ~ ~ cauldron replace #minecraft:cauldrons\nscoreboard players reset @s gm4_zc_liquid_level\n\n# kill display and remove liquid id from cauldron\nkill @e[type=item_display,tag=gm4_zc_liquid,dx=0,limit=1]\ndata modify entity @s data.gm4_zauber_cauldrons.liquid set value \"none\"\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_1/find_cauldron.mcfunction",
    "content": "# initiates a raycast to locate a zauber cauldron which was set to minecraft:water_cauldron[level=1] by a player\n# @s = player who has interacted with the cauldron. May be survival or creative and may have used the offhand or the mainhand.\n# at @s\n# run from advancement cauldron/level_1\n\nadvancement revoke @s only gm4_zauber_cauldrons:cauldron/level_1\n\n# remember player who has interacted with the cauldron\ntag @s add gm4_zc_actor\n\n# find cauldron that was interacted with\nscoreboard players set $ray gm4_zc_data 50\nscoreboard players set $found gm4_zc_data 0\nexecute anchored eyes positioned ^ ^ ^ run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/ray\n\n# remove tag\ntag @s remove gm4_zc_actor\n\n# reset fake players\nscoreboard players reset $ray gm4_zc_data\nscoreboard players reset $found gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_1/item_used/glass_bottle.mcfunction",
    "content": "# hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question\n# @s = cauldron that was emptied\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/reconstruct_interaction\n\n# check if an expansion handles this liquid type being removed via bottle.\n# expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction.\n# checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts.\n# expansions can check the currently present liquid type via checking for the corrosponding tag on the present item_display (at dx=0).\n# the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player\n# $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative.\n# the previous fill level is available via fake player $previous_fill_level gm4_zc_data.\nfunction #gm4_zauber_cauldrons:cauldron/liquid/fill_bottle_from_cauldron\n\n# if no expansion handles this liquid type being removed via bottle, fall back to default behavior:\n# reset the cauldron to to its previous level and return the bottle to the player\n# gamemode doesn't matter in this case\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/set\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_glass_bottle\n\n# reset fake player\nscoreboard players reset $interaction_intercepted gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_1/item_used/water_bottle.mcfunction",
    "content": "# hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question\n# @s = cauldron that was emptied\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/reconstruct_interaction\n\n# check if an expansion handles this liquid type being added via bottle.\n# expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction.\n# checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts.\n# expansions can check the currently present liquid type (if any) via checking for the corrosponding tag on the present item_display (at dx=0).\n# the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player\n# $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative.\n# the previous fill level is available via fake player $previous_fill_level gm4_zc_data and should be checked before checking for the\n# liquid type in case the cauldron was empty; an empty cauldron has no liquid level score.\nfunction #gm4_zauber_cauldrons:cauldron/liquid/drain_bottle_into_cauldron\n\n# if no expansion handles this liquid type being added via bottle, fall back to default behavior:\n# reset the cauldron to to its previous level and return the bottle to the player\n# gamemode doesn't matter in this case\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/set\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_water_bottle\n\n# reset fake player\nscoreboard players reset $interaction_intercepted gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_1/ray.mcfunction",
    "content": "# ray cast to find cauldron\n# @s = player who has interacted with a cauldron\n# at @s anchored eyes positioned ^ ^ ^0.X where X = step count\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/find_cauldron\n\n# check block\nscoreboard players set $found gm4_zc_data 0\nexecute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ #minecraft:cauldrons align xyz as @e[type=marker,tag=gm4_zauber_cauldron,dx=0,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/reconstruct_interaction\n\n# runs the loop again\nscoreboard players remove $ray gm4_zc_data 1\nexecute unless score $found gm4_zc_data matches 1 if score $ray gm4_zc_data matches 1.. positioned ^ ^ ^0.1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/ray\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_1/reconstruct_interaction.mcfunction",
    "content": "# reconstruct in which way the player has interacted with the cauldron to get it into its minecraft:water_cauldron[level=1] state based on the previous state of the cauldron.\n# @s = cauldron that was interacted with\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/ray\n\nscoreboard players set $found gm4_zc_data 1\n\n# check whether the player who caused the interaction was in creative or survival/adventure\nexecute as @a[tag=gm4_zc_actor,limit=1] store result score $actor_gamemode gm4_zc_data run function gm4_zauber_cauldrons:player/check_gamemode\n\n# store fill level to fake player to enable easier access for expansions\n# make sure the operation doesn't set @s's gm4_zc_liquid_level from NaN to 0\nexecute if score @s gm4_zc_liquid_level matches 1.. run scoreboard players operation $previous_fill_level gm4_zc_data = @s gm4_zc_liquid_level\nscoreboard players add $previous_fill_level gm4_zc_data 0\n\n# if the cauldron did not have a fill level before a full bottle must have been used on an empty cauldron, in this case no intervention is needed\n# noop\n\n# if the cauldron was at level=2 previously a glass bottle must have been used on the cauldron\nexecute if score $previous_fill_level gm4_zc_data matches 2 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/item_used/glass_bottle\n\n# reset fake player\nscoreboard players reset $actor_gamemode gm4_zc_data\nscoreboard players reset $previous_fill_level gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_1/set.mcfunction",
    "content": "# sets the visual liquid level of a cauldron with custom liquid to 1\n# @s = zauber cauldron\n# at @s align xyz\n# run from cauldron/liquid/update/from_score and cauldron/liquid/update/<level>/item_used/\n\nfill ~ ~ ~ ~ ~ ~ water_cauldron[level=1] replace #minecraft:cauldrons\ndata modify entity @e[type=item_display,tag=gm4_zc_liquid,dx=0,limit=1] transformation set value [1.984f,0f,0f,0f,0f,0.001f,0f,0f,0f,0f,1.984f,0f,0f,0f,0f,1f]\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_2/find_cauldron.mcfunction",
    "content": "# initiates a raycast to locate a zauber cauldron which was set to minecraft:water_cauldron[level=2] by a player\n# @s = player who has interacted with the cauldron. May be survival or creative and may have used the offhand or the mainhand.\n# at @s\n# run from advancement cauldron/level_2\n\nadvancement revoke @s only gm4_zauber_cauldrons:cauldron/level_2\n\n# remember player who has interacted with the cauldron\ntag @s add gm4_zc_actor\n\n# find cauldron that was interacted with\nscoreboard players set $ray gm4_zc_data 50\nscoreboard players set $found gm4_zc_data 0\nexecute anchored eyes positioned ^ ^ ^ run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/ray\n\n# remove tag\ntag @s remove gm4_zc_actor\n\n# reset fake players\nscoreboard players reset $ray gm4_zc_data\nscoreboard players reset $found gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_2/item_used/glass_bottle.mcfunction",
    "content": "# hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question\n# @s = cauldron that was emptied\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/reconstruct_interaction\n\n# check if an expansion handles this liquid type being removed via bottle.\n# expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction.\n# checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts.\n# expansions can check the currently present liquid type via checking for the corrosponding tag on the present item_display (at dx=0).\n# the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player\n# $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative.\n# the previous fill level is available via fake player $previous_fill_level gm4_zc_data.\nfunction #gm4_zauber_cauldrons:cauldron/liquid/fill_bottle_from_cauldron\n\n# if no expansion handles this liquid type being removed via bottle, fall back to default behavior:\n# reset the cauldron to its previous level and return the bottle to the player\n# gamemode doesn't matter in this case\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/set\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_glass_bottle\n\n# reset fake player\nscoreboard players reset $interaction_intercepted gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_2/item_used/water_bottle.mcfunction",
    "content": "# hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question\n# @s = cauldron that was emptied\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/reconstruct_interaction\n\n# check if an expansion handles this liquid type being added via bottle.\n# expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction.\n# checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts.\n# expansions can check the currently present liquid type (if any) via checking for the corrosponding tag on the present item_display (at dx=0).\n# the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player\n# $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative.\n# the previous fill level is available via fake player $previous_fill_level gm4_zc_data and should be checked before checking for the\n# liquid type in case the cauldron was empty; an empty cauldron has no liquid level score.\nfunction #gm4_zauber_cauldrons:cauldron/liquid/drain_bottle_into_cauldron\n\n# if no expansion handles this liquid type being added via bottle, fall back to default behavior:\n# reset the cauldron to to its previous level and return the bottle to the player\n# gamemode doesn't matter in this case\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/set\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_water_bottle\n\n# reset fake player\nscoreboard players reset $interaction_intercepted gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_2/ray.mcfunction",
    "content": "# ray cast to find cauldron\n# @s = player who has interacted with a cauldron\n# at @s anchored eyes positioned ^ ^ ^0.X where X = step count\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_2/find_cauldron\n\n# check block\nscoreboard players set $found gm4_zc_data 0\nexecute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ #minecraft:cauldrons align xyz as @e[type=marker,tag=gm4_zauber_cauldron,dx=0,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/reconstruct_interaction\n\n# runs the loop again\nscoreboard players remove $ray gm4_zc_data 1\nexecute unless score $found gm4_zc_data matches 1 if score $ray gm4_zc_data matches 1.. positioned ^ ^ ^0.1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/ray\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_2/reconstruct_interaction.mcfunction",
    "content": "# reconstruct in which way the player has interacted with the cauldron to get it into its minecraft:water_cauldron[level=2] state based on the previous state of the cauldron.\n# @s = cauldron that was interacted with\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_2/ray\n\nscoreboard players set $found gm4_zc_data 1\n\n# check whether the player who caused the interaction was in creative or survival/adventure\nexecute as @a[tag=gm4_zc_actor,limit=1] store result score $actor_gamemode gm4_zc_data run function gm4_zauber_cauldrons:player/check_gamemode\n\n# store fill level to fake player to enable easier access for expansions\n# make sure the operation doesn't set @s's gm4_zc_liquid_level from NaN to 0\nexecute if score @s gm4_zc_liquid_level matches 1.. run scoreboard players operation $previous_fill_level gm4_zc_data = @s gm4_zc_liquid_level\nscoreboard players add $previous_fill_level gm4_zc_data 0\n\n# if the cauldron was at level=3 previously a glass bottle must have been used on the cauldron\nexecute if score $previous_fill_level gm4_zc_data matches 3 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/item_used/glass_bottle\n\n# if the cauldron was at level=1 previously a water bottle must have been used on the cauldron\nexecute if score $previous_fill_level gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/item_used/water_bottle\n\n# reset fake player\nscoreboard players reset $actor_gamemode gm4_zc_data\nscoreboard players reset $previous_fill_level gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_2/set.mcfunction",
    "content": "# sets the visual liquid level of a cauldron with custom liquid to 2\n# @s = zauber cauldron\n# at @s align xyz\n# run from cauldron/liquid/update/from_score and cauldron/liquid/update/<level>/item_used/\n\nfill ~ ~ ~ ~ ~ ~ water_cauldron[level=2] replace #minecraft:cauldrons\ndata modify entity @e[type=item_display,tag=gm4_zc_liquid,dx=0,limit=1] transformation set value [1.984f,0f,0f,0f,0f,0.75f,0f,0f,0f,0f,1.984f,0f,0f,0f,0f,1f]\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/analyze_held_items/creative.mcfunction",
    "content": "# tries to deduct which item was used by the player when interacting with the cauldron by looking at the post-interaction state of the player's held items\n# @s = player who has interacted with a cauldron\n# at position of cauldron, align xyz\n# run from cauldron/liquid/update/level_3/analyze_held_items/select_gamemode\n\n# figure out whether item in main or offhand was used\nexecute if predicate gm4_zauber_cauldrons:player/equipment/water_bucket/in_mainhand run return 0\nexecute if predicate gm4_zauber_cauldrons:player/equipment/water_bottle/in_mainhand run return 2\nexecute if predicate gm4_zauber_cauldrons:player/equipment/water_bucket/in_offhand run return 1\nexecute if predicate gm4_zauber_cauldrons:player/equipment/water_bottle/in_offhand run return 3\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/analyze_held_items/select_gamemode.mcfunction",
    "content": "# selects how to check the players's held item depending on their gamemode\n# @s = player who has interacted with a zauber cauldron\n# at position of cauldron, align xyz\n# run from cauldron/liquid/update/level_3/reconstruct_interaction\n\n# the player can not have been in spectator, so checking for !creative is the same as checking for survival or adventure\nexecute if entity @s[gamemode=!creative] store result score $item_use_code gm4_zc_data run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/analyze_held_items/survival_or_adventure\nexecute if entity @s[gamemode=creative] store result score $item_use_code gm4_zc_data run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/analyze_held_items/creative\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/analyze_held_items/survival_or_adventure.mcfunction",
    "content": "# tries to deduct which item was used by the player when interacting with the cauldron by looking at the post-interaction state of the player's held items\n# @s = player who has interacted with a cauldron\n# at position of cauldron, align xyz\n# run from cauldron/liquid/update/level_3/analyze_held_items/select_gamemode\n\n# figure out whether item in main or offhand was used\n# this is so complicated because when starting out with a level=2 cauldron there are two cases which can not be\n# distinguished only from looking at the cauldron's final level (level=3) and the items of the player after the interaction:\n# A) Offhand: Empty Bottle, Mainhand: Full Bucket\n# B) Offhand: Full Bottle, Mainhand: Empty Bucket\n# Both A) and B) result in a level=3 cauldron and the player holding Offhand:Empty Bottle, Mainhand: Empty Bucket\n# but buckets and bottles act differently on cauldrons. Therefore we simply ignore this case, which will lead to the player\n# losing either the contents of a bucket or of a filled bottle when they try to add liquid in state A) or B). \nexecute if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_mainhand run return 2\nexecute if predicate gm4_zauber_cauldrons:player/equipment/bucket/in_mainhand if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_offhand run return -1\nexecute if predicate gm4_zauber_cauldrons:player/equipment/bucket/in_mainhand run return 0\nexecute if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_offhand run return 3\nexecute if predicate gm4_zauber_cauldrons:player/equipment/bucket/in_offhand run return 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/find_cauldron.mcfunction",
    "content": "# initiates a raycast to locate a zauber cauldron which was set to minecraft:water_cauldron[level=3], minecraft:lava_cauldron, or minecraft:powder_snow_cauldron by a player\n# @s = player who has interacted with the cauldron. May be survival or creative and may have used the offhand or the mainhand.\n# at @s\n# run from advancement cauldron/level_3\n\nadvancement revoke @s only gm4_zauber_cauldrons:cauldron/level_3\n\n# remember player who has interacted with the cauldron\ntag @s add gm4_zc_actor\n\n# find cauldron that was interacted with\nscoreboard players set $ray gm4_zc_data 50\nscoreboard players set $found gm4_zc_data 0\nexecute anchored eyes positioned ^ ^ ^ run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/ray\n\n# remove tag\ntag @s remove gm4_zc_actor\n\n# reset fake players\nscoreboard players reset $ray gm4_zc_data\nscoreboard players reset $found gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/item_used/analyze_held_items.mcfunction",
    "content": "# tries to deduct which item was used by the player when interacting with the cauldron by looking at the post-interaction state of the player's held items\n# @s = player who has interacted with a cauldron\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_3/reconstruct_interaction\n\n# figure out whether item in main or offhand was stored\n# this is so complicated because when starting out with a level=2 cauldron there are two cases which can not be\n# distinguished only from looking at the cauldron's final level (level=3) and the items of the player after the interaction:\n# A) Offhand: Empty Bottle, Mainhand: Full Bucket\n# B) Offhand: Full Bottle, Mainhand: Empty Bucket\n# Both A) and B) result in a level=3 cauldron and the player holding Offhand:Empty Bottle, Mainhand: Empty Bucket\n# but buckets and bottles act differently on cauldrons. Therefore we simply ignore this case, which will lead to the player\n# losing either the contents of a bucket or of a filled bottle when they try to add liquid in state A) or B). \nexecute if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_mainhand run return 2\nexecute if predicate gm4_zauber_cauldrons:player/equipment/bucket/in_mainhand if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_offhand run return -1\nexecute if predicate gm4_zauber_cauldrons:player/equipment/bucket/in_mainhand run return 0\nexecute if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_offhand run return 3\nexecute if predicate gm4_zauber_cauldrons:player/equipment/bucket/in_offhand run return 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/item_used/filled_bucket.mcfunction",
    "content": "# hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question\n# @s = cauldron that was emptied\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_3/reconstruct_interaction\n\n# using any filled bucket on a cauldron will overwrite the currenlty contained liquid and fill the cauldron up fully.\nkill @e[type=item_display,tag=gm4_zc_liquid,dx=0,limit=1]\n\n# check if an expansion handles this liquid type being added via bucket, which always overwrites the currenlty contained liquid.\n# therefore in this the expansion only needs to provide a corrosponding item_display if necessary.\n# expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction.\n# checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts.\n# the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player\n# $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative.\nfunction #gm4_zauber_cauldrons:cauldron/liquid/drain_bucket_into_cauldron\n\n# if no expansion handled the liquid being inserted, fall back to vanilla bucket behavior and remove custom liquid, otherwise set liquid level to full\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. run scoreboard players reset @s gm4_zc_liquid_level\nexecute if score $interaction_intercepted gm4_zc_data matches 1.. run scoreboard players set @s gm4_zc_liquid_level 3\n\n# reset fake player\nscoreboard players reset $interaction_intercepted gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/item_used/water_bottle.mcfunction",
    "content": "# hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question\n# @s = cauldron that was emptied\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/reconstruct_interaction\n\n# check if an expansion handles this liquid type being added via bottle.\n# expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction.\n# checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts.\n# expansions can check the currently present liquid type (if any) via checking for the corrosponding tag on the present item_display (at dx=0).\n# the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player\n# $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative.\n# the previous fill level is available via fake player $previous_fill_level gm4_zc_data and should be checked before checking for the\n# liquid type in case the cauldron was empty; an empty cauldron has no liquid level score.\nfunction #gm4_zauber_cauldrons:cauldron/liquid/drain_bottle_into_cauldron\n\n# if no expansion handles this liquid type being added via bottle, fall back to default behavior:\n# reset the cauldron to to its previous level and return the bottle to the player\n# gamemode doesn't matter in this case\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/set\nexecute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_water_bottle\n\n# reset fake player\nscoreboard players reset $interaction_intercepted gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/ray.mcfunction",
    "content": "# ray cast to find cauldron\n# @s = player who has interacted with a cauldron\n# at @s anchored eyes positioned ^ ^ ^0.X where X = step count\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_3/find_cauldron\n\n# check block\nscoreboard players set $found gm4_zc_data 0\nexecute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ #minecraft:cauldrons align xyz as @e[type=marker,tag=gm4_zauber_cauldron,dx=0,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/reconstruct_interaction\n\n# runs the loop again\nscoreboard players remove $ray gm4_zc_data 1\nexecute unless score $found gm4_zc_data matches 1 if score $ray gm4_zc_data matches 1.. positioned ^ ^ ^0.1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/ray\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/reconstruct_interaction.mcfunction",
    "content": "# reconstruct in which way the player has interacted with the cauldron to get it into its minecraft:water_cauldron[level=3], minecraft:lava_cauldron, or minecraft:powder_snow_cauldron state based on the previous state of the cauldron.\n# @s = cauldron that was interacted with\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/level_3/ray\n\nscoreboard players set $found gm4_zc_data 1\n\n# check whether the player who caused the interaction was in creative or survival/adventure\nexecute as @a[tag=gm4_zc_actor,limit=1] store result score $actor_gamemode gm4_zc_data run function gm4_zauber_cauldrons:player/check_gamemode\n\n# store fill level to fake player to enable easier access for expansions\n# make sure the operation doesn't set @s's gm4_zc_liquid_level from NaN to 0\nexecute if score @s gm4_zc_liquid_level matches 1.. run scoreboard players operation $previous_fill_level gm4_zc_data = @s gm4_zc_liquid_level\nscoreboard players add $previous_fill_level gm4_zc_data 0\n\n# if the cauldron was at level=NaN, level=1, or at level=3 previously some filled bucket must have been used on the cauldron\nexecute unless score $previous_fill_level gm4_zc_data matches 2 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/item_used/filled_bucket\n\n# in the case that the cauldron was previously at level=2 we can not distinguish between the use of a bucket or the use of a water bottle\n# without looking at the player's inventory (and even then there is a case in which we can not tell)\nexecute if score $previous_fill_level gm4_zc_data matches 2 as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/analyze_held_items/select_gamemode\nexecute if score $item_use_code gm4_zc_data matches 0..1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/item_used/filled_bucket\nexecute if score $item_use_code gm4_zc_data matches 2..3 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/item_used/water_bottle\n\n# reset fake player\nscoreboard players reset $actor_gamemode gm4_zc_data\nscoreboard players reset $previous_fill_level gm4_zc_data\nscoreboard players reset $item_use_code gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/set.mcfunction",
    "content": "# sets the visual liquid level of a cauldron with custom liquid to 3\n# @s = zauber cauldron\n# at @s align xyz\n# run from cauldron/liquid/update/from_score and cauldron/liquid/update/<level>/item_used/\n\nfill ~ ~ ~ ~ ~ ~ water_cauldron[level=3] replace #minecraft:cauldrons\ndata modify entity @e[type=item_display,tag=gm4_zc_liquid,dx=0,limit=1] transformation set value [1.984f,0f,0f,0f,0f,1.5f,0f,0f,0f,0f,1.984f,0f,0f,0f,0f,1f]\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/return_bucket.mcfunction",
    "content": "# returns an empty bucket to a player who has tried to fill up a bucket from a custom liquid zauber cauldron\n# @s = player who has interacted with the zauber cauldron\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/<level>/item_used/\n\nexecute store success score $found_hand gm4_zc_data if predicate gm4_zauber_cauldrons:player/equipment/water_bucket/in_mainhand run item replace entity @s weapon.mainhand with minecraft:bucket\nexecute unless score $found_hand gm4_zc_data matches 1.. if predicate gm4_zauber_cauldrons:player/equipment/water_bucket/in_offhand run item replace entity @s weapon.offhand with minecraft:bucket\n\n# reset fake player and prevent bucket fill sound\nstopsound @s block minecraft:item.bucket.fill\nscoreboard players reset $found_hand gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/return_glass_bottle.mcfunction",
    "content": "# returns an empty bottle to a player who has tried to fill up a bottle from a custom liquid zauber cauldron\n# @s = player who has interacted with the zauber cauldron\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/<level>/item_used/\n\nexecute store success score $found_hand gm4_zc_data if predicate gm4_zauber_cauldrons:player/equipment/water_bottle/in_mainhand run item replace entity @s weapon.mainhand with minecraft:glass_bottle\nexecute unless score $found_hand gm4_zc_data matches 1.. if predicate gm4_zauber_cauldrons:player/equipment/water_bottle/in_offhand run item replace entity @s weapon.offhand with minecraft:glass_bottle\n\n# reset fake player and prevent bottle fill sound\nstopsound @s block minecraft:item.bottle.fill\nscoreboard players reset $found_hand gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/return_water_bottle.mcfunction",
    "content": "# returns a water bottle to a player who has tried to fill up a into a custom liquid zauber cauldron\n# @s = player who has interacted with the zauber cauldron\n# at position of cauldron, align xyz\n# run from gm4_zauber_cauldrons:cauldron/liquid/update/<>/item_used/\n\nexecute store success score $found_hand gm4_zc_data if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_mainhand run item replace entity @s weapon.mainhand with minecraft:potion[potion_contents=\"minecraft:water\"]\nexecute unless score $found_hand gm4_zc_data matches 1.. if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_offhand run item replace entity @s weapon.offhand with minecraft:potion[potion_contents=\"minecraft:water\"]\n\n# reset fake player and prevent bottle empty sound\nstopsound @s block minecraft:item.bottle.empty\nscoreboard players reset $found_hand gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/rabbit_teleportation.mcfunction",
    "content": "# teleports a rabbit inside a cauldron to another empty cauldron\n# @s = zauber cauldron without water in it\n# at align xyz\n# run from cauldron/structure/validate/liquid\n\n# look for a target cauldron\ntag @e[type=marker,tag=gm4_zauber_cauldron,limit=1,distance=1..,sort=random,scores={gm4_zc_rabtarget=1}] add gm4_zc_selected_target\nexecute unless entity @e[type=marker,tag=gm4_zc_selected_target] run return fail\n\n# advancement for player\nadvancement grant @a[distance=..2,gamemode=!spectator,predicate=gm4_zauber_cauldrons:player/equipment/armor/full] only gm4:zauber_cauldrons_rabbit\n\n# departure sounds & particles\nparticle minecraft:entity_effect{color:[0.2,0.3,0.2,0.5]} ~.5 ~.5 ~.5 0 0 0 0.5 32\nplaysound minecraft:entity.item.pickup neutral @a[distance=..8] ~ ~ ~ 0.5 0.5\n\n# teleport rabbit\ntag @e[type=rabbit,dx=0,dy=0,dz=0,limit=1] add gm4_zc_magic_rabbit\ntp @e[type=rabbit,dx=0,tag=gm4_zc_magic_rabbit,limit=1] @e[type=marker,tag=gm4_zc_selected_target,limit=1]\n\n# arrival  particles\nexecute at @e[type=rabbit,tag=gm4_zc_magic_rabbit,limit=1] align xyz run particle minecraft:entity_effect{color:[0.2,0.3,0.2,0.5]} ~.5 ~.5 ~.5 0 0 0 0.5 32\n\n# remove tags\ntag @e[type=rabbit] remove gm4_zc_magic_rabbit\ntag @e[type=marker,tag=gm4_zauber_cauldron] remove gm4_zc_selected_target\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/recipe_checks.mcfunction",
    "content": "# @s boiling zauber cauldron with valid structure and item(s) inside.\n# at @s (center of block)\n# ran from cauldron/structure/valid\n\n# branches off into different module components\n\n# make items not pickupable when a player is looking at a cauldron\nexecute as @a[gamemode=!spectator,distance=..3] at @s anchored eyes positioned ^ ^ ^1.448 if block ~ ~ ~ #minecraft:cauldrons align xyz positioned ~.5 ~.5 ~.5 if entity @e[type=marker,tag=gm4_current_zauber_cauldron,distance=..0.1] align xyz as @e[type=item,dx=0,dy=0,dz=0] run data merge entity @s {PickupDelay:18s}\n\n# check if cauldron has a bottle\nexecute if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"minecraft:glass_bottle\"}}}}] run scoreboard players set $has_bottle gm4_zc_fullness 1\n\n# set $recipe_success to 0\nscoreboard players set $recipe_success gm4_zc_data 0\n\n# tier 4 potions\nexecute if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"minecraft:prismarine_crystals\"}}}}] if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"minecraft:golden_apple\"}}}}] run function gm4_zauber_cauldrons:recipes/potions/select_bottle\n\n# zauber armor\nexecute unless score $recipe_success gm4_zc_data matches 1.. if score $has_water gm4_zc_data matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"enchanted_prismarine_shard\"}}}}] run function gm4_zauber_cauldrons:recipes/armor/select_piece\n\n# zauber crystals\nexecute unless score $recipe_success gm4_zc_data matches 1.. if score $has_water gm4_zc_data matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"minecraft:sea_lantern\"}}}}] if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"minecraft:nether_star\"}}}}] run function gm4_zauber_cauldrons:recipes/crystals/select_effect\n\n# enchanted prismarine shard\nexecute unless score $recipe_success gm4_zc_data matches 1.. if score $has_water gm4_zc_data matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"minecraft:prismarine_shard\"}}}}] if entity @a[level=30..,distance=..2,limit=1,sort=nearest,gamemode=!spectator] run function gm4_zauber_cauldrons:recipes/precursors/enchanted_prismarine_shard\n\n# luck from flowers\nexecute unless score $recipe_success gm4_zc_data matches 1.. if score $has_water gm4_zc_data matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"minecraft:short_grass\"}}}}] if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"enchanted_prismarine_shard\"}}}}] run function gm4_zauber_cauldrons:recipes/flowers/check_poisonous_flowers\n\n# wormhole in a bottle\nexecute unless score $recipe_success gm4_zc_data matches 1.. if score $has_water gm4_zc_data matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"bottled_vex\"}}}}] if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"enchanted_prismarine_shard\"}}}}] run function gm4_zauber_cauldrons:recipes/chorus/count_chorus\n\n# magicol\nexecute unless score $recipe_success gm4_zc_data matches 1.. unless score $disable_magicol gm4_zc_data matches 1.. if score $has_water gm4_zc_data matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"bottled_vex\"}}}}] if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"enchanted_prismarine_shard\"}}}}] run function gm4_zauber_cauldrons:recipes/magicol/select_color\n\n# bottled magicol\nexecute unless score $recipe_success gm4_zc_data matches 1.. unless score $disable_magicol gm4_zc_data matches 1.. if score @s gm4_zc_liquid_level matches 1..3 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients liquid{id:\"magicol\"} if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:potion_contents\":{potion:\"minecraft:water\"}}}] if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"minecraft:prismarine_crystals\"}}}}] run function gm4_zauber_cauldrons:recipes/magicol/bottled/select_bottle\n\n# reset fake players and storage\nscoreboard players reset $recipe_success gm4_zc_data\nscoreboard players reset $has_bottle gm4_zc_fullness\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/setup/animation/controller.mcfunction",
    "content": "# controls the creation animation\n# @s = player able to create a cauldron\n# at cauldron position\n# scheduled from gm4_zauber_cauldron:cauldron/setup/create\n\n# control animation flow\nexecute if score $creation_counter gm4_zc_data matches ..40 run schedule function gm4_zauber_cauldrons:cauldron/setup/animation/controller 1t\nscoreboard players add $creation_counter gm4_zc_data 1\n\n# display animation frame\nexecute as @e[type=area_effect_cloud,tag=gm4_zc_creation_animation] at @s run function gm4_zauber_cauldrons:cauldron/setup/animation/step\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/setup/animation/step.mcfunction",
    "content": "# displays a single frame of the creation animation\n# @s = animation marker\n# at @s\n# run from gm4_zauber_cauldron:cauldron/setup/animation/controller\n\n# move to new position\nteleport @s ^0.15 ^ ^0.025 facing entity @e[type=marker,tag=gm4_zauber_cauldron,distance=..1,limit=1]\n\n# display particle\nexecute at @s run particle minecraft:enchant ~ ~0.6 ~ 0 0 0 0.001 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/setup/create.mcfunction",
    "content": "# @s = player able to create a cauldron\n# at cauldron being looked at, align xyz\n# ran from cauldron/setup/validate_structure\n\n# summon marker AEC\nexecute positioned ~.5 ~.5 ~.5 summon marker run function gm4_zauber_cauldrons:cauldron/setup/initialize_marker\nadvancement grant @s only gm4:zauber_cauldrons_create\nplaysound minecraft:entity.illusioner.prepare_mirror master @a[distance=..8] ~.5 ~.5 ~.5 1 1.6\n\n# summon texture display\nsummon minecraft:item_display ~.5 ~.5 ~.125 {CustomName:\"gm4_zc_texture\",item:{id:\"minecraft:structure_void\",count:1,components:{\"minecraft:custom_model_data\":{\"strings\":[\"gm4_zauber_cauldrons:block/zauber_cauldron\"]}}},item_display:\"thirdperson_righthand\",Tags:[\"gm4_zc_texture\",\"smithed.entity\",\"smithed.strict\"]}\n\n# start creation animation\nsummon area_effect_cloud ~.5 ~.5 ~.5 {Radius:0,Age:-40,CustomName:\"gm4_zc_creation_animation\",Tags:[\"gm4_zc_creation_animation\"],custom_particle:{type:\"minecraft:block\",block_state:\"minecraft:air\"}}\nscoreboard players set $creation_counter gm4_zc_data 1\nschedule function gm4_zauber_cauldrons:cauldron/setup/animation/controller 1t\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/setup/initialize_marker.mcfunction",
    "content": "# sets nbt and scores on newly created zauber cauldron markers\n# @s = newly created zauber cauldron\n# at @s\n# ran from cauldron/setup/create or from upgrade path 1.10\n\n# set nbt\ndata modify entity @s CustomName set value \"gm4_zauber_cauldron\"\n\n# store cauldron position and dimension in nbt, this is only done once upon creation\n# store coordinates as integers, wormholes always teleport to the center of the target block\nexecute store result entity @s data.gm4_zauber_cauldrons.location.x int 1 run data get entity @s Pos[0]\nexecute store result entity @s data.gm4_zauber_cauldrons.location.y int 1 run data get entity @s Pos[1]\nexecute store result entity @s data.gm4_zauber_cauldrons.location.z int 1 run data get entity @s Pos[2]\ndata modify entity @s data.gm4_zauber_cauldrons.location.dimension set from entity @p Dimension\n\n# TODO remove this when switching over to custom liquids only!\n# instead, the liquid type should be pulled from the vanilla cauldron\n# upon creation and the vanilla cauldron converted to custom liquid\ndata modify entity @s data.gm4_zauber_cauldrons.liquid set value {id:\"none\"}\n\n# add tags\ntag @s add gm4_zauber_cauldron\ntag @s add smithed.entity\ntag @s add smithed.strict\ntag @s add smithed.block\n\n# set scores\nscoreboard players set @s gm4_entity_version 2\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/setup/validate_structure.mcfunction",
    "content": "# @s = non-spectator, non-adventure players, looking at a non-zauber cauldron, holding an enchanted book\n# at cauldron being looked at, align xyz\n# run from player/submain\n\n# analyze structure\nfunction gm4_zauber_cauldrons:cauldron/structure/analyze/liquid\nexecute if score $has_liquid gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/structure/analyze/heatsource\n\n# create zauber cauldron if structure is valid\nexecute if score $has_heatsource gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/setup/create\n\n# reset fake players\nscoreboard players reset $has_liquid gm4_zc_data\nscoreboard players reset $has_water gm4_zc_data\nscoreboard players reset $has_powder_snow gm4_zc_data\nscoreboard players reset $has_lava gm4_zc_data\nscoreboard players reset $has_heatsource gm4_zc_data\nscoreboard players reset $has_soul_fire_heatsource gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/analyze/heatsource.mcfunction",
    "content": "# @s = zauber cauldron\n# at @s align xyz\n# run from cauldron/structure/validate/heatsource\n# fake players must be reset after the result of this function was evaluated\n\n# analyze type of heatsource used\nexecute store success score $has_heatsource gm4_zc_data if block ~ ~-1 ~ #minecraft:campfires[lit=true]\nexecute unless score $has_heatsource gm4_zc_data matches 1 store success score $has_heatsource gm4_zc_data if block ~ ~-1 ~ #minecraft:fire\nexecute if score $has_heatsource gm4_zc_data matches 1 store success score $has_soul_fire_heatsource gm4_zc_data if block ~ ~-1 ~ #gm4_zauber_cauldrons:soul_fire_heatsource\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/analyze/liquid.mcfunction",
    "content": "# @s = zauber cauldron\n# at @s align xyz\n# run from cauldron/structure/validate/liquid and cauldron/setup/validate_structure\n# fake players must be reset after the result of this function was evaluated\n\n# analyze type of cauldron used\nexecute if score @s gm4_zc_liquid_level matches 0..3 run function gm4_zauber_cauldrons:cauldron/liquid/update/from_score\nexecute if score @s gm4_zc_liquid_level matches 1..3 run scoreboard players set $has_liquid gm4_zc_data 1\nexecute unless score $has_liquid gm4_zc_data matches 1 store success score $has_liquid gm4_zc_data store success score $has_water gm4_zc_data if block ~ ~ ~ minecraft:water_cauldron\nexecute unless score $has_liquid gm4_zc_data matches 1 store success score $has_liquid gm4_zc_data store success score $has_powder_snow gm4_zc_data if block ~ ~ ~ minecraft:powder_snow_cauldron\nexecute unless score $has_liquid gm4_zc_data matches 1 store success score $has_liquid gm4_zc_data store success score $has_lava gm4_zc_data if block ~ ~ ~ minecraft:lava_cauldron\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/destroy.mcfunction",
    "content": "# Dismantles a Zauber Cauldron, thereby removing the marker and any related entities.\n# @s = a Zauber Cauldron marker which is no longer within a minecraft:cauldron block\n# at @s alignxyz\n# run from cauldron/structure/validate/liquid\n\n# remove marker\nkill @s\n\n# remove liquid displays if present\nkill @e[type=item_display,tag=gm4_zc_liquid,dx=0,limit=1]\n\n# remove cauldron texture overlay\nkill @e[type=item_display,tag=gm4_zc_texture,dx=0,limit=1]\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/modify/use_liquid.mcfunction",
    "content": "# @s = zauber cauldron\n# should be at @s\n# run from cauldron/structure/modify\n\n# check liquid type\nexecute if score $has_water gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/structure/modify/use_water\nexecute if score $has_powder_snow gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/structure/modify/use_powder_snow\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/modify/use_powder_snow.mcfunction",
    "content": "# @s = zauber cauldron\n# run from recipe check functions\n\n# use powder snow\nexecute if block ~ ~ ~ minecraft:powder_snow_cauldron[level=1] run setblock ~ ~ ~ minecraft:cauldron\nexecute if block ~ ~ ~ minecraft:powder_snow_cauldron[level=2] run setblock ~ ~ ~ minecraft:water_cauldron[level=1]\nexecute if block ~ ~ ~ minecraft:powder_snow_cauldron[level=3] run setblock ~ ~ ~ minecraft:water_cauldron[level=2]\n\n# particle\nparticle minecraft:snowflake ~ ~ ~ .15 0.4 .15 0 24\n\n# sound\nplaysound minecraft:item.bucket.fill_powder_snow block @a[distance=..8] ~ ~ ~ 0.75 0.75\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/modify/use_water.mcfunction",
    "content": "# @s = zauber cauldron\n# run from cauldron/structure/modify\n\n# use water\nexecute if block ~ ~ ~ minecraft:water_cauldron[level=1] run setblock ~ ~ ~ minecraft:cauldron\nexecute if block ~ ~ ~ minecraft:water_cauldron[level=2] run setblock ~ ~ ~ minecraft:water_cauldron[level=1]\nexecute if block ~ ~ ~ minecraft:water_cauldron[level=3] run setblock ~ ~ ~ minecraft:water_cauldron[level=2]\n\n# particle\nparticle minecraft:splash ~ ~ ~ .15 0.1 .15 0 6\n\n# sound\nplaysound minecraft:item.bucket.fill block @a[distance=..8] ~ ~ ~ 0.5 0.75\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/register_items.mcfunction",
    "content": "# @s = item inside cauldron\n# at cauldron align xyz\n# run from cauldron/structure/valid\n# counts items in cauldron and virtualizes them\n\n# count item\nscoreboard players add @e[type=marker,tag=gm4_zauber_cauldron,tag=gm4_current_zauber_cauldron,limit=1] gm4_zc_fullness 1\n\n# register item\ndata modify storage gm4_zauber_cauldrons:temp/cauldron/ingredients item set from entity @s Item\nexecute unless data storage gm4_zauber_cauldrons:temp/cauldron/ingredients item.components.\"minecraft:custom_data\".gm4_zauber_cauldrons.item run data modify storage gm4_zauber_cauldrons:temp/cauldron/ingredients item.components.\"minecraft:custom_data\".gm4_zauber_cauldrons.item set from entity @s Item.id\ndata modify storage gm4_zauber_cauldrons:temp/cauldron/ingredients items append from storage gm4_zauber_cauldrons:temp/cauldron/ingredients item\ndata remove storage gm4_zauber_cauldrons:temp/cauldron/ingredients item\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/use_extra_items.mcfunction",
    "content": "# @s = zauber cauldron with overflow items\n# run from use_cauldron functions\n# at center of block\n\n# calculate how many excess items are in the recipe\nscoreboard players operation @s gm4_zc_fullness -= $expected_item_amount gm4_zc_fullness\n\n# absorb possessed items into a bottle if present\nscoreboard players set $bottled_possessed_items gm4_zc_data 0\nexecute if score $has_bottle gm4_zc_fullness matches 1.. if score @s gm4_zc_fullness matches 2.. align xyz positioned ~.5 ~.5 ~.5 run function gm4_zauber_cauldrons:cauldron/extra_items/prepare_bottle\n\n# summon possessed items if no bottle present\nexecute if score $bottled_possessed_items gm4_zc_data matches 0 run function gm4_zauber_cauldrons:cauldron/extra_items/create_possessed_items\n\n# reset fake players\nscoreboard players reset $bottled_possessed_items gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/valid.mcfunction",
    "content": "# @s = boiling cauldron with valid structure\n# at @s align xyz\n# run from cauldron/structure/validate/heatsource\n\n# tag this cauldron for future refrence\ntag @s add gm4_current_zauber_cauldron\n\n# count items in cauldron\nscoreboard players set @s gm4_zc_fullness 0\ndata remove storage gm4_zauber_cauldrons:temp/cauldron/ingredients items\nexecute as @e[type=item,dx=0,dy=0,dz=0] run function gm4_zauber_cauldrons:cauldron/structure/register_items\n\n# pull liquid id and cauldron location into ingredient storage\ndata modify storage gm4_zauber_cauldrons:temp/cauldron/ingredients marker_data set from entity @s data.gm4_zauber_cauldrons\ndata modify storage gm4_zauber_cauldrons:temp/cauldron/ingredients liquid set from storage gm4_zauber_cauldrons:temp/cauldron/ingredients marker_data.liquid\ndata modify storage gm4_zauber_cauldrons:temp/cauldron/ingredients location set from storage gm4_zauber_cauldrons:temp/cauldron/ingredients marker_data.location\ndata remove storage gm4_zauber_cauldrons:temp/cauldron/ingredients marker_data\n\n# particles\nexecute if score $has_water gm4_zc_data matches 1 run particle minecraft:poof ~.5 ~.5 ~.5 .005 .2 .005 .0005 4\nexecute if score $has_powder_snow gm4_zc_data matches 1 run particle minecraft:dripping_water ~.5 ~0.88 ~.5 0.14 0 0.14 1 1\nexecute if score @s gm4_zc_liquid_level matches 1..3 run function #gm4_zauber_cauldrons:cauldron/liquid/cauldron_particles\nscoreboard players reset $displayed_liquid_particle gm4_zc_data\n\n# check for recipes if at least one item is found inside\nexecute if score @s gm4_zc_fullness matches 1.. positioned ~.5 ~.5 ~.5 run function gm4_zauber_cauldrons:cauldron/recipe_checks\n\n# reset\ntag @s remove gm4_current_zauber_cauldron\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/validate/heatsource.mcfunction",
    "content": "# @s = zauber cauldron\n# at @s align xyz\n# run from cauldron/structure/validate/liquid\n\n# analyze\nfunction gm4_zauber_cauldrons:cauldron/structure/analyze/heatsource\n\n# enable cauldron for crafting\nexecute if score $has_heatsource gm4_zc_data matches 1 unless score $has_lava gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/structure/valid\n\n# reset fake players\nscoreboard players reset $has_heatsource gm4_zc_data\nscoreboard players reset $has_soul_fire_heatsource gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/validate/liquid.mcfunction",
    "content": "# @s = zauber cauldron\n# at @s align xzy\n# run from main\n\n# reset rabbit target score\nscoreboard players set @s gm4_zc_rabtarget 0\n\n# analyze\nfunction gm4_zauber_cauldrons:cauldron/structure/analyze/liquid\n\n# if there is a liquid present, continue to heat source checks\nexecute if score $has_liquid gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/structure/validate/heatsource\n\n# if the cauldron is empty, enable the rabbit teleportation easter egg\nexecute unless score $has_liquid gm4_zc_data matches 1 if block ~ ~ ~ minecraft:cauldron if entity @e[type=rabbit,dx=0,dy=0,dz=0,limit=1] if entity @a[gamemode=!spectator,predicate=gm4_zauber_cauldrons:player/equipment/armor/full,distance=..2] run function gm4_zauber_cauldrons:cauldron/rabbit_teleportation\nexecute unless score $has_liquid gm4_zc_data matches 1 run scoreboard players set @s gm4_zc_rabtarget 1\n\n# if there is no longer a cauldron, destroy the zauber cauldron\nexecute unless block ~ ~ ~ #minecraft:cauldrons run function gm4_zauber_cauldrons:cauldron/structure/destroy\n\n# reset fake players\nscoreboard players reset $has_liquid gm4_zc_data\nscoreboard players reset $has_water gm4_zc_data\nscoreboard players reset $has_powder_snow gm4_zc_data\nscoreboard players reset $has_lava gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_entity_version dummy\nscoreboard objectives add gm4_zc_bottled_vex_escape_timer dummy\nscoreboard objectives add gm4_zc_chorus dummy\nscoreboard objectives add gm4_zc_crystal dummy\nscoreboard objectives add gm4_zc_data dummy\nscoreboard objectives add gm4_zc_flowers dummy\nscoreboard objectives add gm4_zc_fullness dummy\nscoreboard objectives add gm4_zc_id dummy\nscoreboard objectives add gm4_zc_liquid_level dummy\nscoreboard objectives add gm4_zc_moon_phase dummy\nscoreboard objectives add gm4_zc_no_explode dummy\nscoreboard objectives add gm4_zc_magicol_painter_timer dummy\nscoreboard objectives add gm4_zc_rabtarget dummy\n# assign lucky/poisonous flowers, unless this was done before\nexecute unless score $required_flowers gm4_zc_flowers matches -2147483648..2147483647 run function gm4_zauber_cauldrons:recipes/flowers/initiate_flower_types\n# assign chorus amounts, unless this was done before. The latter score check without the $ and the scoreboard operation are required on old worlds.\nexecute if score required_popped_chorus_fruit gm4_zc_chorus matches -2147483648..2147483647 run scoreboard players operation $required_popped_chorus_fruit gm4_zc_chorus = required_popped_chorus_fruit gm4_zc_chorus\nexecute unless score $required_total gm4_zc_chorus matches -2147483648..2147483647 unless score required_total gm4_zc_chorus matches -2147483648..2147483647 run function gm4_zauber_cauldrons:recipes/chorus/initiate_chorus_amounts\n# assign moon phase offset\nexecute unless score $magicol_offset gm4_zc_moon_phase matches -2147483648..2147483647 run function gm4_zauber_cauldrons:recipes/magicol/initiate_moon_phase_offset\nscoreboard players set #modulo gm4_zc_fullness 3\nscoreboard players set #8 gm4_zc_moon_phase 8\nscoreboard players set #256 gm4_zc_moon_phase 256\nscoreboard players set #24000 gm4_zc_moon_phase 24000\nteam add gm4_hide_name\nteam modify gm4_hide_name nametagVisibility never\n\n# module data version\nscoreboard players set $data_version gm4_zc_data 1\n\n# website maintained module version\nexecute unless score zauber_cauldrons gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Zauber Cauldrons\"}\nexecute unless score zauber_cauldrons gm4_earliest_version < zauber_cauldrons gm4_modules run scoreboard players operation zauber_cauldrons gm4_earliest_version = zauber_cauldrons gm4_modules\nscoreboard players set zauber_cauldrons gm4_modules 1\n\n# start core functionality\nschedule function gm4_zauber_cauldrons:main 1t\n\n# start vex in a bottle release meachanism\nschedule function gm4_zauber_cauldrons:cauldron/extra_items/process_bottled_vex_items 2t\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/main.mcfunction",
    "content": "execute as @e[type=marker,tag=gm4_zauber_cauldron] at @s align xyz run function gm4_zauber_cauldrons:cauldron/structure/validate/liquid\n\n# player checks\nexecute as @a[gamemode=!spectator] run function gm4_zauber_cauldrons:player/submain\n\n# prevent explosion handling\nscoreboard players remove @e[scores={gm4_zc_no_explode=1..}] gm4_zc_no_explode 1\n\nschedule function gm4_zauber_cauldrons:main 16t\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/armor/apply_set_bonus.mcfunction",
    "content": "# checks the players armor set for zauber flavor\n# @s = player who's inventory changed and now has full armor\n# at @s\n# run from advancement equipment/has_full_armor\n\n# advancement is not revoked as it is used as a flag for revoke set bonus in\n# advancement equipment/unequipped_armor\n\n# count flavors\n# note: also checking for the armor amount because all zauber armor has +3 armor by default\nexecute store result score $armor_boost gm4_zc_data if items entity @s armor.* *[custom_data~{gm4_zauber_cauldrons:{item:\"zauber_armor\"}},attribute_modifiers~{modifiers:{contains:[{attribute:\"minecraft:armor\",amount:1d}]}}]\nexecute store result score $attack_boost gm4_zc_data if items entity @s armor.* *[custom_data~{gm4_zauber_cauldrons:{item:\"zauber_armor\"}},attribute_modifiers~{modifiers:{contains:[{attribute:\"minecraft:attack_damage\"}]}}]\nexecute store result score $health_boost gm4_zc_data if items entity @s armor.* *[custom_data~{gm4_zauber_cauldrons:{item:\"zauber_armor\"}},attribute_modifiers~{modifiers:{contains:[{attribute:\"minecraft:max_health\"}]}}]\nexecute store result score $speed_boost gm4_zc_data if items entity @s armor.* *[custom_data~{gm4_zauber_cauldrons:{item:\"zauber_armor\"}},attribute_modifiers~{modifiers:{contains:[{attribute:\"minecraft:movement_speed\"}]}}]\n\n# check how many of the most prevalent flavor there are\nscoreboard players set $comparison gm4_zc_data 0\nscoreboard players operation $comparison gm4_zc_data > $armor_boost gm4_zc_data\nscoreboard players operation $comparison gm4_zc_data > $attack_boost gm4_zc_data\nscoreboard players operation $comparison gm4_zc_data > $health_boost gm4_zc_data\nscoreboard players operation $comparison gm4_zc_data > $speed_boost gm4_zc_data\n\n# give set boosts for the most prevalent flavors\nexecute if score $comparison gm4_zc_data = $armor_boost gm4_zc_data run function gm4_zauber_cauldrons:player/armor/set_bonus/armor_boost\nexecute if score $comparison gm4_zc_data = $attack_boost gm4_zc_data run function gm4_zauber_cauldrons:player/armor/set_bonus/attack_boost\nexecute if score $comparison gm4_zc_data = $health_boost gm4_zc_data run function gm4_zauber_cauldrons:player/armor/set_bonus/health_boost\nexecute if score $comparison gm4_zc_data = $speed_boost gm4_zc_data run function gm4_zauber_cauldrons:player/armor/set_bonus/speed_boost\n\n# reset fake players\nscoreboard players reset $armor_boost gm4_zc_data\nscoreboard players reset $attack_boost gm4_zc_data\nscoreboard players reset $health_boost gm4_zc_data\nscoreboard players reset $speed_boost gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/armor/revoke_set_bonus.mcfunction",
    "content": "# revokes set bonuses from players that don't have a full set of zauber armor anymore \n# @s = player who's inventory changed and they don't have zauber armor on anymore, but used to have zauber armor on\n# at @s\n# run from advancement equipment/unequipped_armor\n\n# revoke advancements\nadvancement revoke @s only gm4_zauber_cauldrons:equipment/has_full_armor\nadvancement revoke @s only gm4_zauber_cauldrons:equipment/unequipped_armor\n\n# revoke set bonuses\nattribute @s minecraft:armor modifier remove gm4_zauber_cauldrons:armor_boost\nattribute @s minecraft:attack_damage modifier remove gm4_zauber_cauldrons:attack_boost\nattribute @s minecraft:max_health modifier remove gm4_zauber_cauldrons:health_boost\nattribute @s minecraft:movement_speed modifier remove gm4_zauber_cauldrons:speed_boost\n\n# sound\nplaysound minecraft:block.beacon.deactivate player @a[distance=..4] ~ ~ ~ 0.3 0.1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/armor/set_bonus/armor_boost.mcfunction",
    "content": "# applies a set bonus and displays some particles\n# @s = player who's inventory changed and now has full armor_boost armor\n# at @s\n# run from player/armor/apply_set_bonus\n\n# attribute\nattribute @s minecraft:armor modifier add gm4_zauber_cauldrons:armor_boost 1 add_value\n\n# sounds and visuals\nparticle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ~.3 ~.8 ~.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ~.3 ~.8 ~-.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ~-.3 ~.8 ~-.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ~-.3 ~.8 ~.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ^ ^1.2 ^0.1 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ^ ^1.2 ^-0.1 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ^0.1 ^1.2 ^ 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ^-0.1 ^1.2 ^ 0 0 0 1 1\nplaysound minecraft:block.beacon.power_select player @a[distance=..4] ~ ~ ~ 0.2 1.55\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/armor/set_bonus/attack_boost.mcfunction",
    "content": "# applies a set bonus and displays some particles\n# @s = player who's inventory changed and now has full attack_boost armor\n# at @s\n# run from player/armor/apply_set_bonus\n\n# attribute\nattribute @s minecraft:attack_damage modifier add gm4_zauber_cauldrons:attack_boost 1 add_value\n\n# sounds and visuals\nparticle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ~.3 ~.8 ~.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ~.3 ~.8 ~-.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ~-.3 ~.8 ~-.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ~-.3 ~.8 ~.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ^ ^1.2 ^0.1 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ^ ^1.2 ^-0.1 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ^0.1 ^1.2 ^ 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ^-0.1 ^1.2 ^ 0 0 0 1 1\nplaysound minecraft:block.beacon.power_select player @a[distance=..4] ~ ~ ~ 0.2 1.6\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/armor/set_bonus/health_boost.mcfunction",
    "content": "# applies a set bonus and displays some particles\n# @s = player who's inventory changed and now has full health_boost armor\n# at @s\n# run from player/armor/apply_set_bonus\n\n# attribute\nattribute @s minecraft:max_health modifier add gm4_zauber_cauldrons:health_boost 4 add_value\n\n# sounds and visuals\nparticle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ~.3 ~.8 ~.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ~.3 ~.8 ~-.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ~-.3 ~.8 ~-.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ~-.3 ~.8 ~.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ^ ^1.2 ^0.1 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ^ ^1.2 ^-0.1 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ^0.1 ^1.2 ^ 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ^-0.1 ^1.2 ^ 0 0 0 1 1\nplaysound minecraft:block.beacon.power_select player @a[distance=..4] ~ ~ ~ 0.2 1.65\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/armor/set_bonus/speed_boost.mcfunction",
    "content": "# applies a set bonus and displays some particles\n# @s = player who's inventory changed and now has full speed_boost armor\n# at @s\n# run from player/armor/apply_set_bonus\n\n# attribute\nattribute @s minecraft:movement_speed modifier add gm4_zauber_cauldrons:speed_boost 0.12 add_multiplied_base\n\n# sounds and visuals\nparticle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ~.3 ~.8 ~.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ~.3 ~.8 ~-.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ~-.3 ~.8 ~-.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ~-.3 ~.8 ~.3 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ^ ^1.2 ^0.1 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ^ ^1.2 ^-0.1 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ^0.1 ^1.2 ^ 0 0 0 1 1\nparticle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ^-0.1 ^1.2 ^ 0 0 0 1 1\nplaysound minecraft:block.beacon.power_select player @a[distance=..4] ~ ~ ~ 0.2 1.7\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/assign_id.mcfunction",
    "content": "# @s = player who joined for the first time\n# run from advancement gm4_zauber_cauldrons:join\n\nexecute store result score @s gm4_zc_id run data get entity @s UUID[3]\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/check_gamemode.mcfunction",
    "content": "# checks whether the player who called this function was in creative or survival/adventure and returns 1 or 0 accordingly.\n# @s = a player\n# at unspecified\n# run from cauldron/liquid/update/<level>/reconstruct_interaction\n\n# sorted by gamemode player is most likely to be in\nexecute if entity @s[gamemode=survival] run return 0\nexecute if entity @s[gamemode=creative] run return 1\nexecute if entity @s[gamemode=adventure] run return 0\nreturn -1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/activate.mcfunction",
    "content": "# @s = player with crystal in off-hand\n# at @s\n# run from player/crystal/process\n\n# play activation sound\nplaysound minecraft:block.beacon.activate player @a[distance=..8] ~ ~ ~ 0.3 1.7\nplaysound minecraft:block.amethyst_cluster.hit player @a[distance=..8] ~ ~ ~ 0.3 1.2\n\n# add tag\ntag @s add gm4_zc_crystal_active\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/deactivate.mcfunction",
    "content": "# @s = player\n# at world spawn\n# run from player/submain\n\n# play deactivation sound\nplaysound minecraft:block.beacon.deactivate player @a[distance=..8] ~ ~ ~ 0.3 1.7\nplaysound minecraft:block.amethyst_cluster.hit player @a[distance=..8] ~ ~ ~ 0.3 0.8\n\n# clear tag\ntag @s remove gm4_zc_crystal_active\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/effect/instant_health.mcfunction",
    "content": "# @s =  player with crystal in off-hand\n# run from player/crystal/read_effect\n\n# give effects\neffect give @s instant_health 1 1\neffect give @s nausea 10 0\n\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/effect/speed.mcfunction",
    "content": "# @s =  player with crystal in off-hand\n# run from player/crystal/read_effect\n\n# give effects\neffect give @s speed 7 1\neffect give @s weakness 7 0\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/effect/strength.mcfunction",
    "content": "# @s =  player with crystal in off-hand\n# run from player/crystal/read_effect\n\n# give effects\neffect give @s strength 7 1\neffect give @s fire_resistance 7 0\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/process.mcfunction",
    "content": "# @s = player with crystal in off-hand\n# at world spawn\n# run from player/submain\n\n# activate freshly equiped crystals\nexecute unless score @s gm4_zc_crystal matches 0..7 at @s run function gm4_zauber_cauldrons:player/crystal/activate\n\n# read and apply effects on slow clock\nexecute if score @s gm4_zc_crystal matches 0..7 run scoreboard players add @s gm4_zc_crystal 1\nexecute if score @s gm4_zc_crystal matches 8.. run function gm4_zauber_cauldrons:player/crystal/read_effect\n\n# set fake player flag\nscoreboard players set $success gm4_zc_data 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/read_effect.mcfunction",
    "content": "# @s = player with crystal in off-hand\n# run from player/crystal/process\n\n# read and apply effects\nexecute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:\"instant_damage\"}}] run effect give @s instant_damage 1 1\nexecute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:\"instant_health\"}}] run function gm4_zauber_cauldrons:player/crystal/effect/instant_health\nexecute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:\"jump_boost\"}}] run effect give @s jump_boost 7 1\nexecute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:\"poison\"}}] run effect give @s poison 7 1\nexecute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:\"regeneration\"}}] run effect give @s regeneration 7 1\nexecute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:\"speed\"}}] run function gm4_zauber_cauldrons:player/crystal/effect/speed\nexecute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:\"strength\"}}] run function gm4_zauber_cauldrons:player/crystal/effect/strength\n\n# reset score\ndata remove storage gm4_zauber_cauldrons:temp/player/equipment/offhand gm4_zauber_cauldrons\nscoreboard players set @s gm4_zc_crystal 0\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/cache/dump.mcfunction",
    "content": "# @s = gm4_zc_nbt_storage item spawned in a previous tick. This item carries the 'tag' of the multi use bottles that was used\n# at location of player that drank this bottle\n# run from player/multi_use_bottle/cache/load\n\n# pull data into storage\ndata modify storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item set from entity @s Item\n\n# kill item\nkill @s\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/cache/load.mcfunction",
    "content": "# @s = player that consumed any multi_use_bottle 1 tick ago\n# at @s\n# run from player/multi_use_bottle/restore_context\n\n# move id of player to fake player\nscoreboard players operation $requested_id gm4_zc_id = @s gm4_zc_id\n\n# move matching item data from stored entity into storage\nexecute as @e[type=item,tag=gm4_zc_nbt_storage] if score @s gm4_zc_id = $requested_id gm4_zc_id run function gm4_zauber_cauldrons:player/multi_use_bottle/cache/dump\n\n# abort execution if one or less sips are remaining\nexecute store result score $remaining_sips gm4_zc_data run data get storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item.components.\"minecraft:custom_data\".gm4_zauber_cauldrons.bottle.sips\nexecute if score $remaining_sips gm4_zc_data matches 2.. run function gm4_zauber_cauldrons:player/multi_use_bottle/modify_bottle\n\n# revoke advancement\nadvancement revoke @s only gm4_zauber_cauldrons:use/multi_use_bottle\n\n# reset storage\ndata remove storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item\n\n# reset tags\ntag @s remove gm4_zc_used_mainhand\ntag @s remove gm4_zc_used_offhand\nscoreboard players reset $remaining_sips gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/cache/populate.mcfunction",
    "content": "# @s = player consuming any multi_use_bottle\n# at @s\n# run from player/multi_use_bottle/check_gamemode\n\n# save coordinates into id'd entity\nexecute in overworld run summon item 29999998 1 7134 {Item:{id:\"minecraft:potion\",count:1},Tags:[\"gm4_zc_new_nbt_storage\",\"gm4_zc_nbt_storage\"],Age:5400,PickupDelay:32767}\nscoreboard players operation @e[type=item,tag=gm4_zc_new_nbt_storage,limit=1] gm4_zc_id = @s gm4_zc_id\n\n# read item data from hand into entity\nexecute if predicate gm4_zauber_cauldrons:player/equipment/multi_use_bottle/in_mainhand run function gm4_zauber_cauldrons:player/multi_use_bottle/read_data/mainhand\nexecute unless score $read_data gm4_zc_data matches 1 if predicate gm4_zauber_cauldrons:player/equipment/multi_use_bottle/in_offhand run function gm4_zauber_cauldrons:player/multi_use_bottle/read_data/offhand\nscoreboard players reset $read_data gm4_zc_data\ntag @e[type=item,tag=gm4_zc_nbt_storage] remove gm4_zc_new_nbt_storage\n\n# schedule delayed action\nschedule function gm4_zauber_cauldrons:player/multi_use_bottle/restore_context 1t replace\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/check_gamemode.mcfunction",
    "content": "# @s = player consuming any multi_use_bottle\n# at @s\n# run from advancement gm4_zauber_cauldrons:use/multi_use_bottle\n\n# for survival or adventure players: consume bottle\nexecute if entity @s[gamemode=!spectator,gamemode=!creative] run function gm4_zauber_cauldrons:player/multi_use_bottle/cache/populate\n\n# revoke advancement if gamemode is creative or spectator\n# (advancement is used as marker and will be removed a tick later for survival or adventure players, see player/multi_use_bottle/modify_bottle)\nexecute unless entity @s[gamemode=!spectator,gamemode=!creative] run advancement revoke @s only gm4_zauber_cauldrons:use/multi_use_bottle\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/modify_bottle.mcfunction",
    "content": "# @s = player that consumed any multi_use_bottle 1 tick ago that had at least 2 sips remaining\n# at @s\n# run from player/multi_use_bottle/cache/load\n\n# call utility function to remove one sip and store resulting item into yellow shulker box (gamemode 4 lib_forceload standard)\nfunction gm4_zauber_cauldrons:soulution/use_sip\n\n# return modified items to player inventory, depending on offhand or mainhand use\nexecute if entity @s[tag=gm4_zc_used_mainhand] if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_mainhand in overworld run loot replace entity @s weapon.mainhand 1 mine 29999998 1 7134 minecraft:stick[custom_data={drop_contents:1b}]\nexecute if entity @s[tag=gm4_zc_used_offhand] if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_offhand in overworld run loot replace entity @s weapon.offhand 1 mine 29999998 1 7134 minecraft:stick[custom_data={drop_contents:1b}]\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/read_data/mainhand.mcfunction",
    "content": "# @s = player holding a multi_use_bottle in the mainhand\n# at world spawn\n# run from player/multi_use_bottle/cache/populate\n\n# copy mainhand wormhole x, y, z, and dimension to the temporary data storage\ndata modify entity @e[type=item,tag=gm4_zc_new_nbt_storage,limit=1] Item set from entity @s SelectedItem\n\n# set flag to remember main hand operation across ticks\ntag @s add gm4_zc_used_mainhand\n\n# set flag\nscoreboard players set $read_data gm4_zc_data 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/read_data/offhand.mcfunction",
    "content": "# @s = player holding a multi_use_bottle in the offhand\n# at world spawn\n# run from player/multi_use_bottle/cache/populate\n\n# copy offhand wormhole x, y, z, and dimension to the temporary data storage\ndata modify entity @e[type=item,tag=gm4_zc_new_nbt_storage,limit=1] Item set from entity @s equipment.offhand\n\n# set flag to remember offhand operation across ticks\ntag @s add gm4_zc_used_offhand\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/restore_context.mcfunction",
    "content": "# @s = none\n# at world spawn\n# scheduled by player/multi_use_bottle/cache/populate\n\n# restore original context and start multi use code\nexecute as @a[predicate=gm4_zauber_cauldrons:player/advancement/use/multi_use_bottle] at @s run function gm4_zauber_cauldrons:player/multi_use_bottle/cache/load\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/submain.mcfunction",
    "content": "# @s = non-spectator players\n# at world spawn\n# run from main\n\n# check creation\nexecute at @s[gamemode=!adventure] if predicate gm4_zauber_cauldrons:player/equipment/enchanted_book/in_mainhand anchored eyes positioned ^ ^ ^1.448 align xyz unless entity @e[type=marker,tag=gm4_zauber_cauldron,dx=0] unless entity @e[tag=smithed.block,dx=0] run function gm4_zauber_cauldrons:cauldron/setup/validate_structure\n\n# crystal effects\nscoreboard players set $success gm4_zc_data 0\nexecute if predicate gm4_zauber_cauldrons:player/equipment/crystal/luck_and_in_offhand run function gm4_zauber_cauldrons:player/crystal/process\nexecute if score $success gm4_zc_data matches 0 if entity @s[tag=gm4_zc_crystal_active] at @s run function gm4_zauber_cauldrons:player/crystal/deactivate\nscoreboard players reset $success gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/wormhole_targeting/acquire_destination_context.mcfunction",
    "content": "# sets the execution location to the destination of the wormhole used\n# @s = user to pe teleported by wormhole\n# at @s\n# run from player/wormhole_targeting/prepare_teleport\n\n# insert coordinates and dimension, make sure coordinates are center-of-block coordinates\n$execute in $(dimension) positioned $(x) $(y) $(z) align xyz positioned ~.5 ~.5 ~.5 run function gm4_zauber_cauldrons:player/wormhole_targeting/teleport_user\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/wormhole_targeting/prepare_teleport.mcfunction",
    "content": "# @s = player consuming wormhole_bottle\n# at @s\n# run from advancement zauber_cauldrons:use/wormhole\n\n# compatibility with other modules\nfunction #gm4_zauber_cauldrons:player/wormhole_targeting/prepare_teleport\n\n# revoke advancement for next teleport\nadvancement revoke @s only gm4_zauber_cauldrons:use/wormhole\n\n# detect main or offhand warp and prepare target coordinates in storage\ndata remove storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos\nexecute unless score $read_coordinates gm4_zc_data matches 1 if predicate gm4_zauber_cauldrons:player/equipment/wormhole/in_mainhand store success score $read_coordinates gm4_zc_data run data modify storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos set from entity @s SelectedItem.components.\"minecraft:custom_data\".gm4_zauber_cauldrons.cauldron_pos\nexecute unless score $read_coordinates gm4_zc_data matches 1 if predicate gm4_zauber_cauldrons:player/equipment/wormhole/in_offhand run data modify storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos set from entity @s equipment.offhand.components.\"minecraft:custom_data\".gm4_zauber_cauldrons.cauldron_pos\nscoreboard players reset $read_coordinates gm4_zc_data\n\n# backwards compatibility with old wormholes from below v1.10\n# earliest version is tracked by our upgrade paths framework\nexecute if score zauber_cauldrons gm4_earliest_version matches ..110000 run function gm4_zauber_cauldrons:player/wormhole_targeting/translate_numeric_dimension_id with storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos\n\n# affect player with resistance\neffect give @s resistance 1 12 true\n\n# particles and sound for depart\nparticle minecraft:portal ~ ~.6 ~ .25 .25 .25 0 100\nplaysound minecraft:entity.enderman.teleport player @a[distance=0.001..8] ~ ~ ~ 1 .3\n\n# teleport user to destination\nfunction gm4_zauber_cauldrons:player/wormhole_targeting/acquire_destination_context with storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos\n\n# gm4_zc_wormhole_consumer tag used to be removed here, however, this wasn't reliable for tag removal for non-player entities.\n# The tag removal is now done in the function teleport_user, making this redundant. This is just a failsafe to\n# ensure players aren't left with the tag in case the dimension selection fails.\ntag @s remove gm4_zc_wormhole_consumer\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/wormhole_targeting/remove_speechmarks.mcfunction",
    "content": "# removes the encasing speechmarks from a supplied dimension id\n# @s = player consuming wormhole_bottle\n# at @s\n# run from player/wormhole_targeting/translate_numeric_dimension_id\n\n# uses the fact that 'data modify ... set value \"some_string\"' and 'data modify ... set value some_string' result in the identical string \"some_string\" being stored in storage\n$data modify storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos.dimension set value $(dimension)\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/wormhole_targeting/teleport_user.mcfunction",
    "content": "# @s = user to pe teleported by wormhole\n# at target location of wormhole (center of block)\n# run from player/wormhole_targeting/acquire_destination_context\n\n# forcibly load the chunk\nexecute store success score $forceloaded gm4_zc_data run forceload query ~ ~\nexecute if score $forceloaded gm4_zc_data matches 0 run forceload add ~ ~\nexecute if score $forceloaded gm4_zc_data matches 0 run forceload remove ~ ~\n\n# teleport\ntp @s ~ ~.2 ~\n\n# play arrival animation\nparticle minecraft:portal ~ ~.8 ~ .25 .25 .25 0 100 force @a[distance=..32]\nexecute positioned ~ ~.7 ~ run playsound minecraft:entity.enderman.teleport player @a[distance=..8] ~ ~ ~ 1 .3\n\n# explode user if no cauldron is present\n# in future versions it may be required to wait until the chunks is loaded until the block check is done,\n# but as of 1.20.4 this seems to work just fine in combination with the forceload command above\nexecute unless entity @e[tag=gm4_zc_wormhole_consumer,scores={gm4_zc_no_explode=1..},limit=1] unless block ~ ~ ~ #minecraft:cauldrons run summon tnt ~.5 ~.7 ~.5 {fuse:0s}\n\n# reset fake player\nscoreboard players reset $forceloaded gm4_zc_data\n\n# remove tag\n# Testing in 1.16.5 showed that, for non-player entities, the tag isn't removed as expected in prepare_teleport line 30.\n# This lead to entities with leftover tags, which would break teleportation server wide, as those entities might be teleported instead.\n# Keep testing whether this is still necessary in future versions.\n# Note that this would not be an issue in vanilla zauber, however, zauber liquids allows the teleportation of non-player entities.\ntag @s remove gm4_zc_wormhole_consumer\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/wormhole_targeting/translate_numeric_dimension_id.mcfunction",
    "content": "# translates a numeric dimension id from the forceload library to the dimension name as a string for backwards compatibility with old wormholes\n# @s = player consuming wormhole_bottle\n# at @s\n# run from player/wormhole_targeting/prepare_teleport\n\n# this macro function will fail to instantiate if $(dimension) does not contain a number, as the score ... matches expects a number, not a string.\n# as a result, this function will not run if a string is stored in $(dimension)\n\n# find dimension marker with matching id and get its name (the name will be something like '\"minecraft:overworld\"')\n$execute as @e[type=marker,tag=gm4_dimension] if score @s gm4_dimension matches $(dimension) run tag @s add gm4_zc_targeted_dimension\ndata modify storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos.dimension set from entity @e[type=marker,tag=gm4_zc_targeted_dimension,limit=1] CustomName\n\n# the name stored is still encased by speechmarks, which we need to remove\nfunction gm4_zauber_cauldrons:player/wormhole_targeting/remove_speechmarks with storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos\n\n# remove tag\ntag @e[type=marker,tag=gm4_dimension] remove gm4_zc_targeted_dimension\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/armor/init_piece.mcfunction",
    "content": "# @s = result item\n# at center of cauldron block\n# run from recipes/armor/{{piece}}/{{flavor}}\n# with $components: the initial item components of the armor piece\n\n$data modify entity @s Item.components merge value $(components)\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/armor/select_piece.mcfunction",
    "content": "# @s = boiling zauber cauldron with enchanted prismarine shard inside\n# at @s (center of block)\n# run from cauldron/recipe_checks\n\n# set expected fullness for these recipes\nscoreboard players set $expected_item_amount gm4_zc_fullness 3\n\n# recipes\n# the select_flavor functions are generated via beet from templates\n# generated with the help of bolt\nfor piece_data in ctx.meta['armor_pieces']:\n    execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,id:f\"minecraft:golden_{piece_data['piece']}\"}] run function f\"gm4_zauber_cauldrons:recipes/armor/{piece_data['piece']}/select_flavor\"\n\n# use water and play sound once a recipe ran\nexecute if score $recipe_success gm4_zc_data matches 1 run function gm4_zauber_cauldrons:recipes/armor/use_cauldron\n\n# reset fake players\nscoreboard players reset $expected_item_amount gm4_zc_fullness\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/armor/use_cauldron.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at @s align xyz\n# run from recipes/armor/zauber_armor\n\n# calculate amount of vexes to spawn\nexecute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items\n\n# make items in cauldron pickup-able instantly\nexecute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s\n\n# sounds and visuals\nparticle minecraft:entity_effect{color:[0.1,0.1,0.1,1.0]} ~ ~.4 ~ 0 0 0 1 10\nplaysound entity.player.levelup block @a[distance=..16] ~ ~ ~ 1 1.5\n\n# consume water\nfunction gm4_zauber_cauldrons:cauldron/structure/modify/use_water\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/chorus/blurry_wormhole.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at center of block\n# run from count_chorus\n\n# generate random coordinate offset from UUID of items in cauldron\nexecute store result score $dx gm4_zc_data run data get entity @e[type=item,nbt={Item:{components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"bottled_vex\"}}}}},limit=1] UUID[3] 0.000000005\nexecute store result score $dy gm4_zc_data run data get entity @e[type=item,nbt={Item:{id:\"minecraft:chorus_fruit\"}},limit=1] UUID[3] 0.000000005\nexecute store result score $dz gm4_zc_data run data get entity @e[type=item,nbt={Item:{id:\"minecraft:popped_chorus_fruit\"}},limit=1] UUID[3] 0.000000005\n\n# get bottled_vex cauldron pos\ndata modify storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos set from storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"bottled_vex\"}}}}].components.\"minecraft:custom_data\".gm4_zauber_cauldrons.cauldron_pos\nexecute store result score $x gm4_zc_data run data get storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.x 1\nexecute store result score $y gm4_zc_data run data get storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.y 1\nexecute store result score $z gm4_zc_data run data get storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.z 1\n\n# add random offset (target coordinates)\nscoreboard players operation $x gm4_zc_data += $dx gm4_zc_data\nscoreboard players operation $y gm4_zc_data += $dy gm4_zc_data\nscoreboard players operation $z gm4_zc_data += $dz gm4_zc_data\n\n# copy target coordinates to storage\nexecute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.x int 1 run scoreboard players get $x gm4_zc_data\nexecute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.y int 1 run scoreboard players get $y gm4_zc_data\nexecute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.z int 1 run scoreboard players get $z gm4_zc_data\n\n# kill remaining items\nexecute align xyz run kill @e[type=item,dx=0,dy=0,dz=0]\n\n# summon wormhole\nloot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/wormhole\n\n# make items in cauldron pickup-able instantly\nexecute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s\n\n# if one, popped or raw chorus, was more than required, turn those into vexes\nexecute if score $raw_chorus_fullness gm4_zc_chorus matches 1.. run scoreboard players operation @s gm4_zc_fullness += $raw_chorus_fullness gm4_zc_chorus\nexecute if score $popped_chorus_fullness gm4_zc_chorus matches 1.. run scoreboard players operation @s gm4_zc_fullness += $popped_chorus_fullness gm4_zc_chorus\n\n# cosmetics\nexecute at @s run particle minecraft:witch ~ ~.3 ~ .1 .1 .1 1 7\nexecute at @s run playsound minecraft:entity.ender_eye.death master @a[distance=..8] ~ ~ ~ 1 .6\n\n# set flag\nscoreboard players set $recipe_success gm4_zc_data 1\n\n# reset fake players\nscoreboard players reset $dx gm4_zc_data\nscoreboard players reset $dy gm4_zc_data\nscoreboard players reset $dz gm4_zc_data\nscoreboard players reset $x gm4_zc_data\nscoreboard players reset $y gm4_zc_data\nscoreboard players reset $z gm4_zc_data\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/chorus/count_chorus.mcfunction",
    "content": "# @s = boiling zauber cauldron with bottled vex and enchanted_prismarine_shard inside\n# at center of block\n# run from cauldron/recipe_checks\n\n# initialise fake players\nscoreboard players set $cancel_recipe gm4_zc_data 0\n\n# set expected fullness for these recipes (stack chorus+stack popped chorus+enchanted_prismarine_shard+bottled vex)\nscoreboard players set $expected_item_amount gm4_zc_fullness 4\n\n# set sip level returned when crafting multi-sips, in case another module messed with these presets\nexecute if score $has_soul_fire_heatsource gm4_zc_data matches 1.. run data modify storage gm4_zauber_cauldrons:blueprint/item/multi_sip gm4_zauber_cauldrons.bottle set value {sips:9,size:9,multi_use:1b}\n\n# read count from chorus fruit stacks\nexecute store result score $raw_chorus_fullness gm4_zc_chorus run data get storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"minecraft:chorus_fruit\"}}}}].count 1\nexecute store result score $popped_chorus_fullness gm4_zc_chorus run data get storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"minecraft:popped_chorus_fruit\"}}}}].count 1\n\n# cancel recipe if one of the ingredients is missing\nexecute if score $raw_chorus_fullness gm4_zc_chorus matches 0 run scoreboard players set $cancel_recipe gm4_zc_data 2\nexecute if score $popped_chorus_fullness gm4_zc_chorus matches 0 run scoreboard players set $cancel_recipe gm4_zc_data 2\n\n# check count against seed based count\nexecute unless score $cancel_recipe gm4_zc_data matches 2 run scoreboard players operation $raw_chorus_fullness gm4_zc_chorus -= $required_chorus_fruit gm4_zc_chorus\nexecute unless score $cancel_recipe gm4_zc_data matches 2 run scoreboard players operation $popped_chorus_fullness gm4_zc_chorus -= $required_popped_chorus_fruit gm4_zc_chorus\n\n# start incomplete recipe\nexecute unless score $cancel_recipe gm4_zc_data matches 2 if score $raw_chorus_fullness gm4_zc_chorus matches ..-1 run scoreboard players set $cancel_recipe gm4_zc_data 1\nexecute unless score $cancel_recipe gm4_zc_data matches 2 if score $popped_chorus_fullness gm4_zc_chorus matches ..-1 run scoreboard players set $cancel_recipe gm4_zc_data 1\nexecute if score $cancel_recipe gm4_zc_data matches 1 run function gm4_zauber_cauldrons:recipes/chorus/blurry_wormhole\n\n# start complete recipe\nexecute if score $cancel_recipe gm4_zc_data matches 0 run function gm4_zauber_cauldrons:recipes/chorus/precise_wormhole\n\n# use water and play sound once a recipe ran\nexecute if score $recipe_success gm4_zc_data matches 1 at @s if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items\nexecute if score $recipe_success gm4_zc_data matches 1 at @s run function gm4_zauber_cauldrons:cauldron/structure/modify/use_water\n\n# reset fake players\nscoreboard players reset $cancel_recipe gm4_zc_data\nscoreboard players reset $expected_item_amount gm4_zc_fullness\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/chorus/initiate_chorus_amounts.mcfunction",
    "content": "# determines the chorus and popped chorus amounts required for the wormhole recipe depending on the world seed\n# none\n# at world spawn\n# Run from init if neither $required_total nor required_total are present in gm4_zc_flowers, the latter being a check for old worlds\n\n# initialize randomizer\nrandom reset gm4_zauber_cauldrons:chorus/chorus_amounts 0 true true\n\n# roll random chorus and popped chorus fruit amounts\nexecute store result score $required_chorus_fruit gm4_zc_chorus run random value 1..64 gm4_zauber_cauldrons:chorus/chorus_amounts\nexecute store result score $required_popped_chorus_fruit gm4_zc_chorus run random value 1..64 gm4_zauber_cauldrons:chorus/chorus_amounts\n\n# store total\nscoreboard players operation $required_total gm4_zc_chorus = $required_chorus_fruit gm4_zc_chorus\nscoreboard players operation $required_total gm4_zc_chorus += $required_popped_chorus_fruit gm4_zc_chorus\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/chorus/precise_wormhole.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at center of block\n# run from count_chorus\n\n# get bottled_vex nbt into blueprint\ndata modify storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos set from storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"bottled_vex\"}}}}].components.\"minecraft:custom_data\".gm4_zauber_cauldrons.cauldron_pos\n\n# kill remaining items\nexecute align xyz run kill @e[type=item,dx=0,dy=0,dz=0]\n\n# summon wormhole\nloot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/wormhole\n\n# make items in cauldron pickup-able instantly\nexecute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s\n\n# cosmetics\nexecute at @s run particle minecraft:witch ~ ~.3 ~ .1 .1 .1 1 17\nexecute at @s run playsound minecraft:entity.ender_eye.death master @a[distance=..8] ~ ~ ~ 0.6 .2\n\n# add oversized stacks to cauldron fullness to summon vexes\nscoreboard players operation @s gm4_zc_fullness += $raw_chorus_fullness gm4_zc_chorus\nscoreboard players operation @s gm4_zc_fullness += $popped_chorus_fullness gm4_zc_chorus\n\n# set flag\nscoreboard players set $recipe_success gm4_zc_data 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/crystals/select_effect.mcfunction",
    "content": "# @s = boiling zauber cauldron with sea lantern and nether star inside\n# at @s (center of block)\n# run from cauldron/recipe_checks\n\n# set expected fullness for these recipes\nscoreboard players set $expected_item_amount gm4_zc_fullness 3\n\n# recipes\n# the crystals/effects/ functions are generated via beet from templates\n# generated with the help of bolt\nfor effect_data in ctx.meta['crystal_effects']:\n    execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:effect_data['effect']}}}}] run function f\"gm4_zauber_cauldrons:recipes/crystals/effects/{effect_data['effect']}\"\n\n# use water and play sound once a recipe ran\nexecute if score $recipe_success gm4_zc_data matches 1 at @s run function gm4_zauber_cauldrons:recipes/crystals/use_cauldron\n\n# reset fake players\nscoreboard players reset $expected_item_amount gm4_zc_fullness\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/crystals/use_cauldron.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at @s (center of block)\n# run from recipes/crystals/zauber_crystals\n\n# calculate amount of vexes to spawn\nexecute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items\n\n# make items in cauldron pickup-able instantly\nexecute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s\n\n# sounds and visuals\nparticle minecraft:entity_effect{color:[0.1,0.1,0.1,1.0]} ~ ~.4 ~ 0 0 0 1 10\nplaysound entity.player.levelup block @a[distance=..16] ~ ~ ~ 1 1.5\n\n# consume water\nfunction gm4_zauber_cauldrons:cauldron/structure/modify/use_water\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/flowers/check_normal_flowers.mcfunction",
    "content": "# @s = boiling zauber cauldron with grass and enchanted_prismarine_shard and NO poisonous flowers inside.\n# at center of block\n# run from recipes/flowers/check_poisonous_flowers\n\n# initialise fake player (required if all flowers are poisonous/gm4_zc_flowers=1)\nscoreboard players set $normal_flowers_amount gm4_zc_fullness 0\n\n# count normal flowers\nfor flower_data in ctx.meta['flower_types']:\n    execute if score f\"${flower_data['flower']}\" gm4_zc_flowers matches 0 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:flower_data['item_id']}}}}] run scoreboard players add $normal_flowers_amount gm4_zc_fullness 1\n\n# compare amount of normal flowers in cauldron to expected amount\nexecute if score $normal_flowers_amount gm4_zc_fullness = $required_flowers gm4_zc_flowers run function gm4_zauber_cauldrons:recipes/flowers/luck\n\n# reset fake players\nscoreboard players reset $normal_flowers_amount gm4_zc_fullness\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/flowers/check_poisonous_flowers.mcfunction",
    "content": "# @s = boiling zauber cauldron with grass and enchanted_prismarine_shard inside.\n# at center of block\n# run from cauldron/recipe_checks\n\n# initialise fake players\nscoreboard players set $cancel_recipe gm4_zc_data 0\n# set expected fullness for these recipes\nscoreboard players operation $expected_item_amount gm4_zc_fullness = $required_flowers gm4_zc_flowers\n# add two to expected items (grass and enchanted_prismarine_shard)\nscoreboard players add $expected_item_amount gm4_zc_fullness 2\n\n# poisonous flowers set flag to abort recipe checks\nfor flower_data in ctx.meta['flower_types']:\n    execute if score f\"${flower_data['flower']}\" gm4_zc_flowers matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:flower_data['item_id']}}}}] run scoreboard players set $cancel_recipe gm4_zc_data 1\n\n# recipe\nexecute if score $cancel_recipe gm4_zc_data matches 0 run function gm4_zauber_cauldrons:recipes/flowers/check_normal_flowers\n\n# effect with poison if poisonous flower in cauldron\nexecute if score $cancel_recipe gm4_zc_data matches 1 at @s run function gm4_zauber_cauldrons:recipes/flowers/poison\n\n# use water and play sound once a recipe ran\nexecute if score $recipe_success gm4_zc_data matches 1 at @s if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items\nexecute if score $recipe_success gm4_zc_data matches 1 at @s run function gm4_zauber_cauldrons:cauldron/structure/modify/use_water\n\n# reset fake players\nscoreboard players reset $cancel_recipe gm4_zc_data\nscoreboard players reset $expected_item_amount gm4_zc_fullness\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/flowers/initiate_flower_types.mcfunction",
    "content": "# selects flowers to be poisounous (=1) or lucky (=0)\n# none\n# at world spawn\n# Run from init if $required_flowers gm4_zc_flowers has no score\n\n# initialize randomizer\nrandom reset gm4_zauber_cauldrons:flowers/poisonous_flowers 0 true true\n\n# assign poisonous/lucky score\nfor flower_data in ctx.meta['flower_types']:\n    execute store result score f\"${flower_data['flower']}\" gm4_zc_flowers run random value 0..1 gm4_zauber_cauldrons:flowers/poisonous_flowers\n\n# store amount of non poisonous flowers as 12-<sum of flower scores>\nscoreboard players set $required_flowers gm4_zc_flowers 12\nfor flower_data in ctx.meta['flower_types']:\n    scoreboard players operation $required_flowers gm4_zc_flowers -= f\"${flower_data['flower']}\" gm4_zc_flowers\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/flowers/luck.mcfunction",
    "content": "# @s = boiling zauber cauldron with grass and enchanted_prismarine_shard and poisonous flowers inside.\n# at center of block\n# run from recipes/flowers/check_normal_flowers\n\nexecute align xyz run kill @e[type=item,dx=0,dy=0,dz=0]\nexecute align y positioned ~ ~.75 ~ run effect give @a[distance=..2,gamemode=!spectator] minecraft:luck infinite 0 true\nsummon area_effect_cloud ~ ~.75 ~ {Tags:[\"gm4_zc_luck_cloud\"],Radius:1.6f,Duration:10,RadiusOnUse:0.0f,RadiusPerTick:0.0f,ReapplicationDelay:100,custom_particle:{type:\"minecraft:happy_villager\"},potion_contents:{custom_effects:[{id:\"minecraft:luck\",amplifier:0,duration:12,show_particles:0b}]}}\nplaysound entity.player.levelup block @a[distance=..16] ~ ~ ~ 1 1.5\nscoreboard players set $recipe_success gm4_zc_data 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/flowers/poison.mcfunction",
    "content": "# @s = boiling zauber cauldron with grass and enchanted_prismarine_shard and poisonous flowers inside.\n# at center of block\n# run from recipes/flowers/check_poisonous_flowers\n\nexecute align xyz run kill @e[type=item,dx=0,dy=0,dz=0]\nsummon area_effect_cloud ~ ~.75 ~ {CustomName:{translate:\"entity.gm4.zauber_cauldrons.smog.poison\",fallback:\"the mess they made\"},Radius:2.1f,Duration:-1,RadiusOnUse:-0.1f,RadiusPerTick:-0.005f,ReapplicationDelay:40,potion_contents:{custom_effects:[{id:\"minecraft:poison\",amplifier:2,duration:3200}]}}\nplaysound entity.elder_guardian.curse block @a[distance=..16] ~ ~ ~ 0.6 0.7\nscoreboard players set $recipe_success gm4_zc_data 1\n\n# set $expected_item_amount to 0, this turns all items into vexes\nscoreboard players set $expected_item_amount gm4_zc_fullness 0\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/magicol/bottled/select_bottle.mcfunction",
    "content": "# @s = magicol zauber cauldron with water bottle and prismarine crystals inside\n# at center of block\n# run from cauldron/recipe_checks\n\n# set expected fullness for these recipes\nscoreboard players set $expected_item_amount gm4_zc_fullness 3\n\n# set sip level returned when crafting multi-sips, in case another module messed with these presets\nexecute if score $has_soul_fire_heatsource gm4_zc_data matches 1.. run data modify storage gm4_zauber_cauldrons:blueprint/item/multi_sip gm4_zauber_cauldrons.bottle set value {sips:9,size:9,multi_use:1b}\n\n# select bottle type\n# called functions are generated via beet from templates\n# generated with the help of bolt\nfor bottle_data in ctx.meta['potion_bottles']:\n    execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:bottle_data['item_id']}}}}] run function f\"gm4_zauber_cauldrons:recipes/magicol/bottled/{bottle_data['bottle']}/select_color\"\n\n# use water or powder snow and play sound once a recipe ran\nexecute if score $current gm4_zc_moon_phase = $preferred gm4_zc_moon_phase if score $recipe_success gm4_zc_data matches 1 run function gm4_zauber_cauldrons:recipes/magicol/bottled/use_cauldron\n\n# reset fake players\nscoreboard players reset $expected_item_amount gm4_zc_fullness\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/magicol/bottled/use_cauldron.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at @s (center of block)\n# run from recipes/magicol/bottled/select_bottle\n\n# calculate amount of vexes to spawn\nexecute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items\n\n# make items in cauldron pickup-able instantly\nexecute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s\n\n# sounds and visuals\nplaysound minecraft:block.brewing_stand.brew block @a[distance=..16] ~ ~ ~ 0.6 0.66\n\n# consume liquid\nscoreboard players remove @s gm4_zc_liquid_level 1\nexecute align xyz run function gm4_zauber_cauldrons:cauldron/liquid/update/from_score\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/magicol/bottled/wrong_moon_phase.mcfunction",
    "content": "# @s = magicol zauber cauldron with water bottle and prismarine crystals inside\n# at center of block\n# run from recipes/magicol/bottled\n\n# calculate amount of vexes to spawn\nscoreboard players set $expected_item_amount gm4_zc_fullness 0\nexecute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items\n\n# sounds and visuals\nparticle minecraft:block{block_state:\"minecraft:glass\"} ~ ~.3 ~ 0.12 0.12 0.12 0 23\nplaysound minecraft:block.glass.break block @a[distance=..8] ~ ~ ~ 1 1.3\n\n# consume liquid\nscoreboard players remove @s gm4_zc_liquid_level 1\nexecute align xyz run function gm4_zauber_cauldrons:cauldron/liquid/update/from_score\n\n# return\nreturn fail\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/magicol/initiate_moon_phase_offset.mcfunction",
    "content": "# no @s.\n# at world spawn\n# called by init\n\n# generates a random moon_phase_offset based on the world seed on module installation\nrandom reset gm4_zauber_cauldrons:bottled_vex/moon_phase_offset 0 true true\nexecute store result score $magicol_offset gm4_zc_moon_phase run random value 0..7 gm4_zauber_cauldrons:bottled_vex/moon_phase_offset\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/magicol/select_color.mcfunction",
    "content": "# @s = boiling zauber cauldron with enchanted prismarine shard & magic in a bottle inside\n# at @s (center of block)\n# run from cauldron/recipe_checks\n\n# set expected fullness for these recipes\nscoreboard players set $expected_item_amount gm4_zc_fullness 3\n\n# recipes\n# called functions are generated via beet from templates\n# generated with the help of bolt\nfor color_data in ctx.meta['magicol_colors']:\n    execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:color_data['ingredient_item_id']}}}}] run function f\"gm4_zauber_cauldrons:recipes/magicol/{color_data['color']}\"\n\n# use water and play sound once a recipe ran\nexecute if score $recipe_success gm4_zc_data matches 1 run function gm4_zauber_cauldrons:recipes/magicol/use_cauldron\n\n# reset fake players\nscoreboard players reset $expected_item_amount gm4_zc_fullness\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/magicol/use_cauldron.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at @s (center of block)\n# run from recipes/magicol/select_color\n\n# calculate amount of vexes to spawn\nexecute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items\n\n# update cauldron liquid\nexecute align xyz run function gm4_zauber_cauldrons:cauldron/liquid/update/from_score\n\n# sounds and visuals\nparticle minecraft:entity_effect{color:[0.1,0.1,0.1,1.0]} ~ ~.4 ~ 0 0 0 1 10\nplaysound entity.player.levelup block @a[distance=..16] ~ ~ ~ 1 1.5\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/drinkable/check_liquid.mcfunction",
    "content": "# @s = boiling zauber cauldron with prismarine crystals, golden apple and a splash potion inside\n# at center of block\n# run from recipes/potions/select_bottle\n\n# if powder snow is present, run effect checks\n# the select_effect function is generated via beet from templates\nexecute if score $has_water gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:recipes/potions/drinkable/select_effect\n\n# strength recipe can also be executed with powder snow in the cauldron\nexecute if score $has_powder_snow gm4_zc_data matches 1.. unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"minecraft:potion\"}},\"minecraft:potion_contents\":{potion:\"minecraft:strong_strength\"}}}] run function gm4_zauber_cauldrons:recipes/potions/drinkable/strength\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/instant_damage.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at center of block\n# run from recipes/potions/ recipes\n# applies environmental effects caused by recipes\n\nparticle heart ~ ~.2 ~ .25 .2 .25 10 5\nsummon area_effect_cloud ~ ~.75 ~ {Radius:1.25f,Duration:-1,RadiusOnUse:-0.09f,RadiusPerTick:0.0f,ReapplicationDelay:20,potion_contents:{custom_effects:[{id:\"minecraft:instant_health\",amplifier:2,duration:1}]}}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/instant_health.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at center of block\n# run from recipes/potions/ recipes\n# applies environmental effects caused by recipes\n\nsummon area_effect_cloud ~ ~.75 ~ {CustomName:{translate:\"entity.gm4.zauber_cauldrons.smog.instant_health\",fallback:\"their own incompetence\"},Radius:2.1f,Duration:-1,RadiusOnUse:-0.75f,RadiusPerTick:-0.0005f,ReapplicationDelay:0,potion_contents:{custom_effects:[{id:\"minecraft:instant_damage\",amplifier:8,duration:40}]}}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/jump_boost.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at center of block\n# run from recipes/potions/ recipes\n# applies environmental effects caused by recipes\n\nparticle minecraft:effect ~0.2 ~.7 ~ 0.2 0.2 0.2 0 30\nsummon rabbit ~0.2 ~.7 ~ {RabbitType:99,Tags:[\"gm4_zc_killer_rabbit\"],attributes:[{id:\"minecraft:max_health\",base:31.0}],Health:31,active_effects:[{id:\"minecraft:regeneration\",amplifier:0,duration:2147483647,show_particles:false},{id:\"minecraft:strength\",amplifier:3,duration:2147483647,show_particles:false}]}\nplaysound minecraft:entity.illusioner.mirror_move block @a[distance=..16] ~0.2 ~.7 ~ 0.4 0.5\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/poison.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at center of block\n# run from recipes/potions/ recipes\n# applies environmental effects caused by recipes\n\n# cave spiders\nexecute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1\nexecute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1\nexecute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1\nexecute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1\nexecute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1\nexecute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1\nexecute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1\nexecute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1\nexecute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1\n\n# cobwebs\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~-1 ~0 ~-1 #gm4:replaceable run setblock ~-1 ~0 ~-1 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~-1 ~0 ~0 #gm4:replaceable run setblock ~-1 ~0 ~0 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~-1 ~0 ~1 #gm4:replaceable run setblock ~-1 ~0 ~1 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~0 ~0 ~-1 #gm4:replaceable run setblock ~0 ~0 ~-1 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~0 ~0 ~1 #gm4:replaceable run setblock ~0 ~0 ~1 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~1 ~0 ~-1 #gm4:replaceable run setblock ~1 ~0 ~-1 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~1 ~0 ~0 #gm4:replaceable run setblock ~1 ~0 ~0 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~1 ~0 ~1 #gm4:replaceable run setblock ~1 ~0 ~1 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~-1 ~1 ~-1 #gm4:replaceable run setblock ~-1 ~1 ~-1 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~-1 ~1 ~0 #gm4:replaceable run setblock ~-1 ~1 ~0 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~-1 ~1 ~1 #gm4:replaceable run setblock ~-1 ~1 ~1 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~0 ~1 ~-1 #gm4:replaceable run setblock ~0 ~1 ~-1 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~0 ~1 ~0 #gm4:replaceable run setblock ~0 ~1 ~0 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~0 ~1 ~1 #gm4:replaceable run setblock ~0 ~1 ~1 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~1 ~1 ~-1 #gm4:replaceable run setblock ~1 ~1 ~-1 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~1 ~1 ~0 #gm4:replaceable run setblock ~1 ~1 ~0 cobweb destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~1 ~1 ~1 #gm4:replaceable run setblock ~1 ~1 ~1 cobweb destroy\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/regeneration.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at center of block\n# run from recipes/potions/ recipes\n# applies environmental effects caused by recipes\n\nsummon area_effect_cloud ~ ~.75 ~ {CustomName:{translate:\"entity.gm4.zauber_cauldrons.smog.regeneration\",fallback:\"the mess they made\"},Radius:1.8f,Duration:-1,RadiusOnUse:-0.01f,RadiusPerTick:-0.0002f,ReapplicationDelay:40,potion_contents:{custom_effects:[{id:\"minecraft:wither\",amplifier:3,duration:1280}]}}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/speed.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at center of block\n# run from recipes/potions/ recipes\n# applies environmental effects caused by recipes\n\n# no environmental effect\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/strength.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at center of block\n# run from recipes/potions/ recipes\n# applies environmental effects caused by recipes\n\n# no environmental effects if powder snow was used\nexecute if score $has_powder_snow gm4_zc_data matches 1.. run return 0\n\n# sound\nplaysound item.firecharge.use block @a[distance=..8] ~ ~ ~ 0.8 0.6\n\n# place fire\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~-1 ~0 ~-1 #gm4:replaceable run setblock ~-1 ~0 ~-1 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~-1 ~0 ~0 #gm4:replaceable run setblock ~-1 ~0 ~0 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~-1 ~0 ~1 #gm4:replaceable run setblock ~-1 ~0 ~1 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~0 ~0 ~-1 #gm4:replaceable run setblock ~0 ~0 ~-1 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~0 ~0 ~1 #gm4:replaceable run setblock ~0 ~0 ~1 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~1 ~0 ~-1 #gm4:replaceable run setblock ~1 ~0 ~-1 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~1 ~0 ~0 #gm4:replaceable run setblock ~1 ~0 ~0 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~1 ~0 ~1 #gm4:replaceable run setblock ~1 ~0 ~1 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~-1 ~1 ~-1 #gm4:replaceable run setblock ~-1 ~1 ~-1 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~-1 ~1 ~0 #gm4:replaceable run setblock ~-1 ~1 ~0 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~-1 ~1 ~1 #gm4:replaceable run setblock ~-1 ~1 ~1 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~0 ~1 ~-1 #gm4:replaceable run setblock ~0 ~1 ~-1 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~0 ~1 ~1 #gm4:replaceable run setblock ~0 ~1 ~1 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~1 ~1 ~-1 #gm4:replaceable run setblock ~1 ~1 ~-1 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~1 ~1 ~0 #gm4:replaceable run setblock ~1 ~1 ~0 fire destroy\nexecute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~1 ~1 ~1 #gm4:replaceable run setblock ~1 ~1 ~1 fire destroy\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/invalid_recipe.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at @s\n# run from potions/lingering/check_liquid and potions/splash/check_liquid\n\n# remove ingredients\nexecute align xyz run kill @e[type=item,dx=0,dy=0,dz=0]\n\n#visuals\nscoreboard players reset $expected_item_amount gm4_zc_fullness\nsummon tnt\n\n# kill marker and related entities\nfunction gm4_zauber_cauldrons:cauldron/structure/destroy\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/lingering/check_liquid.mcfunction",
    "content": "# @s = boiling zauber cauldron with prismarine crystals, golden apple and a splash potion inside\n# at center of block\n# run from recipes/potions/select_bottle\n\n# if powder snow is present, run effect checks\n# the select_effect function is generated via beet from templates\nexecute if score $has_powder_snow gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:recipes/potions/lingering/select_effect\n\n# water used instead of powder snow\nexecute if score $has_water gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:recipes/potions/invalid_recipe\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/select_bottle.mcfunction",
    "content": "# @s = boiling zauber cauldron with prismarine crystals and golden apple inside\n# at center of block\n# run from cauldron/recipe_checks\n\n# set expected fullness for these recipes\nscoreboard players set $expected_item_amount gm4_zc_fullness 3\n\n# set sip level returned when crafting multi-sips, in case another module messed with these presets\nexecute if score $has_soul_fire_heatsource gm4_zc_data matches 1.. run data modify storage gm4_zauber_cauldrons:blueprint/item/multi_sip gm4_zauber_cauldrons.bottle set value {sips:9,size:9,multi_use:1b}\n\n# select bottle type\n# generated with the help of bolt\nfor bottle_data in ctx.meta['potion_bottles']:\n    execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:bottle_data['item_id']}}}}] run function f\"gm4_zauber_cauldrons:recipes/potions/{bottle_data['bottle']}/check_liquid\"\n\n# use water or powder snow and play sound once a recipe ran\nexecute if score $recipe_success gm4_zc_data matches 1 run function gm4_zauber_cauldrons:recipes/potions/use_cauldron\n\n# reset fake players\nscoreboard players reset $expected_item_amount gm4_zc_fullness\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/splash/check_liquid.mcfunction",
    "content": "# @s = boiling zauber cauldron with prismarine crystals, golden apple and a splash potion inside\n# at center of block\n# run from recipes/potions/select_bottle\n\n# if powder snow is present, run effect checks\n# the select_effect function is generated via beet from templates\nexecute if score $has_powder_snow gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:recipes/potions/splash/select_effect\n\n# water used instead of powder snow\nexecute if score $has_water gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:recipes/potions/invalid_recipe\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/use_cauldron.mcfunction",
    "content": "# @s = boiling zauber cauldron with recipe inside\n# at @s\n# run from zauber_potions\n\n# calculate amount of vexes to spawn\nexecute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items\n\n# make items in cauldron pickup-able instantly\nexecute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s\n\n# sounds and visuals\nplaysound minecraft:block.brewing_stand.brew block @a[distance=..16] ~ ~ ~ 0.6 0.66\n\n# consume liquid\nfunction gm4_zauber_cauldrons:cauldron/structure/modify/use_liquid\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/precursors/enchanted_prismarine_shard.mcfunction",
    "content": "# @s = boiling zauber cauldron with a precursor inside.\n# at center of block\n# run from cauldron/recipe_checks\n\n# set expected fullness for these recipes\nscoreboard players set $expected_item_amount gm4_zc_fullness 1\n\n# remove ingredients\nexecute align xyz run kill @e[type=item,dx=0,dy=0,dz=0]\n\n# recipe\nloot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/enchanted_prismarine_shard\n\n# make items in cauldron pickup-able instantly\nexecute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s\n\n# use xp\nexecute as @a[level=30..,distance=..2,limit=1,sort=nearest,gamemode=!spectator] run experience add @s[gamemode=!creative] -30 levels\n\n# sounds and visuals\nplaysound block.portal.travel block @a[distance=..16] ~ ~ ~ .2 1.2\nparticle enchanted_hit ~ ~.4 ~ .1 .1 .1 .15 10\n\n# use water and play sound once a recipe ran\nfunction gm4_zauber_cauldrons:cauldron/structure/modify/use_water\n\n# check for leftover items\nexecute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items\n\n# reset fake players\nscoreboard players reset $expected_item_amount gm4_zc_fullness\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/soulution/potion_landed.mcfunction",
    "content": "# spawn copy of potion with one use less when a zauber splash soulution hits the ground\n# @s = @e[type=marker,tag=gm4_potion_tracker]\n# at @s\n# run from zauber_cauldrons:soulution/thrown_potion_tracking/verify_potion_nbt\n\n# pull data of thrown potion into storage\ndata modify storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item set from storage gm4_potion_tracking:temp entity_data.Item\n\n# set to use throws instead of sips\nscoreboard players set $use_alternative_sips gm4_zc_data 1\n\n# check remaining sips\nexecute store result score $remaining_sips gm4_zc_data run data get storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item.components.\"minecraft:custom_data\".gm4_zauber_cauldrons.bottle.sips\nexecute if score $remaining_sips gm4_zc_data matches 2.. run function gm4_zauber_cauldrons:soulution/spawn_copy\n\n# reset fake players and storage\nscoreboard players reset $remaining_sips gm4_zc_data\nscoreboard players reset $use_alternative_sips gm4_zc_data\ndata remove storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/soulution/spawn_copy.mcfunction",
    "content": "# Spawns a new soulution item at the location where a splash or lingering soulution hit the ground, with one less sip\n# @s = thrown zauber splash soulution that hit the ground (signaled by lib_potion_tracking)\n# at @s\n# run from zauber_cauldrons:soulution/thrown_potion_tracking/potion_landed\n\n# use sip and provided edited potion item in yellow shulker box (gamemode 4 lib_forceload standard)\nfunction gm4_zauber_cauldrons:soulution/use_sip\n\n# spawn potion item\nloot spawn ~ ~ ~ mine 29999998 1 7134 minecraft:stick[custom_data={drop_contents:1b}]\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/soulution/use_sip.mcfunction",
    "content": "# Removes one sip from a soulution stored in storage gm4_zauber_cauldrons:temp/item/multi_use_bottle. Utility function called from multiple locations.\n# @s = varies, check calling functions\n# at varies, check calling functions\n# run from player/multi_use_bottle/modify_bottle and \n\n# NOTE:\n# Before calling this function, a couple of steps must be taken by the calling function to prepare\n# scores and storages. These are:\n# 1) Fake player $remaining_sips in gm4_zc_data must be set to the amount of uses left on the soulution (the amount before a sip was used!).\n#    This fake player should be reset by the calling function afterwards.\n# 2) Storage gm4_zauber_cauldrons:temp/item/multi_use_bottle must have item-formatted nbt\n#    (like entries inside the Items array of containers, or the Item nb tag on item entities) in the nb tag 'Item'.\n#    This nbt will be used as a base for the item with one sip removed. Note that the first line of lore will be overwritten by the new\n#    sip information. This storage should be reset by the calling function afterwards via storage remove <...>.\n# 3) Fake player $use_alternative_sips in gm4_zc_data must be set to 1 if 'throws' should be displayed instead of 'sips'. This is a purely visual change.\n#    This fake player should be reset by the calling function afterwards.\n#\n# The item with the updated sip information will be placed in slot 0 of the yellow shulker box at minecraft:overworld 29999998 1 7134 (see lib_forceload),\n# from where the calling function must then immediately use it (waiting even for a single tick may cause the item to be overwritten).\n#\n# This function does not implement any sort of safeguard reagarding invalid sip amounts, i.e. the calling function must ensure there are still sips\n# left to be used on the soulution, e.g. by checking whether there were at least two sips remaining before the soulution was used.\n\n# subtract one sip\nscoreboard players remove $remaining_sips gm4_zc_data 1\nexecute store result storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item.components.\"minecraft:custom_data\".gm4_zauber_cauldrons.bottle.sips int 1 run scoreboard players get $remaining_sips gm4_zc_data\n\n# set slot information to target slot 0 in the yellow shulker box\ndata modify storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item.Slot set value 0b\n\n# move data into shulker box at 29999998 1 7134 (gamemode 4 lib_forceload standard)\nexecute in overworld run data modify block 29999998 1 7134 Items append from storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item\n\n# update lore\nscoreboard players add $use_alternative_sips gm4_zc_data 0\nitem modify block 29999998 1 7134 container.0 gm4_zauber_cauldrons:soulution/update_sips\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/thrown_potion_tracking/tag_potion.mcfunction",
    "content": "# marks thrown potion for tracking by lib_potion tracking\n# @s = @e[type=potion,tag=!gm4_potion_tracking_checked]\n# at @s\n# run from function tag #gm4_potion_tracking:tag_potion\n\ntag @s[tag=!gm4_potion,nbt={Item:{components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{bottle:{multi_use:1b}}}}}}] add gm4_potion\ntag @s[tag=!gm4_potion,nbt={Item:{components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"bottled_magicol\"}}}}}] add gm4_potion\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/thrown_potion_tracking/verify_potion_nbt.mcfunction",
    "content": "# checks if the potion that hit the ground was a zauber potion\n# @s = @e[type=marker,tag=gm4_potion_tracker]\n# at @s\n# run from function tag #gm4_potion_tracking:potion_landed\n\nexecute if data storage gm4_potion_tracking:temp entity_data.Item.components.\"minecraft:custom_data\"{gm4_zauber_cauldrons:{bottle:{multi_use:1b}}} run function gm4_zauber_cauldrons:soulution/potion_landed\nexecute if data storage gm4_potion_tracking:temp entity_data.Item.components.\"minecraft:custom_data\"{gm4_zauber_cauldrons:{item:\"bottled_magicol\"}} run function gm4_zauber_cauldrons:bottled_magicol/potion_landed\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/upgrade_paths/1.10.mcfunction",
    "content": "# add pre-computed location and dimension data to existing Zauber Cauldrons, if there is a player in the same dimension as the cauldron (required for obtaining the dimension id)\nexecute as @e[type=marker,tag=gm4_zauber_cauldron,scores={gm4_entity_version=..1}] at @s if entity @p[x=0] run function gm4_zauber_cauldrons:cauldron/setup/initialize_marker\ntag @a remove gm4_zc_luck\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/guidebook/zauber_cauldrons.json",
    "content": "{\n  \"id\": \"zauber_cauldrons\",\n  \"name\": \"Zauber Cauldrons\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:cauldron\"\n  },\n  \"criteria\": {\n    \"obtain_enchanted_book\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:enchanted_book\"\n            ]\n          }\n        ]\n      }\n    },\n    \"create_zauber_cauldron\": {\n      \"trigger\": \"minecraft:tick\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"player\",\n                \"advancements\": {\n                  \"gm4:zauber_cauldrons_create\": true\n                }\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_potion\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:potion\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_prismarine_shard\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:prismarine_shard\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_gold_armor\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:golden_boots\",\n              \"minecraft:golden_chestplate\",\n              \"minecraft:golden_helmet\",\n              \"minecraft:golden_leggings\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_zauber_potion\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{bottle:{}}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_nether_star\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:nether_star\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_zauber_crystal\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:player_head\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:'crystal'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_any_zauber_item\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_bottled_vex\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:glass_bottle\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:'bottled_vex'}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_bottled_magicol\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:potion\"\n            ],\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\"}}\"\n            }\n          }\n        ]\n      }\n    },\n    \"obtain_chorus_fruit\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:chorus_fruit\",\n              \"minecraft:popped_chorus_fruit\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.description\",\n            \"fallback\": \"Zauber Cauldrons expand the magic system, allowing the creation of stronger potions, magical armour, effect granting crystals, and bottled wormholes.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"creation\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_enchanted_book\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.section.creation\",\n            \"fallback\": \"Creation\",\n            \"bold\": true\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.creation\",\n            \"fallback\": \"A Zauber Cauldron is created by holding an enchanted book while looking into a water-filled cauldron over fire.\\n\\nSoul fire and campfires work as well.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"recipes\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"create_zauber_cauldron\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.recipes\",\n            \"fallback\": \"Zauber recipes are performed by dropping items into the cauldron, consuming some water for each recipe.\\n\\nWhen looking at a Zauber Cauldron, items inside the cauldron won't be picked up.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"description\",\n        \"creation\"\n      ]\n    },\n    {\n      \"name\": \"potions\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_potion\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.section.potions\",\n            \"fallback\": \"Zauber Potions\",\n            \"bold\": true\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.tier_4_potions\",\n            \"fallback\": \"Powerful tier IV potions can be created by dropping a tier II potion, prismarine crystals, and golden apple into the cauldron.\\n\\nThere are some side effects when creating the tier IV potions.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.splash_and_lingering_potions\",\n            \"fallback\": \"Splash and Lingering potions create an excess of heat and will explode if used in a tier IV potion recipe.\\n\\nUsing a snow powder cauldron will absorb the heat and successfully create a splash or lingering tier IV potion.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.soulutions\",\n            \"fallback\": \"Using soul fire underneath the cauldron will cause all brewed potions to be brewed as a Soulution.\\n\\nSoulutions can be drank 9 times before emptying.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.splash_and_lingering_soulutions\",\n            \"fallback\": \"Splash and Lingering soulutions can be created in the same way.\\n\\nWhen it lands, a splash or lingering soulution will summon a new soulution bottle at the location.\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"recipes\"\n      ]\n    },\n    {\n      \"name\": \"enchanted_shard\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_prismarine_shard\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.section.enchanted_prismarine_shard\",\n            \"fallback\": \"Advanced Reactants\",\n            \"bold\": true\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.enchanted_prismarine_shard\",\n            \"fallback\": \"An enchanted prismarine shard is used to upgrade armour and as a way to get Luck.\\n\\nThey can be created in a Zauber Cauldron or bought from a wandering trader.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.enchanted_prismarine_shard_creation\",\n            \"fallback\": \"They can be created by dropping a prismarine shard in the cauldron while standing nearby with at least 30 experience levels.\\n\\nThis will consume 30 levels from the nearest applicable observer.\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"recipes\"\n      ]\n    },\n    {\n      \"name\": \"armor\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_gold_armor\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.section.armor\",\n            \"fallback\": \"Zauber Armour\",\n            \"bold\": true\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.armor\",\n            \"fallback\": \"Zauber armour can be made with a piece of gold armour, an enchanted prismarine shard and a modifier item.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.armor_modifiers\",\n            \"fallback\": \"The following items can be used as a modifier.\\n\\nGlistering Melon\\n  +6 health\\nBlaze Powder\\n  +35% Attack Damage\\nSugar\\n  +12% Speed\\nTurtle Helmet\\n  +1 Armour\\n\\nWearing a full set buffs the most prevalent modifier(s).\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.armor_effects\",\n            \"fallback\": \"Zauber armour has about a 55% increase in defense compared to normal gold armour.\\n\\nEach piece of Zauber Armour also has an Armour Toughness of 3, making it comparable to diamond armour.\"\n          }\n        ]\n      ],\n      \"prerequisites\": [\n        \"enchanted_shard\"\n      ]\n    },\n    {\n      \"name\": \"crystals\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_nether_star\"\n        ],\n        [\n          \"obtain_zauber_potion\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.section.crystals\",\n            \"fallback\": \"Zauber Crystals\",\n            \"bold\": true\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.crystals\",\n            \"fallback\": \"Zauber Crystals can be created with a sea lantern, nether star and tier IV potion.\\n\\nCrystals only function in the offhand of someone with the luck effect.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"luck\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_zauber_crystal\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.section.luck\",\n            \"fallback\": \"Luck\",\n            \"bold\": true\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.lucky_flowers\",\n            \"fallback\": \"Each world has a different set of 'lucky' and 'poisonous' flowers.\\n\\nEach of the twelve small flowers fall under one of those categories.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.luck_output\",\n            \"fallback\": \"These flowers are used for the Luck recipe, which grants the nearest one with Luck until death.\\n\\nIf some of the lucky flowers are missing from the Luck recipe, then nothing will happen.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.luck_output_poison\",\n            \"fallback\": \"However, if a poisonous flower is added to the recipe, the cauldron will emit a poisonous cloud.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.luck\",\n            \"fallback\": \"Luck can be granted to the nearest user by throwing lucky flowers, an enchanted prismarine shard, and short grass into a zauber cauldron.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"crystals\"\n      ]\n    },\n    {\n      \"name\": \"extra_ingredients\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_any_zauber_item\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.section.extra_ingredients\",\n            \"fallback\": \"Magic in a Bottle\",\n            \"bold\": true\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.extra_ingredients\",\n            \"fallback\": \"Any extra ingredients added to a Zauber recipe will leave the cauldron as Possessed Items, weaponless vexes.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.bottling_vexes\",\n            \"fallback\": \"If a glass bottle is added to a recipe with extra ingredients, it can instead capture multiples of 3 Possessed Items.\\n\\nSo if 4 possessed items would normally spawn, 3 would be contained and 1 would be free.\"\n          }\n        ]\n      ],\n      \"grants\": [\n        \"recipes\"\n      ]\n    },\n    {\n      \"name\": \"magic_in_a_bottle\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_bottled_vex\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.magic_in_a_bottle\",\n            \"fallback\": \"If a Magic in a Bottle is left on the ground, the bottle will break and release the vexes.\\n\\nA Magic in a Bottle stores the location it was created which is useful in creating wormholes.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.bottled_vex_moon_phase\",\n            \"fallback\": \"Each Magic in a Bottle has a preferred moon phase.\\n\\nDuring this moon phase, the bottle doesn't break as quickly and will sparkle to players wearing full zauber armor.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.section.magicol\",\n            \"fallback\": \"Magicol\",\n            \"bold\": true\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.magicol_description\",\n            \"fallback\": \"Water inside a Cauldron can be converted into a liquid called Magicol.\\n\\nMagicol is useful for converting areas into colored, spawn-proof biomes.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.magicol_creation\",\n            \"fallback\": \"Dropping Magic in a Bottle, an enchanted prismarine shard and a dye into a water-filled zauber cauldron will dye the liquid into magicol.\\n\\nThe level of the liquid is conserved through this process.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.magicol_bottling\",\n            \"fallback\": \"Magicol can be bottled only during the preferred moon phase of the magic in a bottle used to create it.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.magicol_bottling_1\",\n            \"fallback\": \"Magicol can be bottled by dropping a splash or lingering water bottle and one piece of prismarine crystals, along with either a slime ball, magma cream, or snowball.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"magicol_usage\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_bottled_magicol\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.downfall\",\n            \"fallback\": \"Magicol bottled with slime balls will be temperate with rain.\\n\\nWith magma cream they will be arid with no rain, and with snowballs they will be polar with snow.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.magicol_potion_types\",\n            \"fallback\": \"Soulutions can be created as normal.\\n\\nLingering bottles of magicol will create permanent particles inside the biome.\\n\\nDrinkable bottles of magicol can be created, but have no effect.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.bottled_magicol_usage\",\n            \"fallback\": \"Throwing a magicol bottle will cause the splashed area to turn into a new biome.\\n\\nThese biomes are colored according to the magicol liquid and do not spawn any mobs.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.magicol_biome_colors\",\n            \"fallback\": \"When a new magicol biome is created, short grass and flowers will grow.\\n\\nLucky flowers are the only ones that grow when first splashing an area.\"\n          }\n        ]\n      ]\n    },\n    {\n      \"name\": \"wormholes\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_bottled_vex\"\n        ],\n        [\n          \"obtain_chorus_fruit\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.section.wormholes\",\n            \"fallback\": \"Wormholes\",\n            \"bold\": true\n          },\n          \"\\n\",\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.wormhole_creation\",\n            \"fallback\": \"Throwing an Enchanted Shard, Magic in a Bottle, and some quantity of both Chorus Fruit and Popped Chorus Fruit will create a Wormhole in a Bottle with the location of the Magic in a Bottle.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.wormhole_chorus_amounts\",\n            \"fallback\": \"The precise amount of fruit is different for each world, and requires experiments with blurry wormholes and possessed items.\\n\\nToo few chorus will result in blurry wormholes, locating to a random nearby location.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.wormhole_chorus_amounts_1\",\n            \"fallback\": \"If too many chorus or popped chorus are used, the excess fruit will transform into possessed items, but a precise wormhole will be created.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_cauldrons.wormhole_teleportation\",\n            \"fallback\": \"Wormholes explode when the drinker reaches their destination, damaging surrounding blocks without harming the drinker.\\n\\nIf they end up in a cauldron, there no is explosion.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/item_modifier/soulution/update_sips.json",
    "content": "[\n    {\n        \"function\": \"minecraft:set_lore\",\n        \"mode\": \"replace_section\",\n        \"offset\": 0,\n        \"entity\": \"this\",\n        \"lore\": [\n            [\n                {\n                    \"nbt\": \"Item.components.'minecraft:custom_data'.gm4_zauber_cauldrons.bottle.sips\",\n                    \"storage\": \"gm4_zauber_cauldrons:temp/item/multi_use_bottle\",\n                    \"plain\": true,\n                    \"color\": \"gray\",\n                    \"italic\": false\n                },\n                {\n                    \"text\": \"/\",\n                    \"color\": \"gray\",\n                    \"italic\": false\n                },\n                {\n                    \"nbt\": \"Item.components.'minecraft:custom_data'.gm4_zauber_cauldrons.bottle.size\",\n                    \"storage\": \"gm4_zauber_cauldrons:temp/item/multi_use_bottle\",\n                    \"plain\": true,\n                    \"color\": \"gray\",\n                    \"italic\": false\n                },\n                {\n                    \"text\": \" \",\n                    \"color\": \"gray\",\n                    \"italic\": false\n                },\n                {\n                    \"translate\": \"item.gm4.zauber_cauldrons.multi_use_bottle.lore.sips\",\n                    \"fallback\": \"Sips\",\n                    \"color\": \"gray\",\n                    \"italic\": false\n                }\n            ]\n        ],\n        \"conditions\": [\n            {\n                \"condition\": \"minecraft:value_check\",\n                \"value\": {\n                    \"type\": \"minecraft:score\",\n                    \"target\": {\n                        \"type\": \"minecraft:fixed\",\n                        \"name\": \"$use_alternative_sips\"\n                    },\n                    \"score\": \"gm4_zc_data\"\n                },\n                \"range\": 0\n            }\n        ]\n    },\n    {\n        \"function\": \"minecraft:set_lore\",\n        \"mode\": \"replace_section\",\n        \"offset\": 0,\n        \"entity\": \"this\",\n        \"lore\": [\n            [\n                {\n                    \"nbt\": \"Item.components.'minecraft:custom_data'.gm4_zauber_cauldrons.bottle.sips\",\n                    \"storage\": \"gm4_zauber_cauldrons:temp/item/multi_use_bottle\",\n                    \"plain\": true,\n                    \"color\": \"gray\",\n                    \"italic\": false\n                },\n                {\n                    \"text\": \"/\",\n                    \"color\": \"gray\",\n                    \"italic\": false\n                },\n                {\n                    \"nbt\": \"Item.components.'minecraft:custom_data'.gm4_zauber_cauldrons.bottle.size\",\n                    \"storage\": \"gm4_zauber_cauldrons:temp/item/multi_use_bottle\",\n                    \"plain\": true,\n                    \"color\": \"gray\",\n                    \"italic\": false\n                },\n                {\n                    \"text\": \" \",\n                    \"color\": \"gray\",\n                    \"italic\": false\n                },\n                {\n                    \"translate\": \"item.gm4.zauber_cauldrons.multi_use_bottle.lore.throws\",\n                    \"fallback\": \"Throws\",\n                    \"color\": \"gray\",\n                    \"italic\": false\n                }\n            ]\n        ],\n        \"conditions\": [\n            {\n                \"condition\": \"minecraft:value_check\",\n                \"value\": {\n                    \"type\": \"minecraft:score\",\n                    \"target\": {\n                        \"type\": \"minecraft:fixed\",\n                        \"name\": \"$use_alternative_sips\"\n                    },\n                    \"score\": \"gm4_zc_data\"\n                },\n                \"range\": 1\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/loot_table/items/bottled_vex.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:glass_bottle\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:enchantment_glint_override\": true,\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:item/magic_in_a_bottle\"]}\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_zauber_cauldrons:{item:'bottled_vex'}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:copy_custom_data\",\n                            \"source\": {\n                                \"type\": \"minecraft:storage\",\n                                \"source\": \"gm4_zauber_cauldrons:temp/item/bottled_vex\"\n                            },\n                            \"ops\": [\n                                {\n                                    \"source\": \"gm4_zauber_cauldrons\",\n                                    \"target\": \"gm4_zauber_cauldrons\",\n                                    \"op\": \"merge\"\n                                }\n                            ]\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.magic_in_a_bottle\",\n                                \"fallback\": \"Magic in a Bottle\"\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/loot_table/items/enchanted_prismarine_shard.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:prismarine_shard\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_components\",\n              \"components\": {\n                \"minecraft:enchantment_glint_override\": true,\n                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:item/enchanted_prismarine_shard\"]},\n                \"minecraft:rarity\": \"rare\"\n              }\n            },\n            {\n              \"function\": \"minecraft:set_custom_data\",\n              \"tag\": \"{gm4_zauber_cauldrons:{item:'enchanted_prismarine_shard'}}\"\n            },\n            {\n              \"function\": \"minecraft:set_name\",\n              \"target\": \"item_name\",\n              \"name\": {\n                \"translate\": \"item.gm4.enchanted_prismarine_shard\",\n                \"fallback\": \"Enchanted Prismarine Shard\"\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/loot_table/items/wormhole.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:potion\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:enchantment_glint_override\": true,\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:item/wormhole_in_a_bottle\"]},\n                                \"minecraft:potion_contents\": {\n                                    \"potion\": \"minecraft:thick\",\n                                    \"custom_color\": 8587123\n                                },\n                                \"minecraft:tooltip_display\": {\n                                    \"hidden_components\": [\n                                        \"minecraft:potion_contents\"\n                                    ]\n                                }\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_zauber_cauldrons:{item:'wormhole_bottle',bottle:{multi_use:0b}}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.wormhole_in_a_bottle\",\n                                \"fallback\": \"Wormhole in a Bottle\",\n                                \"italic\": false\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"entity\": \"this\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.wormhole_in_a_bottle\",\n                                \"fallback\": \"Wormhole in a Bottle\",\n                                \"italic\": false\n                            },\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$has_soul_fire_heatsource\"\n                                        },\n                                        \"score\": \"gm4_zc_data\"\n                                    },\n                                    \"range\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"function\": \"minecraft:copy_custom_data\",\n                            \"source\": {\n                                \"type\": \"minecraft:storage\",\n                                \"source\": \"gm4_zauber_cauldrons:blueprint/item/multi_sip\"\n                            },\n                            \"ops\": [\n                                {\n                                    \"source\": \"gm4_zauber_cauldrons.bottle\",\n                                    \"target\": \"gm4_zauber_cauldrons.bottle\",\n                                    \"op\": \"replace\"\n                                }\n                            ],\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$has_soul_fire_heatsource\"\n                                        },\n                                        \"score\": \"gm4_zc_data\"\n                                    },\n                                    \"range\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"function\": \"minecraft:copy_custom_data\",\n                            \"source\": {\n                                \"type\": \"minecraft:storage\",\n                                \"source\": \"gm4_zauber_cauldrons:blueprint/item/wormhole\"\n                            },\n                            \"ops\": [\n                                {\n                                    \"source\": \"gm4_zauber_cauldrons.cauldron_pos\",\n                                    \"target\": \"gm4_zauber_cauldrons.cauldron_pos\",\n                                    \"op\": \"replace\"\n                                }\n                            ]\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"entity\": \"this\",\n                            \"lore\": [\n                                [\n                                    {\n                                        \"nbt\": \"gm4_zauber_cauldrons.bottle.sips\",\n                                        \"storage\": \"gm4_zauber_cauldrons:blueprint/item/multi_sip\",\n                                        \"plain\": true,\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    },\n                                    {\n                                        \"text\": \"/\",\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    },\n                                    {\n                                        \"nbt\": \"gm4_zauber_cauldrons.bottle.size\",\n                                        \"storage\": \"gm4_zauber_cauldrons:blueprint/item/multi_sip\",\n                                        \"plain\": true,\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    },\n                                    {\n                                        \"text\": \" \",\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    },\n                                    {\n                                        \"translate\": \"item.gm4.zauber_cauldrons.multi_use_bottle.lore.sips\",\n                                        \"fallback\": \"Sips\",\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    }\n                                ]\n                            ],\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$has_soul_fire_heatsource\"\n                                        },\n                                        \"score\": \"gm4_zc_data\"\n                                    },\n                                    \"range\": 1\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/loot_table/wandering_trader/enchanted_prismarine_shard.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_zauber_cauldrons:items/enchanted_prismarine_shard\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": 3,\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:random_chance\",\n                                    \"chance\": 0.125\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:emerald\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": {\n                                \"min\": 24,\n                                \"max\": 47\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/loot_table/wandering_trader/golden_apple.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:golden_apple\"\n                }\n            ]\n        },\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:emerald\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": {\n                                \"min\": 10,\n                                \"max\": 14\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/loot_table/wandering_trader/prismarine_crystals.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:prismarine_crystals\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": {\n                                \"min\": 8,\n                                \"max\": 24\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:emerald\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_count\",\n                            \"count\": {\n                                \"min\": 2,\n                                \"max\": 4\n                            }\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/cauldron/cave_spider_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.5\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/cauldron/clear_night.json",
    "content": "{\n    \"condition\": \"minecraft:all_of\",\n    \"terms\": [\n        {\n            \"condition\": \"minecraft:time_check\",\n            \"clock\": \"minecraft:overworld\",\n            \"value\": {\n                \"min\": 13000,\n                \"max\": 23000\n            },\n            \"period\": 24000\n        },\n        {\n            \"condition\": \"minecraft:weather_check\",\n            \"raining\": false,\n            \"thundering\": false\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/cauldron/cobweb_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.33\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/cauldron/fire_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.66\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/advancement/use/multi_use_bottle.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"type_specific\": {\n      \"type\": \"player\",\n      \"advancements\": {\n        \"gm4_zauber_cauldrons:use/multi_use_bottle\": true\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/armor/full.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"head\": {\n        \"items\": [\n          \"golden_helmet\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"zauber_armor\\\"}}\"\n        }\n      },\n      \"chest\": {\n        \"items\": [\n          \"golden_chestplate\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"zauber_armor\\\"}}\"\n        }\n      },\n      \"legs\": {\n        \"items\": [\n          \"golden_leggings\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"zauber_armor\\\"}}\"\n        }\n      },\n      \"feet\": {\n        \"items\": [\n          \"golden_boots\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"zauber_armor\\\"}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/bucket/in_mainhand.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"mainhand\": {\n                \"items\": [\n                    \"minecraft:bucket\"\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/bucket/in_offhand.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"offhand\": {\n                \"items\": [\n                    \"minecraft:bucket\"\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/crystal/luck_and_in_offhand.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"effects\": {\n      \"luck\": {}\n    },\n    \"equipment\": {\n      \"offhand\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"crystal\\\"}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/enchanted_book/in_mainhand.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:enchanted_book\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/glass_bottle/in_mainhand.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:glass_bottle\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/glass_bottle/in_offhand.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:glass_bottle\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/multi_use_bottle/in_mainhand.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:potion\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{bottle:{multi_use:1b}}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/multi_use_bottle/in_offhand.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:potion\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{bottle:{multi_use:1b}}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/water_bottle/in_mainhand.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"mainhand\": {\n                \"items\": [\n                    \"minecraft:potion\"\n                ],\n                \"predicates\": {\n                    \"minecraft:potion_contents\": \"minecraft:water\"\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/water_bottle/in_offhand.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"offhand\": {\n                \"items\": [\n                    \"minecraft:potion\"\n                ],\n                \"predicates\": {\n                    \"minecraft:potion_contents\": \"minecraft:water\"\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/water_bucket/in_mainhand.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"mainhand\": {\n                \"items\": [\n                    \"minecraft:water_bucket\"\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/water_bucket/in_offhand.json",
    "content": "{\n    \"condition\": \"minecraft:entity_properties\",\n    \"entity\": \"this\",\n    \"predicate\": {\n        \"equipment\": {\n            \"offhand\": {\n                \"items\": [\n                    \"minecraft:water_bucket\"\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/wormhole/in_mainhand.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"mainhand\": {\n        \"items\": [\n          \"minecraft:potion\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"wormhole_bottle\\\"}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/wormhole/in_offhand.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"equipment\": {\n      \"offhand\": {\n        \"items\": [\n          \"minecraft:potion\"\n        ],\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{item:\\\"wormhole_bottle\\\"}}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/survival_or_adventure.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"type_specific\": {\n      \"type\": \"player\",\n      \"gamemode\": [\n        \"survival\",\n        \"adventure\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/wandering_trader/enchanted_prismarine_shard_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.33\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/wandering_trader/golden_apple_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.5\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/wandering_trader/prismarine_crystals_chance.json",
    "content": "{\n    \"condition\": \"minecraft:random_chance\",\n    \"chance\": 0.4\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/block/soul_fire_heatsource.json",
    "content": "{\n  \"values\": [\n    \"minecraft:soul_fire\",\n    \"minecraft:soul_campfire\"\n  ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/function/cauldron/liquid/cauldron_particles.json",
    "content": "{\n    \"values\": [\n        \"gm4_zauber_cauldrons:cauldron/liquid/magicol/check_liquid_id\"\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/function/cauldron/liquid/drain_bottle_into_cauldron.json",
    "content": "{\n    \"values\": [\n        \n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/function/cauldron/liquid/drain_bucket_into_cauldron.json",
    "content": "{\n    \"values\": [\n        \n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/function/cauldron/liquid/fill_bottle_from_cauldron.json",
    "content": "{\n    \"values\": [\n        \n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/function/cauldron/liquid/fill_bucket_from_cauldron.json",
    "content": "{\n    \"values\": [\n        \n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/function/player/wormhole_targeting/prepare_teleport.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/item/golden_armor.json",
    "content": "{\n    \"values\": [\n        \"minecraft:golden_helmet\",\n        \"minecraft:golden_chestplate\",\n        \"minecraft:golden_leggings\",\n        \"minecraft:golden_boots\"\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/armor/craft_piece.mcfunction",
    "content": "# @s = heated water zauber cauldron with enchanted prismarine shard and golden {{piece}} inside\n# at @s (center of block)\n# run from recipe/armor/{{piece}}/select_flavor\n\n# remove ingredients\nexecute align xyz run kill @e[type=item,dx=0,dy=0,dz=0]\n\n# summon item\n# item modifier is generated via beet from templates\nsummon item ~ ~.2 ~ {Tags:[\"gm4_zc_temp_armor_piece\"],Item:{id:\"minecraft:golden_{{piece}}\",count:1}}\nexecute as @e[type=item,dx=0,dy=0,dz=0,tag=gm4_zc_temp_armor_piece,limit=1] run function gm4_zauber_cauldrons:recipes/armor/init_piece with storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,id:\"minecraft:golden_{{piece}}\"}]\nitem modify entity @e[type=item,dx=0,dy=0,dz=0,tag=gm4_zc_temp_armor_piece,limit=1] contents gm4_zauber_cauldrons:armor/{{piece}}/{{flavor}}\ntag @e[type=item,dx=0,dy=0,dz=0] remove gm4_zc_temp_armor_piece\n\n# set flag\nscoreboard players set $recipe_success gm4_zc_data 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/armor/select_flavor.mcfunction",
    "content": "# @s = heated water zauber cauldron with enchanted prismarine shard and golden {{piece}} inside\n# at @s (center of block)\n# run from recipe/armor/select_piece\n\n# generated with the help of bolt\nfor flavor_data in ctx.meta['armor_flavors']:\n    execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:flavor_data['ingredient_item_id']}}}}] run function f\"gm4_zauber_cauldrons:recipes/armor/{{piece}}/{flavor_data['flavor']}\"\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/bottled_magicol/color_biome.mcfunction",
    "content": "# Colors the biome hit by this potion in {{weather_modifier}} {{color}} depending on the potion bottle type thrown\n# @s = @e[type=marker,tag=gm4_potion_tracker]\n# at @s\n# run from zauber_cauldrons:bottled_magicol/{{color}}/select_weather_modifier\n\n# prepare fillbiome\nexecute if data storage gm4_zauber_cauldrons:temp/item/bottled_magicol Item{id:\"minecraft:splash_potion\"} run summon marker ~ ~ ~ {CustomName:\"gm4_zauber_cauldrons_magicol_painter\",Tags:[\"gm4_zc_magicol_painter\"],data:{gm4_zauber_cauldrons:{biome:\"gm4_zauber_cauldrons:{{weather_modifier}}_{{color}}_verzauberte_plains\",flower:\"{{flower}}\"}}}\nexecute if data storage gm4_zauber_cauldrons:temp/item/bottled_magicol Item{id:\"minecraft:lingering_potion\"} run summon marker ~ ~ ~ {CustomName:\"gm4_zauber_cauldrons_magicol_painter\",Tags:[\"gm4_zc_magicol_painter\"],data:{gm4_zauber_cauldrons:{biome:\"gm4_zauber_cauldrons:glittering_{{weather_modifier}}_{{color}}_verzauberte_plains\",flower:\"{{flower}}\"}}}\n\n# eyecandy\n# TODO 1.20.5: figure out how this particle looked in 1.20.4\nexecute if loaded ~ ~ ~ run summon area_effect_cloud ~ ~ ~ {CustomName:\"gm4_zauber_cauldrons_magicol_painter_particle\",custom_particle:{type:\"minecraft:entity_effect\",color:[1.0,1.0,1.0,1.0]},Radius:5f,Duration:5,Color:{{potion_color}},Tags:[\"gm4_zc_magicol_painter_particle\"]}\nparticle minecraft:end_rod ~ ~ ~ 0.2 0.2 0.2 0.3 128\n\n# run fillbiome\nfunction gm4_zauber_cauldrons:bottled_magicol/maintain_magicol_painters\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/bottled_magicol/select_weather_modifier.mcfunction",
    "content": "# Selects weather modifier of magicol thrown\n# @s = @e[type=marker,tag=gm4_potion_tracker]\n# at @s\n# run from zauber_cauldrons:bottled_magicol/potion_landed\n\n# check which weather modifier to use\n# called functions are generated via beet from templates\n# generated with the help of bolt\nfor modifier_data in ctx.meta['weather_modifiers']:\n    execute unless score $selected_color gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/item/bottled_magicol Item.components.\"minecraft:custom_data\".gm4_zauber_cauldrons{weather_modifier:modifier_data['modifier']} align xyz positioned ~.5 ~.5 ~.5 run function f\"gm4_zauber_cauldrons:bottled_magicol/{{color}}/{modifier_data['modifier']}\"\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/crystals/craft_crystal.mcfunction",
    "content": "# @s = heated water zauber cauldron with crystal recipe inside\n# at @s (center of block)\n# run from recipes/crystals/select_effect\n\n# templates/functions/crystals/craft_crystal.mcfunction\n\n# remove ingredients\nexecute align xyz run kill @e[type=item,dx=0,dy=0,dz=0]\n\n# summon item\n# loot table is generated via beet from templates\nloot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/crystals/{{effect}}\n\n# set flag\nscoreboard players set $recipe_success gm4_zc_data 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/magicol/craft_bottled_magicol.mcfunction",
    "content": "# @s = heated {{color}} magicol zauber cauldron with bottled {{color}} magicol recipe inside\n# at @s (center of block)\n# run from recipes/magicol/bottled/{{bottle}}/{{color}}/select_weather_modifier\n\n# templates/functions/magicol/craft_bottled_magicol.mcfunction\n\n# remove ingredients\nexecute align xyz run kill @e[type=item,dx=0,dy=0,dz=0]\n\n# set flag\nscoreboard players set $recipe_success gm4_zc_data 1\n\n# cancel execution via return and spawn vexes, unless it is a clear night and the correct moon phase\nexecute unless function gm4_zauber_cauldrons:cauldron/liquid/magicol/check_moon_phase run return run function gm4_zauber_cauldrons:recipes/magicol/bottled/wrong_moon_phase\n\n# summon item\nloot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/bottled_magicol/{{bottle}}/{{color}}/{{weather_modifier}}\n\n# grant advancement\nadvancement grant @a[distance=..8,gamemode=!spectator] only gm4:zauber_cauldrons_make_magicol\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/magicol/craft_liquid_magicol.mcfunction",
    "content": "# @s = heated water zauber cauldron with {{color}} magicol recipe inside\n# at @s (center of block)\n# run from recipes/magicol/select_color\n\n# templates/functions/magicol/craft_magicol.mcfunction\n\n# remove ingredients\nexecute align xyz run kill @e[type=item,dx=0,dy=0,dz=0]\n\n# summon empty bottle\nsummon minecraft:item ~ ~.2 ~ {Item:{id:\"minecraft:glass_bottle\",count:1}}\n\n# set cauldron liquid to magicol\n# set level\nexecute if block ~ ~ ~ minecraft:water_cauldron[level=1] run scoreboard players set @s gm4_zc_liquid_level 1\nexecute if block ~ ~ ~ minecraft:water_cauldron[level=2] run scoreboard players set @s gm4_zc_liquid_level 2\nexecute if block ~ ~ ~ minecraft:water_cauldron[level=3] run scoreboard players set @s gm4_zc_liquid_level 3\n# set liquid type\ndata modify entity @s data.gm4_zauber_cauldrons.liquid set value {id:\"magicol\",magicol:{color:\"{{color}}\"}}\ndata modify entity @s data.gm4_zauber_cauldrons.liquid.magicol.moon_phase set from storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"bottled_vex\"}}}}].components.\"minecraft:custom_data\".gm4_zauber_cauldrons.preferred_moon_phase\n\n# visuals\nsummon minecraft:item_display ~ ~.0781 ~ {item:{id:\"minecraft:{{color}}_concrete_powder\",count:1,components:{\"minecraft:custom_model_data\":{strings:[\"gm4_zauber_cauldrons:block/liquid_magicol/{{color}}\"]}}},item_display:\"fixed\",transformation:[1.984f,0f,0f,0f,0f,0f,0f,0f,0f,0f,1.984f,0f,0f,0f,0f,1f],Tags:[\"gm4_zc_liquid\",\"gm4_zc_magicol\",\"gm4_zc_{{color}}_magicol\"]}\n\n# set flag\nscoreboard players set $recipe_success gm4_zc_data 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/magicol/select_color.mcfunction",
    "content": "# @s = heated magicol zauber cauldron with bottled magicol recipe inside\n# at @s (center of block)\n# run from recipes/magicol/bottled/select_bottle\n\n# templates/functions/magicol/select_color.mcfunction\n\n# check which color of bottled magicol to craft\n# called functions are generated via beet from templates\n# generated with the help of bolt\nfor color_data in ctx.meta['magicol_colors']:\n    execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients liquid.magicol{color:color_data['color']} run function f\"gm4_zauber_cauldrons:recipes/magicol/bottled/{{bottle}}/{color_data['color']}/select_weather_modifier\"\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/magicol/select_weather_modifier.mcfunction",
    "content": "# @s = heated magicol zauber cauldron with bottled magicol recipe inside\n# at @s (center of block)\n# run from recipes/magicol/bottled/select_bottle\n\n# templates/functions/magicol/select_weather_modifier.mcfunction\n\n# check which weather modifier to use\n# called functions are generated via beet from templates\n# generated with the help of bolt\nfor modifier_data in ctx.meta['weather_modifiers']:\n    execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:modifier_data['item_id']}}}}] run function f\"gm4_zauber_cauldrons:recipes/magicol/bottled/{{bottle}}/{{color}}/{modifier_data['modifier']}\"\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/potions/craft_potion.mcfunction",
    "content": "# @s = heated water zauber cauldron with potion recipe inside\n# at @s (center of block)\n# run from recipes/potions/{{bottle}}/select_effect\n\n# templates/functions/potions/craft_potion.mcfunction\n\n# remove ingredients\nexecute align xyz run kill @e[type=item,dx=0,dy=0,dz=0]\n\n# summon item\nloot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/potions/{{bottle}}/{{effect}}\n\n# visuals\nfunction gm4_zauber_cauldrons:recipes/potions/environmental_effects/{{effect}}\n\n# set flag\nscoreboard players set $recipe_success gm4_zc_data 1\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/potions/select_effect.mcfunction",
    "content": "# @s = heated water zauber cauldron with potion recipe inside\n# at @s (center of block)\n# run from recipes/potions/{{bottle}}/check_liquid\n\n# templates/functions/potions/select_effect.mcfunction\n\n# check which potion type to craft\n# generated with the help of bolt\nfor effect_data in ctx.meta['potion_effects']:\n    execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"{{bottle_item_id}}\"}},\"minecraft:potion_contents\":{potion:effect_data['base_potion_id']}}}] run function f\"gm4_zauber_cauldrons:recipes/potions/{{bottle}}/{effect_data['effect']}\"\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/item_modifier/zauber_armor.json",
    "content": "[\n    {\n        \"function\": \"minecraft:set_name\",\n        \"target\": \"item_name\",\n        \"name\": {\n            \"translate\": \"item.gm4.zauber_cauldrons.zauber_armor.{{piece}}\",\n            \"fallback\": \"{{translate_fallback}}\"\n        }\n    },\n    {\n        \"function\": \"minecraft:set_components\",\n        \"components\": {\n            \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:item/zauber_armor/{{flavor}}\"]}\n        }\n    },\n    {\n        \"function\": \"minecraft:set_custom_data\",\n        \"tag\": \"{gm4_zauber_cauldrons:{item:\\\"zauber_armor\\\",type:\\\"{{piece}}\\\"}}\"\n    },\n    {\n        \"function\": \"minecraft:set_attributes\",\n        \"modifiers\": [\n            {\n                \"attribute\": \"minecraft:armor_toughness\",\n                \"id\": \"gm4_zauber_cauldrons:armor_toughness_{{slot}}\",\n                \"amount\": 3,\n                \"operation\": \"add_value\",\n                \"slot\": \"{{slot}}\"\n            },\n            {\n                \"attribute\": \"minecraft:armor\",\n                \"id\": \"gm4_zauber_cauldrons:armor_{{slot}}\",\n                \"amount\": {{armor_value}},\n                \"operation\": \"add_value\",\n                \"slot\": \"{{slot}}\"\n            },\n            {\n                \"attribute\": \"{{flavor_attribute}}\",\n                \"id\": \"gm4_zauber_cauldrons:armor_{{flavor}}_{{slot}}\",\n                \"amount\": {{flavor_amount}},\n                \"operation\": \"{{flavor_operation}}\",\n                \"slot\": \"{{slot}}\"\n            }\n        ]\n    },\n    {\n        \"function\": \"minecraft:set_lore\",\n        \"mode\": \"append\",\n        \"lore\": [\n            {\n                \"translate\": \"item.gm4.zauber_cauldrons.zauber_armor.magic\",\n                \"fallback\": \"+%s%% Magic\",\n                \"with\": [\n                    \"25\"\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/loot_table/bottled_magicol.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"{{bottle_item_id}}\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:item/bottled_magicol/{{weather_modifier}}\"]},\n                                \"minecraft:potion_contents\": {\n                                    \"custom_color\": {{potion_color}}\n                                },\n                                \"minecraft:tooltip_display\": {\n                                    \"hidden_components\": [\n                                        \"minecraft:potion_contents\"\n                                    ]\n                                }\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_zauber_cauldrons:{item:\\\"bottled_magicol\\\",color:\\\"{{color}}\\\",weather_modifier:\\\"{{weather_modifier}}\\\",bottle:{multi_use:0b}}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.zauber_cauldrons.bottled_magicol.{{translate_name}}\",\n                                \"fallback\": \"{{translate_fallback}}\",\n                                \"italic\": false\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"entity\": \"this\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.zauber_cauldrons.multi_use_bottle.bottled_magicol.{{translate_name}}\",\n                                \"fallback\": \"{{soulution_translate_fallback}}\",\n                                \"italic\": false\n                            },\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$has_soul_fire_heatsource\"\n                                        },\n                                        \"score\": \"gm4_zc_data\"\n                                    },\n                                    \"range\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"function\": \"minecraft:copy_custom_data\",\n                            \"source\": {\n                                \"type\": \"minecraft:storage\",\n                                \"source\": \"gm4_zauber_cauldrons:blueprint/item/multi_sip\"\n                            },\n                            \"ops\": [\n                                {\n                                    \"source\": \"gm4_zauber_cauldrons.bottle\",\n                                    \"target\": \"gm4_zauber_cauldrons.bottle\",\n                                    \"op\": \"replace\"\n                                }\n                            ],\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$has_soul_fire_heatsource\"\n                                        },\n                                        \"score\": \"gm4_zc_data\"\n                                    },\n                                    \"range\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:item/bottled_magicol_soulution/{{weather_modifier}}\"]}\n                            },\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$has_soul_fire_heatsource\"\n                                        },\n                                        \"score\": \"gm4_zc_data\"\n                                    },\n                                    \"range\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"entity\": \"this\",\n                            \"lore\": [\n                                [\n                                    {\n                                        \"nbt\": \"gm4_zauber_cauldrons.bottle.sips\",\n                                        \"storage\": \"gm4_zauber_cauldrons:blueprint/item/multi_sip\",\n                                        \"plain\": true,\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    },\n                                    {\n                                        \"text\": \"/\",\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    },\n                                    {\n                                        \"nbt\": \"gm4_zauber_cauldrons.bottle.size\",\n                                        \"storage\": \"gm4_zauber_cauldrons:blueprint/item/multi_sip\",\n                                        \"plain\": true,\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    },\n                                    {\n                                        \"text\": \" \",\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    },\n                                    {\n                                        \"translate\": \"item.gm4.zauber_cauldrons.multi_use_bottle.lore.{{sips_translate_name}}\",\n                                        \"fallback\": \"{{sips_translate_fallback}}\",\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    }\n                                ]\n                            ],\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$has_soul_fire_heatsource\"\n                                        },\n                                        \"score\": \"gm4_zc_data\"\n                                    },\n                                    \"range\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": [\n                                {\n                                    \"text\": \"\"\n                                },\n                                {\n                                    \"translate\": \"potion.whenDrank\",\n                                    \"color\": \"dark_purple\",\n                                    \"italic\": false\n                                },\n                                {\n                                    \"translate\": \"item.gm4.zauber_cauldrons.bottled_magicol.tint.{{color}}\",\n                                    \"fallback\": \"{{color_translate_fallback}}\",\n                                    \"color\": \"blue\",\n                                    \"italic\": false\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/loot_table/zauber_armor.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:golden_{{piece}}\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:reference\",\n                            \"name\": \"gm4_zauber_cauldrons:armor/{{piece}}/{{flavor}}\"\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/loot_table/zauber_crystal.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"minecraft:poisonous_potato\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"!minecraft:consumable\": {},\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:item/crystal/{{effect}}\"]},\n                                \"minecraft:max_stack_size\": 1,\n                                \"minecraft:rarity\": \"uncommon\",\n                                \"minecraft:item_model\": \"minecraft:player_head\",\n                                \"minecraft:profile\": \"$crystal/{{effect}}\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_zauber_cauldrons:{item:\\\"crystal\\\",type:\\\"{{effect}}\\\"}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"target\": \"item_name\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.zauber_cauldrons.crystal.{{effect}}\",\n                                \"fallback\": \"{{translate_fallback}}\"\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": {{lore}}\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/loot_table/zauber_potion.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"{{bottle_item_id}}\",\n                    \"functions\": [\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:potion_contents\": {\n                                  \"custom_color\": {{custom_potion_color}},\n                                  \"custom_effects\": {{custom_potion_effects}}\n                                },\n                                \"minecraft:tooltip_display\": {\n                                    \"hidden_components\": [\n                                        \"minecraft:potion_contents\"\n                                    ]\n                                }\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_custom_data\",\n                            \"tag\": \"{gm4_zauber_cauldrons:{item:\\\"potion\\\",type:\\\"{{effect}}\\\",bottle:{multi_use:0b}}}\"\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"name\": {\n                                \"translate\": \"item.minecraft.potion.effect.{{effect_translate_name}}\",\n                                \"italic\": false\n                            }\n                        },\n                        {\n                            \"function\": \"minecraft:set_name\",\n                            \"entity\": \"this\",\n                            \"name\": {\n                                \"translate\": \"item.gm4.zauber_cauldrons.multi_use_bottle.{{bottle}}.{{effect_translate_name}}\",\n                                \"fallback\": \"{{soulution_translate_fallback}}\",\n                                \"italic\": false\n                            },\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$has_soul_fire_heatsource\"\n                                        },\n                                        \"score\": \"gm4_zc_data\"\n                                    },\n                                    \"range\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"function\": \"minecraft:copy_custom_data\",\n                            \"source\": {\n                                \"type\": \"minecraft:storage\",\n                                \"source\": \"gm4_zauber_cauldrons:blueprint/item/multi_sip\"\n                            },\n                            \"ops\": [\n                                {\n                                    \"source\": \"gm4_zauber_cauldrons.bottle\",\n                                    \"target\": \"gm4_zauber_cauldrons.bottle\",\n                                    \"op\": \"replace\"\n                                }\n                            ],\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$has_soul_fire_heatsource\"\n                                        },\n                                        \"score\": \"gm4_zc_data\"\n                                    },\n                                    \"range\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"function\": \"minecraft:set_components\",\n                            \"components\": {\n                                \"minecraft:custom_model_data\": {\"strings\":[\"gm4_zauber_cauldrons:item/soulution_potion/{{effect}}\"]}\n                            },\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$has_soul_fire_heatsource\"\n                                        },\n                                        \"score\": \"gm4_zc_data\"\n                                    },\n                                    \"range\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"entity\": \"this\",\n                            \"lore\": [\n                                [\n                                    {\n                                        \"nbt\": \"gm4_zauber_cauldrons.bottle.sips\",\n                                        \"storage\": \"gm4_zauber_cauldrons:blueprint/item/multi_sip\",\n                                        \"plain\": true,\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    },\n                                    {\n                                        \"text\": \"/\",\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    },\n                                    {\n                                        \"nbt\": \"gm4_zauber_cauldrons.bottle.size\",\n                                        \"storage\": \"gm4_zauber_cauldrons:blueprint/item/multi_sip\",\n                                        \"plain\": true,\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    },\n                                    {\n                                        \"text\": \" \",\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    },\n                                    {\n                                        \"translate\": \"item.gm4.zauber_cauldrons.multi_use_bottle.lore.{{sips_translate_name}}\",\n                                        \"fallback\": \"{{sips_translate_fallback}}\",\n                                        \"color\": \"gray\",\n                                        \"italic\": false\n                                    }\n                                ]\n                            ],\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:value_check\",\n                                    \"value\": {\n                                        \"type\": \"minecraft:score\",\n                                        \"target\": {\n                                            \"type\": \"minecraft:fixed\",\n                                            \"name\": \"$has_soul_fire_heatsource\"\n                                        },\n                                        \"score\": \"gm4_zc_data\"\n                                    },\n                                    \"range\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"function\": \"minecraft:set_lore\",\n                            \"mode\": \"append\",\n                            \"lore\": {{lore}}\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/worldgen/biome/verzauberte_plains.json",
    "content": "{\n    \"temperature\": {{temperature}},\n    \"downfall\": 0.8,\n    \"has_precipitation\": {{has_precipitation}},\n    \"attributes\": {\n        \"minecraft:visual/sky_color\": {{sky_color}},\n        \"minecraft:visual/fog_color\": {{fog_color}},\n        \"minecraft:visual/water_fog_color\": {{water_fog_color}},\n        \"minecraft:audio/ambient_sounds\": {\n            \"mood\": {\n                \"sound\": \"minecraft:ambient.cave\",\n                \"tick_delay\": 6000,\n                \"block_search_extent\": 8,\n                \"offset\": 2\n            }\n        },\n        \"minecraft:audio/background_music\": {\n            \"default\": {\n                \"sound\": \"minecraft:music.overworld.forest\",\n                \"min_delay\": 12000,\n                \"max_delay\": 24000,\n                \"replace_current_music\": false\n            }\n        }\n    },\n    \"effects\": {\n        \"water_color\": {{water_color}},\n        \"grass_color\": {{grass_color}},\n        \"foliage_color\": {{foliage_color}},\n        {{biome_particle}}\n    },\n    \"spawners\": {},\n    \"spawn_costs\": {},\n    \"carvers\": [],\n    \"features\": [\n        [\n            \"gm4_zauber_cauldrons:{{flower}}_patch\"\n        ]\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/worldgen/configured_feature/flower_patch.json",
    "content": "{\n    \"type\": \"minecraft:random_selector\",\n    \"config\": {\n        \"features\": [],\n        \"default\": {\n            \"feature\": {\n                \"type\": \"minecraft:simple_block\",\n                \"config\": {\n                    \"to_place\": {\n                        \"type\": \"minecraft:simple_state_provider\",\n                        \"state\": {\n                            \"Name\": \"minecraft:{{flower}}\"\n                        }\n                    }\n                }\n            },\n            \"placement\": [\n                {\n                    \"type\": \"minecraft:count\",\n                    \"count\": 8\n                },\n                {\n                    \"type\": \"minecraft:random_offset\",\n                    \"xz_spread\": {\n                        \"type\": \"minecraft:uniform\",\n                        \"min_inclusive\": 0,\n                        \"max_inclusive\": 5\n                    },\n                    \"y_spread\": {\n                        \"type\": \"minecraft:uniform\",\n                        \"min_inclusive\": 0,\n                        \"max_inclusive\": 1\n                    }\n                },\n                {\n                    \"type\": \"minecraft:block_predicate_filter\",\n                    \"predicate\": {\n                        \"type\": \"minecraft:matching_blocks\",\n                        \"blocks\": \"minecraft:air\"\n                    }\n                }\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/worldgen/placed_feature/flower_patch.json",
    "content": "{\n    \"feature\": \"gm4_zauber_cauldrons:{{flower}}_patch\",\n    \"placement\": [\n        {\n            \"type\": \"minecraft:rarity_filter\",\n            \"chance\": 64\n        },\n        {\n            \"type\": \"minecraft:in_square\"\n        },\n        {\n            \"type\": \"minecraft:heightmap\",\n            \"heightmap\": \"MOTION_BLOCKING\"\n        },\n        {\n            \"type\": \"minecraft:biome\"\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/test/rabbit_teleportation.mcfunction",
    "content": "# @template gm4:test_platform\n# @dummy ~1 ~1 ~1\n\nsetblock ~ ~ ~1 netherrack\nsetblock ~ ~1 ~1 fire\nsetblock ~ ~2 ~1 water_cauldron[level=3]\nsetblock ~2 ~ ~1 netherrack\nsetblock ~2 ~1 ~1 fire\nsetblock ~2 ~2 ~1 water_cauldron[level=3]\n\ngive @s enchanted_book[stored_enchantments={protection:1}]\nexecute at @s run tp @s ~ ~ ~ facing ~1 ~ ~\nawait delay 1s\nexecute at @s run tp @s ~ ~ ~ facing ~-1 ~ ~\nawait delay 1s\n\nawait entity @s[advancements={gm4:zauber_cauldrons_create=true}]\n\nsetblock ~ ~2 ~1 cauldron\nsetblock ~2 ~2 ~1 cauldron\nsummon rabbit ~0.5 ~3 ~1.5\n\nloot replace entity @s armor.feet loot gm4_zauber_cauldrons:items/armor/boots/speed_boost\nloot replace entity @s armor.legs loot gm4_zauber_cauldrons:items/armor/leggings/speed_boost\nloot replace entity @s armor.chest loot gm4_zauber_cauldrons:items/armor/chestplate/speed_boost\nloot replace entity @s armor.head loot gm4_zauber_cauldrons:items/armor/helmet/speed_boost\n\nawait entity @s[advancements={gm4:zauber_cauldrons_rabbit=true}]\n\nexecute positioned ~2.5 ~2.5 ~1.5 run assert entity @e[type=rabbit,dx=0]\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/worldgen/configured_feature/short_grass_patch.json",
    "content": "{\n    \"type\": \"minecraft:random_selector\",\n    \"config\": {\n        \"features\": [],\n        \"default\": {\n            \"feature\": {\n                \"type\": \"minecraft:simple_block\",\n                \"config\": {\n                    \"to_place\": {\n                        \"type\": \"minecraft:simple_state_provider\",\n                        \"state\": {\n                            \"Name\": \"minecraft:short_grass\"\n                        }\n                    }\n                }\n            },\n            \"placement\": [\n                {\n                    \"type\": \"minecraft:count\",\n                    \"count\": 8\n                },\n                {\n                    \"type\": \"minecraft:random_offset\",\n                    \"xz_spread\": {\n                        \"type\": \"minecraft:uniform\",\n                        \"min_inclusive\": 0,\n                        \"max_inclusive\": 5\n                    },\n                    \"y_spread\": {\n                        \"type\": \"minecraft:uniform\",\n                        \"min_inclusive\": 0,\n                        \"max_inclusive\": 1\n                    }\n                },\n                {\n                    \"type\": \"minecraft:block_predicate_filter\",\n                    \"predicate\": {\n                        \"type\": \"minecraft:matching_blocks\",\n                        \"blocks\": \"minecraft:air\"\n                    }\n                }\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/worldgen/placed_feature/short_grass_patch.json",
    "content": "{\n    \"feature\": \"gm4_zauber_cauldrons:short_grass_patch\",\n    \"placement\": [\n        {\n            \"type\": \"minecraft:rarity_filter\",\n            \"chance\": 64\n        },\n        {\n            \"type\": \"minecraft:in_square\"\n        },\n        {\n            \"type\": \"minecraft:heightmap\",\n            \"heightmap\": \"MOTION_BLOCKING\"\n        },\n        {\n            \"type\": \"minecraft:biome\"\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/generate.py",
    "content": "from typing import Dict, Any\nfrom pathlib import Path\nfrom itertools import product\nfrom gm4.utils import CSV, CSVCell\nimport json\nimport nbtlib # type: ignore\n\nfrom beet import Context, Model, subproject\n\ndef read_json(path: Path) -> Any:\n    \"\"\"\n    Reads in a json file and returns a python object representing the json.\n    \"\"\"\n    with open(path, mode='r') as file:\n        json_file = json.load(file)\n        return json_file\n\ndef beet_default(ctx: Context):\n\n    # read raw data\n    raw = Path('gm4_zauber_cauldrons', 'raw')\n    armor_flavors: CSV = CSV.from_file(raw / 'armor_flavors.csv')\n    armor_pieces: CSV = CSV.from_file(raw / 'armor_pieces.csv')\n    crystal_effects: CSV = CSV.from_file(raw / 'crystal_effects.csv')\n    crystal_lores: Any = read_json(raw / 'crystal_lores.json')\n    flower_types: CSV = CSV.from_file(raw / 'flower_types.csv')\n    magicol_colors: CSV = CSV.from_file(raw / 'magicol_colors.csv')\n    potion_bottles: CSV = CSV.from_file(raw / 'potion_bottles.csv')\n    potion_effects: CSV = CSV.from_file(raw / 'potion_effects.csv')\n    potion_bottles: CSV = CSV.from_file(raw / 'potion_bottles.csv')\n    potion_lores: Any = read_json(raw / 'potion_lores.json')\n    weather_modifiers: CSV = CSV.from_file(raw / 'weather_modifiers.csv')\n\n    # generate files\n    generate_armor_recipes(ctx, armor_flavors, armor_pieces)\n    generate_crystal_recipes(ctx, crystal_effects, crystal_lores, potion_effects)\n    generate_potion_recipes(ctx, potion_effects, potion_bottles, potion_lores)\n    generate_magicol_recipes(ctx, weather_modifiers, magicol_colors, potion_bottles)\n    generate_zauber_biomes(ctx, weather_modifiers, magicol_colors, potion_bottles, flower_types)\n    generate_flower_features(ctx, flower_types)\n\n    # make some csv data available to bolt later\n    ctx.meta['armor_flavors'] = armor_flavors\n    ctx.meta['armor_pieces'] = armor_pieces\n    ctx.meta['crystal_effects'] = crystal_effects\n    ctx.meta['flower_types'] = flower_types\n    ctx.meta['magicol_colors'] = magicol_colors\n    ctx.meta['potion_bottles'] = potion_bottles\n    ctx.meta['potion_effects'] = potion_effects\n    ctx.meta['potion_bottles'] = potion_bottles\n    ctx.meta['weather_modifiers'] = weather_modifiers\n\n\ndef generate_armor_recipes(ctx: Context, armor_flavors: CSV, armor_pieces: CSV):\n    \"\"\"\n    Generates the function tree and loot tables for all combinations of zauber armor.\n    \"\"\"\n    # create a loot tables and functions for each zauber armor piece + flavor combination\n    for flavor_data in armor_flavors:\n        armor_items: list[str] = []\n        armor_models: dict[str, str] = {}\n        for piece_data in armor_pieces:\n            armor_items.append(item:=f\"golden_{piece_data['piece']}\")\n            armor_models.update({item: (tex_model:=f\"item/zauber_armor/{flavor_data['flavor']}/{piece_data['piece']}\")})\n\n            subproject_config = {\n                \"data_pack\": {\n                    \"load\": [\n                        {\n                            f\"data/gm4_zauber_cauldrons/function/recipes/armor/{piece_data['piece']}/select_flavor.mcfunction\": \"data/gm4_zauber_cauldrons/templates/function/armor/select_flavor.mcfunction\",\n                            f\"data/gm4_zauber_cauldrons/function/recipes/armor/{piece_data['piece']}/{flavor_data['flavor']}.mcfunction\": \"data/gm4_zauber_cauldrons/templates/function/armor/craft_piece.mcfunction\",\n                            f\"data/gm4_zauber_cauldrons/item_modifier/armor/{piece_data['piece']}/{flavor_data['flavor']}.json\": \"data/gm4_zauber_cauldrons/templates/item_modifier/zauber_armor.json\",\n                            f\"data/gm4_zauber_cauldrons/loot_table/items/armor/{piece_data['piece']}/{flavor_data['flavor']}.json\": \"data/gm4_zauber_cauldrons/templates/loot_table/zauber_armor.json\"\n                        }\n                    ],\n                    \"render\": {\n                        \"function\": \"*\",\n                        \"item_modifier\": \"*\",\n                        \"loot_table\": \"*\"\n                    }\n                },\n                \"meta\": {\n                    \"armor_value\": piece_data['armor'],\n                    \"flavor\": flavor_data['flavor'],\n                    \"flavor_amount\": flavor_data['amount'],\n                    \"flavor_attribute\": flavor_data['attribute'],\n                    \"flavor_operation\": flavor_data['operation'],\n                    \"piece\": piece_data['piece'],\n                    \"slot\": piece_data['slot'],\n                    \"translate_fallback\": piece_data['translate_fallback']\n                }\n            }\n\n            ctx.require(subproject(subproject_config))\n\n            ctx.generate(tex_model, Model({\n                \"parent\": \"minecraft:item/generated\",\n                \"textures\": {\n                    \"layer0\": f\"gm4_zauber_cauldrons:{tex_model}\"\n                }\n            }))\n\n        ctx.meta[\"gm4\"].setdefault(\"model_data\", []).append({\n            \"item\": armor_items,\n            \"reference\": f\"item/zauber_armor/{flavor_data['flavor']}\",\n            \"model\": armor_models,\n            \"template\": \"custom\",\n        })\n\n\ndef generate_crystal_recipes(ctx: Context, crystal_effects: CSV, crystal_lores: Dict[str, Any], potion_effects: CSV):\n    \"\"\"\n    Generates the function tree and loot tables for zauber crystals.\n    \"\"\"\n    for effect_data in crystal_effects:\n\n        subproject_config = {\n            \"data_pack\": {\n                \"load\": [\n                    {\n                        f\"data/gm4_zauber_cauldrons/function/recipes/crystals/effects/{effect_data['effect']}.mcfunction\": \"data/gm4_zauber_cauldrons/templates/function/crystals/craft_crystal.mcfunction\",\n                        f\"data/gm4_zauber_cauldrons/loot_table/items/crystals/{effect_data['effect']}.json\": \"data/gm4_zauber_cauldrons/templates/loot_table/zauber_crystal.json\"\n                    }\n                ],\n                \"render\": {\n                    \"function\": \"*\",\n                    \"loot_table\": \"*\"\n                }\n            },\n            \"meta\": {\n                \"effect\": effect_data['effect'],\n                \"custom_potion_color\": potion_effects.find_row(value=effect_data['effect'], by_column='effect')['custom_potion_color'].to_color_code(CSVCell.DEC),\n                \"translate_fallback\": effect_data['translate_fallback'],\n                \"lore\": json.dumps(crystal_lores[effect_data['effect']])\n            }\n        }\n        ctx.require(subproject(subproject_config))\n\n\ndef generate_potion_recipes(ctx: Context, potion_effects: CSV, potion_bottles: CSV, potion_lores: Dict[str, Any]):\n    \"\"\"\n    Generates the function tree and loot tables for zauber potions and soulutions.\n    \"\"\"\n    for effect_data in potion_effects:\n        for bottle_data in potion_bottles:\n\n            subproject_config = {\n                \"data_pack\": {\n                    \"load\": [\n                        {\n                            f\"data/gm4_zauber_cauldrons/function/recipes/potions/{bottle_data['bottle']}/select_effect.mcfunction\": \"data/gm4_zauber_cauldrons/templates/function/potions/select_effect.mcfunction\",\n                            f\"data/gm4_zauber_cauldrons/function/recipes/potions/{bottle_data['bottle']}/{effect_data['effect']}.mcfunction\": \"data/gm4_zauber_cauldrons/templates/function/potions/craft_potion.mcfunction\",\n                            f\"data/gm4_zauber_cauldrons/loot_table/items/potions/{bottle_data['bottle']}/{effect_data['effect']}.json\": \"data/gm4_zauber_cauldrons/templates/loot_table/zauber_potion.json\"\n                        }\n                    ],\n                    \"render\": {\n                        \"function\": \"*\",\n                        \"loot_table\": \"*\"\n                    }\n                },\n                \"meta\": {\n                    \"effect\": effect_data['effect'],\n                    \"effect_translate_name\": effect_data['effect_translate_name'],\n                    \"custom_potion_color\": effect_data['custom_potion_color'].to_color_code(CSVCell.DEC),\n                    \"custom_potion_effects\": json.dumps(nbtlib.parse_nbt(effect_data['custom_potion_effects']).unpack(json=True)), # type: ignore\n                    \"bottle_item_id\": bottle_data['item_id'],\n                    \"bottle\": bottle_data['bottle'],\n                    \"soulution_translate_fallback\": bottle_data[\"soulution_translate_fallback_prefix\"] + effect_data['soulution_translate_fallback'],\n                    \"sips_translate_name\": bottle_data['sips_translate_name'],\n                    \"sips_translate_fallback\": bottle_data['sips_translate_fallback'],\n                    \"lore\": json.dumps(potion_lores[effect_data['effect']])\n                }\n            }\n            ctx.require(subproject(subproject_config))\n\n        ctx.meta[\"gm4\"][\"model_data\"].append({\n            \"item\": [\"potion\", \"splash_potion\", \"lingering_potion\"],\n            \"reference\": f\"item/soulution_potion/{effect_data['effect']}\",\n            \"template\": \"vanilla\"\n        })\n\n\ndef generate_magicol_recipes(ctx: Context, weather_modifiers: CSV, magicol_colors: CSV, potion_bottles: CSV):\n    \"\"\"\n    Generates the function tree for crafting th magicol liquid.\n    \"\"\"\n    for bottle_data, color_data, modifier_data in product(potion_bottles, magicol_colors, weather_modifiers):\n\n        subproject_config = {\n            \"data_pack\": {\n                \"load\": [\n                    {\n                        f\"data/gm4_zauber_cauldrons/function/recipes/magicol/{color_data['color']}.mcfunction\": \"data/gm4_zauber_cauldrons/templates/function/magicol/craft_liquid_magicol.mcfunction\",\n                        f\"data/gm4_zauber_cauldrons/function/recipes/magicol/bottled/{bottle_data['bottle']}/select_color.mcfunction\": \"data/gm4_zauber_cauldrons/templates/function/magicol/select_color.mcfunction\",\n                        f\"data/gm4_zauber_cauldrons/function/recipes/magicol/bottled/{bottle_data['bottle']}/{color_data['color']}/select_weather_modifier.mcfunction\": \"data/gm4_zauber_cauldrons/templates/function/magicol/select_weather_modifier.mcfunction\",\n                        f\"data/gm4_zauber_cauldrons/function/recipes/magicol/bottled/{bottle_data['bottle']}/{color_data['color']}/{modifier_data['modifier']}.mcfunction\": \"data/gm4_zauber_cauldrons/templates/function/magicol/craft_bottled_magicol.mcfunction\",\n                        f\"data/gm4_zauber_cauldrons/loot_table/items/bottled_magicol/{bottle_data['bottle']}/{color_data['color']}/{modifier_data['modifier']}.json\": \"data/gm4_zauber_cauldrons/templates/loot_table/bottled_magicol.json\"\n                    }\n                ],\n                \"render\": {\n                    \"function\": \"*\",\n                    \"loot_table\": \"*\"\n                }\n            },\n            \"meta\": {\n                \"color\": color_data['color'],\n                \"potion_color\": color_data['potion_color'].to_color_code(CSVCell.DEC),\n                \"bottle\": bottle_data['bottle'],\n                \"bottle_item_id\": bottle_data['item_id'],\n                \"weather_modifier\": modifier_data['modifier'],\n                \"sips_translate_name\": bottle_data['sips_translate_name'],\n                \"sips_translate_fallback\": bottle_data['sips_translate_fallback'],\n                \"translate_name\": modifier_data['translate_name'],\n                \"translate_fallback\": modifier_data['translate_fallback'],\n                \"color_translate_name\": color_data['color_translate_name'],\n                \"color_translate_fallback\": color_data['color_translate_fallback'],\n                \"soulution_translate_fallback\": modifier_data['soulution_translate_fallback']\n            }\n        }\n        ctx.require(subproject(subproject_config))\n\n    for color_data in magicol_colors:\n        ctx.meta[\"gm4\"][\"model_data\"].append({\n            \"item\": f\"{color_data['color']}_concrete_powder\",\n            \"reference\": f\"block/liquid_magicol/{color_data['color']}\",\n            \"template\": \"vanilla\"\n        })\n\n\ndef generate_zauber_biomes(ctx: Context, weather_modifiers: CSV, magicol_colors: CSV, potion_bottles: CSV, flower_types: CSV):\n    \"\"\"\n    Generates biome files for verzauberte plains biomes.\n    \"\"\"\n    for bottle_data, color_data, modifier_data in product(potion_bottles, magicol_colors, weather_modifiers):\n\n        # skip drinkable\n        if bottle_data['bottle'] == 'drinkable':\n            continue\n\n        # prepare biome particle for splash & lingering\n        adjective = ''\n        biome_particle = ''\n        if bottle_data['bottle'] == 'lingering':\n            adjective = 'glittering_'\n            # convert base-10 colors to rgb float colors\n            biome_particle = '\"particle\":{\"options\":{\"type\":\"minecraft:dust\",\"color\":' + color_data.get(\n                f\"particle_color_{modifier_data['modifier']}\", 7979098).to_color_code(CSVCell.FLOAT) + ',\"scale\":2},\"probability\":0.002},'\n\n        subproject_config = {\n            \"data_pack\": {\n                \"load\": [\n                    {\n                        f\"data/gm4_zauber_cauldrons/function/bottled_magicol/{color_data['color']}/select_weather_modifier.mcfunction\": \"data/gm4_zauber_cauldrons/templates/function/bottled_magicol/select_weather_modifier.mcfunction\",\n                        f\"data/gm4_zauber_cauldrons/function/bottled_magicol/{color_data['color']}/{modifier_data['modifier']}.mcfunction\": \"data/gm4_zauber_cauldrons/templates/function/bottled_magicol/color_biome.mcfunction\",\n                        f\"data/gm4_zauber_cauldrons/worldgen/biome/{adjective}{modifier_data['modifier']}_{color_data['color']}_verzauberte_plains.json\": \"data/gm4_zauber_cauldrons/templates/worldgen/biome/verzauberte_plains.json\"\n                    }\n                ],\n                \"render\": {\n                    \"function\": \"*\",\n                    \"worldgen_biomes\": \"*\"\n                }\n            },\n            \"meta\": {\n                \"color\": color_data['color'],\n                \"potion_color\": color_data['potion_color'].to_color_code(CSVCell.DEC),\n                \"weather_modifier\": modifier_data['modifier'],\n                \"temperature\": 0.0 if modifier_data['modifier'] == 'polar' else 0.7,\n                \"sky_color\": color_data.get(f\"sky_color_{modifier_data['modifier']}\", 7972607).to_color_code(CSVCell.DEC),\n                \"has_precipitation\": 'false' if modifier_data['modifier'] == 'arid' else 'true',\n                \"fog_color\": color_data.get(f\"fog_color_{modifier_data['modifier']}\", 12638463).to_color_code(CSVCell.DEC),\n                \"water_color\": color_data.get(f\"water_color_{modifier_data['modifier']}\", 4159204).to_color_code(CSVCell.DEC),\n                \"water_fog_color\": color_data.get(f\"water_fog_color_{modifier_data['modifier']}\", 329011).to_color_code(CSVCell.DEC),\n                \"grass_color\": color_data.get(f\"grass_color_{modifier_data['modifier']}\", 7979098).to_color_code(CSVCell.DEC),\n                \"foliage_color\": color_data.get(f\"foliage_color_{modifier_data['modifier']}\", 5877296).to_color_code(CSVCell.DEC),\n                \"biome_particle\": biome_particle,\n                \"flower\": flower_types.find_row(color_data['flower'], 'flower').get('flower', 'short_grass') # only add flowers which are registered as zauber flowers\n            }\n        }\n        ctx.require(subproject(subproject_config))\n\n\ndef generate_flower_features(ctx: Context, flower_types: CSV):\n    \"\"\"\n    Generates the worldgen features required for spawning lucky flowers with composter particles upon the use of magicol to convert a biome.\n    \"\"\"\n    for flower_data in flower_types:\n\n        subproject_config = {\n            \"data_pack\": {\n                \"load\": [\n                    {\n                        f\"data/gm4_zauber_cauldrons/worldgen/configured_feature/{flower_data['flower']}_patch.json\": \"data/gm4_zauber_cauldrons/templates/worldgen/configured_feature/flower_patch.json\",\n                        f\"data/gm4_zauber_cauldrons/worldgen/placed_feature/{flower_data['flower']}_patch.json\": \"data/gm4_zauber_cauldrons/templates/worldgen/placed_feature/flower_patch.json\"\n                    }\n                ],\n                \"render\": {\n                    \"worldgen_configured_features\": \"*\",\n                    \"worldgen_placed_features\": \"*\"\n                }\n            },\n            \"meta\": {\n                \"flower\": flower_data['flower']\n            }\n        }\n        ctx.require(subproject(subproject_config))\n"
  },
  {
    "path": "gm4_zauber_cauldrons/raw/armor_flavors.csv",
    "content": "flavor,ingredient_item_id,attribute,amount,operation\narmor_boost,minecraft:turtle_helmet,minecraft:armor,1,add_value\nattack_boost,minecraft:blaze_powder,minecraft:attack_damage,1,add_value\nhealth_boost,minecraft:glistering_melon_slice,minecraft:max_health,4,add_value\nspeed_boost,minecraft:sugar,minecraft:movement_speed,0.12,add_multiplied_total\n"
  },
  {
    "path": "gm4_zauber_cauldrons/raw/armor_pieces.csv",
    "content": "piece,slot,armor,translate_fallback\nboots,feet,2,Zauber Boots\nchestplate,chest,7,Zauber Chestplate\nhelmet,head,3,Zauber Helmet\nleggings,legs,5,Zauber Leggings\n"
  },
  {
    "path": "gm4_zauber_cauldrons/raw/crystal_effects.csv",
    "content": "effect,translate_fallback\ninstant_damage,Crystal of Harming\ninstant_health,Crystal of Healing\njump_boost,Crystal of Leaping\npoison,Crystal of Poison\nregeneration,Crystal of Regeneration\nspeed,Crystal of Swiftness\nstrength,Crystal of Strength\n"
  },
  {
    "path": "gm4_zauber_cauldrons/raw/crystal_lores.json",
    "content": "{\n    \"instant_damage\": [\n        {\n            \"translate\": \"potion.withAmplifier\",\n            \"with\": [\n                {\n                    \"translate\": \"effect.minecraft.instant_damage\"\n                },\n                {\n                    \"translate\": \"potion.potency.1\"\n                }\n            ],\n            \"color\": \"red\",\n            \"italic\": false\n        }\n    ],\n    \"instant_health\": [\n        [\n            {\n                \"translate\": \"potion.withAmplifier\",\n                \"with\": [\n                    {\n                        \"translate\": \"effect.minecraft.instant_health\"\n                    },\n                    {\n                        \"translate\": \"potion.potency.1\"\n                    }\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ],\n        [\n            {\n                \"translate\": \"potion.withAmplifier\",\n                \"with\": [\n                    {\n                        \"translate\": \"effect.minecraft.nausea\"\n                    },\n                    {\n                        \"translate\": \"potion.potency.0\"\n                    }\n                ],\n                \"color\": \"red\",\n                \"italic\": false\n            }\n        ]\n    ],\n    \"jump_boost\": [\n        [\n            {\n                \"translate\": \"potion.withAmplifier\",\n                \"with\": [\n                    {\n                        \"translate\": \"effect.minecraft.jump_boost\"\n                    },\n                    {\n                        \"translate\": \"potion.potency.1\"\n                    }\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ]\n    ],\n    \"poison\": [\n        [\n            {\n                \"translate\": \"potion.withAmplifier\",\n                \"with\": [\n                    {\n                        \"translate\": \"effect.minecraft.poison\"\n                    },\n                    {\n                        \"translate\": \"potion.potency.1\"\n                    }\n                ],\n                \"color\": \"red\",\n                \"italic\": false\n            }\n        ]\n    ],\n    \"regeneration\": [\n        [\n            {\n                \"translate\": \"potion.withAmplifier\",\n                \"with\": [\n                    {\n                        \"translate\": \"effect.minecraft.regeneration\"\n                    },\n                    {\n                        \"translate\": \"potion.potency.1\"\n                    }\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ]\n    ],\n    \"speed\": [\n        [\n            {\n                \"translate\": \"potion.withAmplifier\",\n                \"with\": [\n                    {\n                        \"translate\": \"effect.minecraft.speed\"\n                    },\n                    {\n                        \"translate\": \"potion.potency.1\"\n                    }\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ],\n        [\n            {\n                \"translate\": \"potion.withAmplifier\",\n                \"with\": [\n                    {\n                        \"translate\": \"effect.minecraft.weakness\"\n                    },\n                    {\n                        \"translate\": \"potion.potency.0\"\n                    }\n                ],\n                \"color\": \"red\",\n                \"italic\": false\n            }\n        ],\n        {\n            \"text\": \"\"\n        },\n        {\n            \"translate\": \"potion.whenDrank\",\n            \"color\": \"dark_purple\",\n            \"italic\": false\n        },\n        {\n            \"translate\": \"attribute.modifier.plus.1\",\n            \"with\": [\n                \"40\",\n                {\n                    \"translate\": \"attribute.name.movement_speed\"\n                }\n            ],\n            \"color\": \"blue\",\n            \"italic\": false\n        },\n        {\n            \"translate\": \"attribute.modifier.take.0\",\n            \"with\": [\n                \"4\",\n                {\n                    \"translate\": \"attribute.name.attack_damage\"\n                }\n            ],\n            \"color\": \"red\",\n            \"italic\": false\n        }\n    ],\n    \"strength\": [\n        [\n            {\n                \"translate\": \"potion.withAmplifier\",\n                \"with\": [\n                    {\n                        \"translate\": \"effect.minecraft.strength\"\n                    },\n                    {\n                        \"translate\": \"potion.potency.1\"\n                    }\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ],\n        [\n            {\n                \"translate\": \"potion.withAmplifier\",\n                \"with\": [\n                    {\n                        \"translate\": \"effect.minecraft.fire_resistance\"\n                    },\n                    {\n                        \"translate\": \"potion.potency.0\"\n                    }\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ],\n        {\n            \"text\": \"\"\n        },\n        {\n            \"translate\": \"potion.whenDrank\",\n            \"color\": \"dark_purple\",\n            \"italic\": false\n        },\n        {\n            \"translate\": \"attribute.modifier.plus.0\",\n            \"with\": [\n                \"6\",\n                {\n                    \"translate\": \"attribute.name.attack_damage\"\n                }\n            ],\n            \"color\": \"blue\",\n            \"italic\": false\n        }\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/raw/flower_types.csv",
    "content": "flower,item_id\ndandelion,minecraft:dandelion\npoppy,minecraft:poppy\nblue_orchid,minecraft:blue_orchid\nallium,minecraft:allium\nazure_bluet,minecraft:azure_bluet\nred_tulip,minecraft:red_tulip\norange_tulip,minecraft:orange_tulip\nwhite_tulip,minecraft:white_tulip\npink_tulip,minecraft:pink_tulip\noxeye_daisy,minecraft:oxeye_daisy\ncornflower,minecraft:cornflower\nlily_of_the_valley,minecraft:lily_of_the_valley\n"
  },
  {
    "path": "gm4_zauber_cauldrons/raw/magicol_colors.csv",
    "content": "color,ingredient_item_id,color_translate_name,color_translate_fallback,flower,potion_color,sky_color_polar,fog_color_polar,water_color_polar,water_fog_color_polar,grass_color_polar,foliage_color_polar,particle_color_polar,sky_color_temperate,fog_color_temperate,water_color_temperate,water_fog_color_temperate,grass_color_temperate,foliage_color_temperate,particle_color_temperate,sky_color_arid,fog_color_arid,water_color_arid,water_fog_color_arid,grass_color_arid,foliage_color_arid,particle_color_arid\nwhite,minecraft:white_dye,white,White Tint,short_grass,#DCE0E6,,,,,#BDC3D9,,#BDC3D9,,,,,#D2E2E2,,#D2E2E2,,,,,#FFFFFF,,#FFFFFF\nlight_gray,minecraft:light_gray_dye,light_gray,Light Gray Tint,short_grass,#807975,,,,,#96937E,,#96937E,,,,,#B1A997,,#B1A997,,,,,#C7C4B5,,#C7C4B5\ngray,minecraft:gray_dye,gray,Gray Tint,short_grass,#3F464D,,,,,#53585C,,#53585C,,,,,#5E696F,,#5E696F,,,,,#7C8588,,#7C8588\nblack,minecraft:black_dye,black,Black Tint,short_grass,#1F1B2E,,,,,#16151F,,#16151F,,,,,#292631,,#292631,,,,,#343138,,#343138\nbrown,minecraft:brown_dye,brown,Brown Tint,orange_tulip,#8C613F,,,,,#6F4425,,#6F4425,,,,,#985E31,,#985E31,,,,,#AC7A47,,#AC7A47\nred,minecraft:red_dye,red,Red Tint,poppy,#A63232,,,,,#B02539,,#B02539,,,,,#CB3431,,#CB3431,,,,,#DE4E40,,#DE4E40\norange,minecraft:orange_dye,orange,Orange Tint,red_tulip,#D98341,,,,,#C65112,,#C65112,,,,,#E26C1F,,#E26C1F,,,,,#F49331,,#F49331\nyellow,minecraft:yellow_dye,yellow,Yellow Tint,dandelion,#F5C149,,,,,#C49313,,#C49313,,,,,#F8A520,,#F8A520,,,,,#EDBC53,,#EDBC53\nlime,minecraft:lime_dye,lime,Lime Tint,oxeye_daisy,#69B324,,,,,#5CAC1C,,#5CAC1C,,,,,#8BD02C,,#8BD02C,,,,,#B3E14E,,#B3E14E\ngreen,minecraft:green_dye,green,Green Tint,azure_bluet,#6B8040,,,,,#4C822F,,#4C822F,,,,,#5E9936,,#5E9936,,,,,#80AE4F,,#80AE4F\ncyan,minecraft:cyan_dye,cyan,Cyan Tint,blue_orchid,#36A2B3,,,,,#229967,,#229967,,,,,#35C780,,#35C780,,,,,#6DE591,,#6DE591\nlight_blue,minecraft:light_blue_dye,light_blue,Light Blue Tint,white_tulip,#369DD9,,,,,#43C8D1,,#43C8D1,,,,,#53EFD7,,#53EFD7,,,,,#84FFD3,,#84FFD3\nblue,minecraft:blue_dye,blue,Blue Tint,cornflower,#474BB3,,,,,#3854AC,,#3854AC,,,,,#417FDE,,#417FDE,,,,,#5DA1E5,,#5DA1E5\npurple,minecraft:purple_dye,purple,Purple Tint,allium,#762DB3,,,,,#6544B8,,#6544B8,,,,,#A15FEF,,#A15FEF,,,,,#CF80F8,,#CF80F8\nmagenta,minecraft:magenta_dye,magenta,Magenta Tint,pink_tulip,#BA45B2,,,,,#B73AAE,,#B73AAE,,,,,#F153CA,,#F153CA,,,,,#FE73E2,,#FE73E2\npink,minecraft:pink_dye,pink,Pink Tint,lily_of_the_valley,#E68AAB,,,,,#D66DA1,,#D66DA1,,,,,#FF8DCC,,#FF8DCC,,,,,#FEA6C2,,#FEA6C2\n"
  },
  {
    "path": "gm4_zauber_cauldrons/raw/potion_bottles.csv",
    "content": "bottle,item_id,sips_translate_name,sips_translate_fallback,soulution_translate_fallback_prefix\ndrinkable,minecraft:potion,sips,Sips,\nsplash,minecraft:splash_potion,throws,Throws,\"Splash \"\nlingering,minecraft:lingering_potion,throws,Throws,\"Lingering \"\n"
  },
  {
    "path": "gm4_zauber_cauldrons/raw/potion_effects.csv",
    "content": "effect,base_potion_id,effect_translate_name,custom_potion_color,custom_potion_effects,soulution_translate_fallback\ninstant_damage,minecraft:strong_harming,harming,#A9656A,\"[{id:'minecraft:instant_damage',amplifier:3,duration:1}]\",Soulution of Harming\ninstant_health,minecraft:strong_healing,healing,#F82423,\"[{id:'minecraft:instant_health',amplifier:3,duration:1},{id:'minecraft:nausea',amplifier:0,duration:160}]\",Soulution of Healing\njump_boost,minecraft:strong_leaping,leaping,#FDFF84,\"[{id:'minecraft:jump_boost',amplifier:3,duration:1800}]\",Soulution of Leaping\npoison,minecraft:strong_poison,poison,#87A363,\"[{id:'minecraft:poison',amplifier:3,duration:640}]\",Soulution of Poison\nregeneration,minecraft:strong_regeneration,regeneration,#CD5CAB,\"[{id:'minecraft:regeneration',amplifier:3,duration:440},{id:'minecraft:speed',amplifier:1,duration:320}]\",Soulution of Regeneration\nspeed,minecraft:strong_swiftness,swiftness,#33EBFF,\"[{id:'minecraft:speed',amplifier:3,duration:4000},{id:'minecraft:weakness',amplifier:2,duration:4000}]\",Soulution of Swiftness\nstrength,minecraft:strong_strength,strength,#FFC700,\"[{id:'minecraft:strength',amplifier:3,duration:1800},{id:'fire_resistance',amplifier:0,duration:320}]\",Soulution of Strength\n"
  },
  {
    "path": "gm4_zauber_cauldrons/raw/potion_lores.json",
    "content": "{\n    \"instant_damage\": [\n        [\n            {\n                \"translate\": \"potion.withAmplifier\",\n                \"with\": [\n                    {\n                        \"translate\": \"effect.minecraft.instant_damage\"\n                    },\n                    {\n                        \"translate\": \"potion.potency.3\"\n                    }\n                ],\n                \"color\": \"red\",\n                \"italic\": false\n            }\n        ]\n    ],\n    \"instant_health\": [\n        [\n            {\n                \"translate\": \"potion.withAmplifier\",\n                \"with\": [\n                    {\n                        \"translate\": \"effect.minecraft.instant_health\"\n                    },\n                    {\n                        \"translate\": \"potion.potency.3\"\n                    }\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ],\n        [\n            {\n                \"translate\": \"potion.withDuration\",\n                \"with\": [\n                    {\n                        \"translate\": \"effect.minecraft.nausea\"\n                    },\n                    \"0:08\"\n                ],\n                \"color\": \"red\",\n                \"italic\": false\n            }\n        ]\n    ],\n    \"jump_boost\": [\n        [\n            {\n                \"translate\": \"potion.withDuration\",\n                \"with\": [\n                    {\n                        \"translate\": \"potion.withAmplifier\",\n                        \"with\": [\n                            {\n                                \"translate\": \"effect.minecraft.jump_boost\"\n                            },\n                            {\n                                \"translate\": \"potion.potency.3\"\n                            }\n                        ]\n                    },\n                    \"1:30\"\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ]\n    ],\n    \"poison\": [\n        [\n            {\n                \"translate\": \"potion.withDuration\",\n                \"with\": [\n                    {\n                        \"translate\": \"potion.withAmplifier\",\n                        \"with\": [\n                            {\n                                \"translate\": \"effect.minecraft.poison\"\n                            },\n                            {\n                                \"translate\": \"potion.potency.3\"\n                            }\n                        ]\n                    },\n                    \"0:32\"\n                ],\n                \"color\": \"red\",\n                \"italic\": false\n            }\n        ]\n    ],\n    \"regeneration\": [\n        [\n            {\n                \"translate\": \"potion.withDuration\",\n                \"with\": [\n                    {\n                        \"translate\": \"potion.withAmplifier\",\n                        \"with\": [\n                            {\n                                \"translate\": \"effect.minecraft.regeneration\"\n                            },\n                            {\n                                \"translate\": \"potion.potency.3\"\n                            }\n                        ]\n                    },\n                    \"0:22\"\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ],\n        [\n            {\n                \"translate\": \"potion.withDuration\",\n                \"with\": [\n                    {\n                        \"translate\": \"potion.withAmplifier\",\n                        \"with\": [\n                            {\n                                \"translate\": \"effect.minecraft.speed\"\n                            },\n                            {\n                                \"translate\": \"potion.potency.1\"\n                            }\n                        ]\n                    },\n                    \"0:16\"\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ],\n        {\n            \"text\": \"\"\n        },\n        {\n            \"translate\": \"potion.whenDrank\",\n            \"color\": \"dark_purple\",\n            \"italic\": false\n        },\n        {\n            \"translate\": \"attribute.modifier.plus.1\",\n            \"with\": [\n                \"40\",\n                {\n                    \"translate\": \"attribute.name.movement_speed\"\n                }\n            ],\n            \"color\": \"blue\",\n            \"italic\": false\n        }\n    ],\n    \"speed\": [\n        [\n            {\n                \"translate\": \"potion.withDuration\",\n                \"with\": [\n                    {\n                        \"translate\": \"potion.withAmplifier\",\n                        \"with\": [\n                            {\n                                \"translate\": \"effect.minecraft.speed\"\n                            },\n                            {\n                                \"translate\": \"potion.potency.3\"\n                            }\n                        ]\n                    },\n                    \"3:20\"\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ],\n        [\n            {\n                \"translate\": \"potion.withDuration\",\n                \"with\": [\n                    {\n                        \"translate\": \"potion.withAmplifier\",\n                        \"with\": [\n                            {\n                                \"translate\": \"effect.minecraft.weakness\"\n                            },\n                            {\n                                \"translate\": \"potion.potency.2\"\n                            }\n                        ]\n                    },\n                    \"3:20\"\n                ],\n                \"color\": \"red\",\n                \"italic\": false\n            }\n        ],\n        {\n            \"text\": \"\"\n        },\n        {\n            \"translate\": \"potion.whenDrank\",\n            \"color\": \"dark_purple\",\n            \"italic\": false\n        },\n        {\n            \"translate\": \"attribute.modifier.plus.1\",\n            \"with\": [\n                \"80\",\n                {\n                    \"translate\": \"attribute.name.movement_speed\"\n                }\n            ],\n            \"color\": \"blue\",\n            \"italic\": false\n        },\n        {\n            \"translate\": \"attribute.modifier.take.0\",\n            \"with\": [\n                \"12\",\n                {\n                    \"translate\": \"attribute.name.attack_damage\"\n                }\n            ],\n            \"color\": \"red\",\n            \"italic\": false\n        }\n    ],\n    \"strength\": [\n        [\n            {\n                \"translate\": \"potion.withDuration\",\n                \"with\": [\n                    {\n                        \"translate\": \"potion.withAmplifier\",\n                        \"with\": [\n                            {\n                                \"translate\": \"effect.minecraft.strength\"\n                            },\n                            {\n                                \"translate\": \"potion.potency.3\"\n                            }\n                        ]\n                    },\n                    \"1:30\"\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ],\n        [\n            {\n                \"translate\": \"potion.withDuration\",\n                \"with\": [\n                    {\n                        \"translate\": \"potion.withAmplifier\",\n                        \"with\": [\n                            {\n                                \"translate\": \"effect.minecraft.fire_resistance\"\n                            },\n                            {\n                                \"translate\": \"potion.potency.0\"\n                            }\n                        ]\n                    },\n                    \"0:16\"\n                ],\n                \"color\": \"blue\",\n                \"italic\": false\n            }\n        ],\n        {\n            \"text\": \"\"\n        },\n        {\n            \"translate\": \"potion.whenDrank\",\n            \"color\": \"dark_purple\",\n            \"italic\": false\n        },\n        {\n            \"translate\": \"attribute.modifier.plus.0\",\n            \"with\": [\n                \"12\",\n                {\n                    \"translate\": \"attribute.name.attack_damage\"\n                }\n            ],\n            \"color\": \"blue\",\n            \"italic\": false\n        }\n    ]\n\n}\n"
  },
  {
    "path": "gm4_zauber_cauldrons/raw/weather_modifiers.csv",
    "content": "modifier,item_id,translate_name,translate_fallback,soulution_translate_fallback\npolar,minecraft:snowball,polar,Bottle of Polar Magicol,Soulution of Polar Magicol\ntemperate,minecraft:slime_ball,temperate,Bottle of Temperate Magicol,Soulution of Temperate Magicol\narid,minecraft:magma_cream,arid,Bottle of Arid Magicol,Soulution of Arid Magicol\n"
  },
  {
    "path": "gm4_zauber_liquids/README.md",
    "content": "# Zauber Liquids<!--$headerTitle--><!--$pmc:delete-->\r\n\r\nAllows Zauber Cauldron produced potions to be stored in Liquid Tanks!<!--$pmc:headerSize-->\r\n\r\n### Features\r\n- Allows storage of extra strong Zauber potions in a tank\r\n- Allows the storage of Zauber's \"Wormhole\" liquid which teleports the player to a specific location created during its process. \r\n"
  },
  {
    "path": "gm4_zauber_liquids/assets/translations.csv",
    "content": "key,en_us\ncontainer.gm4.zauber_tank.harming,Zauber Harming Potion Tank\ncontainer.gm4.zauber_tank.healing,Zauber Healing Potion Tank\ncontainer.gm4.zauber_tank.leaping,Zauber Leaping Potion Tank\ncontainer.gm4.zauber_tank.poison,Zauber Poison Potion Tank\ncontainer.gm4.zauber_tank.regeneration,Zauber Regeneration Potion Tank\ncontainer.gm4.zauber_tank.strength,Zauber Strength Potion Tank\ncontainer.gm4.zauber_tank.swiftness,Zauber Swiftness Potion Tank\ncontainer.gm4.zauber_tank.wormhole,Wormhole Tank\ntext.gm4.guidebook.module_desc.zauber_liquids,From cauldron-made potions to potion-filled tanks! Store your tier IV potions and wormholes in Liquid Tanks!\ntext.gm4.guidebook.zauber_liquids.description,Zauber Potions can be stored in liquid tanks. Soulutions can be taken out by placing soul fire under the liquid tank.\\n\\nMobs under a zauber potion tank will gain the specific potion effect.\ntext.gm4.guidebook.zauber_liquids.wormhole_tanks,\"If any mobs walks under a wormhole tank it will teleport to that location.\\n\\nWhen a tank receives a wormhole, it will update its location to the midpoint of its current location and the new location, keeping the dimension of the original location.\"\n"
  },
  {
    "path": "gm4_zauber_liquids/beet.yaml",
    "content": "id: gm4_zauber_liquids\nname: Zauber Liquids\nversion: 1.9.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    minecraft: []\n    versioning:\n      required:\n        gm4_liquid_tanks: 2.7.0\n        gm4_zauber_cauldrons: 1.13.0\n    website:\n      description: From cauldron-made potions to potion-filled tanks! Store your tier IV potions and wormholes in Liquid Tanks!\n      recommended: []\n      notes: []\n    video: https://www.youtube.com/watch?v=qa9lcbii1BE\n    wiki: https://wiki.gm4.co/wiki/Liquid_Tanks/Zauber_Liquids\n    credits:\n      Creators:\n        - SpecialBuilder32\n        - Bloo\n      Updated by:\n        - JP12\n      Textures by:\n        - Vilder50\n        - Hozz\n      Icon Design:\n        - Sparks\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/item_drain.json",
    "content": "{\n    \"values\":[\n      \"gm4_zauber_liquids:item_drain\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/item_fill.json",
    "content": "{\n    \"values\":[\n      \"gm4_zauber_liquids:item_fill\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/relocate/restore_liquid.json",
    "content": "{\n    \"values\": [\n        \"gm4_zauber_liquids:relocate/restore_wormhole_scores\"\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/relocate/set_data.json",
    "content": "{\n    \"values\": [\n        \"gm4_zauber_liquids:relocate/store_wormhole_scores\"\n    ]\n}\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/remove_liquid_tags.json",
    "content": "{\n    \"values\":[\n      \"gm4_zauber_liquids:remove_liquid_tags\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/tank_init.json",
    "content": "{\n    \"values\":[\n      \"gm4_zauber_liquids:tank_init\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/util_below.json",
    "content": "{\n    \"values\":[\n      \"gm4_zauber_liquids:util_below\"\n    ]\n\n}\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/init.mcfunction",
    "content": "scoreboard objectives add gm4_zl_warp_cx dummy \"gm4_zauber_liquids_warp_cx\"\nscoreboard objectives add gm4_zl_warp_cy dummy \"gm4_zauber_liquids_warp_cy\"\nscoreboard objectives add gm4_zl_warp_cz dummy \"gm4_zauber_liquids_warp_cz\"\nscoreboard objectives add gm4_zl_warp_cd dummy \"gm4_zauber_liquids_warp_cd\"\nscoreboard players set #2 gm4_lt_value 2\n\n#declare storage gm4_zauber_liquids:temp/item/fill/zauber_wormhole\n\nexecute unless score zauber_liquids gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Zauber Liquids\"}\nexecute unless score zauber_liquids gm4_earliest_version < zauber_liquids gm4_modules run scoreboard players operation zauber_liquids gm4_earliest_version = zauber_liquids gm4_modules\nscoreboard players set zauber_liquids gm4_modules 1\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_drain/zauber_potion.mcfunction",
    "content": "# run from gm4_zauber_liquids:item_drain\n# @s = tank being processed\n\nexecute store result score $item_value gm4_lt_value run data get storage gm4_liquid_tanks:temp/tank input_slot.components.\"minecraft:custom_data\".gm4_zauber_cauldrons.bottle.sips 1\n# if not a soulution, sips path won't exist, so set value to 1 from 0\nexecute if score $item_value gm4_lt_value matches 0 run scoreboard players set $item_value gm4_lt_value 1\ndata merge storage gm4_liquid_tanks:temp/tank {output:{id:\"glass_bottle\"}}\nfunction gm4_liquid_tanks:smart_item_drain\ntag @s add gm4_lt_drain\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_drain/zauber_wormhole_potion.mcfunction",
    "content": "# run from gm4_zauber_liquids:item_drain\n# @s = tank being processed\n\n# Non-Weighted Averages: (oldcoord+newcoord)/2\nexecute store result score $math gm4_zl_warp_cx run data get storage gm4_liquid_tanks:temp/tank input_slot.components.\"minecraft:custom_data\".gm4_zauber_cauldrons.cauldron_pos.x\nexecute store result score $math gm4_zl_warp_cy run data get storage gm4_liquid_tanks:temp/tank input_slot.components.\"minecraft:custom_data\".gm4_zauber_cauldrons.cauldron_pos.y\nexecute store result score $math gm4_zl_warp_cz run data get storage gm4_liquid_tanks:temp/tank input_slot.components.\"minecraft:custom_data\".gm4_zauber_cauldrons.cauldron_pos.z\nexecute store result score $math gm4_zl_warp_cd run data get storage gm4_liquid_tanks:temp/tank input_slot.components.\"minecraft:custom_data\".gm4_zauber_cauldrons.cauldron_pos.dimension\n# Double score for first one so the initail input is just the actual position\nexecute if score @s gm4_lt_value matches 0 run scoreboard players operation $math gm4_zl_warp_cx += $math gm4_zl_warp_cx\nexecute if score @s gm4_lt_value matches 0 run scoreboard players operation $math gm4_zl_warp_cy += $math gm4_zl_warp_cy\nexecute if score @s gm4_lt_value matches 0 run scoreboard players operation $math gm4_zl_warp_cz += $math gm4_zl_warp_cz\n\n\n# x math\nscoreboard players operation @s gm4_zl_warp_cx += $math gm4_zl_warp_cx\nscoreboard players operation @s gm4_zl_warp_cx /= #2 gm4_lt_value\n\n# # y math\nscoreboard players operation @s gm4_zl_warp_cy += $math gm4_zl_warp_cy\nscoreboard players operation @s gm4_zl_warp_cy /= #2 gm4_lt_value\n\n# # z math\nscoreboard players operation @s gm4_zl_warp_cz += $math gm4_zl_warp_cz\nscoreboard players operation @s gm4_zl_warp_cz /= #2 gm4_lt_value\n\n# set dimension if first wormhole\nexecute if score @s gm4_lt_value matches 0 run scoreboard players operation @s gm4_zl_warp_cd = $math gm4_zl_warp_cd\n\nfunction gm4_zauber_liquids:item_drain/zauber_potion\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_drain.mcfunction",
    "content": "# Called by Liquid Tank's item_drain.json function tag\n\n# new smart interface handles the logic for whether there is enough space in the tank interrupts if not enough\n\nexecute if entity @s[tag=gm4_lt_zauber_harming_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"instant_damage\"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion\nexecute if entity @s[tag=gm4_lt_zauber_healing_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"instant_health\"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion\nexecute if entity @s[tag=gm4_lt_zauber_leaping_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"jump_boost\"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion\nexecute if entity @s[tag=gm4_lt_zauber_poison_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"poison\"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion\nexecute if entity @s[tag=gm4_lt_zauber_regeneration_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"regeneration\"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion\nexecute if entity @s[tag=gm4_lt_zauber_strength_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"strength\"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion\nexecute if entity @s[tag=gm4_lt_zauber_swiftness_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"speed\"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion\nexecute if entity @s[tag=gm4_lt_zauber_wormhole_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"wormhole_bottle\"}}}}} run function gm4_zauber_liquids:item_drain/zauber_wormhole_potion\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_harming_potion.mcfunction",
    "content": "# run from gm4_zauber_liquids:item_fill\n# @s = tank being processed\n\n# $item_value set in item_fill function for efficiency\n\nloot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/instant_damage\ndata modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0]\nitem replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air\nfunction gm4_liquid_tanks:smart_item_fill\ntag @s add gm4_lt_fill\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_healing_potion.mcfunction",
    "content": "# run from gm4_zauber_liquids:item_fill\n# @s = tank being processed\n\n# $item_value set in item_fill function for efficiency\n\nloot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/instant_health\ndata modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0]\nitem replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air\nfunction gm4_liquid_tanks:smart_item_fill\ntag @s add gm4_lt_fill\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_leaping_potion.mcfunction",
    "content": "# run from gm4_zauber_liquids:item_fill\n# @s = tank being processed\n\n# $item_value set in item_fill function for efficiency\n\nloot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/jump_boost\ndata modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0]\nitem replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air\nfunction gm4_liquid_tanks:smart_item_fill\ntag @s add gm4_lt_fill\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_poison_potion.mcfunction",
    "content": "# run from gm4_zauber_liquids:item_fill\n# @s = tank being processed\n\n# $item_value set in item_fill function for efficiency\n\nloot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/poison\ndata modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0]\nitem replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air\nfunction gm4_liquid_tanks:smart_item_fill\ntag @s add gm4_lt_fill\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_regeneration_potion.mcfunction",
    "content": "# run from gm4_zauber_liquids:item_fill\n# @s = tank being processed\n\n# $item_value set in item_fill function for efficiency\n\nloot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/regeneration\ndata modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0]\nitem replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air\nfunction gm4_liquid_tanks:smart_item_fill\ntag @s add gm4_lt_fill\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_strength_potion.mcfunction",
    "content": "# run from gm4_zauber_liquids:item_fill\n# @s = tank being processed\n\n# $item_value set in item_fill function for efficiency\n\nloot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/strength\ndata modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0]\nitem replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air\nfunction gm4_liquid_tanks:smart_item_fill\ntag @s add gm4_lt_fill\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_swiftness_potion.mcfunction",
    "content": "# run from gm4_zauber_liquids:item_fill\n# @s = tank being processed\n\n# $item_value set in item_fill function for efficiency\n\nloot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/speed\ndata modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0]\nitem replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air\nfunction gm4_liquid_tanks:smart_item_fill\ntag @s add gm4_lt_fill\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_wormhole_potion.mcfunction",
    "content": "# run from gm4_zauber_liquids:item_fill\n# @s = tank being processed\n\n\n# copy coords to storage for wormhole\nexecute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.x int 1 run scoreboard players get @s gm4_zl_warp_cx\nexecute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.y int 1 run scoreboard players get @s gm4_zl_warp_cy\nexecute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.z int 1 run scoreboard players get @s gm4_zl_warp_cz\nexecute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.dimension int 1 run scoreboard players get @s gm4_zl_warp_cd\n\n# $item_value set in item_fill function for efficiency\nloot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/wormhole\ndata modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0]\nitem replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air\nfunction gm4_liquid_tanks:smart_item_fill\ntag @s add gm4_lt_fill\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill.mcfunction",
    "content": "#@s = liquid tank with item in first slot\n#run from liquid_tanks:item_process\n\n# new smart interface handles the logic for whether there is enough liquid to fill the bottle and interrupts if not enough\n\n#all potions have the same liquid-amount rules, so we'll process here \nexecute store success score $has_soul_fire_heatsource gm4_zc_data if block ~ ~-1 ~ soul_fire\nexecute unless score $has_soul_fire_heatsource gm4_zc_data matches 1 store success score $has_soul_fire_heatsource gm4_zc_data if block ~ ~-1 ~ soul_campfire[lit=true]\n\nexecute unless score $has_soul_fire_heatsource gm4_zc_data matches 1 run scoreboard players set $item_value gm4_lt_value -1\nexecute if score $has_soul_fire_heatsource gm4_zc_data matches 1 run scoreboard players set $item_value gm4_lt_value -9\n\nexecute if score $has_soul_fire_heatsource gm4_zc_data matches 1 if score @s gm4_lt_value matches ..8 run scoreboard players operation $item_value gm4_lt_value = @s gm4_lt_value\nscoreboard players set #-1 gm4_lt_value -1\nexecute if score $item_value gm4_lt_value matches 1.. run scoreboard players operation $item_value gm4_lt_value *= #-1 gm4_lt_value\n\nexecute store result storage gm4_zauber_cauldrons:blueprint/item/multi_sip gm4_zauber_cauldrons.bottle.sips int -1.0 run scoreboard players get $item_value gm4_lt_value\n\n#harming\nexecute if entity @s[tag=gm4_lt_zauber_harming_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:glass_bottle\"}} run function gm4_zauber_liquids:item_fill/zauber_harming_potion\n\n#healing\nexecute if entity @s[tag=gm4_lt_zauber_healing_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:glass_bottle\"}} run function gm4_zauber_liquids:item_fill/zauber_healing_potion\n\n#leaping\nexecute if entity @s[tag=gm4_lt_zauber_leaping_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:glass_bottle\"}} run function gm4_zauber_liquids:item_fill/zauber_leaping_potion\n\n#poison\nexecute if entity @s[tag=gm4_lt_zauber_poison_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:glass_bottle\"}} run function gm4_zauber_liquids:item_fill/zauber_poison_potion\n\n#regeneration\nexecute if entity @s[tag=gm4_lt_zauber_regeneration_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:glass_bottle\"}} run function gm4_zauber_liquids:item_fill/zauber_regeneration_potion\n\n#speed\nexecute if entity @s[tag=gm4_lt_zauber_swiftness_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:glass_bottle\"}} run function gm4_zauber_liquids:item_fill/zauber_swiftness_potion\n\n#strength\nexecute if entity @s[tag=gm4_lt_zauber_strength_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:glass_bottle\"}} run function gm4_zauber_liquids:item_fill/zauber_strength_potion\n\n#wormhole\nexecute if entity @s[tag=gm4_lt_zauber_wormhole_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:glass_bottle\"}} run function gm4_zauber_liquids:item_fill/zauber_wormhole_potion\n\ndata modify storage gm4_zauber_cauldrons gm4_zauber_cauldrons.bottle.sips set value 9\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/harming.mcfunction",
    "content": "data merge block ~ ~ ~ {CustomName:'{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.zauber_tank.harming\",\"fallback\":\"Zauber Harming Potion Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.zauber_tank.harming\",\"fallback\":\"Zauber Harming Potion Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}'}\nsummon armor_stand ~ ~-.95 ~ {CustomName:'\"gm4_liquid_tank_display\"',Tags:[\"gm4_no_edit\",\"gm4_liquid_tank_display\",\"smithed.entity\",\"smithed.strict\"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:\"player_head\",count:1,components:{\"minecraft:profile\":\"$gm4_potion_liquids:liquids/harming\"}}]}\ndata modify entity @s data.gm4_liquid_tanks.liquid_tag set value \"gm4_lt_zauber_harming_potion\"\nscoreboard players set @s gm4_lt_max 300\ntag @s add gm4_lt_zauber_harming_potion\ntag @s remove gm4_lt_empty\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/healing.mcfunction",
    "content": "data merge block ~ ~ ~ {CustomName:'{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.zauber_tank.healing\",\"fallback\":\"Zauber Healing Potion Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.zauber_tank.healing\",\"fallback\":\"Zauber Healing Potion Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}'}\nsummon armor_stand ~ ~-.95 ~ {CustomName:'\"gm4_liquid_tank_display\"',Tags:[\"gm4_no_edit\",\"gm4_liquid_tank_display\",\"smithed.entity\",\"smithed.strict\"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:\"player_head\",count:1,components:{\"minecraft:profile\":\"$gm4_potion_liquids:liquids/healing\"}}]}\ndata modify entity @s data.gm4_liquid_tanks.liquid_tag set value \"gm4_lt_zauber_healing_potion\"\nscoreboard players set @s gm4_lt_max 300\ntag @s add gm4_lt_zauber_healing_potion\ntag @s remove gm4_lt_empty\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/leaping.mcfunction",
    "content": "data merge block ~ ~ ~ {CustomName:'{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.zauber_tank.leaping\",\"fallback\":\"Zauber Leaping Potion Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.zauber_tank.leaping\",\"fallback\":\"Zauber Leaping Potion Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}'}\nsummon armor_stand ~ ~-.95 ~ {CustomName:'\"gm4_liquid_tank_display\"',Tags:[\"gm4_no_edit\",\"gm4_liquid_tank_display\",\"smithed.entity\",\"smithed.strict\"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:\"player_head\",count:1,components:{\"minecraft:profile\":\"$gm4_potion_liquids:liquids/leaping\"}}]}\ndata modify entity @s data.gm4_liquid_tanks.liquid_tag set value \"gm4_lt_zauber_leaping_potion\"\nscoreboard players set @s gm4_lt_max 300\ntag @s add gm4_lt_zauber_leaping_potion\ntag @s remove gm4_lt_empty\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/poison.mcfunction",
    "content": "data merge block ~ ~ ~ {CustomName:'{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.zauber_tank.poison\",\"fallback\":\"Zauber Poison Potion Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.zauber_tank.poison\",\"fallback\":\"Zauber Poison Potion Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}'}\nsummon armor_stand ~ ~-.95 ~ {CustomName:'\"gm4_liquid_tank_display\"',Tags:[\"gm4_no_edit\",\"gm4_liquid_tank_display\",\"smithed.entity\",\"smithed.strict\"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:\"player_head\",count:1,components:{\"minecraft:profile\":\"$gm4_potion_liquids:liquids/poison\"}}]}\ndata modify entity @s data.gm4_liquid_tanks.liquid_tag set value \"gm4_lt_zauber_poison_potion\"\nscoreboard players set @s gm4_lt_max 300\ntag @s add gm4_lt_zauber_poison_potion\ntag @s remove gm4_lt_empty\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/regeneration.mcfunction",
    "content": "data merge block ~ ~ ~ {CustomName:'{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.zauber_tank.regeneration\",\"fallback\":\"Zauber Regeneration Potion Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.zauber_tank.regeneration\",\"fallback\":\"Zauber Regeneration Potion Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}'}\nsummon armor_stand ~ ~-.95 ~ {CustomName:'\"gm4_liquid_tank_display\"',Tags:[\"gm4_no_edit\",\"gm4_liquid_tank_display\",\"smithed.entity\",\"smithed.strict\"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:\"player_head\",count:1,components:{\"minecraft:profile\":\"$gm4_potion_liquids:liquids/regeneration\"}}]}\ndata modify entity @s data.gm4_liquid_tanks.liquid_tag set value \"gm4_lt_zauber_regeneration_potion\"\nscoreboard players set @s gm4_lt_max 300\ntag @s add gm4_lt_zauber_regeneration_potion\ntag @s remove gm4_lt_empty\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/strength.mcfunction",
    "content": "data merge block ~ ~ ~ {CustomName:'{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.zauber_tank.strength\",\"fallback\":\"Zauber Strength Potion Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.zauber_tank.strength\",\"fallback\":\"Zauber Strength Potion Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}'}\nsummon armor_stand ~ ~-.95 ~ {CustomName:'\"gm4_liquid_tank_display\"',Tags:[\"gm4_no_edit\",\"gm4_liquid_tank_display\",\"smithed.entity\",\"smithed.strict\"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:\"player_head\",count:1,components:{\"minecraft:profile\":\"$gm4_potion_liquids:liquids/strength\"}}]}\ndata modify entity @s data.gm4_liquid_tanks.liquid_tag set value \"gm4_lt_zauber_strength_potion\"\nscoreboard players set @s gm4_lt_max 300\ntag @s add gm4_lt_zauber_strength_potion\ntag @s remove gm4_lt_empty\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/swiftness.mcfunction",
    "content": "data merge block ~ ~ ~ {CustomName:'{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.zauber_tank.swiftness\",\"fallback\":\"Zauber Swiftness Potion Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.zauber_tank.swiftness\",\"fallback\":\"Zauber Swiftness Potion Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}'}\nsummon armor_stand ~ ~-.95 ~ {CustomName:'\"gm4_liquid_tank_display\"',Tags:[\"gm4_no_edit\",\"gm4_liquid_tank_display\",\"smithed.entity\",\"smithed.strict\"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:\"player_head\",count:1,components:{\"minecraft:profile\":\"$gm4_potion_liquids:liquids/swiftness\"}}]}\ndata modify entity @s data.gm4_liquid_tanks.liquid_tag set value \"gm4_lt_zauber_swiftness_potion\"\nscoreboard players set @s gm4_lt_max 300\ntag @s add gm4_lt_zauber_swiftness_potion\ntag @s remove gm4_lt_empty\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/wormhole.mcfunction",
    "content": "data merge block ~ ~ ~ {CustomName:'{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.zauber_tank.wormhole\",\"fallback\":\"Wormhole Tank\"},[{\"translate\":\"gui.gm4.liquid_tank\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"translate\":\"container.gm4.zauber_tank.wormhole\",\"fallback\":\"Wormhole Tank\",\"font\":\"gm4:default\",\"color\":\"#404040\"}]]}'}\nsummon armor_stand ~ ~-.95 ~ {CustomName:'\"gm4_liquid_tank_display\"',Tags:[\"gm4_no_edit\",\"gm4_liquid_tank_display\",\"smithed.entity\",\"smithed.strict\"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:\"player_head\",count:1,components:{\"minecraft:profile\":\"$gm4_zauber_liquids:liquids/wormhole\"}}]}\ndata modify entity @s data.gm4_liquid_tanks.liquid_tag set value \"gm4_lt_zauber_wormhole_potion\"\nscoreboard players set @s gm4_lt_max 300\ntag @s add gm4_lt_zauber_wormhole_potion\ntag @s add gm4_volatile_liquid\ntag @s remove gm4_lt_empty\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/relocate/restore_wormhole_scores.mcfunction",
    "content": "# restores the liquid from the tank\n# @s = marker for this liquid tank\n# located at the center of the liquid tank\n# run from #gm4_liquid_tanks:relocate/restore_liquid\n\nexecute store result score @s[tag=gm4_lt_zauber_wormhole_potion] gm4_zl_warp_cx run data get storage gm4_relocators:temp gm4_relocation.entity_data.zl_warp_cx\nexecute store result score @s[tag=gm4_lt_zauber_wormhole_potion] gm4_zl_warp_cy run data get storage gm4_relocators:temp gm4_relocation.entity_data.zl_warp_cy\nexecute store result score @s[tag=gm4_lt_zauber_wormhole_potion] gm4_zl_warp_cz run data get storage gm4_relocators:temp gm4_relocation.entity_data.zl_warp_cz\nexecute store result score @s[tag=gm4_lt_zauber_wormhole_potion] gm4_zl_warp_cd run data get storage gm4_relocators:temp gm4_relocation.entity_data.zl_warp_cd\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/relocate/store_wormhole_scores.mcfunction",
    "content": "# stores the scores of the wormhole tank\n# @s = \"smithed.block\" entity inside the block\n# located at the center of the block to be picked up\n# run from #gm4_liquid_tanks:relocate/set_data\n\nexecute store result storage gm4_relocators:temp merge_data.entity_data.zl_warp_cx int 1 run scoreboard players get @s gm4_zl_warp_cx\nexecute store result storage gm4_relocators:temp merge_data.entity_data.zl_warp_cy int 1 run scoreboard players get @s gm4_zl_warp_cy\nexecute store result storage gm4_relocators:temp merge_data.entity_data.zl_warp_cz int 1 run scoreboard players get @s gm4_zl_warp_cz\nexecute store result storage gm4_relocators:temp merge_data.entity_data.zl_warp_cd int 1 run scoreboard players get @s gm4_zl_warp_cd\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/remove_liquid_tags.mcfunction",
    "content": "#@s = liquid tank stand\n# removes all liquid tags from the stand. Used for emptying tank and reassigning liquid type\n\ntag @s remove gm4_lt_zauber_harming_potion\ntag @s remove gm4_lt_zauber_healing_potion\ntag @s remove gm4_lt_zauber_leaping_potion\ntag @s remove gm4_lt_zauber_poison_potion\ntag @s remove gm4_lt_zauber_regeneration_potion\ntag @s remove gm4_lt_zauber_swiftness_potion\ntag @s remove gm4_lt_zauber_strength_potion\ntag @s remove gm4_lt_zauber_wormhole_potion\nscoreboard players reset @s gm4_zl_warp_cx\nscoreboard players reset @s gm4_zl_warp_cy\nscoreboard players reset @s gm4_zl_warp_cz\nscoreboard players reset @s gm4_zl_warp_cd\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/tank_init.mcfunction",
    "content": "#@s = empty liquid tank with item in first slot or entity on top\n#run from liquid_tanks:item_process\n\n#zauber leaping\nexecute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"jump_boost\"}}}}} run function gm4_zauber_liquids:liquid_init/leaping\n\n#zauber speed\nexecute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"speed\"}}}}} run function gm4_zauber_liquids:liquid_init/swiftness\n\n#zauber healing\nexecute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"instant_health\"}}}}} run function gm4_zauber_liquids:liquid_init/healing\n\n#zauber harming\nexecute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"instant_damage\"}}}}} run function gm4_zauber_liquids:liquid_init/harming\n\n#zauber poison\nexecute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"poison\"}}}}} run function gm4_zauber_liquids:liquid_init/poison\n\n#zauber regeneration\nexecute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"regeneration\"}}}}} run function gm4_zauber_liquids:liquid_init/regeneration\n\n#zauber strength\nexecute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"potion\",type:\"strength\"}}}}} run function gm4_zauber_liquids:liquid_init/strength\n\n#zauber wormhole\nexecute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:\"minecraft:potion\",components:{\"minecraft:custom_data\":{gm4_zauber_cauldrons:{item:\"wormhole_bottle\"}}}}} run function gm4_zauber_liquids:liquid_init/wormhole\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/harming.mcfunction",
    "content": "#@s = living-base entity below zauber harming potion tank\n#run from zauber_liquids:util_below\n\neffect give @s instant_damage 1 3\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/healing.mcfunction",
    "content": "#@s = living-base entity below zauber healing potion tank\n#run from zauber_liquids:util_below\n\neffect give @s instant_health 1 3\neffect give @s nausea 8 0\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/leaping.mcfunction",
    "content": "#@s = living-base entity below zauber leaping potion tank\n#run from zauber_liquids:util_below\n\neffect give @s jump_boost 90 3\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/poison.mcfunction",
    "content": "#@s = living-base entity below zauber poison potion tank\n#run from zauber_liquids:util_below\n\neffect give @s poison 32 3\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/regeneration.mcfunction",
    "content": "#@s = living-base entity below zauber regeneration potion tank\n#run from zauber_liquids:util_below\n\neffect give @s regeneration 22 3\neffect give @s speed 16 2\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/strength.mcfunction",
    "content": "#@s = living-base entity below zauber strength potion tank\n#run from zauber_liquids:util_below\n\neffect give @s strength 90 3\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/swiftness.mcfunction",
    "content": "#@s = living-base entity below zauber speed potion tank\n#run from zauber_liquids:util_below\n\neffect give @s speed 200 3\neffect give @s weakness 360 3\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/wormhole.mcfunction",
    "content": "#@s = living-base entity below wormhole potion tank\n#run from zauber_liquids:util_below\n\n# To work with non-player mobs, both versions require a change to @e from @a on line 14 of wormhole_targeting/set_dimension.mcfunction\n\n# Set coords\nscoreboard players operation $wormhole_x gm4_zc_data = @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_zl_warp_cx\nscoreboard players operation $wormhole_y gm4_zc_data = @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_zl_warp_cy\nscoreboard players operation $wormhole_z gm4_zc_data = @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_zl_warp_cz\nscoreboard players operation $wormhole_d gm4_zc_data = @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_zl_warp_cd\nscoreboard players set $read_coordinates gm4_zc_data 1\nexecute at @s run function gm4_zauber_cauldrons:player/wormhole_targeting/prepare_teleport\n\nscoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1\nplaysound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/function/util_below.mcfunction",
    "content": "#@s = tank with entity above it positioned ~ ~-1 ~\n#run from liquid_tanks:process via #gm4_liquid_tanks:util_below\n\ntag @s add gm4_processing_tank\n\n#harming\nexecute if score @s[tag=gm4_lt_zauber_harming_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] run function gm4_zauber_liquids:util/harming\n\n#healing\nexecute if score @s[tag=gm4_lt_zauber_healing_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] run function gm4_zauber_liquids:util/healing\n\n#leaping\nexecute if score @s[tag=gm4_lt_zauber_leaping_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:jump_boost'}]}] run function gm4_zauber_liquids:util/leaping\n\n#poison\nexecute if score @s[tag=gm4_lt_zauber_poison_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:poison'}]}] run function gm4_zauber_liquids:util/poison\n\n#regeneration\nexecute if score @s[tag=gm4_lt_zauber_regeneration_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:regeneration'}]}] run function gm4_zauber_liquids:util/regeneration\n\n#speed\nexecute if score @s[tag=gm4_lt_zauber_swiftness_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:speed'}]}] run function gm4_zauber_liquids:util/swiftness\n\n#strength\nexecute if score @s[tag=gm4_lt_zauber_strength_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:strength'}]}] run function gm4_zauber_liquids:util/strength\n\n#wormhole\nexecute if score @s[tag=gm4_lt_zauber_wormhole_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[tag=!gm4_zl_wormhole_ignore] run function gm4_zauber_liquids:util/wormhole\n\ntag @s remove gm4_processing_tank\n"
  },
  {
    "path": "gm4_zauber_liquids/data/gm4_zauber_liquids/guidebook/zauber_liquids.json",
    "content": "{\n  \"id\": \"zauber_liquids\",\n  \"name\": \"Zauber Liquids\",\n  \"module_type\": \"expansion\",\n  \"base_module\": \"liquid_tanks\",\n  \"icon\": {\n    \"id\": \"minecraft:potion\",\n    \"components\": {\n      \"minecraft:potion_contents\": {\n        \"custom_color\": 8587123\n      }\n    }\n  },\n  \"criteria\": {\n    \"obtain_zauber_potion_after_liquid_tank\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"predicates\": {\n              \"minecraft:custom_data\": \"{gm4_zauber_cauldrons:{bottle:{}}}\"\n            }\n          }\n        ],\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"type_specific\": {\n                \"type\": \"player\",\n                \"advancements\": {\n                  \"gm4:liquid_tanks_create\": true\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_zauber_potion_after_liquid_tank\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_liquids.description\",\n            \"fallback\": \"Zauber Potions can be stored in liquid tanks. Soulutions can be taken out by placing soul fire under the liquid tank.\\n\\nMobs under a zauber potion tank will gain the specific potion effect.\"\n          }\n        ],\n        [\n          {\n            \"translate\": \"text.gm4.guidebook.zauber_liquids.wormhole_tanks\",\n            \"fallback\": \"If any mobs walks under a wormhole tank it will teleport to that location.\\n\\nWhen a tank receives a wormhole, it will update its location to the midpoint of its current location and the new location, keeping the dimension of the original location.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_ziprails/README.md",
    "content": "# Ziprails<!--$headerTitle--><!--$pmc:delete-->\n\nEveryone loves building minecart rail systems, but giant mono-rails across your world can get to be an eyesore. With this simple data pack, enable your minecarts to hang from \"ziprails\" made of tripwire, much less intrusive \nthan regular rail lines. <!--$pmc:headerSize-->\n\n![Ziprails Example](images/ziprails_example.webp) <!--$localAssetToURL--> <!--$modrinth:replaceWithVideo--> <!--$pmc:delete-->\n\n### Features\n- All minecart types can grab onto a \"ziprail\" by riding under the tripwire hook at one end.\n- Minecarts will travel down a ziprail until it reaches the other end, much like a gondola or cable-car\n- Adds a custom advancement for your first ride in the sky\n"
  },
  {
    "path": "gm4_ziprails/beet.yaml",
    "content": "id: gm4_ziprails\nname: Ziprails\nversion: 1.7.X\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.extend.module\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [tick]\n    model_data:\n      - item: minecart\n        reference: gui/advancement/ziprails\n        template: advancement\n    website:\n      description: Automatically latch on to a tripwire to sail through the sky on a suspended line!\n      recommended:\n        - gm4_vertical_rails\n      notes: []\n    modrinth:\n      project_id: EpgLRkLf\n    smithed:\n      pack_id: gm4_ziprails\n    planetminecraft: \n      uid: 4298467\n    video: https://www.youtube.com/watch?v=QA7a5q2kVcg\n    wiki: https://wiki.gm4.co/wiki/Ziprails\n    credits:\n      Creators:\n        - Sparks\n        - SpecialBuilder32\n        - Bloo\n      Icon Design:\n        - DuckJr\n"
  },
  {
    "path": "gm4_ziprails/data/gm4/advancement/ziprails.json",
    "content": "{\n  \"display\": {\n    \"icon\": {\n      \"id\": \"minecraft:minecart\",\n      \"components\": {\n        \"minecraft:custom_model_data\": {\"strings\":[\"gm4_ziprails:gui/advancement/ziprails\"]}\n      }\n    },\n    \"title\": {\n      \"translate\": \"advancement.gm4.ziprails.title\",\n      \"fallback\": \"Wheeeeeeeee\"\n    },\n    \"description\": {\n      \"translate\": \"advancement.gm4.ziprails.description\",\n      \"fallback\": \"Fly through the sky on a ziprail.\",\n      \"color\": \"gray\"\n    }\n  },\n  \"parent\": \"gm4:root\",\n  \"criteria\": {\n    \"ride_ziprail\": {\n      \"trigger\": \"minecraft:location\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_properties\",\n            \"entity\": \"this\",\n            \"predicate\": {\n              \"vehicle\": {\n                \"type\": \"minecraft:minecart\",\n                \"nbt\": \"{Tags:[\\\"gm4_linked\\\"]}\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "gm4_ziprails/data/gm4_ziprails/function/check_cable.mcfunction",
    "content": "# checks to see if minecart is under a tripwire cable\n# @s = minecart\n# run from main\n\nexecute if block ~ ~1 ~ #gm4_ziprails:cable[attached=true] run function gm4_ziprails:ziprail/zipping\nexecute if entity @s[tag=gm4_linked] unless block ~ ~1 ~ #gm4_ziprails:cable run function gm4_ziprails:ziprail/clear_tags\n"
  },
  {
    "path": "gm4_ziprails/data/gm4_ziprails/function/init.mcfunction",
    "content": "execute unless score ziprails gm4_modules matches 1 run data modify storage gm4:log queue append value {type:\"install\",module:\"Ziprails\"}\nexecute unless score ziprails gm4_earliest_version < ziprails gm4_modules run scoreboard players operation ziprails gm4_earliest_version = ziprails gm4_modules\nscoreboard players set ziprails gm4_modules 1\n\nschedule function gm4_ziprails:main 1t\n\n\n\n#$moduleUpdateList\n"
  },
  {
    "path": "gm4_ziprails/data/gm4_ziprails/function/main.mcfunction",
    "content": "execute as @e[type=#gm4:minecarts,tag=!smithed.entity] at @s run function gm4_ziprails:check_cable\n\nschedule function gm4_ziprails:main 2t\n"
  },
  {
    "path": "gm4_ziprails/data/gm4_ziprails/function/ziprail/clear_tags.mcfunction",
    "content": "# run from check_cable\n\ntag @s remove gm4_linked\n\ntag @s remove gm4_zipping_north\ntag @s remove gm4_zipping_east\ntag @s remove gm4_zipping_south\ntag @s remove gm4_zipping_west\n"
  },
  {
    "path": "gm4_ziprails/data/gm4_ziprails/function/ziprail/link.mcfunction",
    "content": "# docks minecarts under hooks to assign them a zipline movement direction\n# @s = minecarts that are under a hook\n# run from ziprail/zipping\n\ntag @s add gm4_linked\n\n# remove old facing directions\ntag @s remove gm4_zipping_north\ntag @s remove gm4_zipping_south\ntag @s remove gm4_zipping_east\ntag @s remove gm4_zipping_west\n\n# assign minecart movement direction based on the direction of the hook above them\nexecute if block ~ ~1 ~ tripwire_hook[facing=north] run tag @s add gm4_zipping_north\nexecute if block ~ ~1 ~ tripwire_hook[facing=south] run tag @s add gm4_zipping_south\nexecute if block ~ ~1 ~ tripwire_hook[facing=east] run tag @s add gm4_zipping_east\nexecute if block ~ ~1 ~ tripwire_hook[facing=west] run tag @s add gm4_zipping_west\n\n# sound effect\nplaysound minecraft:entity.item_frame.place neutral @p[distance=..1,limit=1]\n"
  },
  {
    "path": "gm4_ziprails/data/gm4_ziprails/function/ziprail/zipping.mcfunction",
    "content": "# @s = minecarts that are under a hook or string\n# run from check_cable\n\n# link minecarts that are on a hook\nexecute if entity @s[tag=!gm4_linked] if block ~ ~1 ~ tripwire_hook[attached=true] run function gm4_ziprails:ziprail/link\n\n# teleport carts to rail-trigger height\nexecute if entity @s[tag=!gm4_taut_link,tag=gm4_linked] unless block ~ ~ ~ #minecraft:rails align y run teleport @s ~ ~.36250001192093 ~\nexecute if entity @s[tag=gm4_linked] unless block ~ ~ ~ #minecraft:rails run tag @s add gm4_taut_link\nexecute if block ~ ~ ~ #minecraft:rails run tag @s remove gm4_taut_link\n\nexecute if entity @s[tag=!gm4_taut_link] if block ~ ~1 ~ tripwire_hook[attached=true] run function gm4_ziprails:ziprail/link\n\n# move docked minecarts along their string\ndata merge entity @s[tag=gm4_taut_link,tag=gm4_zipping_north] {Motion:[0.0,0.06,-0.4]}\ndata merge entity @s[tag=gm4_taut_link,tag=gm4_zipping_south] {Motion:[0.0,0.06,0.4]}\ndata merge entity @s[tag=gm4_taut_link,tag=gm4_zipping_east] {Motion:[0.4,0.06,0.0]}\ndata merge entity @s[tag=gm4_taut_link,tag=gm4_zipping_west] {Motion:[-0.4,0.06,0.0]}\n"
  },
  {
    "path": "gm4_ziprails/data/gm4_ziprails/guidebook/ziprails.json",
    "content": "{\n  \"id\": \"ziprails\",\n  \"name\": \"Ziprails\",\n  \"module_type\": \"module\",\n  \"icon\": {\n    \"id\": \"minecraft:minecart\"\n  },\n  \"criteria\": {\n    \"obtain_minecart\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:minecart\"\n            ]\n          }\n        ]\n      }\n    },\n    \"obtain_string\": {\n      \"trigger\": \"minecraft:inventory_changed\",\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": [\n              \"minecraft:string\"\n            ]\n          }\n        ]\n      }\n    }\n  },\n  \"sections\": [\n    {\n      \"name\": \"description\",\n      \"enable\": [],\n      \"requirements\": [\n        [\n          \"obtain_minecart\"\n        ],\n        [\n          \"obtain_string\"\n        ]\n      ],\n      \"pages\": [\n        [\n          {\n            \"insert\": \"title\"\n          },\n          {\n            \"translate\": \"text.gm4.guidebook.ziprails.description\",\n            \"fallback\": \"Tripwires act as ziprails for minecarts.\\n\\nA rail must be directly under an connected tripwire hook to transfer a minecart to a zipline.\"\n          }\n        ]\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "gm4_ziprails/data/gm4_ziprails/tags/block/cable.json",
    "content": "{\n    \"values\": [\n        \"minecraft:tripwire_hook\",\n        \"minecraft:tripwire\"\n    ]\n}\n"
  },
  {
    "path": "gm4_ziprails/translations.csv",
    "content": "key,en_us\nadvancement.gm4.ziprails.title,Wheeeeeeeee\nadvancement.gm4.ziprails.description,Fly through the sky on a ziprail.\ntext.gm4.guidebook.module_desc.ziprails,Automatically latch on to a tripwire to sail through the sky on a suspended line!\ntext.gm4.guidebook.ziprails.description,Tripwires act as ziprails for minecarts.\\n\\nA rail must be directly under an connected tripwire hook to transfer a minecart to a zipline.\n"
  },
  {
    "path": "lib_brewing/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2021 Gamemode 4 Development\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib_brewing/README.md",
    "content": "# lib_brewing\nlib_brewing is a mcfunction library that allows other data packs to replace custom potions with splash and lingering potions when brewed in a brewing stand. This is used to prevent the `Uncraftable Splash Potion` and `Uncraftable Lingering Potion` items from being obtainable.\n\n## Uses\n### Splash and Lingering Conversions\nThis library automatically catches splash and lingering potion conversions to allow data packs to properly replace those potions. This means whenever a potion is brewed into a splash potion using gunpowder, a set of functions will be run to replace the Uncraftable Splash Potion with a custom splash potion. Similarly, whenever a splash potion is brewed into a lingering potion using dragon's breath, a set of functions will be run to replace the Uncraftable Lingering Potion with a custom lingering potion.\n\nEach brewing stand has a marker to track these changes. When splash and lingering potions are created, each potion is checked by calling the `#gm4_brewing:insert/splash` or `#gm4_brewing:insert/lingering` function tags (once per potion, so if there are 3 potions in the brewing stand, that function tag gets called for each potion). The full item components for each potion is saved into the nbt of the marker in `data.gm4_brewing.insert.components.<ITEM_COMPONENTS>`. For example if the brewing stand has the nbt `{Items:[{Slot:0b,id:\"minecraft:potion\",count:1,components:{'minecraft:custom_data':{my_custom_potion:1b}}}]}`, the marker would have the nbt `{data:{gm4_brewing:{insert:{Slot:0b,id:\"minecraft:potion\",count:1,components:{'minecraft:custom_data':{my_custom_potion:1b}}}}}}` when it's checking the first potion. This is how you should check for your custom potions\n\nTo utilize this function, two functions tags, two functions, and two loot tables should be created. Below are the files for splash potions, and can be copied for lingering potions by replacing all instances of `splash` with `lingering`\n\n1. create a single loot table to check the potion type and drop the proper splash potion:\n\nloot table `MODULE_ID:technical/brewing_stand/splash`\n```json\n{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:alternatives\",\n          \"children\": [\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"name\": \"LOOT TABLE PATH TO SPLASH POTION 1\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:entity_properties\",\n                  \"entity\": \"this\",\n                  \"predicate\": {\n                    \"nbt\": \"{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{INDICATION NBT FOR POTION 1}}}}}\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"minecraft:loot_table\",\n              \"name\": \"LOOT TABLE PATH TO SPLASH POTION 2\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:entity_properties\",\n                  \"entity\": \"this\",\n                  \"predicate\": {\n                    \"nbt\": \"{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{INDICATION NBT FOR POTION 2}}}}}\"\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      ],\n      \"functions\": [\n        {\n          \"function\": \"minecraft:set_custom_data\",\n          \"tag\": \"{gm4_custom_potion:1b}\"\n        }\n      ]\n    }\n  ]\n}\n```\n\n2. Create a function to call the splash potion loot table when the library catches a splash potion conversion:\n\nfunction `MODULE_ID:brewing_stand/splash`\n```mcfunction\n# @s = brewing stand marker with a custom potion to be converted to a splash potion\n# run from #gm4_brewing:insert/splash\n\nloot spawn ~ ~ ~ loot MODULE_ID:technical/brewing_stand/splash\n# uncomment this line to completely clear the potion VV\n# execute if<...> run scoreboard players set $insert gm4_brewing_data -1\n```\n\n3. Add your function to the library API call that runs when the library catches a splash potion conversion:\n\nfunction tag `#gm4_brewing:insert/splash`\n```json\n{\n  \"values\": [\n    \"MODULE_ID:brewing_stand/splash\"\n  ]\n}\n```\n\n\n### Changing Splash and Lingering Outcomes\n- In the two created functions (`/brewing_stand/splash.mcfunction` and `/brewing_stand/lingering.mcfunction`) additonal commands can be run before the `/loot` command to change the outcome of the loot tables. For example, if you want potions to turn into a water bottle if the brewing stand is surrounded by water, you could set a score and have the loot table check for that score.\n\n- Using the following command will clear the potion from the brewing stand (should typically be used with a check so only certain custom potions are deleted):\n```mcfunction\nscoreboard players set $insert gm4_brewing_data -1\n```\n\n### Additional Brewing Functions\nEvery time a brewing stand completes a brew, the function tag `#gm4_brewing:finish_brew` runs AFTER the default interactions of creating splash and lingering potions. This allows further checks and modifications to potions (but is still restricted to the vanilla hardcoded brewing rules; i.e. it doesn't allow using dirt as a brewing ingredient). The `Items` nbt of the brewing stand is saved 1 tick before the potions finish brewing (when `#gm4_brewing:finish_brew` is called), so the brewing ingredient and original potion data is available inside the marker nbt. To test for items in the brewing stand, use the entity data from the marker: \n\n```mcfunction\nexecute if entity @s[nbt={data:{gm4_brewing:{previous_items:[BLOCK_DATA]}}}]\n```\n\nFor example, this is the code that checks if a splash potion should be created: \n```mcfunction\nexecute if entity @s[nbt={data:{gm4_brewing:{previous_items:[{Slot:3b,id:\"minecraft:gunpowder\"}]}}}] ...\n```\n\n\n## License\nThis library, and the contents of the `lib_brewing` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License.\n"
  },
  {
    "path": "lib_brewing/beet.yaml",
    "content": "id: gm4_brewing\nname: Gamemode 4 Brewing\nversion: 1.5.X\ndescription: Allows datapacks to replace custom potions with splash and lingering potions when brewed in a brewing stand.\n\ndata_pack:\n  load: \n    data: data\n\npipeline:\n  - gm4.plugins.extend.library\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [main]\n    smithed:\n      pack_id: gm4_lib_brewing\n    credits:\n      Creator:\n        - BPR\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/advancement/place_brewing_stand.json",
    "content": "{\n  \"criteria\": {\n    \"place_brewing_stand\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:block_state_property\",\n            \"block\": \"minecraft:brewing_stand\"\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_brewing:place_brewing_stand\"\n  }\n}\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/check_brew.mcfunction",
    "content": "# @s = none\n# run from process\n\nscoreboard players set $brewed gm4_brewing_data 0\nexecute as @e[type=marker,tag=gm4_brewing_tick] at @s if block ~ ~ ~ brewing_stand{BrewTime:1s} run function gm4_brewing:prep_finish_brew\n\nexecute if score $brewed gm4_brewing_data matches 0 run schedule function gm4_brewing:check_brew 1t\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/finalize_potions/get_brewing_stand.mcfunction",
    "content": "# @s = brewing stand marker that just finished brewing\n# run from finish_brew\n\nexecute if entity @s[nbt={data:{gm4_brewing:{previous_items:[{Slot:3b,id:\"minecraft:gunpowder\"}]}}}] run function gm4_brewing:finalize_potions/splash/check_items\nexecute if entity @s[nbt={data:{gm4_brewing:{previous_items:[{Slot:3b,id:\"minecraft:dragon_breath\"}]}}}] run function gm4_brewing:finalize_potions/lingering/check_items\n\nfunction #gm4_brewing:finish_brew\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/finalize_potions/lingering/check_items.mcfunction",
    "content": "# @s = brewing stand marker that finished brewing with dragon's breath\n# run from finalize_potions/get_brewing_stand\n\n# store data into storage\ndata modify storage gm4_brewing:temp Items set from entity @s data.gm4_brewing.previous_items\n\n# check contents of block for splash potions\nexecute if data storage gm4_brewing:temp Items[{Slot:0b,id:\"minecraft:splash_potion\"}] run function gm4_brewing:finalize_potions/lingering/slot_0\nexecute if data storage gm4_brewing:temp Items[{Slot:1b,id:\"minecraft:splash_potion\"}] run function gm4_brewing:finalize_potions/lingering/slot_1\nexecute if data storage gm4_brewing:temp Items[{Slot:2b,id:\"minecraft:splash_potion\"}] run function gm4_brewing:finalize_potions/lingering/slot_2\n\n# clean up\ndata remove storage gm4_brewing:temp Items\ntag @s remove gm4_brewing_finished\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/finalize_potions/lingering/slot_0.mcfunction",
    "content": "# @s = brewing stand marker with a splash potion in slot 0\n# run from finalize_potions/lingering/check_items\n\ndata modify entity @s data.gm4_brewing.insert set from storage gm4_brewing:temp Items[{Slot:0b}]\n\n# use loot table to create new item\nfunction #gm4_brewing:insert/lingering\nexecute if score $insert gm4_brewing_data matches -1 run data remove block ~ ~ ~ Items[{Slot:0b}]\nexecute store success score $insert gm4_brewing_data run data modify storage gm4_brewing:temp insert set from entity @e[type=item,predicate=gm4_brewing:is_custom_potion,limit=1] Item\n\n# insert item\ndata remove storage gm4_brewing:temp insert.components.\"minecraft:custom_data\".gm4_custom_potion\ndata modify storage gm4_brewing:temp insert.Slot set value 0b\nexecute if score $insert gm4_brewing_data matches 1.. run data modify block ~ ~ ~ Items[{Slot:0b}] set from storage gm4_brewing:temp insert \n\n# clean up\nscoreboard players reset $insert gm4_brewing_data\nkill @e[type=item,predicate=gm4_brewing:is_custom_potion]\ndata remove entity @s data.gm4_brewing.insert\ndata remove storage gm4_brewing:temp insert\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/finalize_potions/lingering/slot_1.mcfunction",
    "content": "# @s = brewing stand marker with a splash potion in slot 1\n# run from finalize_potions/lingering/check_items\n\ndata modify entity @s data.gm4_brewing.insert set from storage gm4_brewing:temp Items[{Slot:1b}]\n\n# use loot table to create new item\nfunction #gm4_brewing:insert/lingering\nexecute if score $insert gm4_brewing_data matches -1 run data remove block ~ ~ ~ Items[{Slot:1b}]\nexecute store success score $insert gm4_brewing_data run data modify storage gm4_brewing:temp insert set from entity @e[type=item,predicate=gm4_brewing:is_custom_potion,limit=1] Item\n\n# insert item\ndata remove storage gm4_brewing:temp insert.components.\"minecraft:custom_data\".gm4_custom_potion\ndata modify storage gm4_brewing:temp insert.Slot set value 1b\nexecute if score $insert gm4_brewing_data matches 1.. run data modify block ~ ~ ~ Items[{Slot:1b}] set from storage gm4_brewing:temp insert \n\n# clean up\nscoreboard players reset $insert gm4_brewing_data\nkill @e[type=item,predicate=gm4_brewing:is_custom_potion]\ndata remove entity @s data.gm4_brewing.insert\ndata remove storage gm4_brewing:temp insert\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/finalize_potions/lingering/slot_2.mcfunction",
    "content": "# @s = brewing stand marker with a splash potion in slot 2\n# run from finalize_potions/lingering/check_items\n\ndata modify entity @s data.gm4_brewing.insert set from storage gm4_brewing:temp Items[{Slot:2b}]\n\n# use loot table to create new item\nfunction #gm4_brewing:insert/lingering\nexecute if score $insert gm4_brewing_data matches -1 run data remove block ~ ~ ~ Items[{Slot:2b}]\nexecute store success score $insert gm4_brewing_data run data modify storage gm4_brewing:temp insert set from entity @e[type=item,predicate=gm4_brewing:is_custom_potion,limit=1] Item\n\n# insert item\ndata remove storage gm4_brewing:temp insert.components.\"minecraft:custom_data\".gm4_custom_potion\ndata modify storage gm4_brewing:temp insert.Slot set value 2b\nexecute if score $insert gm4_brewing_data matches 1.. run data modify block ~ ~ ~ Items[{Slot:2b}] set from storage gm4_brewing:temp insert \n\n# clean up\nscoreboard players reset $insert gm4_brewing_data\nkill @e[type=item,predicate=gm4_brewing:is_custom_potion]\ndata remove entity @s data.gm4_brewing.insert\ndata remove storage gm4_brewing:temp insert\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/finalize_potions/splash/check_items.mcfunction",
    "content": "# @s = brewing stand marker that finished brewing with gunpowder\n# run from finalize_potions/get_brewing_stand\n\n# store data into storage\ndata modify storage gm4_brewing:temp Items set from entity @s data.gm4_brewing.previous_items\n\n# check contents of block for potions\nexecute if data storage gm4_brewing:temp Items[{Slot:0b,id:\"minecraft:potion\"}] run function gm4_brewing:finalize_potions/splash/slot_0\nexecute if data storage gm4_brewing:temp Items[{Slot:1b,id:\"minecraft:potion\"}] run function gm4_brewing:finalize_potions/splash/slot_1\nexecute if data storage gm4_brewing:temp Items[{Slot:2b,id:\"minecraft:potion\"}] run function gm4_brewing:finalize_potions/splash/slot_2\n\n# clean up\ndata remove storage gm4_brewing:temp Items\ntag @s remove gm4_brewing_finished\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/finalize_potions/splash/slot_0.mcfunction",
    "content": "# @s = brewing stand marker with a potion in slot 0\n# run from finalize_potions/splash/check_items\n\ndata modify entity @s data.gm4_brewing.insert set from storage gm4_brewing:temp Items[{Slot:0b}]\n\n# use loot table to create new item\nfunction #gm4_brewing:insert/splash\nexecute if score $insert gm4_brewing_data matches -1 run data remove block ~ ~ ~ Items[{Slot:0b}]\nexecute store success score $insert gm4_brewing_data run data modify storage gm4_brewing:temp insert set from entity @e[type=item,predicate=gm4_brewing:is_custom_potion,limit=1] Item\n\n# insert item\ndata remove storage gm4_brewing:temp insert.components.\"minecraft:custom_data\".gm4_custom_potion\ndata modify storage gm4_brewing:temp insert.Slot set value 0b\nexecute if score $insert gm4_brewing_data matches 1.. run data modify block ~ ~ ~ Items[{Slot:0b}] set from storage gm4_brewing:temp insert \n\n# clean up\nscoreboard players reset $insert gm4_brewing_data\nkill @e[type=item,predicate=gm4_brewing:is_custom_potion]\ndata remove entity @s data.gm4_brewing.insert\ndata remove storage gm4_brewing:temp insert\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/finalize_potions/splash/slot_1.mcfunction",
    "content": "# @s = brewing stand marker with a potion in slot 1\n# run from finalize_potions/splash/check_items\n\ndata modify entity @s data.gm4_brewing.insert set from storage gm4_brewing:temp Items[{Slot:1b}]\n\n# use loot table to create new item\nfunction #gm4_brewing:insert/splash\nexecute if score $insert gm4_brewing_data matches -1 run data remove block ~ ~ ~ Items[{Slot:1b}]\nexecute store success score $insert gm4_brewing_data run data modify storage gm4_brewing:temp insert set from entity @e[type=item,predicate=gm4_brewing:is_custom_potion,limit=1] Item\n\n# insert item\ndata remove storage gm4_brewing:temp insert.components.\"minecraft:custom_data\".gm4_custom_potion\ndata modify storage gm4_brewing:temp insert.Slot set value 1b\nexecute if score $insert gm4_brewing_data matches 1.. run data modify block ~ ~ ~ Items[{Slot:1b}] set from storage gm4_brewing:temp insert \n\n# clean up\nscoreboard players reset $insert gm4_brewing_data\nkill @e[type=item,predicate=gm4_brewing:is_custom_potion]\ndata remove entity @s data.gm4_brewing.insert\ndata remove storage gm4_brewing:temp insert\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/finalize_potions/splash/slot_2.mcfunction",
    "content": "# @s = brewing stand marker with a potion in slot 2\n# run from finalize_potions/splash/check_items\n\ndata modify entity @s data.gm4_brewing.insert set from storage gm4_brewing:temp Items[{Slot:2b}]\n\n# use loot table to create new item\nfunction #gm4_brewing:insert/splash\nexecute if score $insert gm4_brewing_data matches -1 run data remove block ~ ~ ~ Items[{Slot:2b}]\nexecute store success score $insert gm4_brewing_data run data modify storage gm4_brewing:temp insert set from entity @e[type=item,predicate=gm4_brewing:is_custom_potion,limit=1] Item\n\n# insert item\ndata remove storage gm4_brewing:temp insert.components.\"minecraft:custom_data\".gm4_custom_potion\ndata modify storage gm4_brewing:temp insert.Slot set value 2b\nexecute if score $insert gm4_brewing_data matches 1.. run data modify block ~ ~ ~ Items[{Slot:2b}] set from storage gm4_brewing:temp insert \n\n# clean up\nscoreboard players reset $insert gm4_brewing_data\nkill @e[type=item,predicate=gm4_brewing:is_custom_potion]\ndata remove entity @s data.gm4_brewing.insert\ndata remove storage gm4_brewing:temp insert\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/finish_brew.mcfunction",
    "content": "# @s = none\n# run from prep_finish_brew\n\n# finalize potions\nexecute as @e[type=marker,tag=gm4_brewing_finished] at @s run function gm4_brewing:finalize_potions/get_brewing_stand\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/load.mcfunction",
    "content": "scoreboard objectives add gm4_count dummy\nscoreboard objectives add gm4_brewing_data dummy\n\nschedule function gm4_brewing:main 9t\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/main.mcfunction",
    "content": "schedule function gm4_brewing:main 16t\n\nexecute as @e[type=marker,tag=gm4_brewing_stand] at @s run function gm4_brewing:process\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/mark_adjacent_brewing_stand.mcfunction",
    "content": "# marches along and places a marker once a newly placed brewing stand is found\n# @s = player who has placed a brewing stand\n# at location along a ray originating from the player's eyes\n# run from gm4_brewing:place_brewing_stand\n\n# check for newly placed brewing stand, return when found\nexecute positioned ~1 ~ ~ if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:[\"gm4_brewing_stand\"],CustomName:\"gm4_brewing_stand\"}\nexecute positioned ~ ~1 ~ if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:[\"gm4_brewing_stand\"],CustomName:\"gm4_brewing_stand\"}\nexecute positioned ~ ~ ~1 if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:[\"gm4_brewing_stand\"],CustomName:\"gm4_brewing_stand\"}\nexecute positioned ~-1 ~ ~ if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:[\"gm4_brewing_stand\"],CustomName:\"gm4_brewing_stand\"}\nexecute positioned ~ ~-1 ~ if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:[\"gm4_brewing_stand\"],CustomName:\"gm4_brewing_stand\"}\nexecute positioned ~ ~ ~-1 if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:[\"gm4_brewing_stand\"],CustomName:\"gm4_brewing_stand\"}\n\n# advance\nscoreboard players remove $ray gm4_count 1\nexecute if score $ray gm4_count matches 0.. positioned ^ ^ ^0.013 run function gm4_brewing:mark_adjacent_brewing_stand\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/mark_brewing_stand.mcfunction",
    "content": "# marches along and places a marker once a newly placed brewing stand is found\n# @s = player who has placed a brewing stand\n# at location along a ray originating from the player's eyes\n# run from gm4_brewing:place_brewing_stand\n\n# check for newly placed brewing stand, return when found\nexecute if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:[\"gm4_brewing_stand\"],CustomName:\"gm4_brewing_stand\"}\n\n# advance\nscoreboard players remove $ray gm4_count 1\nexecute if score $ray gm4_count matches 0.. positioned ^ ^ ^0.013 run return run function gm4_brewing:mark_brewing_stand\nexecute unless score $ray gm4_count matches 0.. run return fail\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/place_brewing_stand.mcfunction",
    "content": "# Initiates the search for the newly placed brewing stand\n# @s = player that just placed a brewing stand\n# at @s\n# run from advancement place_brewing_stand\n\n# revoke advancement\nadvancement revoke @s only gm4_brewing:place_brewing_stand\n\n# find newly placed brewing stand and place marker\n# check blocks on looking vector\nscoreboard players set $ray gm4_count 500\nexecute store success score $found_brewing_stand gm4_count anchored eyes positioned ^ ^ ^ run function gm4_brewing:mark_brewing_stand\n\n# check adjacent blocks\nexecute unless score $found_brewing_stand gm4_count matches 1 run function gm4_brewing:mark_adjacent_brewing_stand\nscoreboard players reset $found_brewing_stand gm4_count\n\n# reset fake players\nscoreboard players reset $ray gm4_count\nscoreboard players reset $found gm4_count\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/prep_finish_brew.mcfunction",
    "content": "# @s = brewing stand that finished brewing\n# run from check_brew\n\n# mark as finished\ntag @s remove gm4_brewing_tick\ntag @s add gm4_brewing_finished\nscoreboard players set $brewed gm4_brewing_data 1\n\n# store contents of brewing stand\ndata modify entity @s data.gm4_brewing.previous_items set from block ~ ~ ~ Items\n\n# run the finish functions\nschedule function gm4_brewing:finish_brew 1t\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/function/process.mcfunction",
    "content": "# @s = brewing stand marker\n# run from main\n\nexecute unless block ~ ~ ~ brewing_stand run kill @s\n\nexecute store result score @s gm4_brewing_data run data get block ~ ~ ~ BrewTime\n\nexecute if score @s gm4_brewing_data matches 1..18 run tag @s add gm4_brewing_tick\nexecute if score @s gm4_brewing_data matches 1..18 run schedule function gm4_brewing:check_brew 1t\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/predicate/is_custom_potion.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"slots\": {\n      \"contents\": {\n        \"predicates\": {\n          \"minecraft:custom_data\": \"{gm4_custom_potion:1b}\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/tags/function/finish_brew.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/tags/function/insert/lingering.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "lib_brewing/data/gm4_brewing/tags/function/insert/splash.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_brewing/tags/functions/finish_brew.json",
    "content": "{\n    \"values\": [\n        \"gm4_example_pack:brewing_stand/finish_brew\"\n    ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_brewing/tags/functions/insert/lingering.json",
    "content": "{\n    \"values\": [\n        \"gm4_example_pack:brewing_stand/lingering\"\n    ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_brewing/tags/functions/insert/splash.json",
    "content": "{\n    \"values\": [\n        \"gm4_example_pack:brewing_stand/splash\"\n    ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_example_pack/functions/brewing_stand/finish_brew.mcfunction",
    "content": "# @s = brewing stand marker that finished brewing a potion\n# run from #gm4_brewing:finish_brew\n\n# poison potion + fermented spider eye -> regeneration potion \n# (only implemented for first potion slot in this example)\nexecute if entity @s[nbt={data:{gm4_brewing:{previous_items:[{Slot:3b,id:\"minecraft:fermented_spider_eye\"},{Slot:0b,id:\"minecraft:potion\",components:{\"minecraft:potion_contents\":{potion:\"minecraft:poison\"}}}]}}}] run data modify block ~ ~ ~ Items[{Slot:0b}] set value {Slot:0b,id:\"minecraft:potion\",components:{\"minecraft:potion_contents\":{potion:\"minecraft:regeneration\"}}}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_example_pack/functions/brewing_stand/lingering.mcfunction",
    "content": "# @s = brewing stand marker with a custom splash potion to be converted to a lingering potion\n# run from #gm4_brewing:insert/lingering\n\n# brews potions into their proper lingering variants\nloot spawn ~ ~ ~ loot gm4_example_pack:technical/brewing_stand/lingering\n\n# clears vanishing potions and summons an illusioner at its place\nexecute if data entity @s data.gm4_brewing.insert{item:\"minecraft:splash_potion\",components:{\"minecraft:custom_data\":{custom_potion:\"vanishing\"}}} run scoreboard players set $insert gm4_brewing_data -1\nexecute if score $insert gm4_brewing_data matches -1 run summon illusioner\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_example_pack/functions/brewing_stand/splash.mcfunction",
    "content": "# @s = brewing stand marker with a custom potion to be converted to a splash potion\n# run from #gm4_brewing:insert/splash\n\n# brews potions into their proper splash variants\nloot spawn ~ ~ ~ loot gm4_example_pack:technical/brewing_stand/splash\n\n# clears vanishing potions and summons an evoker at its place\nexecute if data entity @s data.gm4_brewing.insert{item:\"minecraft:splash_potion\",components:{\"minecraft:custom_data\":{custom_potion:\"vanishing\"}}} run scoreboard players set $insert gm4_brewing_data -1\nexecute if score $insert gm4_brewing_data matches -1 run summon evoker\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/booze.json",
    "content": "{\n  \"type\": \"generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:potion\",\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": 1\n            },\n            {\n              \"function\": \"set_nbt\",\n              \"tag\": \"{custom_potion:\\\"booze\\\",custom_potion_effects:[{id:'minecraft:slowness',amplifier:0b,duration:1200},{id:'minecraft:strength',amplifier:0b,duration:1200},{id:'minecraft:nausea',amplifier:1b,duration:400},{id:'minecraft:poison',amplifier:0b,duration:400},{id:'minecraft:absorption',amplifier:1b,duration:1200}],CustomPotionColor:11236936}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"text\": \"Booze\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/lingering_booze.json",
    "content": "{\n  \"type\": \"generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:lingering_potion\",\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": 1\n            },\n            {\n              \"function\": \"set_nbt\",\n              \"tag\": \"{custom_potion:\\\"booze\\\",custom_potion_effects:[{id:'minecraft:slowness',amplifier:0b,duration:300},{id:'minecraft:strength',amplifier:0b,duration:300},{id:'minecraft:nausea',amplifier:1b,duration:100},{id:'minecraft:poison',amplifier:0b,duration:100},{id:'minecraft:absorption',amplifier:1b,duration:300}],CustomPotionColor:11236936}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"text\": \"Lingering Booze\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/lingering_resistance_potion.json",
    "content": "{\n  \"type\": \"generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:lingering_potion\",\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": 1\n            },\n            {\n              \"function\": \"set_nbt\",\n              \"tag\": \"{custom_potion:\\\"resistance\\\",Potion:\\\"minecraft:mundane\\\",custom_potion_effects:[{id:'minecraft:resistance',amplifier:0b,duration:150}]}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"text\": \"Lingering Potion of Resistance\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/resistance_potion.json",
    "content": "{\n  \"type\": \"generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:potion\",\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": 1\n            },\n            {\n              \"function\": \"set_nbt\",\n              \"tag\": \"{custom_potion:\\\"resistance\\\",Potion:\\\"minecraft:mundane\\\",custom_potion_effects:[{id:'minecraft:resistance',amplifier:0b,duration:600}]}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"text\": \"Potion of Resistance\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/splash_booze.json",
    "content": "{\n  \"type\": \"generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:splash_potion\",\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": 1\n            },\n            {\n              \"function\": \"set_nbt\",\n              \"tag\": \"{custom_potion:\\\"booze\\\",custom_potion_effects:[{id:'minecraft:slowness',amplifier:0b,duration:1200},{id:'minecraft:strength',amplifier:0b,duration:1200},{id:'minecraft:nausea',amplifier:1b,duration:400},{id:'minecraft:poison',amplifier:0b,duration:400},{id:'minecraft:absorption',amplifier:1b,duration:1200}],CustomPotionColor:11236936}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"text\": \"Splashable Booze\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/splash_resistance_potion.json",
    "content": "{\n  \"type\": \"generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:splash_potion\",\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": 1\n            },\n            {\n              \"function\": \"set_nbt\",\n              \"tag\": \"{custom_potion:\\\"resistance\\\",Potion:\\\"minecraft:mundane\\\",custom_potion_effects:[{id:'minecraft:resistance',amplifier:0b,duration:600}]}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"text\": \"Splash Potion of Resistance\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/splash_vanishing_potion.json",
    "content": "{\n  \"type\": \"generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:splash_potion\",\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": 1\n            },\n            {\n              \"function\": \"set_nbt\",\n              \"tag\": \"{custom_potion:\\\"vanishing\\\",Potion:\\\"minecraft:mundane\\\",custom_potion_effects:[{id:'minecraft:invisibility',amplifier:9b,duration:600}]}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"text\": \"Splash Potion of Vanishing\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/vanishing_potion.json",
    "content": "{\n  \"type\": \"generic\",\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:potion\",\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": 1\n            },\n            {\n              \"function\": \"set_nbt\",\n              \"tag\": \"{custom_potion:\\\"vanishing\\\",Potion:\\\"minecraft:mundane\\\",custom_potion_effects:[{id:'minecraft:invisibility',amplifier:9b,duration:600}]}\"\n            },\n            {\n              \"function\": \"set_name\",\n              \"name\": [\n                {\n                  \"text\": \"Potion of Vanishing\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_example_pack/loot_tables/technical/brewing_stand/lingering.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:alternatives\",\n                    \"children\": [\n                        {\n                            \"type\": \"minecraft:loot_table\",\n                            \"value\": \"gm4_example_pack:items/lingering_resistance_potion\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:entity_properties\",\n                                    \"entity\": \"this\",\n                                    \"predicate\": {\n                                        \"nbt\": \"{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{custom_potion:'resistance'}}}}}}\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:loot_table\",\n                            \"value\": \"gm4_example_pack:items/lingering_booze\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:entity_properties\",\n                                    \"entity\": \"this\",\n                                    \"predicate\": {\n                                        \"nbt\": \"{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{custom_potion:'booze'}}}}}}\"\n                                    }\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"functions\": [\n                {\n                    \"function\": \"minecraft:set_nbt\",\n                    \"tag\": \"{gm4_custom_potion:1b}\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/gm4_example_pack/loot_tables/technical/brewing_stand/splash.json",
    "content": "{\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:alternatives\",\n                    \"children\": [\n                        {\n                            \"type\": \"minecraft:loot_table\",\n                            \"value\": \"gm4_example_pack:items/splash_resistance_potion\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:entity_properties\",\n                                    \"entity\": \"this\",\n                                    \"predicate\": {\n                                        \"nbt\": \"{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{custom_potion:'resistance'}}}}}}\"\n                                    }\n                                }\n                            ]\n                        },\n                        {\n                            \"type\": \"minecraft:loot_table\",\n                            \"value\": \"gm4_example_pack:items/splash_booze\",\n                            \"conditions\": [\n                                {\n                                    \"condition\": \"minecraft:entity_properties\",\n                                    \"entity\": \"this\",\n                                    \"predicate\": {\n                                        \"nbt\": \"{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{custom_potion:'booze'}}}}}}\"\n                                    }\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"functions\": [\n                {\n                    \"function\": \"minecraft:set_nbt\",\n                    \"tag\": \"{gm4_custom_potion:1b}\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/load/tags/functions/gm4_example_pack.json",
    "content": "{\n    \"values\": [\n        \"#load:gm4_brewing\"\n    ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/data/load/tags/functions/load.json",
    "content": "{\n    \"values\": [\n        \"#load:gm4_example_pack\"\n    ]\n}\n"
  },
  {
    "path": "lib_brewing/example_use/pack.mcmeta",
    "content": "{\n    \"pack\": {\n        \"pack_format\": 7,\n        \"description\": [\n            \"Example Pack\",\n            \"\\n\",\n            {\n                \"text\": \"Usage example of lib_brewing\",\n                \"color\": \"gold\"\n            }\n        ]\n    },\n    \"credits\": {\n        \"Creator\": [\n            [\n                \"BPR\",\n                \"https://bsky.app/profile/bpr02.com\"\n            ]\n        ]\n    }\n}\n"
  },
  {
    "path": "lib_brewing/mod.mcdoc",
    "content": "use ::java::util::slot::SlottedItem\nuse ::java::world::item::ItemStack\n\ndispatch minecraft:storage[gm4_brewing:temp] to struct {\n  Items?: [SlottedItem<byte>],\n  insert?: (ItemStack | SlottedItem<byte>),\n}\n\ndispatch mcdoc:marker_data[gm4_brewing] to struct {\n  previous_items?: [SlottedItem<byte>],\n}\n"
  },
  {
    "path": "lib_forceload/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2021 Gamemode 4 Development\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib_forceload/README.md",
    "content": "# lib_forceload\nlib_forceload is a mcfunction library adding a forceloaded chunk with common utlities. Available utilities are:\n* yellow-shulker-box for inventory manipulations\n* sign for text resolution\n* jukebox for single item storage\n* repeating command block for sub-tick execution\n* armour-stand for tool-based loot table context\n\n## How to Use\nThis library forceloads the chunk `29999999 7134`, which lies beyond the maximum world size, in every dimension - including custom defined dimensions. Each dimension initializes its forceloaded chunk when a player first logs into that dimension.\n\n### Yellow Shulker Box\nEvery dimension gets a `yellow_shulker_box` placed at `29999998 1 7134` for use with inventory manipulations. This library follows the \"yellow-shulker-box\" convention, including the standard loot table.\n\nexample:\n```\n# move item from shulker box to output barrel\nloot insert ~ ~ ~ mine 29999998 1 7134 air{drop_contents:1b}\n```\n\n### Birch Sign\nEvery dimension gets a `birch_wall_sign` placed at `29999998 1 7133`. This can be used to resolve json text components and retrieve the resulting string. \n\nexample:\n```\ndata modify block 29999998 1 7133 front_text.messages[0] set value [{\"text\": \"killed by \"},{\"storage\":\"my_storage:register\", \"nbt\":\"my_text.name\"}]\ndata modify entity @s CustomName set from block ~ ~ ~ front_text.messages[0]\n```\n\n### Jukebox\nEvery dimension gets a `jukebox` placed at `29999998 1 7132`. The item contained within can be used for whatever the developer wishes.\n\n### Unique Dimension ID\nIn each dimension, a marker entity with the tag `gm4_dimension` is summoned. This marker has a unique scoreboard value stored in the objective `gm4_dimension`, and a name matching the dimension's string ID. \n\nThis score can be used to dynamically store a dimension on an item, such as for a recall ability, or for your data pack to support an arbitrary number of dimensions, added by other data packs.\n\n### Repeating Command Block\nThe overworld dimension has a repeating command block running the function tag `#gm4_forceload:command_block_tick`. Adding functions to this tag lets their contents to be run at a different subtick than ordinary functions. This is commonly used to intercept item drops before a player has the change to pick them up, but may be used to properly time other data pack code.\n\n### Armor Stand\nThe overworld dimension has a armour stand with the static uuid `344d47-4-4-4-f04ce104d`. This can be used with loot tables that utilize the `match_tool` predicate which require an entity with a mainhand slot. \n\n## License\nThis library, and the contents of the `lib_forceload` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License.\n"
  },
  {
    "path": "lib_forceload/beet.yaml",
    "content": "id: gm4_forceload\nname: Gamemode 4 Forceload\nversion: 1.6.X\ndescription: lib_forceload is a mcfunction library adding a forceloaded chunk with common utlities.\n\ndata_pack:\n  load: \n    data: data\n\npipeline:\n  - gm4.plugins.extend.library\n\nmeta:\n  gm4:\n    versioning:\n      extra_version_injections:\n        advancements: [change_dimension, join]\n    smithed:\n      pack_id: gm4_lib_forceload\n    credits:\n      Creator:\n        - Misode\n"
  },
  {
    "path": "lib_forceload/data/gm4_forceload/advancement/change_dimension.json",
    "content": "{\n  \"criteria\": {\n    \"change_dimension\": {\n      \"trigger\": \"minecraft:changed_dimension\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_forceload:mark_dimension\"\n  }\n}\n"
  },
  {
    "path": "lib_forceload/data/gm4_forceload/advancement/join.json",
    "content": "{\n  \"criteria\": {\n    \"join\": {\n      \"trigger\": \"minecraft:tick\"\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_forceload:mark_dimension\"\n  }\n}\n"
  },
  {
    "path": "lib_forceload/data/gm4_forceload/function/init_chunk.mcfunction",
    "content": "# run from init_ow_chunk and mark_dimension\n\nforceload remove 29999999 7134\nforceload add 29999999 7134\n\nfill 29999998 0 7135 29999997 2 7130 minecraft:bedrock\nsetblock 29999998 1 7134 minecraft:yellow_shulker_box\nsetblock 29999998 1 7133 minecraft:birch_wall_sign[facing=north]\nsetblock 29999998 1 7132 minecraft:jukebox{RecordItem:{id:\"minecraft:stick\",count:1}}\n"
  },
  {
    "path": "lib_forceload/data/gm4_forceload/function/init_ow_chunk.mcfunction",
    "content": "# @s = marker entity to forceload overworld\n# run from load\n\ntag @s add gm4_dimension\ndata merge entity @s {CustomName:\"minecraft:overworld\"}\n\nfunction gm4_forceload:init_chunk\nsetblock 29999998 1 7131 minecraft:repeating_command_block{auto:1b,Command:\"function #gm4_forceload:command_block_tick\"}\nsummon armor_stand 29999999 0 7135 {UUID:[I;3427655,262148,262159,80613453],Invulnerable:1b,Invisible:1b,Marker:1b,Tags:[\"smithed.entity\",\"smithed.strict\"],CustomName:\"lib_forceload_armorstand\"}\n#alias uuid lib_forceload_armorstand 344d47-4-4-4-f04ce104d\n\nscoreboard players add #max gm4_dimension 1\nscoreboard players operation @s gm4_dimension = #max gm4_dimension\ntp @s 29999999 0 7135\n"
  },
  {
    "path": "lib_forceload/data/gm4_forceload/function/load.mcfunction",
    "content": "scoreboard objectives add gm4_dimension dummy\ngamerule command_block_output false\n\nexecute store success score $initialized gm4_dimension if block 29999998 1 7133 birch_wall_sign\nexecute if score $initialized gm4_dimension matches 0 positioned ~ 0 ~ summon marker run function gm4_forceload:init_ow_chunk\n"
  },
  {
    "path": "lib_forceload/data/gm4_forceload/function/mark_dimension.mcfunction",
    "content": "# @s = player who changed dimensions or joined for the first time\n# run from advancements \"change_dimension\" and \"join\"\n\nadvancement revoke @s only gm4_forceload:change_dimension\n\n# exit if the dimension is already initialized\nexecute if block 29999998 1 7133 birch_wall_sign run return 0\n\nfunction gm4_forceload:init_chunk\n\n# spawn dimension marker with scoreboard ID and name\ntag @s add gm4_in_new_dimension\nexecute summon minecraft:marker in minecraft:overworld run function gm4_forceload:set_marker_data\ntag @s remove gm4_in_new_dimension\n"
  },
  {
    "path": "lib_forceload/data/gm4_forceload/function/set_marker_data.mcfunction",
    "content": "# @s = new dimension marker AEC\n# executed in minecraft:overworld\n# run from mark_dimension\n\n# scoreboard ID\nscoreboard players add #max gm4_dimension 1\nscoreboard players operation @s gm4_dimension = #max gm4_dimension\n\n# name\ndata modify block 29999998 1 7133 front_text.messages[0] set value {\"nbt\": \"Dimension\", \"entity\": \"@a[tag=gm4_in_new_dimension,limit=1]\"}\ndata modify entity @s CustomName set from block 29999998 1 7133 front_text.messages[0]\n\n# move to forceloaded chunk\nexecute at @s run tp @s 29999999 0 7135\ntag @s add gm4_dimension\n"
  },
  {
    "path": "lib_forceload/data/gm4_forceload/tags/function/command_block_tick.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "lib_forceload/data/minecraft/loot_table/blocks/yellow_shulker_box.json",
    "content": "{\n  \"type\": \"minecraft:block\",\n  \"pools\": [\n    {\n      \"rolls\": 1.0,\n      \"bonus_rolls\": 0.0,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:yellow_shulker_box\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:copy_components\",\n              \"source\": \"block_entity\",\n              \"include\": [\n                \"minecraft:custom_name\",\n                \"minecraft:container\",\n                \"minecraft:lock\",\n                \"minecraft:container_loot\"\n              ]\n            }\n          ]\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:inverted\",\n          \"term\": {\n            \"condition\": \"minecraft:match_tool\",\n            \"predicate\": {\n              \"predicates\": {\n                \"minecraft:custom_data\": {\n                  \"drop_contents\": 1\n                }\n              }\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"rolls\": 1.0,\n      \"bonus_rolls\": 0.0,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:dynamic\",\n          \"name\": \"minecraft:contents\"\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:match_tool\",\n          \"predicate\": {\n            \"predicates\": {\n              \"minecraft:custom_data\": {\n                \"drop_contents\": 1\n              }\n            }\n          }\n        }\n      ]\n    }\n  ],\n  \"random_sequence\": \"minecraft:blocks/yellow_shulker_box\",\n  \"__smithed__\": {\n    \"priority\": {\n      \"stage\": \"early\"\n    },\n    \"rules\": [\n      {\n        \"type\": \"append\",\n        \"target\": \"pools[0].conditions\",\n        \"source\": {\n          \"type\": \"reference\",\n          \"path\": \"pools[0].conditions[0]\"\n        }\n      },\n      {\n        \"type\": \"append\",\n        \"target\": \"pools\",\n        \"source\": {\n          \"type\": \"reference\",\n          \"path\": \"pools[1]\"\n        }\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "lib_hooked_entity/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2026 Gamemode 4 Development\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib_hooked_entity/README.md",
    "content": "# lib_hooked_entity\nlib_hooked_entity is a mcfunction library that enables running functions on the entity that a player hooked with a fishing rod. Without a library like this, this operation is not possible to do accurately. Furthermore, logic enabled by this library only triggers with the `fishing_rod_hooked` advancement trigger.\n\n## Usage\nUsage of this library is achieved by adding functions to the provided function tags: `#gm4_hooked_entity:on_hooked_entity`, `#gm4_hooked_entity:pre_hook_on_player`, `#gm4_hooked_entity:post_hook_on_player`\n\n### Function Tags in order of execution:\n\n#### `#gm4_hooked_entity:pre_hook_on_player` \nRun before selection of the hooked entity. Think of this as what will run any time the player triggers the `fishing_rod_hooked` advancement trigger, it is run as the player and at the player. The intention of this is to access the player in any way you need to before logic is run on the hooked entity.\n\n#### `#gm4_hooked_entity:on_hooked_entity` \nRun as the entity hooked by the player, at the fishing bobber. During this, the relevant player is tagged with `gm4_hooked_entity.player` in case you need to select them during this time frame.\n\n#### `#gm4_hooked_entity:post_hook_on_player` \nVery similar to the `#gm4_hooked_entity:pre_hook_on_player`, just run after `#gm4_hooked_entity:on_hooked_entity`.\n\n## Technical Details\nThis library operates by assigning a 16 bit binary ID in the form of scores on every entity that can be hooked by a fishing rod bobber, but only within 42 blocks of any fishing bobber. When a player uses the fishing rod and triggers `fishing_rod_hooked` they will receive 16 advancements which are used to reconstruct the binary ID of the entity. From there the scores are used in a macro function to select the entity directly.\n\nThis method is only necessary due to 2 reasons\n- `execute on` is unable to select the entity a fishing bobber is hooked into\n- The height that the fishing bobber sits in an entity is dependent on that entity's hitbox height which cannot be known in advance of selection. (With the exceptions of paintings and item frames)\n\n## License\nThis library, and the contents of the `lib_hooked_entity` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License.\n"
  },
  {
    "path": "lib_hooked_entity/beet.yaml",
    "content": "id: gm4_hooked_entity\nname: Gamemode 4 Hooked Entity Selection\nversion: 1.0.X\ndescription: Allows other datapacks to run functions on the entity that a player hooked with a fishing rod.\n\ndata_pack:\n  load: \n    data: data\n\npipeline:\n  - generate\n  - gm4.plugins.extend.library\n\nmeta:\n  gm4:\n    versioning:\n      schedule_loops: [tick]\n    smithed:\n      pack_id: gm4_lib_hooked_entity\n    credits:\n      Creator:\n        - runcows\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/function/id/clear.mcfunction",
    "content": "# clears id of @s\n# @s = entity with tag gm4_hooked_entity.id.tagged\n# run from id/loop\n\nscoreboard players reset @s gm4_hooked_entity.id_bit.0\nscoreboard players reset @s gm4_hooked_entity.id_bit.1\nscoreboard players reset @s gm4_hooked_entity.id_bit.2\nscoreboard players reset @s gm4_hooked_entity.id_bit.3\nscoreboard players reset @s gm4_hooked_entity.id_bit.4\nscoreboard players reset @s gm4_hooked_entity.id_bit.5\nscoreboard players reset @s gm4_hooked_entity.id_bit.6\nscoreboard players reset @s gm4_hooked_entity.id_bit.7\nscoreboard players reset @s gm4_hooked_entity.id_bit.8\nscoreboard players reset @s gm4_hooked_entity.id_bit.9\nscoreboard players reset @s gm4_hooked_entity.id_bit.10\nscoreboard players reset @s gm4_hooked_entity.id_bit.11\nscoreboard players reset @s gm4_hooked_entity.id_bit.12\nscoreboard players reset @s gm4_hooked_entity.id_bit.13\nscoreboard players reset @s gm4_hooked_entity.id_bit.14\nscoreboard players reset @s gm4_hooked_entity.id_bit.15\ntag @s remove gm4_hooked_entity.id.tagged\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/function/id/get_next.mcfunction",
    "content": "# Gets the next id\n# @s = entity to be assigned id\n# at @s\n# run from id/set\n\n## Binary Counter\n# change bit 0 -> 1, return nothing else to do\n# change bit 1 -> 0, then go on to next bit\n\n# bit.0\nexecute if score $next gm4_hooked_entity.id_bit.0 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.0 1\nscoreboard players set $next gm4_hooked_entity.id_bit.0 0\n# bit.1\nexecute if score $next gm4_hooked_entity.id_bit.1 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.1 1\nscoreboard players set $next gm4_hooked_entity.id_bit.1 0\n# bit.2\nexecute if score $next gm4_hooked_entity.id_bit.2 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.2 1\nscoreboard players set $next gm4_hooked_entity.id_bit.2 0\n# bit.3\nexecute if score $next gm4_hooked_entity.id_bit.3 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.3 1\nscoreboard players set $next gm4_hooked_entity.id_bit.3 0\n# bit.4\nexecute if score $next gm4_hooked_entity.id_bit.4 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.4 1\nscoreboard players set $next gm4_hooked_entity.id_bit.4 0\n# bit.5\nexecute if score $next gm4_hooked_entity.id_bit.5 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.5 1\nscoreboard players set $next gm4_hooked_entity.id_bit.5 0\n# bit.6\nexecute if score $next gm4_hooked_entity.id_bit.6 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.6 1\nscoreboard players set $next gm4_hooked_entity.id_bit.6 0\n# bit.7\nexecute if score $next gm4_hooked_entity.id_bit.7 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.7 1\nscoreboard players set $next gm4_hooked_entity.id_bit.7 0\n# bit.8\nexecute if score $next gm4_hooked_entity.id_bit.8 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.8 1\nscoreboard players set $next gm4_hooked_entity.id_bit.8 0\n# bit.9\nexecute if score $next gm4_hooked_entity.id_bit.9 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.9 1\nscoreboard players set $next gm4_hooked_entity.id_bit.9 0\n# bit.10\nexecute if score $next gm4_hooked_entity.id_bit.10 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.10 1\nscoreboard players set $next gm4_hooked_entity.id_bit.10 0\n# bit.11\nexecute if score $next gm4_hooked_entity.id_bit.11 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.11 1\nscoreboard players set $next gm4_hooked_entity.id_bit.11 0\n# bit.12\nexecute if score $next gm4_hooked_entity.id_bit.12 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.12 1\nscoreboard players set $next gm4_hooked_entity.id_bit.12 0\n# bit.13\nexecute if score $next gm4_hooked_entity.id_bit.13 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.13 1\nscoreboard players set $next gm4_hooked_entity.id_bit.13 0\n# bit.14\nexecute if score $next gm4_hooked_entity.id_bit.14 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.14 1\nscoreboard players set $next gm4_hooked_entity.id_bit.14 0\n# bit.15\nexecute if score $next gm4_hooked_entity.id_bit.15 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.15 1\nscoreboard players set $next gm4_hooked_entity.id_bit.15 0\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/function/id/loop.mcfunction",
    "content": "# checks for bobbers and stops when there are none\n# run from player/cast_line and scheduled from id/select_entities\n\n# assign new ids if there's a bobber\nexecute as @e[type=minecraft:fishing_bobber] at @s run return run function gm4_hooked_entity:id/select_entities\n\n# no fishing bobber, clear ids\nexecute as @e[tag=gm4_hooked_entity.id.tagged] run function gm4_hooked_entity:id/clear\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/function/id/select_entities.mcfunction",
    "content": "# selects entities to assign an id and schedules the loop to run again\n# @s = fishing_bobber\n# at @s\n# run from id/loop \n\n# set new id tags if needed\n# distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber\nexecute as @e[type=!#gm4_hooked_entity:ignore,tag=!gm4_hooked_entity.id.tagged,distance=..42] at @s run function gm4_hooked_entity:id/set\n\n# schedule again, since bobber still exists\nschedule function gm4_hooked_entity:id/loop 2t\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/function/id/set.mcfunction",
    "content": "# set an id on an entity\n# @s = entity to be assigned id\n# at @s\n# run from id/select_entities\n\n# get new id\nfunction gm4_hooked_entity:id/get_next\n\n# assign new id\nscoreboard players operation @s gm4_hooked_entity.id_bit.0 = $next gm4_hooked_entity.id_bit.0\nscoreboard players operation @s gm4_hooked_entity.id_bit.1 = $next gm4_hooked_entity.id_bit.1\nscoreboard players operation @s gm4_hooked_entity.id_bit.2 = $next gm4_hooked_entity.id_bit.2\nscoreboard players operation @s gm4_hooked_entity.id_bit.3 = $next gm4_hooked_entity.id_bit.3\nscoreboard players operation @s gm4_hooked_entity.id_bit.4 = $next gm4_hooked_entity.id_bit.4\nscoreboard players operation @s gm4_hooked_entity.id_bit.5 = $next gm4_hooked_entity.id_bit.5\nscoreboard players operation @s gm4_hooked_entity.id_bit.6 = $next gm4_hooked_entity.id_bit.6\nscoreboard players operation @s gm4_hooked_entity.id_bit.7 = $next gm4_hooked_entity.id_bit.7\nscoreboard players operation @s gm4_hooked_entity.id_bit.8 = $next gm4_hooked_entity.id_bit.8\nscoreboard players operation @s gm4_hooked_entity.id_bit.9 = $next gm4_hooked_entity.id_bit.9\nscoreboard players operation @s gm4_hooked_entity.id_bit.10 = $next gm4_hooked_entity.id_bit.10\nscoreboard players operation @s gm4_hooked_entity.id_bit.11 = $next gm4_hooked_entity.id_bit.11\nscoreboard players operation @s gm4_hooked_entity.id_bit.12 = $next gm4_hooked_entity.id_bit.12\nscoreboard players operation @s gm4_hooked_entity.id_bit.13 = $next gm4_hooked_entity.id_bit.13\nscoreboard players operation @s gm4_hooked_entity.id_bit.14 = $next gm4_hooked_entity.id_bit.14\nscoreboard players operation @s gm4_hooked_entity.id_bit.15 = $next gm4_hooked_entity.id_bit.15\ntag @s add gm4_hooked_entity.id.tagged\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/function/load.mcfunction",
    "content": "scoreboard objectives add gm4_hooked_entity.math dummy\nscoreboard objectives add gm4_hooked_entity.rods_cast minecraft.used:minecraft.fishing_rod\n\n# id\nscoreboard objectives add gm4_hooked_entity.id_bit.0 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.1 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.2 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.3 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.4 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.5 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.6 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.7 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.8 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.9 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.10 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.11 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.12 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.13 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.14 dummy\nscoreboard objectives add gm4_hooked_entity.id_bit.15 dummy\n\nschedule function gm4_hooked_entity:tick 5t\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/function/player/cast_line.mcfunction",
    "content": "# sets rods_cast to 0 and schedules id loop\n# @s = player, scores={gm4_hooked_entity.rods_cast=1..}\n# at @s\n# run from tick\n\nscoreboard players set @s gm4_hooked_entity.rods_cast 0\nfunction gm4_hooked_entity:id/loop\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/function/player/find_hooked_entity.mcfunction",
    "content": "# Finds the entity the player hooked\n# @s = player who fished\n# at @s\n# with {bit_0, bit_1, bit_2, bit_3, bit_4, bit_5, bit_6, bit_7, bit_8, bit_9, bit_10, bit_11, bit_12, bit_13, bit_14, bit_15}\n# run from player/received_bit\n\nfunction #gm4_hooked_entity:pre_hook_on_player\ntag @s add gm4_hooked_entity.player\n\n# distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber\n$execute as @e[type=minecraft:fishing_bobber,distance=..33] \\\n  if function gm4_hooked_entity:player/owns_bobber \\\n  at @s as @e[\\\n    distance=..42, limit=1, type=!#gm4_hooked_entity:ignore, \\\n    scores={$(bit_0),$(bit_1),$(bit_2),$(bit_3),$(bit_4),$(bit_5),$(bit_6),$(bit_7),$(bit_8),$(bit_9),$(bit_10),$(bit_11),$(bit_12),$(bit_13),$(bit_14),$(bit_15)}\\\n  ] run function #gm4_hooked_entity:on_hooked_entity\n\ntag @s remove gm4_hooked_entity.player\nfunction #gm4_hooked_entity:post_hook_on_player\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/function/player/owns_bobber.mcfunction",
    "content": "# Checks if a fishing bobber belongs to the targeted owner\n# @s = a fishing bobber\n# at owner\n# run from player/find_hooked_entity\n\nreturn run execute on origin if entity @s[tag=gm4_hooked_entity.player]\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/function/player/received_bit.mcfunction",
    "content": "# Logic for when a player receives a bit\n# @s = player who received a bit\n# at @s\n# with {bit, UUID}\n# run from player/bits/bit_{bit}_{value}\n\n$data modify storage gm4_hooked_entity:players \"$(UUID)\".bit_$(bit) set from storage gm4_hooked_entity:temp bit_data.bit_score\n\n# fail if not all bits\n$execute store result score $bit_count gm4_hooked_entity.math run data get storage gm4_hooked_entity:players \"$(UUID)\"\nexecute unless score $bit_count gm4_hooked_entity.math matches 16 run return fail\n\n# all bits received\n$function gm4_hooked_entity:player/find_hooked_entity with storage gm4_hooked_entity:players \"$(UUID)\"\n\n# clear storage\n$data remove storage gm4_hooked_entity:players \"$(UUID)\"\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/function/tick.mcfunction",
    "content": "# checks if players have cast a line, then will assign ids to entities around bobber\nexecute as @a[scores={gm4_hooked_entity.rods_cast=1..}] run function gm4_hooked_entity:player/cast_line\n\n# schedule again\nschedule function gm4_hooked_entity:tick 3t\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/tags/entity_type/ignore.json",
    "content": "{\n  \"values\": [\n    \"minecraft:area_effect_cloud\",\n    \"minecraft:arrow\",\n    \"minecraft:block_display\",\n    \"minecraft:dragon_fireball\",\n    \"minecraft:egg\",\n    \"minecraft:ender_pearl\",\n    \"minecraft:evoker_fangs\",\n    \"minecraft:experience_bottle\",\n    \"minecraft:experience_orb\",\n    \"minecraft:eye_of_ender\",\n    \"minecraft:firework_rocket\",\n    \"minecraft:fishing_bobber\",\n    \"minecraft:interaction\",\n    \"minecraft:item_display\",\n    \"minecraft:lightning_bolt\",\n    \"minecraft:lingering_potion\",\n    \"minecraft:llama_spit\",\n    \"minecraft:marker\",\n    \"minecraft:ominous_item_spawner\",\n    \"minecraft:splash_potion\",\n    \"minecraft:small_fireball\",\n    \"minecraft:snowball\",\n    \"minecraft:spectral_arrow\",\n    \"minecraft:text_display\",\n    \"minecraft:trident\",\n    \"minecraft:wither_skull\"\n  ]\n}\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/tags/function/on_hooked_entity.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/tags/function/post_hook_on_player.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "lib_hooked_entity/data/gm4_hooked_entity/tags/function/pre_hook_on_player.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "lib_hooked_entity/generate.py",
    "content": "from beet import Context, Advancement, Function\n\ndef beet_default(ctx: Context):\n    for bit in range(16):\n        for value in range(2):\n            ctx.data[f\"gm4_hooked_entity:bit_{bit}_{value}\"] = Advancement({\n                \"criteria\":{\n                    \"fishing_rod_hooked\":{\n                        \"trigger\":\"minecraft:fishing_rod_hooked\",\n                        \"conditions\":{\n                            \"entity\": [\n                                {\n                                    \"condition\": \"minecraft:entity_scores\",\n                                    \"entity\": \"this\",\n                                    \"scores\": {\n                                        f\"gm4_hooked_entity.id_bit.{bit}\": value\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                },\n                \"rewards\":{\n                    \"function\": f\"gm4_hooked_entity:player/bits/bit_{bit}_{value}\"\n                }\n            })\n            ctx.data[f\"gm4_hooked_entity:player/bits/bit_{bit}_{value}\"] = Function([\n                f\"# player adv logic for getting bit {bit} at value {value}. Generated by generate.py.\",\n                f\"# run from advancement bit_{bit}_{value}\\n\",\n                f\"advancement revoke @s only gm4_hooked_entity:bit_{bit}_{value}\\n\",\n                \"data modify storage gm4_hooked_entity:temp bit_data set value {bit_score:\\\"\" + f\"gm4_hooked_entity.id_bit.{bit}={value}\\\", bit:\\\"{bit}\\\"\" + \"}\",\n                \"data modify storage gm4_hooked_entity:temp bit_data.UUID set from entity @s UUID\",\n                \"function gm4_hooked_entity:player/received_bit with storage gm4_hooked_entity:temp bit_data\"\n            ])\n"
  },
  {
    "path": "lib_lore/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2021 Gamemode 4 Development\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib_lore/README.md",
    "content": "# lib_lore\nlib_lore is a mcfunction library that allows other data packs to easily search, remove, insert, and replace lines of lore on items.\n\n## How to use\nThere are 4 operations that can be applied. Each operation uses data storage and scoreboards as inputs and outputs.\n\n### Inputs\nThere are three data storage inputs, along with two scoreboard inputs. Below are their terminologies (will be used further in this document), as well as their uses and the command to set them.\n\n`Source`: This is a list of the lore that will be modified, typically this would be extracted directly from the item being modified, but can be set manually to a desired set of lore.\n```mcfunction\ndata modify storage gm4_lore:temp Source set from <...>\n```\n\n`Target`: This is a single json item (i.e. a single 'line' of lore) that will be found during the operations. This sets the line of lore to be searched, removed, inserted after, or replaced.\n```mcfunction\ndata modify storage gm4_lore:temp Target set from <...>\n```\n\n`Input`: This is list of the lore that will be inserted or replaced. This should not be set when simply searching or removing and will be ignored if set while using the search or remove operation.\n```mcfunction\ndata modify storage gm4_lore:temp Input set from <...>\n```\n\n`start`: This is an integer that determines where the operation will start. It is essentially the offset for the operations. More specific use cases can be found under each specific operation description.\n```mcfunction\nscoreboard players set $start gm4_lore <value>\n```\n\n`extra`: This is an integer that determines the extra lines to be removed after the initial line. This is only used during the remove operation and will be ignored otherwise. More specific use cases can be found under the remove operation description.\n```mcfunction\nscoreboard players set $extra gm4_lore <value>\n```\n\n### Outputs\nThere are three outputs to work to work with after running an operation. Each operation uses the three outputs differently, which can be found under the specific operation description. Below are their terminologies (will be used further in this document), as well as their general uses and the command to get them.\n\n`Source`: This is the modified version of the input Source.\n```mcfunction\ndata get storage gm4_lore:temp Source\n```\n\n`Dump`: This is extra info about the operation that was used, usually the line of lore that was modified.\n```mcfunction\ndata get storage gm4_lore:temp Dump\n```\n\n`index`: This is the index of the lore where the operation took place.\n```mcfunction\nscoreboard players get $index gm4_lore\n```\n\n\n### Operations\nBelow are the four operations and how to utilize them. Note that every operation requires `Source` and `Target` to be set.\n\n#### Remove\nRemoves a specified line of lore\n\n- `start` determines where the removal will start when it finds the `Target` line; this can be negative to start removing before the line or positive to start removing after the line. Defaults to 0.\n- `extra` determines how many more lines to remove after the first target line is removed. Must be positive. Defaults to 0. If set to -1, every line after the first target line will be removed.\n\n```mcfunction\nfunction #gm4_lore:remove\n```\n\n- `Source` is the updated `Source` without the `Target` line.\n- `Dump` is the removed line of lore.\n- `index` is the location of first line that was removed.\n\n\n#### Search\nFinds the index of a specified line of lore\n- `start` determines where the search will start; must be a positive number. Defaults to 0.\n\n```mcfunction\nfunction #gm4_lore:search\n```\n\n- `Source` remains unchanged.\n- `Dump` is the found line of lore (`Target`).\n- `index` is the location of first line that was found.\n\n\n#### Insert\nInserts lines of lore after a specified line of lore\n\n- `Input` determines the lines of lore to add after the `Target` line\n- `start` determines where the insertion will start when it finds the `Target` line; this can be negative to insert before the line or positive to insert after the line. Defaults to 0.\n\n```mcfunction\nfunction #gm4_lore:insert\n```\n\n- `Source` is the updated `Source` with the added lore.\n- `Dump` is the added lines of lore (`Input`).\n- `index` is the location of first line that was added.\n\n\n#### Replace\nReplaces a specified line of lore with one or more new lines of lore\n\n- `Input ` determines the lines of lore to replace the `Target` line\n- `start` determines where the search for the `Target` line will start; must be a positive number. Defaults to 0.\n\n```mcfunction\nfunction #gm4_lore:replace\n```\n\n- `Source` is the updated `Source` with the replaced lore\n- `Dump` is the replaced line of lore (`Target`)\n- `index` is the location of first line that was replaced.\n\n\nPlease note that the `example_pack` must be started by calling `#load:load`, as a proper load implementation is not included.\n\n## Technical Details\n- Technically the item isn't modified directly, this means the `Source` and be added to the lore of the item using the default `data modify` operations.\n- These operations are technically not limited to lore, but can also be used for any type of list.\n\n## License\nThis library, and the contents of the `lib_lore` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License.\n"
  },
  {
    "path": "lib_lore/beet.yaml",
    "content": "id: gm4_lore\nname: Gamemode 4 Lore\nversion: 1.4.X\ndescription: Allows other datapacks to easily search, remove, insert, and replace lines of lore on items.\n\ndata_pack:\n  load: \n    data: data\n\npipeline:\n  - gm4.plugins.extend.library\n\nmeta:\n  gm4:\n    versioning:\n      extra_version_injections:\n        functions:\n          - resolve_algorithm/insert\n          - resolve_algorithm/remove\n          - resolve_algorithm/replace\n          - resolve_algorithm/search\n    smithed:\n      pack_id: gm4_lib_lore\n    credits:\n      Creator:\n        - BPR\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/algorithms/insert.mcfunction",
    "content": "# insert lines of Lore after a specified line of Lore\n# run from modules that use this library\n\n# prepare for insert\nfunction gm4_lore:utilities/prepare\n\n# move all lines prior to the target line to a temp storage\n# Source[0] will become equal to Target after this\nfunction gm4_lore:utilities/find_line\n\n# if start is specified, iterate through the lines\nexecute if score $start gm4_lore matches ..-1 run function gm4_lore:utilities/start_before\nexecute if score $start gm4_lore matches 1.. run function gm4_lore:utilities/start_after\n\n# insert lore\nexecute unless score $index gm4_lore matches 0 run function gm4_lore:utilities/insert/insert_after\nexecute unless score $index gm4_lore matches -1 run data modify storage gm4_lore:temp TempSource append from storage gm4_lore:temp Input[]\n\n# store the input lines\ndata modify storage gm4_lore:temp Dump set from storage gm4_lore:temp Input\n\n# place the lines back into Source from the TempSource\ndata modify storage gm4_lore:temp Source prepend from storage gm4_lore:temp TempSource[]\n\n# clean up\nfunction gm4_lore:utilities/clean_up\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/algorithms/remove.mcfunction",
    "content": "# remove a specified line of Lore from a source Lore\n# run from modules that use this library\n\n# prepare for removal\nfunction gm4_lore:utilities/prepare\n\n# move all lines prior to the target line to a temp storage\n# Source[0] will become equal to Target after this\nfunction gm4_lore:utilities/find_line\n\n# if start is specified, iterate through the lines\nexecute if score $start gm4_lore matches ..-1 run function gm4_lore:utilities/start_before\nexecute if score $start gm4_lore matches 1.. run function gm4_lore:utilities/start_after\n\n# if extra is specified, remove the rest of the extra lines\nexecute if score $extra gm4_lore matches 1.. run function gm4_lore:utilities/remove/extra_lines\n\n# remove the first line of source\ndata modify storage gm4_lore:temp Dump append from storage gm4_lore:temp Source[0]\ndata remove storage gm4_lore:temp Source[0]\n\n# if extra is -1, clear Source\nexecute if score $extra gm4_lore matches -1 run function gm4_lore:utilities/remove/remove_rest\n\n# place the lines back into Source from the TempSource\ndata modify storage gm4_lore:temp Source prepend from storage gm4_lore:temp TempSource[]\n\n# clean up\nfunction gm4_lore:utilities/clean_up\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/algorithms/replace.mcfunction",
    "content": "# replaces a specified line of Lore with a new line of Lore\n# run from modules that use this library\n\n# prepare for replace\nfunction gm4_lore:utilities/prepare\n\n# if start is specified, ignore the lines before that index\nexecute if score $start gm4_lore matches 1.. run function gm4_lore:utilities/start_after\n\n# move all lines prior to the target line to a temp storage\n# Source[0] will become equal to Target after this\nfunction gm4_lore:utilities/find_line\n\n# replace the first line of source (target line)\ndata modify storage gm4_lore:temp TempInput set from storage gm4_lore:temp Input\ndata modify storage gm4_lore:temp Dump append from storage gm4_lore:temp Source[0]\ndata modify storage gm4_lore:temp Source[0] set from storage gm4_lore:temp Input[-1]\ndata remove storage gm4_lore:temp Input[-1]\ndata modify storage gm4_lore:temp Source prepend from storage gm4_lore:temp Input[]\ndata modify storage gm4_lore:temp Input set from storage gm4_lore:temp TempInput\n\n# place the lines back into Source from the TempSource\ndata modify storage gm4_lore:temp Source prepend from storage gm4_lore:temp TempSource[]\n\n# clean up\nfunction gm4_lore:utilities/clean_up\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/algorithms/search.mcfunction",
    "content": "# find a specified line of Lore from a source Lore\n# run from modules that use this library\n\n# prepare for search\nfunction gm4_lore:utilities/prepare\n\n# if start is specified, ignore the lines before that index\nexecute if score $start gm4_lore matches 1.. run function gm4_lore:utilities/start_after\n\n# move all lines prior to the target line to a temp storage\n# Source[0] will become equal to Target after this\nfunction gm4_lore:utilities/find_line\n\n# store the first line of source (target line)\ndata modify storage gm4_lore:temp Dump append from storage gm4_lore:temp Source[0]\n\n# place the lines back into Source from the TempSource\ndata modify storage gm4_lore:temp Source prepend from storage gm4_lore:temp TempSource[]\n\n# clean up\nfunction gm4_lore:utilities/clean_up\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/load.mcfunction",
    "content": "scoreboard objectives add gm4_lore dummy"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/resolve_algorithm/insert.mcfunction",
    "content": "execute if score gm4_lore load.status matches 1 if score gm4_lore_minor load.status matches 0.. run function gm4_lore:algorithms/insert\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/resolve_algorithm/remove.mcfunction",
    "content": "execute if score gm4_lore load.status matches 1 if score gm4_lore_minor load.status matches 0.. run function gm4_lore:algorithms/remove\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/resolve_algorithm/replace.mcfunction",
    "content": "execute if score gm4_lore load.status matches 1 if score gm4_lore_minor load.status matches 0.. run function gm4_lore:algorithms/replace\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/resolve_algorithm/search.mcfunction",
    "content": "execute if score gm4_lore load.status matches 1 if score gm4_lore_minor load.status matches 0.. run function gm4_lore:algorithms/search\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/utilities/clean_up.mcfunction",
    "content": "# all 4 functions end with this block of code, cleans up everything after the algorithms run\n# run from gm4_lore:<function>\n\n# clean up\nscoreboard players reset $line_count gm4_lore\nscoreboard players reset $start gm4_lore\nscoreboard players reset $extra gm4_lore\nscoreboard players reset $incorrect_line gm4_lore\ndata remove storage gm4_lore:temp TempSource\ndata remove storage gm4_lore:temp TempInput\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/utilities/find_line.mcfunction",
    "content": "# finds the target line of lore\n# run from gm4_lore:<function>\n\n# store original lines to a temp source\ndata modify storage gm4_lore:temp TempSource append from storage gm4_lore:temp Source[0]\n# check if the first line matches the target line\nexecute store success score $incorrect_line gm4_lore run data modify storage gm4_lore:temp Source[0] set from storage gm4_lore:temp Target\n\n# remove the line from Source unless it's the target line\nexecute if score $incorrect_line gm4_lore matches 1 run data remove storage gm4_lore:temp Source[0]\nexecute if score $incorrect_line gm4_lore matches 0 run data remove storage gm4_lore:temp TempSource[-1]\n\n# loop until the line is found\nexecute if score $incorrect_line gm4_lore matches 1 run scoreboard players add $index gm4_lore 1\nexecute if score $index gm4_lore < $line_count gm4_lore if score $incorrect_line gm4_lore matches 1 run function gm4_lore:utilities/find_line\nexecute if score $index gm4_lore >= $line_count gm4_lore run scoreboard players set $index gm4_lore -1\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/utilities/insert/insert_after.mcfunction",
    "content": "# moves additional lines from Source\n# run from gm4_lore:insert\n\ndata modify storage gm4_lore:temp TempSource append from storage gm4_lore:temp Source[0]\ndata remove storage gm4_lore:temp Source[0]\nscoreboard players add $index gm4_lore 1\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/utilities/prepare.mcfunction",
    "content": "# all 4 functions start with this block of code, sets up everything before the rest of the algorithms run\n# run from gm4_lore:<function>\n\nscoreboard players set $index gm4_lore 0\nexecute store result score $line_count gm4_lore run data get storage gm4_lore:temp Source\ndata remove storage gm4_lore:temp TempSource\ndata remove storage gm4_lore:temp Dump\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/utilities/remove/extra_lines.mcfunction",
    "content": "# deletes additional lines from Source\n# run from gm4_lore:remove\n\ndata modify storage gm4_lore:temp Dump append from storage gm4_lore:temp Source[0]\ndata remove storage gm4_lore:temp Source[0]\n\nscoreboard players remove $extra gm4_lore 1\nexecute if score $extra gm4_lore matches 1.. run function gm4_lore:utilities/remove/extra_lines\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/utilities/remove/remove_rest.mcfunction",
    "content": "\ndata modify storage gm4_lore:temp Dump append from storage gm4_lore:temp Source[]\ndata remove storage gm4_lore:temp Source\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/utilities/start_after.mcfunction",
    "content": "# moves additional lines from Source to TempSource\n# run from gm4_lore:<function>\n\ndata modify storage gm4_lore:temp TempSource append from storage gm4_lore:temp Source[0]\ndata remove storage gm4_lore:temp Source[0]\n\n# loop until all of the lines are moved over\nscoreboard players add $index gm4_lore 1\nexecute if score $index gm4_lore >= $line_count gm4_lore run scoreboard players set $index gm4_lore -1\nscoreboard players remove $start gm4_lore 1\nexecute unless score $start gm4_lore matches 0 run function gm4_lore:utilities/start_after\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/function/utilities/start_before.mcfunction",
    "content": "# moves lines from TempSource back to Source\n# run from gm4_lore:insert and gm4_lore:remove\n\ndata modify storage gm4_lore:temp Source prepend from storage gm4_lore:temp TempSource[-1]\ndata remove storage gm4_lore:temp TempSource[-1]\n\n# loop until all of the lines are moved over\nexecute unless score $index gm4_lore matches 0 run scoreboard players remove $index gm4_lore 1\nscoreboard players add $start gm4_lore 1\nexecute unless score $start gm4_lore matches 0 run function gm4_lore:utilities/start_before\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/tags/function/insert.json",
    "content": "{\n    \"values\": [\n        \"#gm4_lore:resolve_algorithm/insert\"\n    ]\n}\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/tags/function/remove.json",
    "content": "{\n    \"values\": [\n        \"#gm4_lore:resolve_algorithm/remove\"\n    ]\n}\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/tags/function/replace.json",
    "content": "{\n    \"values\": [\n        \"#gm4_lore:resolve_algorithm/replace\"\n    ]\n}\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/tags/function/resolve_algorithm/insert.json",
    "content": "{\n    \"values\": [\n        \"gm4_lore:resolve_algorithm/insert\"\n    ]\n}\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/tags/function/resolve_algorithm/remove.json",
    "content": "{\n    \"values\": [\n        \"gm4_lore:resolve_algorithm/remove\"\n    ]\n}\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/tags/function/resolve_algorithm/replace.json",
    "content": "{\n    \"values\": [\n        \"gm4_lore:resolve_algorithm/replace\"\n    ]\n}\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/tags/function/resolve_algorithm/search.json",
    "content": "{\n    \"values\": [\n        \"gm4_lore:resolve_algorithm/search\"\n    ]\n}\n"
  },
  {
    "path": "lib_lore/data/gm4_lore/tags/function/search.json",
    "content": "{\n    \"values\": [\n        \"#gm4_lore:resolve_algorithm/search\"\n    ]\n}\n"
  },
  {
    "path": "lib_lore/example_use/data/gm4_example_pack/functions/insert_examples.mcfunction",
    "content": "# demonstrates uses of insert operation of lib_lore\n\n## Inserts Lore in Player's mainhand\n\n# set inputs\ndata modify storage gm4_lore:temp Source set from entity @s SelectedItem.components.\"minecraft:lore\"\ndata modify storage gm4_lore:temp Target set value {\"text\":\"The inserted lines will appear after this line\"}\ndata modify storage gm4_lore:temp Input set value [{\"text\":\"This line will be inserted after the line\"},{\"text\":\"This line will also be inserted after the line\"},{\"text\":\"Same with this line\"}]\n# run operation\nfunction #gm4_lore:insert\n# update player's item with item modifier\nitem modify entity @s weapon.mainhand gm4_example_pack:update_player\n\n\n\n## Inserts Lore in an item\n\n# set inputs\ndata modify storage gm4_lore:temp Source set from entity @e[type=item,limit=1,sort=nearest] Item.components.\"minecraft:lore\"\ndata modify storage gm4_lore:temp Target set value {\"text\":\"The inserted lines will appear before this line since start is -1\"}\ndata modify storage gm4_lore:temp Input set value [{\"text\":\"This line will be inserted before the line\"},{\"text\":\"This line will also be inserted, following the previous line (still in front of the TARGET_LINE)\"}]\nscoreboard players set $start gm4_lore -1\n# run operation\nfunction #gm4_lore:insert\n# update item\ndata modify entity @e[type=item,limit=1,sort=nearest] Item.components.\"minecraft:lore\" set from storage gm4_lore:temp Source\n\n\n\n## Inserts Lore in one item, and also transfers them to another item\n\n# set inputs\nsummon item ~ ~ ~ {Tags:[\"item_1\"],Item:{components:{\"minecraft:lore\":[{\"text\":\"TARGET_LINE\"},{\"text\":\"The inserted lines will appear after this line\"},{\"text\":\"The inserted lines will appear before this line\"}]}}}\ndata modify storage gm4_lore:temp Source set from entity @e[type=item,tag=item_1,limit=1] Item.components.\"minecraft:lore\"\ndata modify storage gm4_lore:temp Target set value {\"text\":\"TARGET_LINE\"}\nscoreboard players set $start gm4_lore 1\ndata modify storage gm4_lore:temp Input set value [{\"text\":\"This line will be inserted\"},{\"text\":\"This line will follow the line before it\"}]\n# run operation\nfunction #gm4_lore:insert\n# set updated lore into item_1\ndata modify entity @e[type=item,tag=item_1,limit=1] Item.components.\"minecraft:lore\" set from storage gm4_lore:temp Source\n# appends inserted lore line to the closest item\ndata modify entity @e[type=item,tag=!item_1,sort=nearest,limit=1] Item.components.\"minecraft:lore\" append from storage gm4_lore:temp Dump\n# note that using \"Dump\" and \"Input\" in the command above is functionally equivalent\n"
  },
  {
    "path": "lib_lore/example_use/data/gm4_example_pack/functions/remove_examples.mcfunction",
    "content": "# demonstrates uses of remove operation of lib_lore\n\n## Removes 1 line of lore from Player's mainhand\n\n# set inputs\ndata modify storage gm4_lore:temp Source set from entity @s SelectedItem.components.\"minecraft:lore\"\ndata modify storage gm4_lore:temp Target set value {\"text\":\"This line will be removed\"}\n# run operation\nfunction #gm4_lore:remove\n# update player's item with item modifier\nitem modify entity @s weapon.mainhand gm4_example_pack:update_player\n\n\n\n## Removes 3 lines of lore from an item\n\n# set inputs\ndata modify storage gm4_lore:temp Source set from entity @e[type=item,limit=1,sort=nearest] Item.components.\"minecraft:lore\"\ndata modify storage gm4_lore:temp Target set value {\"text\":\"The 3 lines before this line will be removed\"}\nscoreboard players set $start gm4_lore -3\nscoreboard players set $extra gm4_lore 2\n# run operation\nfunction #gm4_lore:remove\n# update item\ndata modify entity @e[type=item,limit=1,sort=nearest] Item.components.\"minecraft:lore\" set from storage gm4_lore:temp Source\n\n\n\n## Removes lore from one item, and transfers it to another item\n\n# set inputs\nsummon item ~ ~ ~ {Tags:[\"item_1\"],Item:{id:\"stone\",components:{\"minecraft:lore\":[{\"text\":\"This line and the ones after will be searched for the TARGET_LINE\"},{\"text\":\"FILLER_LINE\"},{\"text\":\"TARGET_LINE\"},{\"text\":\"The line after this line will be removed, since start is 2 (2 after TARGET_LINE)\"},{\"text\":\"This line will be removed and appended to another item\"},{\"text\":\"This line will be removed and appended to another item since extra is -1\"},{\"text\":\"This line will be removed and appended to another item since extra is -1\"}]}}}\ndata modify storage gm4_lore:temp Source set from entity @e[type=item,tag=item_1,limit=1] Item.components.\"minecraft:lore\"\ndata modify storage gm4_lore:temp Target set value {\"text\":\"TARGET_LINE\"}\nscoreboard players set $start gm4_lore 2\nscoreboard players set $extra gm4_lore -1\n# run operation\nfunction #gm4_lore:remove\n# set updated lore into item_1\ndata modify entity @e[type=item,tag=item_1,limit=1] Item.components.\"minecraft:lore\" set from storage gm4_lore:temp Source\n# appends removed lore lines to the closest item\ndata modify entity @e[type=item,tag=!item_1,sort=nearest,limit=1] Item.components.\"minecraft:lore\" append from storage gm4_lore:temp Dump\n"
  },
  {
    "path": "lib_lore/example_use/data/gm4_example_pack/functions/replace_examples.mcfunction",
    "content": "# demonstrates uses of replace operation of lib_lore\n\n## Replaces Lore in Player's mainhand\n\n# set inputs\ndata modify storage gm4_lore:temp Source set from entity @s SelectedItem.components.\"minecraft:lore\"\ndata modify storage gm4_lore:temp Target set value {\"text\":\"This line will be replaced\"}\ndata modify storage gm4_lore:temp Input set value [{\"text\":\"This line will replace the line\"}]\n# run operation\nfunction #gm4_lore:replace\n# update player's item with item modifier\nitem modify entity @s weapon.mainhand gm4_example_pack:update_player\n\n\n\n## Replaces Lore in an item\n\n# set inputs\ndata modify storage gm4_lore:temp Source set from entity @e[type=item,limit=1,sort=nearest] Item.components.\"minecraft:lore\"\ndata modify storage gm4_lore:temp Target set value {\"text\":\"This line will be replaced\"}\ndata modify storage gm4_lore:temp Input set value [{\"text\":\"This line will replace the line\"},{\"text\":\"This line will follow the line before it\"}]\n# run operation\nfunction #gm4_lore:replace\n# update item\ndata modify entity @e[type=item,limit=1,sort=nearest] Item.components.\"minecraft:lore\" set from storage gm4_lore:temp Source\n\n\n\n## Replaces Lore in one item, and transfers it to another item\n\n# set inputs\nsummon item ~ ~ ~ {Tags:[\"item_1\"],Item:{id:\"minecraf:stick\",components:{\"minecraft:lore\":[{\"text\":\"TARGET_LINE\"},{\"text\":\"The first two lines will be skipped/ignored\"},{\"text\":\"The line after this one will be replaced\"},{\"text\":\"TARGET_LINE\"},{\"text\":\"This line will remain at the end\"}]}}}\ndata modify storage gm4_lore:temp Source set from entity @e[type=item,tag=item_1,limit=1] Item.components.\"minecraft:lore\"\ndata modify storage gm4_lore:temp Target set value {\"text\":\"TARGET_LINE\"}\nscoreboard players set $start gm4_lore 2\ndata modify storage gm4_lore:temp Input set value [{\"text\":\"This line will replace the TARGET_LINE\"},{\"text\":\"This line will follow the line before it\"}]\n# run operation\nfunction #gm4_lore:replace\n# set updated lore into item_1\ndata modify entity @e[type=item,tag=item_1,limit=1] Item.components.\"minecraft:lore\" set from storage gm4_lore:temp Source\n# appends replaced lore line to the closest item\ndata modify entity @e[type=item,tag=!item_1,sort=nearest,limit=1] Item.components.\"minecraft:lore\" append from storage gm4_lore:temp Dump\n# note that using \"Dump\" and \"Target\" in the command above is functionally equivalent\n"
  },
  {
    "path": "lib_lore/example_use/data/gm4_example_pack/functions/search_examples.mcfunction",
    "content": "# demonstrates uses of search operation of lib_lore\n\n## Searches for a duplicate line of lore from Player's mainhand\n## Checks if any line of lore is the same as the first line\n\n# set inputs\ndata modify storage gm4_lore:temp Source set from entity @s SelectedItem.components.\"minecraft:lore\"\ndata modify storage gm4_lore:temp Target set from entity @s SelectedItem.components.\"minecraft:lore\"[0]\nscoreboard players set $start gm4_lore 1\n# run operation\nfunction #gm4_lore:search\n# check if there was a duplicate line\nexecute unless score $index gm4_lore matches -1 run say There is a lore line that is exactly the same as the first lore line!\n"
  },
  {
    "path": "lib_lore/example_use/data/gm4_example_pack/item_modifiers/update_player.json",
    "content": "{\n    \"function\": \"minecraft:copy_nbt\",\n    \"source\": {\n        \"type\": \"minecraft:storage\",\n        \"source\": \"gm4_lore:temp\"\n    },\n    \"ops\": [\n        {\n            \"source\": \"Source\",\n            \"target\": \"display.Lore\",\n            \"op\": \"replace\"\n        }\n    ]\n}\n"
  },
  {
    "path": "lib_lore/example_use/data/load/tags/functions/gm4_example_pack.json",
    "content": "{\n    \"values\": [\n        \"#load:gm4_lore\"\n    ]\n}\n"
  },
  {
    "path": "lib_lore/example_use/data/load/tags/functions/load.json",
    "content": "{\n    \"values\": [\n        \"#load:gm4_example_pack\"\n    ]\n}\n"
  },
  {
    "path": "lib_lore/example_use/pack.mcmeta",
    "content": "{\n    \"pack\": {\n        \"pack_format\": 7,\n        \"description\": [\n            \"Example Pack\",\n            \"\\n\",\n            {\n                \"text\": \"Usage example of lib_lore\",\n                \"color\": \"gold\"\n            }\n        ]\n    },\n    \"credits\": {\n        \"Creator\": [\n            [\n                \"BPR\",\n                \"https://bsky.app/profile/bpr02.com\"\n            ]\n        ]\n    }\n}\n"
  },
  {
    "path": "lib_lore/mod.mcdoc",
    "content": "use ::java::util::text::Text\n\ndispatch minecraft:storage[gm4_lore:temp] to struct {\n  /// A list of the lore that will be modified, typically this would be extracted directly from the item being modified, but can be set manually to a desired set of lore.\n  Source?: [Text],\n  /// A single json item (i.e. a single 'line' of lore) that will be found during the operations. This sets the line of lore to be searched, removed, inserted after, or replaced.\n  Target?: Text,\n  /// A list of the lore that will be inserted or replaced. This should not be set when simply searching or removing and will be ignored if set while using the search or remove operation.\n  Input?: [Text],\n  TempSource?: [Text],\n  TempInput?: [Text],\n  Dump?: [Text],\n}\n"
  },
  {
    "path": "lib_machines/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2021 Gamemode 4 Development\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib_machines/README.md",
    "content": "# lib_machines\nlib_machines is a mcfunction library that adds logic for placing and breaking custom blocks. \n\n## Terminology\nGamemode 4 primarily uses this library for machine blocks, but any mention of \"machine\" or \"machine blocks\" below refers to any custom block.\n\n## How to Use\nThere are 2 function tags to be used: one for placing machines (`#gm4_machines:place_down`) and one for breaking machines (`#gm4_machines:destroy`).\n\n### Placing Down Machines\nMachine blocks must be player heads with the following NBT data:\n\n```mcfunction\n{components:{\"minecraft:custom_data\":{gm4_machines:{id:\"BLOCK_INDENTIFIER\"}}}}\n```\n\nWhen placing down a player head with this NBT, the function tag `#gm4_machines:place_down` will run. This will run `as` the player who placed the block and `at` the center of the block that was placed. The following command should be used to verify the specific machine placed:\n\n```mcfunction\nexecute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:\"BLOCK_INDENTIFIER\"} run function MODULE_NAMESPACE:machine/create\n```\n\nThe function `MODULE_NAMESPACE:machine/create` should have the following commands: \n```mcfunction\nscoreboard players set $placed_block gm4_machine_data 1\nsummon marker ~ ~ ~ {Tags:[\"gm4_machine_marker\",\"smithed.block\",\"smithed.entity\",\"smithed.strict\",\"IDENTIFIER\",\"ADD ANY EXTRA TAGS\"],CustomName:\"PLEASE NAME YOUR MACHINE MARKERS\",<...>}\n```\n\nEach machine block has a marker entity located at the center of the block (`align xyz positioned ~0.5 ~0.5 ~0.5`) with the tag `gm4_machine_marker`.\n\nThe score `$rotation gm4_machine_data` stores the direction the player is facing and can be used in the `create` function:\n\n```\n1: up\n2: down\n3: north\n4: east\n5: south\n6: west\n```\n\nThis can be used to rotate blocks according to facing direction. Note that normally most rotated blocks (droppers, barrels, pistons, etc.) are placed with a facing direction opposite of the player's facing direction. E.g. if the player faces downwards, a placed dropper faces upwards.\n\nThe score `$single_rotation gm4_machine_data` stores the cardinal direction the player is facing and can be used in the `create` function:\n\n```\n1: north\n2: east\n3: south\n4: west\n```\n\nThis can be used to rotate blocks according to facing direction if the block doesn't have a vertical direction, such as furnaces.\n\n\nThe score `$face_placement gm4_machine_data` stores the face that the block was placed on and can be used in the `create` function:\n\n```\n1: north\n2: east\n3: south\n4: west\n```\n\nThis can be used to rotate blocks according to what face of the block it was placed on. Note that normally hoppers are placed with a facing direction opposite to the face that it was placed on. E.g. if a player places a hopper onto the south face of a block, it will point north, into the block it was placed on.\n\nThe scores `$x_rotation` and `$y_rotation` store the exact rotations of the player and can be used for more precise block placement than the three options outlined above.\n### Breaking Machines\nEvery tick, machine markers will check if it is in one of the following blocks:\n```\nair\nmoving_piston\nlava\nwater\n```\n\nIf it is in one of those blocks, it will activate a destruction function tag `#gm4_machines:destroy`. This runs `as` and `at` the marker entity. This function is run during the command block sub-tick, meaning you can kill/modify items before they can be picked up by hoppers and hopper minecarts.\n\nE.g. if the base block of a machine is a dropper, when the machine marker detects it has been broken, the dropper item can be killed and/or replaced with a custom item (likely the player head used to place down the machine block).\n\nThe following command should be used to verify the specific machine destroyed:\n\n```mcfunction\nexecute if entity @s[tag=IDENTIFIER] run function MODULE_NAMESPACE:machine/destroy\n```\n\n## License\nThis library, and the contents of the `lib_machines` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License.\n"
  },
  {
    "path": "lib_machines/beet.yaml",
    "content": "id: gm4_machines\nname: Gamemode 4 Machines\nversion: 1.5.X\ndescription: lib_machines is a mcfunction library that adds logic for placing and breaking custom blocks. \n\ndata_pack:\n  load:\n    data: data\n\npipeline:\n  - gm4.plugins.extend.library\n  - gm4.plugins.include.lib_forceload\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_forceload: 1.6.0\n      schedule_loops: [main]\n      extra_version_injections:\n        functions:\n          - resolve_tick\n        advancements:\n          - place_machine_block\n          - place_machine_cart\n    smithed:\n      pack_id: gm4_lib_machines\n    credits:\n      Machines Library Creator:\n        - BPR\n"
  },
  {
    "path": "lib_machines/data/gm4_forceload/tags/function/command_block_tick.json",
    "content": "{\n    \"values\": [\n        \"gm4_machines:resolve_tick\"\n    ]\n}\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/advancement/place_machine_block.json",
    "content": "{\n  \"criteria\": {\n    \"placed_machine_block\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:match_tool\",\n            \"predicate\": {\n              \"items\": [\n                \"minecraft:player_head\"\n              ],\n              \"predicates\": {\n                \"minecraft:custom_data\": \"{gm4_machines:{}}\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_machines:place_down/place_machine_block\"\n  }\n}\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/advancement/place_machine_cart.json",
    "content": "{\n  \"criteria\": {\n    \"placed_machine_entity\": {\n      \"trigger\": \"minecraft:item_used_on_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:match_tool\",\n            \"predicate\": {\n              \"items\": \"#gm4_machines:minecarts\",\n              \"predicates\": {\n                \"minecraft:custom_data\": \"{gm4_machines:{}}\"\n              }\n            }\n          },\n          {\n            \"condition\": \"minecraft:location_check\",\n            \"predicate\": {\n              \"block\": {\n                \"blocks\": \"#minecraft:rails\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_machines:place_down/place_machine_cart\"\n  }\n}\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/function/load.mcfunction",
    "content": "scoreboard objectives add gm4_machine_data dummy\nscoreboard objectives add gm4_entity_version dummy\n\nschedule function gm4_machines:main 6t\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/function/main.mcfunction",
    "content": "# runs every 16t\n# @s = none\n# located at world spawn\n# run from gm4_machines:load\n\nschedule function gm4_machines:main 16t\n\n# check if a new minecart machine has been spawned (via dispenser, since placed by player is detected via advancement)\nexecute if entity @e[type=#gm4:minecarts,tag=!gm4_machine_checked,limit=1] run function gm4_machines:place_down/place_machine_cart\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/function/place_down/check_layer.mcfunction",
    "content": "# replaces any machine player heads with their corresponding block\n# @s = player that just placed a machine block player head\n# located at @s rotated <aligned to cardinal direction> positioned ^-4 ^X ^-1, X = layer number - 4\n# run from gm4_machines:place_down/place_machine_block\n\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^ ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^1 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^2 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^3 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^4 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^5 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^6 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^7 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^8 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\n\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^ ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^1 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^2 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^3 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^4 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^5 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^6 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^7 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^8 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\n\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^ ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^1 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^2 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^3 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^4 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^5 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^6 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^7 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^8 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\n\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^ ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^1 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^2 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^3 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^4 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^5 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^6 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^7 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^8 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\n\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^ ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^1 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^2 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^3 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^4 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^5 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^6 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^7 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^8 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\n\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^ ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^1 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^2 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^3 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^4 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^5 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^6 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^7 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\nexecute if score $player_head_count gm4_machine_data matches 1.. positioned ^8 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place\n\n\nscoreboard players add $layer_count gm4_machine_data 1\nexecute if score $player_head_count gm4_machine_data matches 1.. if score $layer_count gm4_machine_data matches ..10 positioned ~ ~1 ~ run function gm4_machines:place_down/check_layer\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/function/place_down/count_heads/east.mcfunction",
    "content": "# counts the number of players heads\n# @s = player that just placed a machine block player head\n# located at @s\n# run from gm4_machines:plade_down/place_machine_block\n\nexecute store result score $player_head_add gm4_machine_data run clone ~-1 ~-4 ~-4 ~4 ~-4 ~4 ~-1 ~-4 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-1 ~-3 ~-4 ~4 ~-3 ~4 ~-1 ~-3 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-1 ~-2 ~-4 ~4 ~-2 ~4 ~-1 ~-2 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-1 ~-1 ~-4 ~4 ~-1 ~4 ~-1 ~-1 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-1 ~ ~-4 ~4 ~ ~4 ~-1 ~ ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-1 ~1 ~-4 ~4 ~1 ~4 ~-1 ~1 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-1 ~2 ~-4 ~4 ~2 ~4 ~-1 ~2 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-1 ~3 ~-4 ~4 ~3 ~4 ~-1 ~3 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-1 ~4 ~-4 ~4 ~4 ~4 ~-1 ~4 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-1 ~5 ~-4 ~4 ~5 ~4 ~-1 ~5 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-1 ~6 ~-4 ~4 ~6 ~4 ~-1 ~6 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/function/place_down/count_heads/north.mcfunction",
    "content": "# counts the number of players heads\n# @s = player that just placed a machine block player head\n# located at @s\n# run from gm4_machines:plade_down/place_machine_block\n\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~-4 ~-4 ~4 ~-4 ~1 ~-4 ~-4 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~-3 ~-4 ~4 ~-3 ~1 ~-4 ~-3 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~-2 ~-4 ~4 ~-2 ~1 ~-4 ~-2 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~-1 ~-4 ~4 ~-1 ~1 ~-4 ~-1 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~ ~-4 ~4 ~ ~1 ~-4 ~ ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~1 ~-4 ~4 ~1 ~1 ~-4 ~1 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~2 ~-4 ~4 ~2 ~1 ~-4 ~2 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~3 ~-4 ~4 ~3 ~1 ~-4 ~3 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~4 ~-4 ~4 ~4 ~1 ~-4 ~4 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~5 ~-4 ~4 ~5 ~1 ~-4 ~5 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~6 ~-4 ~4 ~6 ~1 ~-4 ~6 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/function/place_down/count_heads/south.mcfunction",
    "content": "# counts the number of players heads\n# @s = player that just placed a machine block player head\n# located at @s\n# run from gm4_machines:plade_down/place_machine_block\n\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~-4 ~-1 ~4 ~-4 ~4 ~-4 ~-4 ~-1 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~-3 ~-1 ~4 ~-3 ~4 ~-4 ~-3 ~-1 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~-2 ~-1 ~4 ~-2 ~4 ~-4 ~-2 ~-1 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~-1 ~-1 ~4 ~-1 ~4 ~-4 ~-1 ~-1 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~ ~-1 ~4 ~ ~4 ~-4 ~ ~-1 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~1 ~-1 ~4 ~1 ~4 ~-4 ~1 ~-1 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~2 ~-1 ~4 ~2 ~4 ~-4 ~2 ~-1 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~3 ~-1 ~4 ~3 ~4 ~-4 ~3 ~-1 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~4 ~-1 ~4 ~4 ~4 ~-4 ~4 ~-1 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~5 ~-1 ~4 ~5 ~4 ~-4 ~5 ~-1 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~6 ~-1 ~4 ~6 ~4 ~-4 ~6 ~-1 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/function/place_down/count_heads/west.mcfunction",
    "content": "# counts the number of players heads\n# @s = player that just placed a machine block player head\n# located at @s\n# run from gm4_machines:plade_down/place_machine_block\n\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~-4 ~-4 ~1 ~-4 ~4 ~-4 ~-4 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~-3 ~-4 ~1 ~-3 ~4 ~-4 ~-3 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~-2 ~-4 ~1 ~-2 ~4 ~-4 ~-2 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~-1 ~-4 ~1 ~-1 ~4 ~-4 ~-1 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~ ~-4 ~1 ~ ~4 ~-4 ~ ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~1 ~-4 ~1 ~1 ~4 ~-4 ~1 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~2 ~-4 ~1 ~2 ~4 ~-4 ~2 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~3 ~-4 ~1 ~3 ~4 ~-4 ~3 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~4 ~-4 ~1 ~4 ~4 ~-4 ~4 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~5 ~-4 ~1 ~5 ~4 ~-4 ~5 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\nexecute store result score $player_head_add gm4_machine_data run clone ~-4 ~6 ~-4 ~1 ~6 ~4 ~-4 ~6 ~-4 filtered #gm4_machines:player_heads{components:{\"minecraft:custom_data\":{gm4_machines:{}}}} force\nscoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/function/place_down/place_machine_block.mcfunction",
    "content": "# finds the player head that was placed by the player\n# @s = player that just placed a machine block player head\n# located at @s\n# run from gm4_machines:resolve_load/place_machine_block\n\nadvancement revoke @s only gm4_machines:place_machine_block\n\n# get rotation of player\n# key: direction of player\n# 3: north, 4: east, 5: south, 6: west\nexecute store result score $y_rotation gm4_machine_data run data get entity @s Rotation[0]\nscoreboard players set $rotation gm4_machine_data 0\n\nexecute if score $y_rotation gm4_machine_data matches 45..135 run scoreboard players set $rotation gm4_machine_data 6\nexecute if score $rotation gm4_machine_data matches 0 if score $y_rotation gm4_machine_data matches -45..45 run scoreboard players set $rotation gm4_machine_data 5\nexecute if score $rotation gm4_machine_data matches 0 if score $y_rotation gm4_machine_data matches -135..-45 run scoreboard players set $rotation gm4_machine_data 4\nexecute if score $rotation gm4_machine_data matches 0 run scoreboard players set $rotation gm4_machine_data 3\n\n# store cardinal y_rotation\nscoreboard players operation $single_rotation gm4_machine_data = $rotation gm4_machine_data\nscoreboard players remove $single_rotation gm4_machine_data 2\n\n# find player heads in the specific region\nscoreboard players set $player_head_count gm4_machine_data 0\nexecute if score $rotation gm4_machine_data matches 3 run function gm4_machines:place_down/count_heads/north\nexecute if score $rotation gm4_machine_data matches 4 run function gm4_machines:place_down/count_heads/east\nexecute if score $rotation gm4_machine_data matches 5 run function gm4_machines:place_down/count_heads/south\nexecute if score $rotation gm4_machine_data matches 6 run function gm4_machines:place_down/count_heads/west\n\n# replace player heads with the corresponding block\nscoreboard players set $layer_count gm4_machine_data 0\nexecute if score $player_head_count gm4_machine_data matches 1.. if score $rotation gm4_machine_data matches 3 align xyz positioned ~0.5 ~0.5 ~0.5 rotated 180 0 positioned ^-4 ^-4 ^-1 run function gm4_machines:place_down/check_layer\nexecute if score $player_head_count gm4_machine_data matches 1.. if score $rotation gm4_machine_data matches 4 align xyz positioned ~0.5 ~0.5 ~0.5 rotated -90 0 positioned ^-4 ^-4 ^-1 run function gm4_machines:place_down/check_layer\nexecute if score $player_head_count gm4_machine_data matches 1.. if score $rotation gm4_machine_data matches 5 align xyz positioned ~0.5 ~0.5 ~0.5 rotated 0 0 positioned ^-4 ^-4 ^-1 run function gm4_machines:place_down/check_layer\nexecute if score $player_head_count gm4_machine_data matches 1.. if score $rotation gm4_machine_data matches 6 align xyz positioned ~0.5 ~0.5 ~0.5 rotated 90 0 positioned ^-4 ^-4 ^-1 run function gm4_machines:place_down/check_layer\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/function/place_down/place_machine_cart.mcfunction",
    "content": "# finds the minecart that was placed by the player OR dispenser\n# @s = player that just placed a machine minecart OR none\n# located at @s OR world spawn\n# run from gm4_machines:resolve_load/place_machine_minecart\n# and from gm4_machines:main\n\nadvancement revoke @s only gm4_machines:place_machine_cart\n\n# set up\ntag @s add gm4_machines_placer\nscoreboard players set $placed_block gm4_machine_data 0\n\n# call function for all minecarts with custom names\nexecute as @e[type=#gm4:minecarts,tag=!gm4_machine_checked] if data entity @s CustomName at @s run function #gm4_machines:place_cart\n\n# clean up\ntag @e[type=#gm4:minecarts] add gm4_machine_checked\ntag @s remove gm4_machines_placer\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/function/place_down/prep_place.mcfunction",
    "content": "# prepares the storage and scores for block placement\n# @s = player that just placed a machine block player head\n# located at the center of the block that was placed\n# run from gm4_machines:resolve_load/place_machine_block\n\n# overwrite rotation if player is looking highly up or down\n# key: direction of player\n# 1: up, 2: down\nexecute store result score $x_rotation gm4_machine_data run data get entity @s Rotation[1]\nexecute if score $x_rotation gm4_machine_data matches -90..-45 run scoreboard players set $rotation gm4_machine_data 1\nexecute if score $x_rotation gm4_machine_data matches 45..90 run scoreboard players set $rotation gm4_machine_data 2\n\n# store face placed on\n# key: block face\n# 1: up, 2: down, 3: north, 4: east, 5: south, 6: west\nscoreboard players set $face_placement gm4_machine_data 1\nexecute if block ~ ~ ~ player_head if score $x_rotation gm4_machine_data matches -90..0 run scoreboard players set $face_placement gm4_machine_data 2\nexecute if block ~ ~ ~ player_wall_head[facing=north] run scoreboard players set $face_placement gm4_machine_data 3\nexecute if block ~ ~ ~ player_wall_head[facing=east] run scoreboard players set $face_placement gm4_machine_data 4\nexecute if block ~ ~ ~ player_wall_head[facing=south] run scoreboard players set $face_placement gm4_machine_data 5\nexecute if block ~ ~ ~ player_wall_head[facing=west] run scoreboard players set $face_placement gm4_machine_data 6\n\ndata modify storage gm4_machines:temp id set from block ~ ~ ~ components.\"minecraft:custom_data\".gm4_machines.id\n\nscoreboard players set $placed_block gm4_machine_data 0\nscoreboard players remove $player_head_count gm4_machine_data 1\n\nfunction #gm4_machines:place_down\ndata remove storage gm4_machines:temp id\n\n# prevent multi-machines\nexecute store result score $entity_count gm4_machine_data if entity @e[type=marker,tag=gm4_machine_marker,distance=..0.1]\nexecute if score $entity_count gm4_machine_data matches 2.. run setblock ~ ~ ~ air destroy\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/function/resolve_tick.mcfunction",
    "content": "# checks if lib_machines module is loaded\n# @s = forceloaded command block \n# located at 29999998 1 7131\n# run from function tag #gm4_forceload:command_block_tick\n\nexecute if score gm4_machines load.status matches 1 if score gm4_machines_minor load.status matches 1 run function gm4_machines:tick\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/function/tick.mcfunction",
    "content": "# runs every tick on the command block subtick; detects when a machine block has been broken\n# @s = forceloaded command block \n# located at 29999998 1 7131\n# run from gm4_machines:resolve_tick\n\n# check if machine blocks have been broken or moved by a piston (note: this assumes that the block is never replaced with a /fill command)\nexecute as @e[type=marker,tag=gm4_machine_marker] at @s if block ~ ~ ~ #gm4_machines:empty_block run function #gm4_machines:destroy\nexecute as @e[type=item_display,tag=gm4_machine_cart,predicate=!gm4_machines:has_vehicle] at @s run function #gm4_machines:destroy_cart\nexecute as @e[type=area_effect_cloud,tag=gm4_machine_cart,predicate=!gm4_machines:has_vehicle] at @s run function #gm4_machines:destroy_cart\nexecute as @e[type=marker,tag=gm4_machine_cart,predicate=!gm4_machines:has_vehicle] at @s run function #gm4_machines:destroy_cart\n\n# Necessary for liquid minecarts\nexecute as @e[type=armor_stand,tag=gm4_machine_cart,predicate=!gm4_machines:has_vehicle] at @s run function #gm4_machines:destroy_cart\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/predicate/has_vehicle.json",
    "content": "{\n  \"condition\": \"minecraft:entity_properties\",\n  \"entity\": \"this\",\n  \"predicate\": {\n    \"vehicle\": {}\n  }\n}\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/tags/block/empty_block.json",
    "content": "{\n    \"values\": [\n        \"minecraft:air\",\n        \"minecraft:moving_piston\",\n        \"minecraft:water\",\n        \"minecraft:lava\"\n    ]\n}\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/tags/block/player_heads.json",
    "content": "{\n    \"values\": [\n        \"minecraft:player_head\",\n        \"minecraft:player_wall_head\"\n    ]\n}\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/tags/function/destroy.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/tags/function/destroy_cart.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/tags/function/place_cart.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/tags/function/place_down.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "lib_machines/data/gm4_machines/tags/item/minecarts.json",
    "content": "{\n    \"values\": [\n        \"minecraft:minecart\",\n        \"minecraft:chest_minecart\",\n        \"minecraft:hopper_minecart\",\n        \"minecraft:furnace_minecart\",\n        \"minecraft:tnt_minecart\",\n        \"minecraft:command_block_minecart\"\n    ]\n}\n"
  },
  {
    "path": "lib_machines/mod.mcdoc",
    "content": "use ::java::util::slot::SlottedItem\n\ndispatch minecraft:storage[gm4_machines:temp] to struct {\n  id?: string,\n  Items?: [SlottedItem<byte>],\n}\n\ndispatch mcdoc:custom_data[gm4_machines] to struct {\n  id: string,\n}\n"
  },
  {
    "path": "lib_player_death/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2024 Gamemode 4 Development\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib_player_death/README.md",
    "content": "# lib_player_death\n"
  },
  {
    "path": "lib_player_death/beet.yaml",
    "content": "id: gm4_player_death\nname: Gamemode 4 Player Death\nversion: 1.4.X\n\ndata_pack:\n  load: \n    data: data\n\npipeline:\n  - gm4.plugins.extend.library\n\nmeta:\n  gm4:\n    versioning:\n      extra_version_injections:\n        advancements:\n          - death\n    credits:\n      Creator:\n        - Misode\n"
  },
  {
    "path": "lib_player_death/data/gm4_player_death/advancement/death.json",
    "content": "{\n  \"criteria\": {\n    \"die\": {\n      \"trigger\": \"minecraft:entity_hurt_player\",\n      \"conditions\": {\n        \"player\": [\n          {\n            \"condition\": \"minecraft:entity_scores\",\n            \"entity\": \"this\",\n            \"scores\": {\n              \"gm4_player_death_count\": {\n                \"min\": 1\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"rewards\": {\n    \"function\": \"gm4_player_death:death\"\n  }\n}\n"
  },
  {
    "path": "lib_player_death/data/gm4_player_death/function/death.mcfunction",
    "content": "# @s = player that just died\n# run from advancement player_death\n\nadvancement revoke @s only gm4_player_death:death\nscoreboard players reset @s gm4_player_death_count\n\nfunction #gm4_player_death:_private/death\n"
  },
  {
    "path": "lib_player_death/data/gm4_player_death/function/load.mcfunction",
    "content": "# Add death tracking and reset objective in case the player died while the data pack was disabled\nscoreboard objectives add gm4_player_death_count deathCount\nscoreboard players reset * gm4_player_death_count\n"
  },
  {
    "path": "lib_player_death/data/gm4_player_death/tags/function/_private/death.json",
    "content": "{\n  \"values\": [\n    {\n      \"id\": \"#gm4_player_death:soul_bound\",\n      \"required\": false\n    },\n    {\n      \"id\": \"#gm4_player_death:relocate\",\n      \"required\": false\n    },\n    {\n      \"id\": \"#gm4_player_death:grave\",\n      \"required\": false\n    },\n    {\n      \"id\": \"#gm4_player_death:death\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "lib_player_motion/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2025 Gamemode 4 Development\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n---\n\nMIT License\n\nCopyright (c) 2024 BigPapi13, MulverineX\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib_player_motion/README.md",
    "content": "# lib_player_motion\nThe [Player Motion](https://modrinth.com/datapack/player_motion) library prefixed with the GM4 namespace and properly versioned to prevent conflicts with other versions of player motion.\n\n## changes\nThe following usage changes have been made to the original player motion library:\n- The scoreboard objective `gm4_player_motion.api.launch` should be used instead of `player_motion.api.launch` when setting the parameters for the launch.\n- The function tags `#gm4_player_motion:launch_xyz` and `#gm4_player_motion:launch_looking` function tags should be used instead of the `player_motion:api/launch_xyz` and `player_motion:api/launch_looking` functions.\n\nThe following file changes have been made to the original player motion library:\n- The `#minecraft:load` function tag has been removed in favor of lantern load.\n- The `player_motion` namespace has been changed to `gm4_player_motion` to prevent potential conflicts with other versions of the player motion library.\n- The `player_motion:internal/technical/load` function has been moved to `gm4_player_motion:load` as per GM4 file conventions.\n- The `#gm4_player_motion:launch_xyz` and `#gm4_player_motion:launch_looking` functions tags have been added as version-checked API calls.\n\nThe following implementation changes have been made to the original player motion library:\n- All scoreboard objectives and storage references use `gm4_player_motion` instead of `player_motion` to prevent potential conflicts with other versions of the player motion library.\n- The UUID for the marker used to get vectors has been changed to a different UUID to prevent potential conflicts with other versions of the player motion library.\n- The marker is kept at 29999998 0 7133 instead of 0 0 0 to prevent forceloading 0 0; instead the GM4 forceloaded chunk is used to keep the marker selectable.\n"
  },
  {
    "path": "lib_player_motion/beet.yaml",
    "content": "id: gm4_player_motion\nname: Gamemode 4 Player Motion\nversion: 1.1.X\n\ndata_pack:\n  load: \n    data: data\n\npipeline:\n  - gm4.plugins.extend.library\n  - gm4.plugins.include.lib_forceload\n\nmeta:\n  gm4:\n    versioning:\n      required:\n        lib_forceload: 1.6.0\n      schedule_loops: [internal/technical/tick]\n    credits:\n      Original Creator:\n        - MulverineX\n      Adapted for GM4 by:\n        - BPR\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/api/launch_looking.mcfunction",
    "content": "#> gm4_player_motion:api/launch_looking\r\n# Launches the player in the input direction\r\nexecute if entity @s[type=!player] run return fail\r\nexecute on vehicle run return fail\r\n\r\nscoreboard players set $function_called gm4_player_motion.internal.dummy 1\r\ntag @s add gm4_player_motion.launch\r\n\r\nexecute store result storage gm4_player_motion:math strength double 0.0001 run scoreboard players get $strength gm4_player_motion.api.launch\r\nexecute as 9a347e6c-1ce5-434a-b717-6707d51f4299 in minecraft:overworld positioned 0.0 0.0 0.0 run function gm4_player_motion:internal/math/looking_to_xyz with storage gm4_player_motion:math\r\n#          ^ changed UUID to prevent potential conflict\r\nexecute store result score $out gm4_player_motion.internal.motion.x run data get storage gm4_player_motion:math motion[0] 10000\r\nexecute store result score $out gm4_player_motion.internal.motion.y run data get storage gm4_player_motion:math motion[1] 10000\r\nexecute store result score $out gm4_player_motion.internal.motion.z run data get storage gm4_player_motion:math motion[2] 10000\r\n\r\nscoreboard players operation @s gm4_player_motion.internal.motion.x += $out gm4_player_motion.internal.motion.x\r\nscoreboard players operation @s gm4_player_motion.internal.motion.y += $out gm4_player_motion.internal.motion.y\r\nscoreboard players operation @s gm4_player_motion.internal.motion.z += $out gm4_player_motion.internal.motion.z\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/api/launch_xyz.mcfunction",
    "content": "#> gm4_player_motion-1.4:api/launch_xyz\r\n# Launches the player in the input direction\r\nexecute if entity @s[type=!player] run return fail\r\nexecute on vehicle run return fail\r\n\r\nscoreboard players set $function_called gm4_player_motion.internal.dummy 1\r\ntag @s add gm4_player_motion.launch\r\n\r\nscoreboard players operation @s gm4_player_motion.internal.motion.x += $x gm4_player_motion.api.launch\r\nscoreboard players operation @s gm4_player_motion.internal.motion.y += $y gm4_player_motion.api.launch\r\nscoreboard players operation @s gm4_player_motion.internal.motion.z += $z gm4_player_motion.api.launch"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/launch/exp_pos.mcfunction",
    "content": "#> gm4_player_motion:internal/launch/exp_pos\n$tp 9a347e6c-1ce5-434a-b717-6707d51f4299 ^ ^ ^$(d)\n#   ^ (GM4) changed UUID to prevent potential conflict\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/launch/gamemode/get.mcfunction",
    "content": "#> gm4_player_motion:internal/launch/gamemode/get\r\nexecute if entity @s[gamemode=survival] run return run scoreboard players set $mode gm4_player_motion.internal.gamemode 0\r\nexecute if entity @s[gamemode=creative] run return run scoreboard players set $mode gm4_player_motion.internal.gamemode 1\r\nexecute if entity @s[gamemode=adventure] run return run scoreboard players set $mode gm4_player_motion.internal.gamemode 2\r\nexecute if entity @s[gamemode=spectator] run scoreboard players set $mode gm4_player_motion.internal.gamemode 3\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/launch/gamemode/restore.mcfunction",
    "content": "#> gm4_player_motion:internal/launch/gamemode/restore\r\nexecute if score $mode gm4_player_motion.internal.gamemode matches 0 run return run gamemode survival @s\r\nexecute if score $mode gm4_player_motion.internal.gamemode matches 1 run return run gamemode creative @s\r\nexecute if score $mode gm4_player_motion.internal.gamemode matches 2 run return run gamemode adventure @s\r\nexecute if score $mode gm4_player_motion.internal.gamemode matches 3 run gamemode spectator @s\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/launch/main.mcfunction",
    "content": "#> gm4_player_motion:internal/launch/main\r\n# Launches players in the input direction\r\n\r\nexecute \\\r\n    store result storage gm4_player_motion:math motion[0] double 0.0001 \\\r\n    store result storage gm4_player_motion:math motion_x double 0.0001 run \\\r\n    scoreboard players operation $motion_x gm4_player_motion.internal.math = @s gm4_player_motion.internal.motion.x\r\nexecute \\\r\n    store result storage gm4_player_motion:math motion[1] double 0.0001 \\\r\n    store result storage gm4_player_motion:math motion_y double 0.0001 run \\\r\n    scoreboard players operation $motion_y gm4_player_motion.internal.math = @s gm4_player_motion.internal.motion.y\r\nexecute \\\r\n    store result storage gm4_player_motion:math motion[2] double 0.0001 \\\r\n    store result storage gm4_player_motion:math motion_z double 0.0001 run \\\r\n    scoreboard players operation $motion_z gm4_player_motion.internal.math = @s gm4_player_motion.internal.motion.z\r\n\r\nexecute in minecraft:overworld run function gm4_player_motion:internal/math/main\r\nattribute @s knockback_resistance modifier add gm4_player_motion:disable_knockback_resistance -1 add_multiplied_total\r\nfunction gm4_player_motion:internal/launch/gamemode/get\r\ngamemode creative\r\ntp ~ ~10000 ~\r\nexecute rotated as @s positioned ~ ~10000 ~ run function gm4_player_motion:internal/summon/main with storage gm4_player_motion:math\r\ntp ~ ~ ~\r\nfunction gm4_player_motion:internal/launch/gamemode/restore\r\nattribute @s knockback_resistance modifier remove gm4_player_motion:disable_knockback_resistance\r\n\r\nscoreboard players set $function_called gm4_player_motion.internal.dummy 0\r\ntag @s remove gm4_player_motion.launch\r\n\r\n# Reset scoreboards\r\nscoreboard players reset @s gm4_player_motion.internal.motion.x\r\nscoreboard players reset @s gm4_player_motion.internal.motion.y\r\nscoreboard players reset @s gm4_player_motion.internal.motion.z\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/math/eyelevel.mcfunction",
    "content": "#> gm4_player_motion:internal/math/eyelevel\r\n# eyelevel=y(eyes)-y(player)\r\nexecute anchored eyes positioned ^ ^ ^ if entity @s[distance=...41] run \\\r\n    return run scoreboard players set $eyelevel gm4_player_motion.internal.math 40\r\n\r\nexecute anchored eyes positioned ^ ^ ^ if entity @s[distance=..1.27] run \\\r\n    return run scoreboard players set $eyelevel gm4_player_motion.internal.math 127\r\n\r\nscoreboard players set $eyelevel gm4_player_motion.internal.math 162\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/math/full_power/sine.mcfunction",
    "content": "# > gm4_player_motion:internal/math/full_power/sine\r\n$execute store result score $n_full_exp gm4_player_motion.internal.math run data get storage gm4_player_motion:trig arr[$(angle)]\r\nscoreboard players operation $n_full_exp gm4_player_motion.internal.math *= $motion_y gm4_player_motion.internal.math\r\nexecute store result score $sub_power gm4_player_motion.internal.math run scoreboard players operation $n_full_exp gm4_player_motion.internal.math /= #constant.1000 gm4_player_motion.internal.const\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/math/full_power/tp.mcfunction",
    "content": "# > gm4_player_motion:internal/math/full_power/tp\r\nexecute store result storage gm4_player_motion:math pos[0] double 0.1 run scoreboard players get $motion_x gm4_player_motion.internal.math\r\nexecute store result storage gm4_player_motion:math pos[1] double 0.1 run scoreboard players get $motion_y gm4_player_motion.internal.math\r\nexecute store result storage gm4_player_motion:math pos[2] double 0.1 run scoreboard players get $motion_z gm4_player_motion.internal.math\r\ndata modify entity @s Pos set from storage gm4_player_motion:math pos\r\nexecute at @s facing 0.0 0.0 0.0 run tp @s 0 0 0 0 ~\r\nexecute store result storage gm4_player_motion:math magnitude.angle int 1 run data get entity @s Rotation[1] 100\r\ntp @s 29999998.0 0.0 7133.0\r\n# ^ (GM4) move entity back to GM4 forceloaded chunk\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/math/full_power/trig.mcfunction",
    "content": "# > gm4_player_motion:internal/math/full_power/trig\nexecute as 9a347e6c-1ce5-434a-b717-6707d51f4299 run function gm4_player_motion:internal/math/full_power/tp\n#          ^ (GM4) changed UUID to prevent potential conflict\nfunction gm4_player_motion:internal/math/full_power/sine with storage gm4_player_motion:math magnitude\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/math/looking_to_xyz.mcfunction",
    "content": "#> gm4_player_motion:internal/math/looking_to_xyz\r\n$tp @s ^ ^ ^$(strength)\r\ndata modify storage gm4_player_motion:math motion set from entity @s Pos\r\ntp @s 29999998.0 0.0 7133.0\r\n#     ^ (GM4) changed to move back to GM4 forceloaded chunk coords\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/math/main.mcfunction",
    "content": "#> gm4_player_motion:internal/math/main\r\n\r\n# full_power=sqrt(motion_x²+motion_y²+motion_z²)\r\n    # Save sign of $motion_y\r\n\texecute store success score $negative_sine gm4_player_motion.internal.math \\\r\n\t    if score $motion_y gm4_player_motion.internal.math matches ..-1\r\n\r\n    # Normalize\r\n        execute if score $motion_x gm4_player_motion.internal.math matches ..-1 run \\\r\n            scoreboard players operation $motion_x gm4_player_motion.internal.math *= #constant.-1 gm4_player_motion.internal.const\r\n\r\n        execute if score $motion_y gm4_player_motion.internal.math matches ..-1 run \\\r\n            scoreboard players operation $motion_y gm4_player_motion.internal.math *= #constant.-1 gm4_player_motion.internal.const\r\n\r\n        execute if score $motion_z gm4_player_motion.internal.math matches ..-1 run \\\r\n            scoreboard players operation $motion_z gm4_player_motion.internal.math *= #constant.-1 gm4_player_motion.internal.const\r\n\r\n    # Sets angle before exchange\r\n        scoreboard players set $angle gm4_player_motion.internal.math 0\r\n\r\n        execute if score $motion_y gm4_player_motion.internal.math matches 0 run \\\r\n            scoreboard players set $angle gm4_player_motion.internal.math 1\r\n\r\n    # SuperSwordTW's method. Credit: https://github.com/SuperSwordTW/Distance-Trig-Calc-3d\r\n        execute if score $motion_y gm4_player_motion.internal.math matches 0 run \\\r\n            scoreboard players operation $motion_y gm4_player_motion.internal.math >< $motion_x gm4_player_motion.internal.math\r\n\r\n        execute if score $motion_y gm4_player_motion.internal.math matches 0 run \\\r\n            scoreboard players operation $motion_y gm4_player_motion.internal.math >< $motion_z gm4_player_motion.internal.math\r\n\r\n        function gm4_player_motion:internal/math/full_power/trig\r\n\r\n# n_full_exp=floor(full_power/0.865)\r\n    scoreboard players operation $n_full_exp gm4_player_motion.internal.math /= #constant.fpc gm4_player_motion.internal.const\r\n\r\n# Change back the angle\r\n    execute if score $angle gm4_player_motion.internal.math matches 1 run data modify storage gm4_player_motion:math magnitude.angle set value 0\r\n\r\n# eyelevel=y(eyes)-y(player)\r\n    function gm4_player_motion:internal/math/eyelevel\r\n\r\n# sub power operations\r\n    # sub_power=floor(full_power%0.8)\r\n        scoreboard players operation $sub_power gm4_player_motion.internal.math %= #constant.fpc gm4_player_motion.internal.const\r\n\r\n    # d12=1-sub_power\r\n        scoreboard players set $d12 gm4_player_motion.internal.math 10000\r\n        scoreboard players operation $d12 gm4_player_motion.internal.math -= $sub_power gm4_player_motion.internal.math\r\n\r\n    # Formula d=-(eyelevel*sinα + d12*12 * cos(arcsin(cosα*eyelevel/(d12*12))))\r\n\r\n    # d12 = d12*12\r\n    scoreboard players operation $d12 gm4_player_motion.internal.math *= #constant.12 gm4_player_motion.internal.const\r\n\r\n    # Obtain sinα and cosα\r\n    function gm4_player_motion:internal/math/trig/sine with storage gm4_player_motion:math magnitude\r\n\r\n    # cosα *= eyelevel, record cosα for later use\r\n    scoreboard players operation $cosine gm4_player_motion.internal.math *= $eyelevel gm4_player_motion.internal.math\r\n        scoreboard players operation $cosine1 gm4_player_motion.internal.math = $cosine gm4_player_motion.internal.math\r\n    \r\n    # cosα /= d12 = cosα*eyelevel / (d12*12)\r\n    scoreboard players operation $cosine gm4_player_motion.internal.math *= #constant.10 gm4_player_motion.internal.const\r\n\r\n    scoreboard players operation $cosine gm4_player_motion.internal.math /= $d12 gm4_player_motion.internal.math\r\n\r\n    # obtain cos(arcsin(cosα*eyelevel/(d12*12))))\r\n    execute store result storage gm4_player_motion:math magnitude.quotient int 1 run scoreboard players get $cosine gm4_player_motion.internal.math\r\n\r\n    function gm4_player_motion:internal/math/trig/arcsine with storage gm4_player_motion:math magnitude\r\n\r\n    # cos(arcsin(cosα*eyelevel/(d12)))) *= d12\r\n    scoreboard players operation $d gm4_player_motion.internal.math *= $d12 gm4_player_motion.internal.math\r\n\r\n    scoreboard players operation $d gm4_player_motion.internal.math /= #constant.1000 gm4_player_motion.internal.const\r\n\r\n    # sinα *= eyelevel, record sine for later use\r\n    scoreboard players operation $sine gm4_player_motion.internal.math *= $eyelevel gm4_player_motion.internal.math\r\n\r\n    scoreboard players operation $sine gm4_player_motion.internal.math /= #constant.10 gm4_player_motion.internal.const\r\n\r\n        scoreboard players operation $sine1 gm4_player_motion.internal.math = $sine gm4_player_motion.internal.math\r\n\r\n    # d += sine\r\n    execute store result storage gm4_player_motion:math d double -0.0001 run \\\r\n    scoreboard players operation $d gm4_player_motion.internal.math += $sine gm4_player_motion.internal.math\r\n\r\n\r\n# full power operations\r\n    # d12=1-fpc(0.8) = 0.2\r\n        scoreboard players set $d12 gm4_player_motion.internal.math 2000\r\n\r\n    #full_d = -(eyelevel*sinα + (d12*12)*cos(arcsin(cosα*eyelevel/(d12*12))))\r\n\r\n    # d12 = d12*12\r\n    scoreboard players operation $d12 gm4_player_motion.internal.math *= #constant.12 gm4_player_motion.internal.const\r\n\r\n    # cosine1 = cosα*eyelevel, cosine1 /= d12\r\n    scoreboard players operation $cosine1 gm4_player_motion.internal.math *= #constant.10 gm4_player_motion.internal.const\r\n\r\n    scoreboard players operation $cosine1 gm4_player_motion.internal.math /= $d12 gm4_player_motion.internal.math\r\n\r\n    # Obtain cos(arcsin(cosine1))\r\n    execute store result storage gm4_player_motion:math magnitude.quotient int 1 run scoreboard players get $cosine1 gm4_player_motion.internal.math\r\n\r\n    function gm4_player_motion:internal/math/trig/arcsine with storage gm4_player_motion:math magnitude\r\n\r\n    # cos(arcsin(cosα*eyelevel/(d12)))) *= d12\r\n    scoreboard players operation $d gm4_player_motion.internal.math *= $d12 gm4_player_motion.internal.math\r\n    scoreboard players operation $d gm4_player_motion.internal.math /= #constant.1000 gm4_player_motion.internal.const\r\n\r\n    # d += sine1\r\n    execute store result storage gm4_player_motion:math full_d double -0.0001 run \\\r\n    scoreboard players operation $d gm4_player_motion.internal.math += $sine1 gm4_player_motion.internal.math\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/math/trig/arcsine.mcfunction",
    "content": "$execute store result score $d gm4_player_motion.internal.math run data get storage gm4_player_motion:arcsine arr[$(quotient)]"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/math/trig/sine.mcfunction",
    "content": "$execute store result score $sine gm4_player_motion.internal.math run data get storage gm4_player_motion:sine arr[$(angle)]\r\nexecute if score $negative_sine gm4_player_motion.internal.math matches 1 run scoreboard players operation $sine gm4_player_motion.internal.math *= #constant.-1 gm4_player_motion.internal.const\r\n$execute store result score $cosine gm4_player_motion.internal.math run data get storage gm4_player_motion:cosine arr[$(angle)]"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/summon/crystal.mcfunction",
    "content": "#> gm4_player_motion:internal/summon/crystal\r\n$execute if score $n_full_exp gm4_player_motion.internal.math matches 1.. anchored eyes positioned ^ ^ ^$(full_d) run function gm4_player_motion:internal/summon/loop\r\n$execute anchored eyes positioned ^ ^ ^$(d) summon end_crystal run damage @s 0\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/summon/loop.mcfunction",
    "content": "#> gm4_player_motion:internal/summon/loop\r\nscoreboard players remove $n_full_exp gm4_player_motion.internal.math 1\r\nexecute summon end_crystal run damage @s 0\r\nexecute if score $n_full_exp gm4_player_motion.internal.math matches 1.. run function gm4_player_motion:internal/summon/loop\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/summon/main.mcfunction",
    "content": "#> gm4_player_motion:internal/summon/main\r\n$execute facing ~$(motion_x) ~$(motion_y) ~$(motion_z) run function gm4_player_motion:internal/summon/crystal with storage gm4_player_motion:math\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/technical/tick.mcfunction",
    "content": "#> gm4_player_motion:internal/technical/tick\r\n# TICK FUNCTION\r\nschedule function gm4_player_motion:internal/technical/tick 1t append\r\n\r\n# LAUNCH PLAYERS\r\nexecute if score $function_called gm4_player_motion.internal.dummy matches 1 as @a[tag=gm4_player_motion.launch] at @s run function gm4_player_motion:internal/launch/main\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/internal/technical/trig.mcfunction",
    "content": "    data modify storage gm4_player_motion:trig arr set value [10000000,5729580,2864790,1909860,1432390,1145920,954929,818511,716197,636620,572958,520871,477465,440737,409255,381972,358099,337034,318310,301557,286479,272837,260436,249112,238733,229183,220369,212207,204628,197572,190986,184825,179050,173624,168517,163703,159155,154854,150779,146913,143240,139746,136419,133247,130218,127325,124557,121907,119367,116931,114593,112346,110185,108106,106104,104175,102315,100520,98787,97113,95494,93929,92414,90947,89526,88149,86813,85518,84260,83039,81853,80700,79579,78489,77428,76396,75391,74412,73458,72528,71622,70737,69875,69033,68211,67409,66625,65859,65111,64379,63664,62965,62280,61611,60955,60314,59685,59070,58467,57877,57298,56731,56175,55629,55095,54570,54055,53550,53054,52568,52090,51621,51160,50707,50262,49825,49396,48974,48559,48151,47749,47355,46967,46585,46209,45840,45476,45118,44766,44419,44077,43741,43409,43083,42761,42445,42133,41825,41522,41224,40929,40639,40353,40071,39792,39518,39247,38980,38717,38457,38201,37948,37699,37452,37209,36969,36732,36498,36267,36039,35814,35592,35372,35155,34941,34729,34520,34313,34109,33907,33708,33511,33316,33123,32933,32745,32559,32375,32193,32014,31836,31660,31486,31314,31144,30976,30809,30644,30481,30320,30161,30003,29847,29692,29539,29388,29238,29089,28943,28797,28653,28511,28370,28230,28092,27955,27819,27685,27552,27420,27289,27160,27032,26905,26779,26655,26532,26409,26288,26168,26049,25932,25815,25699,25584,25471,25358,25247,25136,25026,24917,24810,24703,24597,24492,24388,24284,24182,24080,23980,23880,23781,23682,23585,23488,23393,23298,23203,23110,23017,22925,22834,22743,22653,22564,22476,22388,22301,22215,22129,22044,21959,21876,21793,21710,21628,21547,21466,21386,21307,21228,21150,21072,20995,20918,20842,20767,20692,20618,20544,20470,20398,20325,20254,20182,20112,20041,19972,19902,19833,19765,19697,19630,19563,19496,19430,19365,19300,19235,19171,19107,19043,18980,18918,18856,18794,18733,18672,18611,18551,18491,18432,18373,18314,18256,18198,18140,18083,18026,17970,17914,17858,17803,17748,17693,17638,17584,17531,17477,17424,17371,17319,17267,17215,17164,17112,17062,17011,16961,16911,16861,16812,16763,16714,16665,16617,16569,16521,16474,16427,16380,16333,16287,16241,16195,16149,16104,16059,16014,15970,15925,15881,15838,15794,15751,15708,15665,15622,15580,15538,15496,15454,15412,15371,15330,15289,15249,15208,15168,15128,15088,15049,15010,14970,14931,14893,14854,14816,14778,14740,14702,14665,14627,14590,14553,14516,14480,14443,14407,14371,14335,14299,14264,14229,14193,14158,14124,14089,14054,14020,13986,13952,13918,13885,13851,13818,13785,13752,13719,13686,13654,13621,13589,13557,13525,13493,13462,13430,13399,13368,13337,13306,13275,13244,13214,13184,13153,13123,13093,13064,13034,13005,12975,12946,12917,12888,12859,12830,12802,12773,12745,12717,12689,12661,12633,12605,12578,12550,12523,12496,12468,12442,12415,12388,12361,12335,12308,12282,12256,12230,12204,12178,12152,12127,12101,12076,12050,12025,12000,11975,11950,11925,11901,11876,11852,11827,11803,11779,11755,11731,11707,11683,11659,11636,11612,11589,11566,11542,11519,11496,11473,11450,11428,11405,11382,11360,11338,11315,11293,11271,11249,11227,11205,11183,11162,11140,11118,11097,11076,11054,11033,11012,10991,10970,10949,10928,10908,10887,10866,10846,10825,10805,10785,10765,10745,10725,10705,10685,10665,10645,10626,10606,10586,10567,10548,10528,10509,10490,10471,10452,10433,10414,10395,10377,10358,10339,10321,10302,10284,10265,10247,10229,10211,10193,10175,10157,10139,10121,10103,10086,10068,10050,10033,10015,9998,9981,9963,9946,9929,9912,9895,9878,9861,9844,9827,9811,9794,9777,9761,9744,9728,9711,9695,9679,9663,9646,9630,9614,9598,9582,9566,9550,9535,9519,9503,9487,9472,9456,9441,9425,9410,9395,9379,9364,9349,9334,9319,9304,9289,9274,9259,9244,9229,9214,9200,9185,9170,9156,9141,9127,9112,9098,9084,9069,9055,9041,9027,9013,8999,8985,8971,8957,8943,8929,8915,8901,8888,8874,8860,8847,8833,8820,8806,8793,8779,8766,8753,8739,8726,8713,8700,8687,8674,8661,8648,8635,8622,8609,8596,8583,8571,8558,8545,8533,8520,8507,8495,8482,8470,8458,8445,8433,8421,8408,8396,8384,8372,8360,8347,8335,8323,8311,8299,8287,8276,8264,8252,8240,8228,8217,8205,8193,8182,8170,8159,8147,8136,8124,8113,8101,8090,8079,8067,8056,8045,8034,8023,8011,8000,7989,7978,7967,7956,7945,7934,7923,7913,7902,7891,7880,7870,7859,7848,7837,7827,7816,7806,7795,7785,7774,7764,7753,7743,7733,7722,7712,7702,7691,7681,7671,7661,7651,7641,7630,7620,7610,7600,7590,7580,7570,7561,7551,7541,7531,7521,7511,7502,7492,7482,7473,7463,7453,7444,7434,7425,7415,7406,7396,7387,7377,7368,7358,7349,7340,7330,7321,7312,7303,7294,7284,7275,7266,7257,7248,7239,7230,7221,7212,7203,7194,7185,7176,7167,7158,7149,7140,7132,7123,7114,7105,7097,7088,7079,7071,7062,7053,7045,7036,7028,7019,7011,7002,6994,6985,6977,6968,6960,6952,6943,6935,6927,6919,6910,6902,6894,6886,6877,6869,6861,6853,6845,6837,6829,6821,6813,6805,6797,6789,6781,6773,6765,6757,6749,6741,6734,6726,6718,6710,6702,6695,6687,6679,6671,6664,6656,6649,6641,6633,6626,6618,6611,6603,6596,6588,6581,6573,6566,6558,6551,6543,6536,6529,6521,6514,6507,6499,6492,6485,6478,6470,6463,6456,6449,6442,6435,6427,6420,6413,6406,6399,6392,6385,6378,6371,6364,6357,6350,6343,6336,6329,6322,6315,6309,6302,6295,6288,6281,6274,6268,6261,6254,6247,6241,6234,6227,6221,6214,6207,6201,6194,6187,6181,6174,6168,6161,6155,6148,6142,6135,6129,6122,6116,6109,6103,6097,6090,6084,6077,6071,6065,6058,6052,6046,6039,6033,6027,6021,6014,6008,6002,5996,5990,5983,5977,5971,5965,5959,5953,5947,5941,5935,5929,5922,5916,5910,5904,5898,5892,5887,5881,5875,5869,5863,5857,5851,5845,5839,5833,5828,5822,5816,5810,5804,5798,5793,5787,5781,5775,5770,5764,5758,5753,5747,5741,5736,5730,5724,5719,5713,5707,5702,5696,5691,5685,5680,5674,5669,5663,5657,5652,5647,5641,5636,5630,5625,5619,5614,5608,5603,5598,5592,5587,5582,5576,5571,5566,5560,5555,5550,5544,5539,5534,5529,5523,5518,5513,5508,5502,5497,5492,5487,5482,5477,5471,5466,5461,5456,5451,5446,5441,5436,5431,5426,5421,5416,5410,5405,5400,5395,5390,5385,5381,5376,5371,5366,5361,5356,5351,5346,5341,5336,5331,5326,5322,5317,5312,5307,5302,5297,5293,5288,5283,5278,5273,5269,5264,5259,5254,5250,5245,5240,5236,5231,5226,5222,5217,5212,5208,5203,5198,5194,5189,5184,5180,5175,5171,5166,5162,5157,5152,5148,5143,5139,5134,5130,5125,5121,5116,5112,5107,5103,5098,5094,5090,5085,5081,5076,5072,5068,5063,5059,5054,5050,5046,5041,5037,5033,5028,5024,5020,5015,5011,5007,5002,4998,4994,4990,4985,4981,4977,4973,4968,4964,4960,4956,4952,4947,4943,4939,4935,4931,4927,4922,4918,4914,4910,4906,4902,4898,4894,4890,4885,4881,4877,4873,4869,4865,4861,4857,4853,4849,4845,4841,4837,4833,4829,4825,4821,4817,4813,4809,4805,4801,4797,4793,4790,4786,4782,4778,4774,4770,4766,4762,4758,4755,4751,4747,4743,4739,4735,4732,4728,4724,4720,4716,4713,4709,4705,4701,4697,4694,4690,4686,4682,4679,4675,4671,4668,4664,4660,4656,4653,4649,4645,4642,4638,4634,4631,4627,4623,4620,4616,4612,4609,4605,4602,4598,4594,4591,4587,4584,4580,4576,4573,4569,4566,4562,4559,4555,4552,4548,4545,4541,4538,4534,4531,4527,4524,4520,4517,4513,4510,4506,4503,4499,4496,4492,4489,4486,4482,4479,4475,4472,4469,4465,4462,4458,4455,4452,4448,4445,4442,4438,4435,4432,4428,4425,4422,4418,4415,4412,4408,4405,4402,4398,4395,4392,4389,4385,4382,4379,4375,4372,4369,4366,4362,4359,4356,4353,4350,4346,4343,4340,4337,4334,4330,4327,4324,4321,4318,4315,4311,4308,4305,4302,4299,4296,4293,4289,4286,4283,4280,4277,4274,4271,4268,4265,4261,4258,4255,4252,4249,4246,4243,4240,4237,4234,4231,4228,4225,4222,4219,4216,4213,4210,4207,4204,4201,4198,4195,4192,4189,4186,4183,4180,4177,4174,4171,4168,4165,4162,4159,4156,4153,4151,4148,4145,4142,4139,4136,4133,4130,4127,4124,4122,4119,4116,4113,4110,4107,4104,4101,4099,4096,4093,4090,4087,4084,4082,4079,4076,4073,4070,4068,4065,4062,4059,4056,4054,4051,4048,4045,4043,4040,4037,4034,4032,4029,4026,4023,4021,4018,4015,4012,4010,4007,4004,4002,3999,3996,3993,3991,3988,3985,3983,3980,3977,3975,3972,3969,3967,3964,3961,3959,3956,3953,3951,3948,3946,3943,3940,3938,3935,3932,3930,3927,3925,3922,3919,3917,3914,3912,3909,3906,3904,3901,3899,3896,3894,3891,3889,3886,3883,3881,3878,3876,3873,3871,3868,3866,3863,3861,3858,3856,3853,3851,3848,3846,3843,3841,3838,3836,3833,3831,3828,3826,3823,3821,3818,3816,3814,3811,3809,3806,3804,3801,3799,3796,3794,3792,3789,3787,3784,3782,3780,3777,3775,3772,3770,3768,3765,3763,3760,3758,3756,3753,3751,3749,3746,3744,3741,3739,3737,3734,3732,3730,3727,3725,3723,3720,3718,3716,3713,3711,3709,3706,3704,3702,3700,3697,3695,3693,3690,3688,3686,3684,3681,3679,3677,3674,3672,3670,3668,3665,3663,3661,3659,3656,3654,3652,3650,3647,3645,3643,3641,3639,3636,3634,3632,3630,3627,3625,3623,3621,3619,3616,3614,3612,3610,3608,3606,3603,3601,3599,3597,3595,3592,3590,3588,3586,3584,3582,3580,3577,3575,3573,3571,3569,3567,3565,3562,3560,3558,3556,3554,3552,3550,3548,3546,3543,3541,3539,3537,3535,3533,3531,3529,3527,3525,3523,3520,3518,3516,3514,3512,3510,3508,3506,3504,3502,3500,3498,3496,3494,3492,3490,3488,3486,3484,3481,3479,3477,3475,3473,3471,3469,3467,3465,3463,3461,3459,3457,3455,3453,3451,3449,3447,3445,3443,3441,3439,3437,3435,3434,3432,3430,3428,3426,3424,3422,3420,3418,3416,3414,3412,3410,3408,3406,3404,3402,3400,3398,3397,3395,3393,3391,3389,3387,3385,3383,3381,3379,3377,3376,3374,3372,3370,3368,3366,3364,3362,3360,3358,3357,3355,3353,3351,3349,3347,3345,3344,3342,3340,3338,3336,3334,3332,3331,3329,3327,3325,3323,3321,3319,3318,3316,3314,3312,3310,3309,3307,3305,3303,3301,3299,3298,3296,3294,3292,3290,3289,3287,3285,3283,3281,3280,3278,3276,3274,3273,3271,3269,3267,3265,3264,3262,3260,3258,3257,3255,3253,3251,3250,3248,3246,3244,3243,3241,3239,3237,3236,3234,3232,3230,3229,3227,3225,3223,3222,3220,3218,3217,3215,3213,3211,3210,3208,3206,3205,3203,3201,3199,3198,3196,3194,3193,3191,3189,3188,3186,3184,3183,3181,3179,3178,3176,3174,3173,3171,3169,3168,3166,3164,3163,3161,3159,3158,3156,3154,3153,3151,3149,3148,3146,3144,3143,3141,3140,3138,3136,3135,3133,3131,3130,3128,3127,3125,3123,3122,3120,3119,3117,3115,3114,3112,3111,3109,3107,3106,3104,3103,3101,3099,3098,3096,3095,3093,3091,3090,3088,3087,3085,3084,3082,3080,3079,3077,3076,3074,3073,3071,3069,3068,3066,3065,3063,3062,3060,3059,3057,3056,3054,3052,3051,3049,3048,3046,3045,3043,3042,3040,3039,3037,3036,3034,3033,3031,3030,3028,3027,3025,3024,3022,3021,3019,3018,3016,3015,3013,3012,3010,3009,3007,3006,3004,3003,3001,3000,2998,2997,2995,2994,2992,2991,2989,2988,2986,2985,2983,2982,2981,2979,2978,2976,2975,2973,2972,2970,2969,2967,2966,2965,2963,2962,2960,2959,2957,2956,2955,2953,2952,2950,2949,2947,2946,2944,2943,2942,2940,2939,2937,2936,2935,2933,2932,2930,2929,2928,2926,2925,2923,2922,2921,2919,2918,2916,2915,2914,2912,2911,2909,2908,2907,2905,2904,2902,2901,2900,2898,2897,2896,2894,2893,2891,2890,2889,2887,2886,2885,2883,2882,2881,2879,2878,2876,2875,2874,2872,2871,2870,2868,2867,2866,2864,2863,2862,2860,2859,2858,2856,2855,2854,2852,2851,2850,2848,2847,2846,2844,2843,2842,2840,2839,2838,2836,2835,2834,2832,2831,2830,2829,2827,2826,2825,2823,2822,2821,2819,2818,2817,2816,2814,2813,2812,2810,2809,2808,2807,2805,2804,2803,2801,2800,2799,2798,2796,2795,2794,2792,2791,2790,2789,2787,2786,2785,2784,2782,2781,2780,2779,2777,2776,2775,2774,2772,2771,2770,2769,2767,2766,2765,2764,2762,2761,2760,2759,2757,2756,2755,2754,2752,2751,2750,2749,2747,2746,2745,2744,2743,2741,2740,2739,2738,2736,2735,2734,2733,2732,2730,2729,2728,2727,2726,2724,2723,2722,2721,2720,2718,2717,2716,2715,2714,2712,2711,2710,2709,2708,2706,2705,2704,2703,2702,2701,2699,2698,2697,2696,2695,2693,2692,2691,2690,2689,2688,2686,2685,2684,2683,2682,2681,2679,2678,2677,2676,2675,2674,2672,2671,2670,2669,2668,2667,2666,2664,2663,2662,2661,2660,2659,2657,2656,2655,2654,2653,2652,2651,2650,2648,2647,2646,2645,2644,2643,2642,2640,2639,2638,2637,2636,2635,2634,2633,2631,2630,2629,2628,2627,2626,2625,2624,2623,2621,2620,2619,2618,2617,2616,2615,2614,2613,2612,2610,2609,2608,2607,2606,2605,2604,2603,2602,2601,2599,2598,2597,2596,2595,2594,2593,2592,2591,2590,2589,2588,2586,2585,2584,2583,2582,2581,2580,2579,2578,2577,2576,2575,2574,2573,2572,2570,2569,2568,2567,2566,2565,2564,2563,2562,2561,2560,2559,2558,2557,2556,2555,2554,2553,2551,2550,2549,2548,2547,2546,2545,2544,2543,2542,2541,2540,2539,2538,2537,2536,2535,2534,2533,2532,2531,2530,2529,2528,2527,2526,2525,2524,2523,2522,2521,2519,2518,2517,2516,2515,2514,2513,2512,2511,2510,2509,2508,2507,2506,2505,2504,2503,2502,2501,2500,2499,2498,2497,2496,2495,2494,2493,2492,2491,2490,2489,2488,2487,2486,2485,2484,2483,2482,2481,2480,2479,2479,2478,2477,2476,2475,2474,2473,2472,2471,2470,2469,2468,2467,2466,2465,2464,2463,2462,2461,2460,2459,2458,2457,2456,2455,2454,2453,2452,2451,2450,2449,2448,2448,2447,2446,2445,2444,2443,2442,2441,2440,2439,2438,2437,2436,2435,2434,2433,2432,2431,2430,2430,2429,2428,2427,2426,2425,2424,2423,2422,2421,2420,2419,2418,2417,2416,2416,2415,2414,2413,2412,2411,2410,2409,2408,2407,2406,2405,2404,2404,2403,2402,2401,2400,2399,2398,2397,2396,2395,2394,2394,2393,2392,2391,2390,2389,2388,2387,2386,2385,2384,2384,2383,2382,2381,2380,2379,2378,2377,2376,2375,2375,2374,2373,2372,2371,2370,2369,2368,2367,2367,2366,2365,2364,2363,2362,2361,2360,2360,2359,2358,2357,2356,2355,2354,2353,2352,2352,2351,2350,2349,2348,2347,2346,2346,2345,2344,2343,2342,2341,2340,2339,2339,2338,2337,2336,2335,2334,2333,2333,2332,2331,2330,2329,2328,2327,2327,2326,2325,2324,2323,2322,2321,2321,2320,2319,2318,2317,2316,2316,2315,2314,2313,2312,2311,2310,2310,2309,2308,2307,2306,2305,2305,2304,2303,2302,2301,2300,2300,2299,2298,2297,2296,2295,2295,2294,2293,2292,2291,2291,2290,2289,2288,2287,2286,2286,2285,2284,2283,2282,2281,2281,2280,2279,2278,2277,2277,2276,2275,2274,2273,2273,2272,2271,2270,2269,2269,2268,2267,2266,2265,2264,2264,2263,2262,2261,2260,2260,2259,2258,2257,2256,2256,2255,2254,2253,2252,2252,2251,2250,2249,2249,2248,2247,2246,2245,2245,2244,2243,2242,2241,2241,2240,2239,2238,2238,2237,2236,2235,2234,2234,2233,2232,2231,2231,2230,2229,2228,2227,2227,2226,2225,2224,2224,2223,2222,2221,2220,2220,2219,2218,2217,2217,2216,2215,2214,2214,2213,2212,2211,2211,2210,2209,2208,2207,2207,2206,2205,2204,2204,2203,2202,2201,2201,2200,2199,2198,2198,2197,2196,2195,2195,2194,2193,2192,2192,2191,2190,2189,2189,2188,2187,2186,2186,2185,2184,2184,2183,2182,2181,2181,2180,2179,2178,2178,2177,2176,2175,2175,2174,2173,2172,2172,2171,2170,2170,2169,2168,2167,2167,2166,2165,2164,2164,2163,2162,2162,2161,2160,2159,2159,2158,2157,2157,2156,2155,2154,2154,2153,2152,2151,2151,2150,2149,2149,2148,2147,2146,2146,2145,2144,2144,2143,2142,2142,2141,2140,2139,2139,2138,2137,2137,2136,2135,2134,2134,2133,2132,2132,2131,2130,2130,2129,2128,2127,2127,2126,2125,2125,2124,2123,2123,2122,2121,2121,2120,2119,2118,2118,2117,2116,2116,2115,2114,2114,2113,2112,2112,2111,2110,2109,2109,2108,2107,2107,2106,2105,2105,2104,2103,2103,2102,2101,2101,2100,2099,2099,2098,2097,2097,2096,2095,2095,2094,2093,2093,2092,2091,2091,2090,2089,2089,2088,2087,2087,2086,2085,2085,2084,2083,2083,2082,2081,2081,2080,2079,2079,2078,2077,2077,2076,2075,2075,2074,2073,2073,2072,2071,2071,2070,2069,2069,2068,2067,2067,2066,2065,2065,2064,2063,2063,2062,2062,2061,2060,2060,2059,2058,2058,2057,2056,2056,2055,2054,2054,2053,2052,2052,2051,2051,2050,2049,2049,2048,2047,2047,2046,2045,2045,2044,2044,2043,2042,2042,2041,2040,2040,2039,2038,2038,2037,2037,2036,2035,2035,2034,2033,2033,2032,2032,2031,2030,2030,2029,2028,2028,2027,2027,2026,2025,2025,2024,2023,2023,2022,2022,2021,2020,2020,2019,2018,2018,2017,2017,2016,2015,2015,2014,2014,2013,2012,2012,2011,2010,2010,2009,2009,2008,2007,2007,2006,2006,2005,2004,2004,2003,2003,2002,2001,2001,2000,2000,1999,1998,1998,1997,1996,1996,1995,1995,1994,1993,1993,1992,1992,1991,1990,1990,1989,1989,1988,1987,1987,1986,1986,1985,1985,1984,1983,1983,1982,1982,1981,1980,1980,1979,1979,1978,1977,1977,1976,1976,1975,1974,1974,1973,1973,1972,1972,1971,1970,1970,1969,1969,1968,1967,1967,1966,1966,1965,1965,1964,1963,1963,1962,1962,1961,1961,1960,1959,1959,1958,1958,1957,1956,1956,1955,1955,1954,1954,1953,1952,1952,1951,1951,1950,1950,1949,1948,1948,1947,1947,1946,1946,1945,1944,1944,1943,1943,1942,1942,1941,1941,1940,1939,1939,1938,1938,1937,1937,1936,1935,1935,1934,1934,1933,1933,1932,1932,1931,1930,1930,1929,1929,1928,1928,1927,1927,1926,1925,1925,1924,1924,1923,1923,1922,1922,1921,1920,1920,1919,1919,1918,1918,1917,1917,1916,1916,1915,1914,1914,1913,1913,1912,1912,1911,1911,1910,1910,1909,1908,1908,1907,1907,1906,1906,1905,1905,1904,1904,1903,1903,1902,1901,1901,1900,1900,1899,1899,1898,1898,1897,1897,1896,1896,1895,1895,1894,1893,1893,1892,1892,1891,1891,1890,1890,1889,1889,1888,1888,1887,1887,1886,1886,1885,1884,1884,1883,1883,1882,1882,1881,1881,1880,1880,1879,1879,1878,1878,1877,1877,1876,1876,1875,1875,1874,1874,1873,1872,1872,1871,1871,1870,1870,1869,1869,1868,1868,1867,1867,1866,1866,1865,1865,1864,1864,1863,1863,1862,1862,1861,1861,1860,1860,1859,1859,1858,1858,1857,1857,1856,1856,1855,1855,1854,1854,1853,1853,1852,1852,1851,1851,1850,1850,1849,1849,1848,1848,1847,1847,1846,1846,1845,1845,1844,1844,1843,1843,1842,1842,1841,1841,1840,1840,1839,1839,1838,1838,1837,1837,1836,1836,1835,1835,1834,1834,1833,1833,1832,1832,1831,1831,1830,1830,1829,1829,1828,1828,1827,1827,1826,1826,1825,1825,1824,1824,1823,1823,1822,1822,1821,1821,1820,1820,1819,1819,1819,1818,1818,1817,1817,1816,1816,1815,1815,1814,1814,1813,1813,1812,1812,1811,1811,1810,1810,1809,1809,1808,1808,1807,1807,1807,1806,1806,1805,1805,1804,1804,1803,1803,1802,1802,1801,1801,1800,1800,1799,1799,1799,1798,1798,1797,1797,1796,1796,1795,1795,1794,1794,1793,1793,1792,1792,1792,1791,1791,1790,1790,1789,1789,1788,1788,1787,1787,1786,1786,1785,1785,1785,1784,1784,1783,1783,1782,1782,1781,1781,1780,1780,1780,1779,1779,1778,1778,1777,1777,1776,1776,1775,1775,1774,1774,1774,1773,1773,1772,1772,1771,1771,1770,1770,1770,1769,1769,1768,1768,1767,1767,1766,1766,1765,1765,1765,1764,1764,1763,1763,1762,1762,1761,1761,1761,1760,1760,1759,1759,1758,1758,1757,1757,1757,1756,1756,1755,1755,1754,1754,1753,1753,1753,1752,1752,1751,1751,1750,1750,1749,1749,1749,1748,1748,1747,1747,1746,1746,1746,1745,1745,1744,1744,1743,1743,1743,1742,1742,1741,1741,1740,1740,1739,1739,1739,1738,1738,1737,1737,1736,1736,1736,1735,1735,1734,1734,1733,1733,1733,1732,1732,1731,1731,1730,1730,1730,1729,1729,1728,1728,1727,1727,1727,1726,1726,1725,1725,1725,1724,1724,1723,1723,1722,1722,1722,1721,1721,1720,1720,1719,1719,1719,1718,1718,1717,1717,1717,1716,1716,1715,1715,1714,1714,1714,1713,1713,1712,1712,1712,1711,1711,1710,1710,1709,1709,1709,1708,1708,1707,1707,1707,1706,1706,1705,1705,1704,1704,1704,1703,1703,1702,1702,1702,1701,1701,1700,1700,1700,1699,1699,1698,1698,1698,1697,1697,1696,1696,1696,1695,1695,1694,1694,1693,1693,1693,1692,1692,1691,1691,1691,1690,1690,1689,1689,1689,1688,1688,1687,1687,1687,1686,1686,1685,1685,1685,1684,1684,1683,1683,1683,1682,1682,1681,1681,1681,1680,1680,1679,1679,1679,1678,1678,1678,1677,1677,1676,1676,1676,1675,1675,1674,1674,1674,1673,1673,1672,1672,1672,1671,1671,1670,1670,1670,1669,1669,1668,1668,1668,1667,1667,1667,1666,1666,1665,1665,1665,1664,1664,1663,1663,1663,1662,1662,1662,1661,1661,1660,1660,1660,1659,1659,1658,1658,1658,1657,1657,1657,1656,1656,1655,1655,1655,1654,1654,1653,1653,1653,1652,1652,1652,1651,1651,1650,1650,1650,1649,1649,1649,1648,1648,1647,1647,1647,1646,1646,1646,1645,1645,1644,1644,1644,1643,1643,1643,1642,1642,1641,1641,1641,1640,1640,1640,1639,1639,1638,1638,1638,1637,1637,1637,1636,1636,1635,1635,1635,1634,1634,1634,1633,1633,1633,1632,1632,1631,1631,1631,1630,1630,1630,1629,1629,1629,1628,1628,1627,1627,1627,1626,1626,1626,1625,1625,1624,1624,1624,1623,1623,1623,1622,1622,1622,1621,1621,1621,1620,1620,1619,1619,1619,1618,1618,1618,1617,1617,1617,1616,1616,1615,1615,1615,1614,1614,1614,1613,1613,1613,1612,1612,1612,1611,1611,1610,1610,1610,1609,1609,1609,1608,1608,1608,1607,1607,1607,1606,1606,1606,1605,1605,1604,1604,1604,1603,1603,1603,1602,1602,1602,1601,1601,1601,1600,1600,1600,1599,1599,1599,1598,1598,1597,1597,1597,1596,1596,1596,1595,1595,1595,1594,1594,1594,1593,1593,1593,1592,1592,1592,1591,1591,1591,1590,1590,1590,1589,1589,1589,1588,1588,1587,1587,1587,1586,1586,1586,1585,1585,1585,1584,1584,1584,1583,1583,1583,1582,1582,1582,1581,1581,1581,1580,1580,1580,1579,1579,1579,1578,1578,1578,1577,1577,1577,1576,1576,1576,1575,1575,1575,1574,1574,1574,1573,1573,1573,1572,1572,1572,1571,1571,1571,1570,1570,1570,1569,1569,1569,1568,1568,1568,1567,1567,1567,1566,1566,1566,1565,1565,1565,1564,1564,1564,1563,1563,1563,1562,1562,1562,1561,1561,1561,1560,1560,1560,1559,1559,1559,1558,1558,1558,1557,1557,1557,1557,1556,1556,1556,1555,1555,1555,1554,1554,1554,1553,1553,1553,1552,1552,1552,1551,1551,1551,1550,1550,1550,1549,1549,1549,1548,1548,1548,1548,1547,1547,1547,1546,1546,1546,1545,1545,1545,1544,1544,1544,1543,1543,1543,1542,1542,1542,1541,1541,1541,1541,1540,1540,1540,1539,1539,1539,1538,1538,1538,1537,1537,1537,1536,1536,1536,1536,1535,1535,1535,1534,1534,1534,1533,1533,1533,1532,1532,1532,1531,1531,1531,1531,1530,1530,1530,1529,1529,1529,1528,1528,1528,1527,1527,1527,1527,1526,1526,1526,1525,1525,1525,1524,1524,1524,1523,1523,1523,1523,1522,1522,1522,1521,1521,1521,1520,1520,1520,1519,1519,1519,1519,1518,1518,1518,1517,1517,1517,1516,1516,1516,1516,1515,1515,1515,1514,1514,1514,1513,1513,1513,1513,1512,1512,1512,1511,1511,1511,1510,1510,1510,1510,1509,1509,1509,1508,1508,1508,1507,1507,1507,1507,1506,1506,1506,1505,1505,1505,1505,1504,1504,1504,1503,1503,1503,1502,1502,1502,1502,1501,1501,1501,1500,1500,1500,1500,1499,1499,1499,1498,1498,1498,1497,1497,1497,1497,1496,1496,1496,1495,1495,1495,1495,1494,1494,1494,1493,1493,1493,1493,1492,1492,1492,1491,1491,1491,1491,1490,1490,1490,1489,1489,1489,1489,1488,1488,1488,1487,1487,1487,1486,1486,1486,1486,1485,1485,1485,1485,1484,1484,1484,1483,1483,1483,1483,1482,1482,1482,1481,1481,1481,1481,1480,1480,1480,1479,1479,1479,1479,1478,1478,1478,1477,1477,1477,1477,1476,1476,1476,1475,1475,1475,1475,1474,1474,1474,1474,1473,1473,1473,1472,1472,1472,1472,1471,1471,1471,1470,1470,1470,1470,1469,1469,1469,1469,1468,1468,1468,1467,1467,1467,1467,1466,1466,1466,1466,1465,1465,1465,1464,1464,1464,1464,1463,1463,1463,1462,1462,1462,1462,1461,1461,1461,1461,1460,1460,1460,1460,1459,1459,1459,1458,1458,1458,1458,1457,1457,1457,1457,1456,1456,1456,1455,1455,1455,1455,1454,1454,1454,1454,1453,1453,1453,1453,1452,1452,1452,1451,1451,1451,1451,1450,1450,1450,1450,1449,1449,1449,1449,1448,1448,1448,1447,1447,1447,1447,1446,1446,1446,1446,1445,1445,1445,1445,1444,1444,1444,1443,1443,1443,1443,1442,1442,1442,1442,1441,1441,1441,1441,1440,1440,1440,1440,1439,1439,1439,1439,1438,1438,1438,1437,1437,1437,1437,1436,1436,1436,1436,1435,1435,1435,1435,1434,1434,1434,1434,1433,1433,1433,1433,1432,1432,1432,1432,1431,1431,1431,1431,1430,1430,1430,1430,1429,1429,1429,1429,1428,1428,1428,1427,1427,1427,1427,1426,1426,1426,1426,1425,1425,1425,1425,1424,1424,1424,1424,1423,1423,1423,1423,1422,1422,1422,1422,1421,1421,1421,1421,1420,1420,1420,1420,1419,1419,1419,1419,1418,1418,1418,1418,1417,1417,1417,1417,1416,1416,1416,1416,1415,1415,1415,1415,1414,1414,1414,1414,1413,1413,1413,1413,1412,1412,1412,1412,1411,1411,1411,1411,1411,1410,1410,1410,1410,1409,1409,1409,1409,1408,1408,1408,1408,1407,1407,1407,1407,1406,1406,1406,1406,1405,1405,1405,1405,1404,1404,1404,1404,1403,1403,1403,1403,1402,1402,1402,1402,1402,1401,1401,1401,1401,1400,1400,1400,1400,1399,1399,1399,1399,1398,1398,1398,1398,1397,1397,1397,1397,1397,1396,1396,1396,1396,1395,1395,1395,1395,1394,1394,1394,1394,1393,1393,1393,1393,1392,1392,1392,1392,1392,1391,1391,1391,1391,1390,1390,1390,1390,1389,1389,1389,1389,1388,1388,1388,1388,1388,1387,1387,1387,1387,1386,1386,1386,1386,1385,1385,1385,1385,1385,1384,1384,1384,1384,1383,1383,1383,1383,1382,1382,1382,1382,1382,1381,1381,1381,1381,1380,1380,1380,1380,1379,1379,1379,1379,1379,1378,1378,1378,1378,1377,1377,1377,1377,1377,1376,1376,1376,1376,1375,1375,1375,1375,1374,1374,1374,1374,1374,1373,1373,1373,1373,1372,1372,1372,1372,1372,1371,1371,1371,1371,1370,1370,1370,1370,1370,1369,1369,1369,1369,1368,1368,1368,1368,1367,1367,1367,1367,1367,1366,1366,1366,1366,1365,1365,1365,1365,1365,1364,1364,1364,1364,1364,1363,1363,1363,1363,1362,1362,1362,1362,1362,1361,1361,1361,1361,1360,1360,1360,1360,1360,1359,1359,1359,1359,1358,1358,1358,1358,1358,1357,1357,1357,1357,1356,1356,1356,1356,1356,1355,1355,1355,1355,1355,1354,1354,1354,1354,1353,1353,1353,1353,1353,1352,1352,1352,1352,1352,1351,1351,1351,1351,1350,1350,1350,1350,1350,1349,1349,1349,1349,1349,1348,1348,1348,1348,1347,1347,1347,1347,1347,1346,1346,1346,1346,1346,1345,1345,1345,1345,1344,1344,1344,1344,1344,1343,1343,1343,1343,1343,1342,1342,1342,1342,1342,1341,1341,1341,1341,1341,1340,1340,1340,1340,1339,1339,1339,1339,1339,1338,1338,1338,1338,1338,1337,1337,1337,1337,1337,1336,1336,1336,1336,1336,1335,1335,1335,1335,1334,1334,1334,1334,1334,1333,1333,1333,1333,1333,1332,1332,1332,1332,1332,1331,1331,1331,1331,1331,1330,1330,1330,1330,1330,1329,1329,1329,1329,1329,1328,1328,1328,1328,1328,1327,1327,1327,1327,1327,1326,1326,1326,1326,1326,1325,1325,1325,1325,1325,1324,1324,1324,1324,1324,1323,1323,1323,1323,1323,1322,1322,1322,1322,1322,1321,1321,1321,1321,1321,1320,1320,1320,1320,1320,1319,1319,1319,1319,1319,1318,1318,1318,1318,1318,1317,1317,1317,1317,1317,1316,1316,1316,1316,1316,1315,1315,1315,1315,1315,1314,1314,1314,1314,1314,1313,1313,1313,1313,1313,1312,1312,1312,1312,1312,1311,1311,1311,1311,1311,1310,1310,1310,1310,1310,1310,1309,1309,1309,1309,1309,1308,1308,1308,1308,1308,1307,1307,1307,1307,1307,1306,1306,1306,1306,1306,1305,1305,1305,1305,1305,1305,1304,1304,1304,1304,1304,1303,1303,1303,1303,1303,1302,1302,1302,1302,1302,1301,1301,1301,1301,1301,1301,1300,1300,1300,1300,1300,1299,1299,1299,1299,1299,1298,1298,1298,1298,1298,1298,1297,1297,1297,1297,1297,1296,1296,1296,1296,1296,1295,1295,1295,1295,1295,1295,1294,1294,1294,1294,1294,1293,1293,1293,1293,1293,1292,1292,1292,1292,1292,1292,1291,1291,1291,1291,1291,1290,1290,1290,1290,1290,1290,1289,1289,1289,1289,1289,1288,1288,1288,1288,1288,1288,1287,1287,1287,1287,1287,1286,1286,1286,1286,1286,1286,1285,1285,1285,1285,1285,1284,1284,1284,1284,1284,1284,1283,1283,1283,1283,1283,1282,1282,1282,1282,1282,1282,1281,1281,1281,1281,1281,1280,1280,1280,1280,1280,1280,1279,1279,1279,1279,1279,1279,1278,1278,1278,1278,1278,1277,1277,1277,1277,1277,1277,1276,1276,1276,1276,1276,1276,1275,1275,1275,1275,1275,1274,1274,1274,1274,1274,1274,1273,1273,1273,1273,1273,1273,1272,1272,1272,1272,1272,1271,1271,1271,1271,1271,1271,1270,1270,1270,1270,1270,1270,1269,1269,1269,1269,1269,1269,1268,1268,1268,1268,1268,1267,1267,1267,1267,1267,1267,1266,1266,1266,1266,1266,1266,1265,1265,1265,1265,1265,1265,1264,1264,1264,1264,1264,1264,1263,1263,1263,1263,1263,1263,1262,1262,1262,1262,1262,1261,1261,1261,1261,1261,1261,1260,1260,1260,1260,1260,1260,1259,1259,1259,1259,1259,1259,1258,1258,1258,1258,1258,1258,1257,1257,1257,1257,1257,1257,1256,1256,1256,1256,1256,1256,1255,1255,1255,1255,1255,1255,1254,1254,1254,1254,1254,1254,1253,1253,1253,1253,1253,1253,1252,1252,1252,1252,1252,1252,1251,1251,1251,1251,1251,1251,1250,1250,1250,1250,1250,1250,1250,1249,1249,1249,1249,1249,1249,1248,1248,1248,1248,1248,1248,1247,1247,1247,1247,1247,1247,1246,1246,1246,1246,1246,1246,1245,1245,1245,1245,1245,1245,1244,1244,1244,1244,1244,1244,1244,1243,1243,1243,1243,1243,1243,1242,1242,1242,1242,1242,1242,1241,1241,1241,1241,1241,1241,1240,1240,1240,1240,1240,1240,1240,1239,1239,1239,1239,1239,1239,1238,1238,1238,1238,1238,1238,1237,1237,1237,1237,1237,1237,1237,1236,1236,1236,1236,1236,1236,1235,1235,1235,1235,1235,1235,1234,1234,1234,1234,1234,1234,1234,1233,1233,1233,1233,1233,1233,1232,1232,1232,1232,1232,1232,1232,1231,1231,1231,1231,1231,1231,1230,1230,1230,1230,1230,1230,1230,1229,1229,1229,1229,1229,1229,1228,1228,1228,1228,1228,1228,1228,1227,1227,1227,1227,1227,1227,1226,1226,1226,1226,1226,1226,1226,1225,1225,1225,1225,1225,1225,1224,1224,1224,1224,1224,1224,1224,1223,1223,1223,1223,1223,1223,1223,1222,1222,1222,1222,1222,1222,1221,1221,1221,1221,1221,1221,1221,1220,1220,1220,1220,1220,1220,1220,1219,1219,1219,1219,1219,1219,1218,1218,1218,1218,1218,1218,1218,1217,1217,1217,1217,1217,1217,1217,1216,1216,1216,1216,1216,1216,1216,1215,1215,1215,1215,1215,1215,1215,1214,1214,1214,1214,1214,1214,1213,1213,1213,1213,1213,1213,1213,1212,1212,1212,1212,1212,1212,1212,1211,1211,1211,1211,1211,1211,1211,1210,1210,1210,1210,1210,1210,1210,1209,1209,1209,1209,1209,1209,1209,1208,1208,1208,1208,1208,1208,1208,1207,1207,1207,1207,1207,1207,1207,1206,1206,1206,1206,1206,1206,1206,1205,1205,1205,1205,1205,1205,1205,1204,1204,1204,1204,1204,1204,1204,1203,1203,1203,1203,1203,1203,1203,1202,1202,1202,1202,1202,1202,1202,1201,1201,1201,1201,1201,1201,1201,1201,1200,1200,1200,1200,1200,1200,1200,1199,1199,1199,1199,1199,1199,1199,1198,1198,1198,1198,1198,1198,1198,1197,1197,1197,1197,1197,1197,1197,1196,1196,1196,1196,1196,1196,1196,1196,1195,1195,1195,1195,1195,1195,1195,1194,1194,1194,1194,1194,1194,1194,1193,1193,1193,1193,1193,1193,1193,1193,1192,1192,1192,1192,1192,1192,1192,1191,1191,1191,1191,1191,1191,1191,1191,1190,1190,1190,1190,1190,1190,1190,1189,1189,1189,1189,1189,1189,1189,1189,1188,1188,1188,1188,1188,1188,1188,1187,1187,1187,1187,1187,1187,1187,1187,1186,1186,1186,1186,1186,1186,1186,1185,1185,1185,1185,1185,1185,1185,1185,1184,1184,1184,1184,1184,1184,1184,1183,1183,1183,1183,1183,1183,1183,1183,1182,1182,1182,1182,1182,1182,1182,1182,1181,1181,1181,1181,1181,1181,1181,1180,1180,1180,1180,1180,1180,1180,1180,1179,1179,1179,1179,1179,1179,1179,1179,1178,1178,1178,1178,1178,1178,1178,1178,1177,1177,1177,1177,1177,1177,1177,1177,1176,1176,1176,1176,1176,1176,1176,1175,1175,1175,1175,1175,1175,1175,1175,1174,1174,1174,1174,1174,1174,1174,1174,1173,1173,1173,1173,1173,1173,1173,1173,1172,1172,1172,1172,1172,1172,1172,1172,1171,1171,1171,1171,1171,1171,1171,1171,1170,1170,1170,1170,1170,1170,1170,1170,1169,1169,1169,1169,1169,1169,1169,1169,1168,1168,1168,1168,1168,1168,1168,1168,1167,1167,1167,1167,1167,1167,1167,1167,1167,1166,1166,1166,1166,1166,1166,1166,1166,1165,1165,1165,1165,1165,1165,1165,1165,1164,1164,1164,1164,1164,1164,1164,1164,1163,1163,1163,1163,1163,1163,1163,1163,1162,1162,1162,1162,1162,1162,1162,1162,1162,1161,1161,1161,1161,1161,1161,1161,1161,1160,1160,1160,1160,1160,1160,1160,1160,1159,1159,1159,1159,1159,1159,1159,1159,1159,1158,1158,1158,1158,1158,1158,1158,1158,1157,1157,1157,1157,1157,1157,1157,1157,1157,1156,1156,1156,1156,1156,1156,1156,1156,1155,1155,1155,1155,1155,1155,1155,1155,1155,1154,1154,1154,1154,1154,1154,1154,1154,1154,1153,1153,1153,1153,1153,1153,1153,1153,1152,1152,1152,1152,1152,1152,1152,1152,1152,1151,1151,1151,1151,1151,1151,1151,1151,1151,1150,1150,1150,1150,1150,1150,1150,1150,1149,1149,1149,1149,1149,1149,1149,1149,1149,1148,1148,1148,1148,1148,1148,1148,1148,1148,1147,1147,1147,1147,1147,1147,1147,1147,1147,1146,1146,1146,1146,1146,1146,1146,1146,1146,1145,1145,1145,1145,1145,1145,1145,1145,1145,1144,1144,1144,1144,1144,1144,1144,1144,1144,1143,1143,1143,1143,1143,1143,1143,1143,1143,1142,1142,1142,1142,1142,1142,1142,1142,1142,1141,1141,1141,1141,1141,1141,1141,1141,1141,1140,1140,1140,1140,1140,1140,1140,1140,1140,1139,1139,1139,1139,1139,1139,1139,1139,1139,1138,1138,1138,1138,1138,1138,1138,1138,1138,1138,1137,1137,1137,1137,1137,1137,1137,1137,1137,1136,1136,1136,1136,1136,1136,1136,1136,1136,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1134,1134,1134,1134,1134,1134,1134,1134,1134,1133,1133,1133,1133,1133,1133,1133,1133,1133,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1131,1131,1131,1131,1131,1131,1131,1131,1131,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1129,1129,1129,1129,1129,1129,1129,1129,1129,1129,1128,1128,1128,1128,1128,1128,1128,1128,1128,1127,1127,1127,1127,1127,1127,1127,1127,1127,1127,1126,1126,1126,1126,1126,1126,1126,1126,1126,1126,1125,1125,1125,1125,1125,1125,1125,1125,1125,1125,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1122,1122,1122,1122,1122,1122,1122,1122,1122,1122,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1120,1120,1120,1120,1120,1120,1120,1120,1120,1120,1119,1119,1119,1119,1119,1119,1119,1119,1119,1119,1118,1118,1118,1118,1118,1118,1118,1118,1118,1118,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1114,1114,1114,1114,1114,1114,1114,1114,1114,1114,1114,1113,1113,1113,1113,1113,1113,1113,1113,1113,1113,1112,1112,1112,1112,1112,1112,1112,1112,1112,1112,1112,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1110,1110,1110,1110,1110,1110,1110,1110,1110,1110,1110,1109,1109,1109,1109,1109,1109,1109,1109,1109,1109,1109,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1105,1105,1105,1105,1105,1105,1105,1105,1105,1105,1105,1104,1104,1104,1104,1104,1104,1104,1104,1104,1104,1104,1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,1102,1102,1102,1102,1102,1102,1102,1102,1102,1102,1102,1101,1101,1101,1101,1101,1101,1101,1101,1101,1101,1101,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1099,1099,1099,1099,1099,1099,1099,1099,1099,1099,1099,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1097,1097,1097,1097,1097,1097,1097,1097,1097,1097,1097,1097,1096,1096,1096,1096,1096,1096,1096,1096,1096,1096,1096,1096,1095,1095,1095,1095,1095,1095,1095,1095,1095,1095,1095,1094,1094,1094,1094,1094,1094,1094,1094,1094,1094,1094,1094,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1091,1091,1091,1091,1091,1091,1091,1091,1091,1091,1091,1091,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1087,1087,1087,1087,1087,1087,1087,1087,1087,1087,1087,1087,1087,1086,1086,1086,1086,1086,1086,1086,1086,1086,1086,1086,1086,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1079,1079,1079,1079,1079,1079,1079,1079,1079,1079,1079,1079,1079,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1072,1072,1072,1072,1072,1072,1072,1072,1072,1072,1072,1072,1072,1072,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1069,1069,1069,1069,1069,1069,1069,1069,1069,1069,1069,1069,1069,1069,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1065,1065,1065,1065,1065,1065,1065,1065,1065,1065,1065,1065,1065,1065,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1060,1060,1060,1060,1060,1060,1060,1060,1060,1060,1060,1060,1060,1060,1060,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000]\r\n    data modify storage gm4_player_motion:sine arr set value [0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,8,8,8,8,8,8,9,9,9,9,9,9,10,10,10,10,10,10,11,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,13,14,14,14,14,14,15,15,15,15,15,15,16,16,16,16,16,16,17,17,17,17,17,17,18,18,18,18,18,19,19,19,19,19,19,20,20,20,20,20,20,21,21,21,21,21,21,22,22,22,22,22,23,23,23,23,23,23,24,24,24,24,24,24,25,25,25,25,25,26,26,26,26,26,26,27,27,27,27,27,27,28,28,28,28,28,28,29,29,29,29,29,30,30,30,30,30,30,31,31,31,31,31,31,32,32,32,32,32,32,33,33,33,33,33,34,34,34,34,34,34,35,35,35,35,35,35,36,36,36,36,36,36,37,37,37,37,37,38,38,38,38,38,38,39,39,39,39,39,39,40,40,40,40,40,41,41,41,41,41,41,42,42,42,42,42,42,43,43,43,43,43,43,44,44,44,44,44,45,45,45,45,45,45,46,46,46,46,46,46,47,47,47,47,47,47,48,48,48,48,48,49,49,49,49,49,49,50,50,50,50,50,50,51,51,51,51,51,51,52,52,52,52,52,53,53,53,53,53,53,54,54,54,54,54,54,55,55,55,55,55,55,56,56,56,56,56,57,57,57,57,57,57,58,58,58,58,58,58,59,59,59,59,59,60,60,60,60,60,60,61,61,61,61,61,61,62,62,62,62,62,62,63,63,63,63,63,64,64,64,64,64,64,65,65,65,65,65,65,66,66,66,66,66,66,67,67,67,67,67,68,68,68,68,68,68,69,69,69,69,69,69,70,70,70,70,70,70,71,71,71,71,71,72,72,72,72,72,72,73,73,73,73,73,73,74,74,74,74,74,74,75,75,75,75,75,76,76,76,76,76,76,77,77,77,77,77,77,78,78,78,78,78,78,79,79,79,79,79,80,80,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,84,84,84,84,84,84,85,85,85,85,85,85,86,86,86,86,86,86,87,87,87,87,87,88,88,88,88,88,88,89,89,89,89,89,89,90,90,90,90,90,90,91,91,91,91,91,92,92,92,92,92,92,93,93,93,93,93,93,94,94,94,94,94,94,95,95,95,95,95,96,96,96,96,96,96,97,97,97,97,97,97,98,98,98,98,98,98,99,99,99,99,99,100,100,100,100,100,100,101,101,101,101,101,101,102,102,102,102,102,102,103,103,103,103,103,104,104,104,104,104,104,105,105,105,105,105,105,106,106,106,106,106,106,107,107,107,107,107,107,108,108,108,108,108,109,109,109,109,109,109,110,110,110,110,110,110,111,111,111,111,111,111,112,112,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,115,115,115,115,115,115,116,116,116,116,116,117,117,117,117,117,117,118,118,118,118,118,118,119,119,119,119,119,119,120,120,120,120,120,121,121,121,121,121,121,122,122,122,122,122,122,123,123,123,123,123,123,124,124,124,124,124,124,125,125,125,125,125,126,126,126,126,126,126,127,127,127,127,127,127,128,128,128,128,128,128,129,129,129,129,129,130,130,130,130,130,130,131,131,131,131,131,131,132,132,132,132,132,132,133,133,133,133,133,133,134,134,134,134,134,135,135,135,135,135,135,136,136,136,136,136,136,137,137,137,137,137,137,138,138,138,138,138,139,139,139,139,139,139,140,140,140,140,140,140,141,141,141,141,141,141,142,142,142,142,142,142,143,143,143,143,143,144,144,144,144,144,144,145,145,145,145,145,145,146,146,146,146,146,146,147,147,147,147,147,147,148,148,148,148,148,149,149,149,149,149,149,150,150,150,150,150,150,151,151,151,151,151,151,152,152,152,152,152,152,153,153,153,153,153,154,154,154,154,154,154,155,155,155,155,155,155,156,156,156,156,156,156,157,157,157,157,157,157,158,158,158,158,158,159,159,159,159,159,159,160,160,160,160,160,160,161,161,161,161,161,161,162,162,162,162,162,162,163,163,163,163,163,164,164,164,164,164,164,165,165,165,165,165,165,166,166,166,166,166,166,167,167,167,167,167,167,168,168,168,168,168,169,169,169,169,169,169,170,170,170,170,170,170,171,171,171,171,171,171,172,172,172,172,172,172,173,173,173,173,173,173,174,174,174,174,174,175,175,175,175,175,175,176,176,176,176,176,176,177,177,177,177,177,177,178,178,178,178,178,178,179,179,179,179,179,180,180,180,180,180,180,181,181,181,181,181,181,182,182,182,182,182,182,183,183,183,183,183,183,184,184,184,184,184,184,185,185,185,185,185,186,186,186,186,186,186,187,187,187,187,187,187,188,188,188,188,188,188,189,189,189,189,189,189,190,190,190,190,190,190,191,191,191,191,191,192,192,192,192,192,192,193,193,193,193,193,193,194,194,194,194,194,194,195,195,195,195,195,195,196,196,196,196,196,196,197,197,197,197,197,197,198,198,198,198,198,199,199,199,199,199,199,200,200,200,200,200,200,201,201,201,201,201,201,202,202,202,202,202,202,203,203,203,203,203,203,204,204,204,204,204,205,205,205,205,205,205,206,206,206,206,206,206,207,207,207,207,207,207,208,208,208,208,208,208,209,209,209,209,209,209,210,210,210,210,210,210,211,211,211,211,211,212,212,212,212,212,212,213,213,213,213,213,213,214,214,214,214,214,214,215,215,215,215,215,215,216,216,216,216,216,216,217,217,217,217,217,217,218,218,218,218,218,218,219,219,219,219,219,220,220,220,220,220,220,221,221,221,221,221,221,222,222,222,222,222,222,223,223,223,223,223,223,224,224,224,224,224,224,225,225,225,225,225,225,226,226,226,226,226,226,227,227,227,227,227,228,228,228,228,228,228,229,229,229,229,229,229,230,230,230,230,230,230,231,231,231,231,231,231,232,232,232,232,232,232,233,233,233,233,233,233,234,234,234,234,234,234,235,235,235,235,235,235,236,236,236,236,236,237,237,237,237,237,237,238,238,238,238,238,238,239,239,239,239,239,239,240,240,240,240,240,240,241,241,241,241,241,241,242,242,242,242,242,242,243,243,243,243,243,243,244,244,244,244,244,244,245,245,245,245,245,245,246,246,246,246,246,246,247,247,247,247,247,248,248,248,248,248,248,249,249,249,249,249,249,250,250,250,250,250,250,251,251,251,251,251,251,252,252,252,252,252,252,253,253,253,253,253,253,254,254,254,254,254,254,255,255,255,255,255,255,256,256,256,256,256,256,257,257,257,257,257,257,258,258,258,258,258,258,259,259,259,259,259,259,260,260,260,260,260,261,261,261,261,261,261,262,262,262,262,262,262,263,263,263,263,263,263,264,264,264,264,264,264,265,265,265,265,265,265,266,266,266,266,266,266,267,267,267,267,267,267,268,268,268,268,268,268,269,269,269,269,269,269,270,270,270,270,270,270,271,271,271,271,271,271,272,272,272,272,272,272,273,273,273,273,273,273,274,274,274,274,274,274,275,275,275,275,275,275,276,276,276,276,276,276,277,277,277,277,277,277,278,278,278,278,278,278,279,279,279,279,279,279,280,280,280,280,280,281,281,281,281,281,281,282,282,282,282,282,282,283,283,283,283,283,283,284,284,284,284,284,284,285,285,285,285,285,285,286,286,286,286,286,286,287,287,287,287,287,287,288,288,288,288,288,288,289,289,289,289,289,289,290,290,290,290,290,290,291,291,291,291,291,291,292,292,292,292,292,292,293,293,293,293,293,293,294,294,294,294,294,294,295,295,295,295,295,295,296,296,296,296,296,296,297,297,297,297,297,297,298,298,298,298,298,298,299,299,299,299,299,299,300,300,300,300,300,300,301,301,301,301,301,301,302,302,302,302,302,302,303,303,303,303,303,303,304,304,304,304,304,304,305,305,305,305,305,305,306,306,306,306,306,306,307,307,307,307,307,307,308,308,308,308,308,308,309,309,309,309,309,309,310,310,310,310,310,310,311,311,311,311,311,311,312,312,312,312,312,312,312,313,313,313,313,313,313,314,314,314,314,314,314,315,315,315,315,315,315,316,316,316,316,316,316,317,317,317,317,317,317,318,318,318,318,318,318,319,319,319,319,319,319,320,320,320,320,320,320,321,321,321,321,321,321,322,322,322,322,322,322,323,323,323,323,323,323,324,324,324,324,324,324,325,325,325,325,325,325,326,326,326,326,326,326,327,327,327,327,327,327,328,328,328,328,328,328,329,329,329,329,329,329,330,330,330,330,330,330,331,331,331,331,331,331,331,332,332,332,332,332,332,333,333,333,333,333,333,334,334,334,334,334,334,335,335,335,335,335,335,336,336,336,336,336,336,337,337,337,337,337,337,338,338,338,338,338,338,339,339,339,339,339,339,340,340,340,340,340,340,341,341,341,341,341,341,342,342,342,342,342,342,343,343,343,343,343,343,343,344,344,344,344,344,344,345,345,345,345,345,345,346,346,346,346,346,346,347,347,347,347,347,347,348,348,348,348,348,348,349,349,349,349,349,349,350,350,350,350,350,350,351,351,351,351,351,351,352,352,352,352,352,352,352,353,353,353,353,353,353,354,354,354,354,354,354,355,355,355,355,355,355,356,356,356,356,356,356,357,357,357,357,357,357,358,358,358,358,358,358,359,359,359,359,359,359,359,360,360,360,360,360,360,361,361,361,361,361,361,362,362,362,362,362,362,363,363,363,363,363,363,364,364,364,364,364,364,365,365,365,365,365,365,366,366,366,366,366,366,366,367,367,367,367,367,367,368,368,368,368,368,368,369,369,369,369,369,369,370,370,370,370,370,370,371,371,371,371,371,371,372,372,372,372,372,372,372,373,373,373,373,373,373,374,374,374,374,374,374,375,375,375,375,375,375,376,376,376,376,376,376,377,377,377,377,377,377,378,378,378,378,378,378,378,379,379,379,379,379,379,380,380,380,380,380,380,381,381,381,381,381,381,382,382,382,382,382,382,383,383,383,383,383,383,383,384,384,384,384,384,384,385,385,385,385,385,385,386,386,386,386,386,386,387,387,387,387,387,387,387,388,388,388,388,388,388,389,389,389,389,389,389,390,390,390,390,390,390,391,391,391,391,391,391,392,392,392,392,392,392,392,393,393,393,393,393,393,394,394,394,394,394,394,395,395,395,395,395,395,396,396,396,396,396,396,396,397,397,397,397,397,397,398,398,398,398,398,398,399,399,399,399,399,399,400,400,400,400,400,400,400,401,401,401,401,401,401,402,402,402,402,402,402,403,403,403,403,403,403,404,404,404,404,404,404,404,405,405,405,405,405,405,406,406,406,406,406,406,407,407,407,407,407,407,408,408,408,408,408,408,408,409,409,409,409,409,409,410,410,410,410,410,410,411,411,411,411,411,411,411,412,412,412,412,412,412,413,413,413,413,413,413,414,414,414,414,414,414,415,415,415,415,415,415,415,416,416,416,416,416,416,417,417,417,417,417,417,418,418,418,418,418,418,418,419,419,419,419,419,419,420,420,420,420,420,420,421,421,421,421,421,421,421,422,422,422,422,422,422,423,423,423,423,423,423,424,424,424,424,424,424,424,425,425,425,425,425,425,426,426,426,426,426,426,427,427,427,427,427,427,427,428,428,428,428,428,428,429,429,429,429,429,429,430,430,430,430,430,430,430,431,431,431,431,431,431,432,432,432,432,432,432,433,433,433,433,433,433,433,434,434,434,434,434,434,435,435,435,435,435,435,436,436,436,436,436,436,436,437,437,437,437,437,437,438,438,438,438,438,438,438,439,439,439,439,439,439,440,440,440,440,440,440,441,441,441,441,441,441,441,442,442,442,442,442,442,443,443,443,443,443,443,444,444,444,444,444,444,444,445,445,445,445,445,445,446,446,446,446,446,446,446,447,447,447,447,447,447,448,448,448,448,448,448,449,449,449,449,449,449,449,450,450,450,450,450,450,451,451,451,451,451,451,451,452,452,452,452,452,452,453,453,453,453,453,453,453,454,454,454,454,454,454,455,455,455,455,455,455,456,456,456,456,456,456,456,457,457,457,457,457,457,458,458,458,458,458,458,458,459,459,459,459,459,459,460,460,460,460,460,460,460,461,461,461,461,461,461,462,462,462,462,462,462,462,463,463,463,463,463,463,464,464,464,464,464,464,464,465,465,465,465,465,465,466,466,466,466,466,466,467,467,467,467,467,467,467,468,468,468,468,468,468,469,469,469,469,469,469,469,470,470,470,470,470,470,471,471,471,471,471,471,471,472,472,472,472,472,472,473,473,473,473,473,473,473,474,474,474,474,474,474,475,475,475,475,475,475,475,476,476,476,476,476,476,477,477,477,477,477,477,477,478,478,478,478,478,478,478,479,479,479,479,479,479,480,480,480,480,480,480,480,481,481,481,481,481,481,482,482,482,482,482,482,482,483,483,483,483,483,483,484,484,484,484,484,484,484,485,485,485,485,485,485,486,486,486,486,486,486,486,487,487,487,487,487,487,488,488,488,488,488,488,488,489,489,489,489,489,489,489,490,490,490,490,490,490,491,491,491,491,491,491,491,492,492,492,492,492,492,493,493,493,493,493,493,493,494,494,494,494,494,494,495,495,495,495,495,495,495,496,496,496,496,496,496,496,497,497,497,497,497,497,498,498,498,498,498,498,498,499,499,499,499,499,499,500,500,500,500,500,500,500,501,501,501,501,501,501,501,502,502,502,502,502,502,503,503,503,503,503,503,503,504,504,504,504,504,504,504,505,505,505,505,505,505,506,506,506,506,506,506,506,507,507,507,507,507,507,507,508,508,508,508,508,508,509,509,509,509,509,509,509,510,510,510,510,510,510,510,511,511,511,511,511,511,512,512,512,512,512,512,512,513,513,513,513,513,513,513,514,514,514,514,514,514,515,515,515,515,515,515,515,516,516,516,516,516,516,516,517,517,517,517,517,517,518,518,518,518,518,518,518,519,519,519,519,519,519,519,520,520,520,520,520,520,521,521,521,521,521,521,521,522,522,522,522,522,522,522,523,523,523,523,523,523,523,524,524,524,524,524,524,525,525,525,525,525,525,525,526,526,526,526,526,526,526,527,527,527,527,527,527,527,528,528,528,528,528,528,529,529,529,529,529,529,529,530,530,530,530,530,530,530,531,531,531,531,531,531,531,532,532,532,532,532,532,533,533,533,533,533,533,533,534,534,534,534,534,534,534,535,535,535,535,535,535,535,536,536,536,536,536,536,537,537,537,537,537,537,537,538,538,538,538,538,538,538,539,539,539,539,539,539,539,540,540,540,540,540,540,540,541,541,541,541,541,541,542,542,542,542,542,542,542,543,543,543,543,543,543,543,544,544,544,544,544,544,544,545,545,545,545,545,545,545,546,546,546,546,546,546,546,547,547,547,547,547,547,548,548,548,548,548,548,548,549,549,549,549,549,549,549,550,550,550,550,550,550,550,551,551,551,551,551,551,551,552,552,552,552,552,552,552,553,553,553,553,553,553,553,554,554,554,554,554,554,554,555,555,555,555,555,555,556,556,556,556,556,556,556,557,557,557,557,557,557,557,558,558,558,558,558,558,558,559,559,559,559,559,559,559,560,560,560,560,560,560,560,561,561,561,561,561,561,561,562,562,562,562,562,562,562,563,563,563,563,563,563,563,564,564,564,564,564,564,564,565,565,565,565,565,565,565,566,566,566,566,566,566,566,567,567,567,567,567,567,567,568,568,568,568,568,568,568,569,569,569,569,569,569,569,570,570,570,570,570,570,571,571,571,571,571,571,571,572,572,572,572,572,572,572,573,573,573,573,573,573,573,574,574,574,574,574,574,574,575,575,575,575,575,575,575,576,576,576,576,576,576,576,577,577,577,577,577,577,577,578,578,578,578,578,578,578,578,579,579,579,579,579,579,579,580,580,580,580,580,580,580,581,581,581,581,581,581,581,582,582,582,582,582,582,582,583,583,583,583,583,583,583,584,584,584,584,584,584,584,585,585,585,585,585,585,585,586,586,586,586,586,586,586,587,587,587,587,587,587,587,588,588,588,588,588,588,588,589,589,589,589,589,589,589,590,590,590,590,590,590,590,591,591,591,591,591,591,591,592,592,592,592,592,592,592,592,593,593,593,593,593,593,593,594,594,594,594,594,594,594,595,595,595,595,595,595,595,596,596,596,596,596,596,596,597,597,597,597,597,597,597,598,598,598,598,598,598,598,599,599,599,599,599,599,599,600,600,600,600,600,600,600,600,601,601,601,601,601,601,601,602,602,602,602,602,602,602,603,603,603,603,603,603,603,604,604,604,604,604,604,604,605,605,605,605,605,605,605,605,606,606,606,606,606,606,606,607,607,607,607,607,607,607,608,608,608,608,608,608,608,609,609,609,609,609,609,609,610,610,610,610,610,610,610,610,611,611,611,611,611,611,611,612,612,612,612,612,612,612,613,613,613,613,613,613,613,614,614,614,614,614,614,614,614,615,615,615,615,615,615,615,616,616,616,616,616,616,616,617,617,617,617,617,617,617,617,618,618,618,618,618,618,618,619,619,619,619,619,619,619,620,620,620,620,620,620,620,621,621,621,621,621,621,621,621,622,622,622,622,622,622,622,623,623,623,623,623,623,623,624,624,624,624,624,624,624,624,625,625,625,625,625,625,625,626,626,626,626,626,626,626,627,627,627,627,627,627,627,627,628,628,628,628,628,628,628,629,629,629,629,629,629,629,629,630,630,630,630,630,630,630,631,631,631,631,631,631,631,632,632,632,632,632,632,632,632,633,633,633,633,633,633,633,634,634,634,634,634,634,634,635,635,635,635,635,635,635,635,636,636,636,636,636,636,636,637,637,637,637,637,637,637,637,638,638,638,638,638,638,638,639,639,639,639,639,639,639,639,640,640,640,640,640,640,640,641,641,641,641,641,641,641,641,642,642,642,642,642,642,642,643,643,643,643,643,643,643,643,644,644,644,644,644,644,644,645,645,645,645,645,645,645,645,646,646,646,646,646,646,646,647,647,647,647,647,647,647,647,648,648,648,648,648,648,648,649,649,649,649,649,649,649,649,650,650,650,650,650,650,650,651,651,651,651,651,651,651,651,652,652,652,652,652,652,652,653,653,653,653,653,653,653,653,654,654,654,654,654,654,654,655,655,655,655,655,655,655,655,656,656,656,656,656,656,656,656,657,657,657,657,657,657,657,658,658,658,658,658,658,658,658,659,659,659,659,659,659,659,660,660,660,660,660,660,660,660,661,661,661,661,661,661,661,661,662,662,662,662,662,662,662,663,663,663,663,663,663,663,663,664,664,664,664,664,664,664,664,665,665,665,665,665,665,665,666,666,666,666,666,666,666,666,667,667,667,667,667,667,667,667,668,668,668,668,668,668,668,669,669,669,669,669,669,669,669,670,670,670,670,670,670,670,670,671,671,671,671,671,671,671,671,672,672,672,672,672,672,672,673,673,673,673,673,673,673,673,674,674,674,674,674,674,674,674,675,675,675,675,675,675,675,675,676,676,676,676,676,676,676,677,677,677,677,677,677,677,677,678,678,678,678,678,678,678,678,679,679,679,679,679,679,679,679,680,680,680,680,680,680,680,680,681,681,681,681,681,681,681,681,682,682,682,682,682,682,682,683,683,683,683,683,683,683,683,684,684,684,684,684,684,684,684,685,685,685,685,685,685,685,685,686,686,686,686,686,686,686,686,687,687,687,687,687,687,687,687,688,688,688,688,688,688,688,688,689,689,689,689,689,689,689,689,690,690,690,690,690,690,690,691,691,691,691,691,691,691,691,692,692,692,692,692,692,692,692,693,693,693,693,693,693,693,693,694,694,694,694,694,694,694,694,695,695,695,695,695,695,695,695,696,696,696,696,696,696,696,696,697,697,697,697,697,697,697,697,698,698,698,698,698,698,698,698,699,699,699,699,699,699,699,699,700,700,700,700,700,700,700,700,701,701,701,701,701,701,701,701,702,702,702,702,702,702,702,702,703,703,703,703,703,703,703,703,704,704,704,704,704,704,704,704,705,705,705,705,705,705,705,705,705,706,706,706,706,706,706,706,706,707,707,707,707,707,707,707,707,708,708,708,708,708,708,708,708,709,709,709,709,709,709,709,709,710,710,710,710,710,710,710,710,711,711,711,711,711,711,711,711,712,712,712,712,712,712,712,712,713,713,713,713,713,713,713,713,713,714,714,714,714,714,714,714,714,715,715,715,715,715,715,715,715,716,716,716,716,716,716,716,716,717,717,717,717,717,717,717,717,718,718,718,718,718,718,718,718,718,719,719,719,719,719,719,719,719,720,720,720,720,720,720,720,720,721,721,721,721,721,721,721,721,722,722,722,722,722,722,722,722,722,723,723,723,723,723,723,723,723,724,724,724,724,724,724,724,724,725,725,725,725,725,725,725,725,725,726,726,726,726,726,726,726,726,727,727,727,727,727,727,727,727,728,728,728,728,728,728,728,728,728,729,729,729,729,729,729,729,729,730,730,730,730,730,730,730,730,730,731,731,731,731,731,731,731,731,732,732,732,732,732,732,732,732,733,733,733,733,733,733,733,733,733,734,734,734,734,734,734,734,734,735,735,735,735,735,735,735,735,735,736,736,736,736,736,736,736,736,737,737,737,737,737,737,737,737,737,738,738,738,738,738,738,738,738,739,739,739,739,739,739,739,739,739,740,740,740,740,740,740,740,740,741,741,741,741,741,741,741,741,741,742,742,742,742,742,742,742,742,743,743,743,743,743,743,743,743,743,744,744,744,744,744,744,744,744,745,745,745,745,745,745,745,745,745,746,746,746,746,746,746,746,746,746,747,747,747,747,747,747,747,747,748,748,748,748,748,748,748,748,748,749,749,749,749,749,749,749,749,749,750,750,750,750,750,750,750,750,751,751,751,751,751,751,751,751,751,752,752,752,752,752,752,752,752,752,753,753,753,753,753,753,753,753,754,754,754,754,754,754,754,754,754,755,755,755,755,755,755,755,755,755,756,756,756,756,756,756,756,756,756,757,757,757,757,757,757,757,757,758,758,758,758,758,758,758,758,758,759,759,759,759,759,759,759,759,759,760,760,760,760,760,760,760,760,760,761,761,761,761,761,761,761,761,761,762,762,762,762,762,762,762,762,763,763,763,763,763,763,763,763,763,764,764,764,764,764,764,764,764,764,765,765,765,765,765,765,765,765,765,766,766,766,766,766,766,766,766,766,767,767,767,767,767,767,767,767,767,768,768,768,768,768,768,768,768,768,769,769,769,769,769,769,769,769,769,770,770,770,770,770,770,770,770,770,771,771,771,771,771,771,771,771,771,772,772,772,772,772,772,772,772,772,773,773,773,773,773,773,773,773,773,774,774,774,774,774,774,774,774,774,775,775,775,775,775,775,775,775,775,776,776,776,776,776,776,776,776,776,777,777,777,777,777,777,777,777,777,778,778,778,778,778,778,778,778,778,779,779,779,779,779,779,779,779,779,779,780,780,780,780,780,780,780,780,780,781,781,781,781,781,781,781,781,781,782,782,782,782,782,782,782,782,782,783,783,783,783,783,783,783,783,783,784,784,784,784,784,784,784,784,784,784,785,785,785,785,785,785,785,785,785,786,786,786,786,786,786,786,786,786,787,787,787,787,787,787,787,787,787,788,788,788,788,788,788,788,788,788,788,789,789,789,789,789,789,789,789,789,790,790,790,790,790,790,790,790,790,791,791,791,791,791,791,791,791,791,791,792,792,792,792,792,792,792,792,792,793,793,793,793,793,793,793,793,793,793,794,794,794,794,794,794,794,794,794,795,795,795,795,795,795,795,795,795,796,796,796,796,796,796,796,796,796,796,797,797,797,797,797,797,797,797,797,798,798,798,798,798,798,798,798,798,798,799,799,799,799,799,799,799,799,799,799,800,800,800,800,800,800,800,800,800,801,801,801,801,801,801,801,801,801,801,802,802,802,802,802,802,802,802,802,803,803,803,803,803,803,803,803,803,803,804,804,804,804,804,804,804,804,804,804,805,805,805,805,805,805,805,805,805,806,806,806,806,806,806,806,806,806,806,807,807,807,807,807,807,807,807,807,807,808,808,808,808,808,808,808,808,808,809,809,809,809,809,809,809,809,809,809,810,810,810,810,810,810,810,810,810,810,811,811,811,811,811,811,811,811,811,811,812,812,812,812,812,812,812,812,812,812,813,813,813,813,813,813,813,813,813,814,814,814,814,814,814,814,814,814,814,815,815,815,815,815,815,815,815,815,815,816,816,816,816,816,816,816,816,816,816,817,817,817,817,817,817,817,817,817,817,818,818,818,818,818,818,818,818,818,818,819,819,819,819,819,819,819,819,819,819,820,820,820,820,820,820,820,820,820,820,821,821,821,821,821,821,821,821,821,821,822,822,822,822,822,822,822,822,822,822,823,823,823,823,823,823,823,823,823,823,824,824,824,824,824,824,824,824,824,824,825,825,825,825,825,825,825,825,825,825,825,826,826,826,826,826,826,826,826,826,826,827,827,827,827,827,827,827,827,827,827,828,828,828,828,828,828,828,828,828,828,829,829,829,829,829,829,829,829,829,829,830,830,830,830,830,830,830,830,830,830,830,831,831,831,831,831,831,831,831,831,831,832,832,832,832,832,832,832,832,832,832,833,833,833,833,833,833,833,833,833,833,833,834,834,834,834,834,834,834,834,834,834,835,835,835,835,835,835,835,835,835,835,835,836,836,836,836,836,836,836,836,836,836,837,837,837,837,837,837,837,837,837,837,838,838,838,838,838,838,838,838,838,838,838,839,839,839,839,839,839,839,839,839,839,839,840,840,840,840,840,840,840,840,840,840,841,841,841,841,841,841,841,841,841,841,841,842,842,842,842,842,842,842,842,842,842,843,843,843,843,843,843,843,843,843,843,843,844,844,844,844,844,844,844,844,844,844,844,845,845,845,845,845,845,845,845,845,845,846,846,846,846,846,846,846,846,846,846,846,847,847,847,847,847,847,847,847,847,847,847,848,848,848,848,848,848,848,848,848,848,848,849,849,849,849,849,849,849,849,849,849,849,850,850,850,850,850,850,850,850,850,850,850,851,851,851,851,851,851,851,851,851,851,852,852,852,852,852,852,852,852,852,852,852,853,853,853,853,853,853,853,853,853,853,853,854,854,854,854,854,854,854,854,854,854,854,855,855,855,855,855,855,855,855,855,855,855,855,856,856,856,856,856,856,856,856,856,856,856,857,857,857,857,857,857,857,857,857,857,857,858,858,858,858,858,858,858,858,858,858,858,859,859,859,859,859,859,859,859,859,859,859,860,860,860,860,860,860,860,860,860,860,860,861,861,861,861,861,861,861,861,861,861,861,861,862,862,862,862,862,862,862,862,862,862,862,863,863,863,863,863,863,863,863,863,863,863,864,864,864,864,864,864,864,864,864,864,864,864,865,865,865,865,865,865,865,865,865,865,865,866,866,866,866,866,866,866,866,866,866,866,866,867,867,867,867,867,867,867,867,867,867,867,868,868,868,868,868,868,868,868,868,868,868,868,869,869,869,869,869,869,869,869,869,869,869,870,870,870,870,870,870,870,870,870,870,870,870,871,871,871,871,871,871,871,871,871,871,871,871,872,872,872,872,872,872,872,872,872,872,872,873,873,873,873,873,873,873,873,873,873,873,873,874,874,874,874,874,874,874,874,874,874,874,874,875,875,875,875,875,875,875,875,875,875,875,875,876,876,876,876,876,876,876,876,876,876,876,876,877,877,877,877,877,877,877,877,877,877,877,877,878,878,878,878,878,878,878,878,878,878,878,878,879,879,879,879,879,879,879,879,879,879,879,879,880,880,880,880,880,880,880,880,880,880,880,880,881,881,881,881,881,881,881,881,881,881,881,881,882,882,882,882,882,882,882,882,882,882,882,882,883,883,883,883,883,883,883,883,883,883,883,883,884,884,884,884,884,884,884,884,884,884,884,884,884,885,885,885,885,885,885,885,885,885,885,885,885,886,886,886,886,886,886,886,886,886,886,886,886,887,887,887,887,887,887,887,887,887,887,887,887,887,888,888,888,888,888,888,888,888,888,888,888,888,889,889,889,889,889,889,889,889,889,889,889,889,889,890,890,890,890,890,890,890,890,890,890,890,890,891,891,891,891,891,891,891,891,891,891,891,891,891,892,892,892,892,892,892,892,892,892,892,892,892,892,893,893,893,893,893,893,893,893,893,893,893,893,893,894,894,894,894,894,894,894,894,894,894,894,894,895,895,895,895,895,895,895,895,895,895,895,895,895,896,896,896,896,896,896,896,896,896,896,896,896,896,897,897,897,897,897,897,897,897,897,897,897,897,897,898,898,898,898,898,898,898,898,898,898,898,898,898,899,899,899,899,899,899,899,899,899,899,899,899,899,900,900,900,900,900,900,900,900,900,900,900,900,900,901,901,901,901,901,901,901,901,901,901,901,901,901,901,902,902,902,902,902,902,902,902,902,902,902,902,902,903,903,903,903,903,903,903,903,903,903,903,903,903,904,904,904,904,904,904,904,904,904,904,904,904,904,904,905,905,905,905,905,905,905,905,905,905,905,905,905,906,906,906,906,906,906,906,906,906,906,906,906,906,906,907,907,907,907,907,907,907,907,907,907,907,907,907,907,908,908,908,908,908,908,908,908,908,908,908,908,908,909,909,909,909,909,909,909,909,909,909,909,909,909,909,910,910,910,910,910,910,910,910,910,910,910,910,910,910,911,911,911,911,911,911,911,911,911,911,911,911,911,911,912,912,912,912,912,912,912,912,912,912,912,912,912,912,913,913,913,913,913,913,913,913,913,913,913,913,913,913,914,914,914,914,914,914,914,914,914,914,914,914,914,914,915,915,915,915,915,915,915,915,915,915,915,915,915,915,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,917,917,917,917,917,917,917,917,917,917,917,917,917,917,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,919,919,919,919,919,919,919,919,919,919,919,919,919,919,920,920,920,920,920,920,920,920,920,920,920,920,920,920,920,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,922,922,922,922,922,922,922,922,922,922,922,922,922,922,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,930,930,930,930,930,930,930,930,930,930,930,930,930,930,930,930,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,934,934,934,934,934,934,934,934,934,934,934,934,934,934,934,934,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,942,942,942,942,942,942,942,942,942,942,942,942,942,942,942,942,942,943,943,943,943,943,943,943,943,943,943,943,943,943,943,943,943,943,944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,947,947,947,947,947,947,947,947,947,947,947,947,947,947,947,947,947,947,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,956,956,956,956,956,956,956,956,956,956,956,956,956,956,956,956,956,956,956,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,1000]\r\n    data modify storage gm4_player_motion:arcsine arr set value [1000,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,997,997,997,997,997,997,997,997,997,997,997,997,997,997,996,996,996,996,996,996,996,996,996,996,996,996,995,995,995,995,995,995,995,995,995,995,994,994,994,994,994,994,994,994,994,994,993,993,993,993,993,993,993,993,993,992,992,992,992,992,992,992,992,991,991,991,991,991,991,991,990,990,990,990,990,990,990,990,989,989,989,989,989,989,988,988,988,988,988,988,988,987,987,987,987,987,987,986,986,986,986,986,986,985,985,985,985,985,985,984,984,984,984,984,984,983,983,983,983,983,982,982,982,982,982,981,981,981,981,981,981,980,980,980,980,979,979,979,979,979,978,978,978,978,978,977,977,977,977,977,976,976,976,976,975,975,975,975,975,974,974,974,974,973,973,973,973,972,972,972,972,971,971,971,971,971,970,970,970,970,969,969,969,969,968,968,968,967,967,967,967,966,966,966,966,965,965,965,965,964,964,964,963,963,963,963,962,962,962,962,961,961,961,960,960,960,960,959,959,959,958,958,958,957,957,957,957,956,956,956,955,955,955,954,954,954,953,953,953,952,952,952,952,951,951,951,950,950,950,949,949,949,948,948,948,947,947,947,946,946,946,945,945,945,944,944,943,943,943,942,942,942,941,941,941,940,940,940,939,939,938,938,938,937,937,937,936,936,936,935,935,934,934,934,933,933,932,932,932,931,931,931,930,930,929,929,929,928,928,927,927,927,926,926,925,925,924,924,924,923,923,922,922,922,921,921,920,920,919,919,919,918,918,917,917,916,916,916,915,915,914,914,913,913,912,912,912,911,911,910,910,909,909,908,908,907,907,907,906,906,905,905,904,904,903,903,902,902,901,901,900,900,899,899,898,898,897,897,897,896,896,895,895,894,894,893,893,892,892,891,891,890,889,889,888,888,887,887,886,886,885,885,884,884,883,883,882,882,881,881,880,879,879,878,878,877,877,876,876,875,875,874,873,873,872,872,871,871,870,870,869,868,868,867,867,866,866,865,864,864,863,863,862,861,861,860,860,859,858,858,857,857,856,855,855,854,854,853,852,852,851,851,850,849,849,848,847,847,846,846,845,844,844,843,842,842,841,841,840,839,839,838,837,837,836,835,835,834,833,833,832,831,831,830,829,829,828,827,827,826,825,825,824,823,823,822,821,820,820,819,818,818,817,816,816,815,814,813,813,812,811,811,810,809,808,808,807,806,805,805,804,803,802,802,801,800,800,799,798,797,796,796,795,794,793,793,792,791,790,790,789,788,787,786,786,785,784,783,783,782,781,780,779,779,778,777,776,775,774,774,773,772,771,770,770,769,768,767,766,765,765,764,763,762,761,760,759,759,758,757,756,755,754,753,753,752,751,750,749,748,747,746,745,745,744,743,742,741,740,739,738,737,736,735,735,734,733,732,731,730,729,728,727,726,725,724,723,722,721,720,719,719,718,717,716,715,714,713,712,711,710,709,708,707,706,705,704,703,702,701,700,699,698,697,696,695,693,692,691,690,689,688,687,686,685,684,683,682,681,680,679,678,676,675,674,673,672,671,670,669,668,667,665,664,663,662,661,660,659,658,656,655,654,653,652,651,649,648,647,646,645,644,642,641,640,639,638,636,635,634,633,631,630,629,628,627,625,624,623,622,620,619,618,616,615,614,613,611,610,609,607,606,605,603,602,601,600,598,597,595,594,593,591,590,589,587,586,585,583,582,580,579,578,576,575,573,572,570,569,568,566,565,563,562,560,559,557,556,554,553,551,550,548,547,545,544,542,541,539,537,536,534,533,531,529,528,526,525,523,521,520,518,516,515,513,511,510,508,506,505,503,501,500,498,496,494,493,491,489,487,485,484,482,480,478,476,474,473,471,469,467,465,463,461,459,457,455,454,452,450,448,446,444,442,439,437,435,433,431,429,427,425,423,421,418,416,414,412,410,407,405,403,401,398,396,394,391,389,387,384,382,379,377,375,372,370,367,365,362,359,357,354,352,349,346,343,341,338,335,332,329,327,324,321,318,315,312,309,306,302,299,296,293,290,286,283,280,276,273,269,265,262,258,254,250,247,243,239,234,230,226,222,217,213,208,203,198,194,188,183,178,172,166,160,154,147,141,133,126,118,109,99,89,77,63,44,0]\r\n    data modify storage gm4_player_motion:cosine arr set value [10000,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9992,9992,9992,9992,9992,9992,9992,9992,9992,9992,9992,9992,9992,9992,9992,9991,9991,9991,9991,9991,9991,9991,9991,9991,9991,9991,9991,9991,9991,9990,9990,9990,9990,9990,9990,9990,9990,9990,9990,9990,9990,9990,9989,9989,9989,9989,9989,9989,9989,9989,9989,9989,9989,9989,9988,9988,9988,9988,9988,9988,9988,9988,9988,9988,9988,9988,9987,9987,9987,9987,9987,9987,9987,9987,9987,9987,9987,9987,9986,9986,9986,9986,9986,9986,9986,9986,9986,9986,9986,9985,9985,9985,9985,9985,9985,9985,9985,9985,9985,9984,9984,9984,9984,9984,9984,9984,9984,9984,9984,9984,9983,9983,9983,9983,9983,9983,9983,9983,9983,9983,9982,9982,9982,9982,9982,9982,9982,9982,9982,9981,9981,9981,9981,9981,9981,9981,9981,9981,9981,9980,9980,9980,9980,9980,9980,9980,9980,9980,9979,9979,9979,9979,9979,9979,9979,9979,9979,9978,9978,9978,9978,9978,9978,9978,9978,9978,9977,9977,9977,9977,9977,9977,9977,9977,9976,9976,9976,9976,9976,9976,9976,9976,9976,9975,9975,9975,9975,9975,9975,9975,9975,9974,9974,9974,9974,9974,9974,9974,9974,9973,9973,9973,9973,9973,9973,9973,9973,9972,9972,9972,9972,9972,9972,9972,9971,9971,9971,9971,9971,9971,9971,9971,9970,9970,9970,9970,9970,9970,9970,9969,9969,9969,9969,9969,9969,9969,9969,9968,9968,9968,9968,9968,9968,9968,9967,9967,9967,9967,9967,9967,9967,9966,9966,9966,9966,9966,9966,9966,9965,9965,9965,9965,9965,9965,9965,9964,9964,9964,9964,9964,9964,9964,9963,9963,9963,9963,9963,9963,9963,9962,9962,9962,9962,9962,9962,9961,9961,9961,9961,9961,9961,9961,9960,9960,9960,9960,9960,9960,9959,9959,9959,9959,9959,9959,9959,9958,9958,9958,9958,9958,9958,9957,9957,9957,9957,9957,9957,9956,9956,9956,9956,9956,9956,9955,9955,9955,9955,9955,9955,9954,9954,9954,9954,9954,9954,9953,9953,9953,9953,9953,9953,9952,9952,9952,9952,9952,9952,9951,9951,9951,9951,9951,9951,9950,9950,9950,9950,9950,9950,9949,9949,9949,9949,9949,9948,9948,9948,9948,9948,9948,9947,9947,9947,9947,9947,9947,9946,9946,9946,9946,9946,9945,9945,9945,9945,9945,9945,9944,9944,9944,9944,9944,9943,9943,9943,9943,9943,9943,9942,9942,9942,9942,9942,9941,9941,9941,9941,9941,9940,9940,9940,9940,9940,9939,9939,9939,9939,9939,9939,9938,9938,9938,9938,9938,9937,9937,9937,9937,9937,9936,9936,9936,9936,9936,9935,9935,9935,9935,9935,9934,9934,9934,9934,9934,9933,9933,9933,9933,9933,9932,9932,9932,9932,9932,9931,9931,9931,9931,9931,9930,9930,9930,9930,9930,9929,9929,9929,9929,9929,9928,9928,9928,9928,9927,9927,9927,9927,9927,9926,9926,9926,9926,9926,9925,9925,9925,9925,9925,9924,9924,9924,9924,9923,9923,9923,9923,9923,9922,9922,9922,9922,9922,9921,9921,9921,9921,9920,9920,9920,9920,9920,9919,9919,9919,9919,9918,9918,9918,9918,9918,9917,9917,9917,9917,9916,9916,9916,9916,9916,9915,9915,9915,9915,9914,9914,9914,9914,9913,9913,9913,9913,9913,9912,9912,9912,9912,9911,9911,9911,9911,9910,9910,9910,9910,9910,9909,9909,9909,9909,9908,9908,9908,9908,9907,9907,9907,9907,9907,9906,9906,9906,9906,9905,9905,9905,9905,9904,9904,9904,9904,9903,9903,9903,9903,9902,9902,9902,9902,9901,9901,9901,9901,9900,9900,9900,9900,9899,9899,9899,9899,9899,9898,9898,9898,9898,9897,9897,9897,9897,9896,9896,9896,9896,9895,9895,9895,9895,9894,9894,9894,9893,9893,9893,9893,9892,9892,9892,9892,9891,9891,9891,9891,9890,9890,9890,9890,9889,9889,9889,9889,9888,9888,9888,9888,9887,9887,9887,9887,9886,9886,9886,9885,9885,9885,9885,9884,9884,9884,9884,9883,9883,9883,9883,9882,9882,9882,9882,9881,9881,9881,9880,9880,9880,9880,9879,9879,9879,9879,9878,9878,9878,9877,9877,9877,9877,9876,9876,9876,9876,9875,9875,9875,9874,9874,9874,9874,9873,9873,9873,9873,9872,9872,9872,9871,9871,9871,9871,9870,9870,9870,9869,9869,9869,9869,9868,9868,9868,9867,9867,9867,9867,9866,9866,9866,9866,9865,9865,9865,9864,9864,9864,9864,9863,9863,9863,9862,9862,9862,9861,9861,9861,9861,9860,9860,9860,9859,9859,9859,9859,9858,9858,9858,9857,9857,9857,9857,9856,9856,9856,9855,9855,9855,9854,9854,9854,9854,9853,9853,9853,9852,9852,9852,9851,9851,9851,9851,9850,9850,9850,9849,9849,9849,9848,9848,9848,9848,9847,9847,9847,9846,9846,9846,9845,9845,9845,9845,9844,9844,9844,9843,9843,9843,9842,9842,9842,9841,9841,9841,9841,9840,9840,9840,9839,9839,9839,9838,9838,9838,9837,9837,9837,9836,9836,9836,9836,9835,9835,9835,9834,9834,9834,9833,9833,9833,9832,9832,9832,9831,9831,9831,9830,9830,9830,9829,9829,9829,9829,9828,9828,9828,9827,9827,9827,9826,9826,9826,9825,9825,9825,9824,9824,9824,9823,9823,9823,9822,9822,9822,9821,9821,9821,9820,9820,9820,9819,9819,9819,9818,9818,9818,9817,9817,9817,9816,9816,9816,9815,9815,9815,9814,9814,9814,9813,9813,9813,9812,9812,9812,9811,9811,9811,9810,9810,9810,9809,9809,9809,9808,9808,9808,9807,9807,9807,9806,9806,9806,9805,9805,9805,9804,9804,9804,9803,9803,9803,9802,9802,9802,9801,9801,9800,9800,9800,9799,9799,9799,9798,9798,9798,9797,9797,9797,9796,9796,9796,9795,9795,9795,9794,9794,9793,9793,9793,9792,9792,9792,9791,9791,9791,9790,9790,9790,9789,9789,9789,9788,9788,9787,9787,9787,9786,9786,9786,9785,9785,9785,9784,9784,9784,9783,9783,9782,9782,9782,9781,9781,9781,9780,9780,9780,9779,9779,9778,9778,9778,9777,9777,9777,9776,9776,9775,9775,9775,9774,9774,9774,9773,9773,9773,9772,9772,9771,9771,9771,9770,9770,9770,9769,9769,9768,9768,9768,9767,9767,9767,9766,9766,9765,9765,9765,9764,9764,9764,9763,9763,9762,9762,9762,9761,9761,9761,9760,9760,9759,9759,9759,9758,9758,9758,9757,9757,9756,9756,9756,9755,9755,9754,9754,9754,9753,9753,9753,9752,9752,9751,9751,9751,9750,9750,9749,9749,9749,9748,9748,9748,9747,9747,9746,9746,9746,9745,9745,9744,9744,9744,9743,9743,9742,9742,9742,9741,9741,9740,9740,9740,9739,9739,9738,9738,9738,9737,9737,9736,9736,9736,9735,9735,9734,9734,9734,9733,9733,9732,9732,9732,9731,9731,9730,9730,9730,9729,9729,9728,9728,9728,9727,9727,9726,9726,9726,9725,9725,9724,9724,9724,9723,9723,9722,9722,9722,9721,9721,9720,9720,9720,9719,9719,9718,9718,9717,9717,9717,9716,9716,9715,9715,9715,9714,9714,9713,9713,9713,9712,9712,9711,9711,9710,9710,9710,9709,9709,9708,9708,9708,9707,9707,9706,9706,9705,9705,9705,9704,9704,9703,9703,9702,9702,9702,9701,9701,9700,9700,9699,9699,9699,9698,9698,9697,9697,9697,9696,9696,9695,9695,9694,9694,9694,9693,9693,9692,9692,9691,9691,9691,9690,9690,9689,9689,9688,9688,9687,9687,9687,9686,9686,9685,9685,9684,9684,9684,9683,9683,9682,9682,9681,9681,9681,9680,9680,9679,9679,9678,9678,9677,9677,9677,9676,9676,9675,9675,9674,9674,9674,9673,9673,9672,9672,9671,9671,9670,9670,9670,9669,9669,9668,9668,9667,9667,9666,9666,9666,9665,9665,9664,9664,9663,9663,9662,9662,9661,9661,9661,9660,9660,9659,9659,9658,9658,9657,9657,9656,9656,9656,9655,9655,9654,9654,9653,9653,9652,9652,9651,9651,9651,9650,9650,9649,9649,9648,9648,9647,9647,9646,9646,9646,9645,9645,9644,9644,9643,9643,9642,9642,9641,9641,9640,9640,9640,9639,9639,9638,9638,9637,9637,9636,9636,9635,9635,9634,9634,9633,9633,9633,9632,9632,9631,9631,9630,9630,9629,9629,9628,9628,9627,9627,9626,9626,9625,9625,9625,9624,9624,9623,9623,9622,9622,9621,9621,9620,9620,9619,9619,9618,9618,9617,9617,9616,9616,9615,9615,9615,9614,9614,9613,9613,9612,9612,9611,9611,9610,9610,9609,9609,9608,9608,9607,9607,9606,9606,9605,9605,9604,9604,9603,9603,9602,9602,9601,9601,9600,9600,9600,9599,9599,9598,9598,9597,9597,9596,9596,9595,9595,9594,9594,9593,9593,9592,9592,9591,9591,9590,9590,9589,9589,9588,9588,9587,9587,9586,9586,9585,9585,9584,9584,9583,9583,9582,9582,9581,9581,9580,9580,9579,9579,9578,9578,9577,9577,9576,9576,9575,9575,9574,9574,9573,9573,9572,9572,9571,9571,9570,9570,9569,9569,9568,9568,9567,9567,9566,9566,9565,9565,9564,9564,9563,9563,9562,9562,9561,9561,9560,9559,9559,9558,9558,9557,9557,9556,9556,9555,9555,9554,9554,9553,9553,9552,9552,9551,9551,9550,9550,9549,9549,9548,9548,9547,9547,9546,9546,9545,9545,9544,9543,9543,9542,9542,9541,9541,9540,9540,9539,9539,9538,9538,9537,9537,9536,9536,9535,9535,9534,9534,9533,9532,9532,9531,9531,9530,9530,9529,9529,9528,9528,9527,9527,9526,9526,9525,9525,9524,9523,9523,9522,9522,9521,9521,9520,9520,9519,9519,9518,9518,9517,9517,9516,9515,9515,9514,9514,9513,9513,9512,9512,9511,9511,9510,9510,9509,9508,9508,9507,9507,9506,9506,9505,9505,9504,9504,9503,9502,9502,9501,9501,9500,9500,9499,9499,9498,9498,9497,9496,9496,9495,9495,9494,9494,9493,9493,9492,9492,9491,9490,9490,9489,9489,9488,9488,9487,9487,9486,9486,9485,9484,9484,9483,9483,9482,9482,9481,9481,9480,9479,9479,9478,9478,9477,9477,9476,9476,9475,9474,9474,9473,9473,9472,9472,9471,9470,9470,9469,9469,9468,9468,9467,9467,9466,9465,9465,9464,9464,9463,9463,9462,9461,9461,9460,9460,9459,9459,9458,9458,9457,9456,9456,9455,9455,9454,9454,9453,9452,9452,9451,9451,9450,9450,9449,9448,9448,9447,9447,9446,9446,9445,9444,9444,9443,9443,9442,9442,9441,9440,9440,9439,9439,9438,9438,9437,9436,9436,9435,9435,9434,9433,9433,9432,9432,9431,9431,9430,9429,9429,9428,9428,9427,9426,9426,9425,9425,9424,9424,9423,9422,9422,9421,9421,9420,9419,9419,9418,9418,9417,9417,9416,9415,9415,9414,9414,9413,9412,9412,9411,9411,9410,9409,9409,9408,9408,9407,9407,9406,9405,9405,9404,9404,9403,9402,9402,9401,9401,9400,9399,9399,9398,9398,9397,9396,9396,9395,9395,9394,9393,9393,9392,9392,9391,9390,9390,9389,9389,9388,9387,9387,9386,9386,9385,9384,9384,9383,9383,9382,9381,9381,9380,9380,9379,9378,9378,9377,9377,9376,9375,9375,9374,9374,9373,9372,9372,9371,9370,9370,9369,9369,9368,9367,9367,9366,9366,9365,9364,9364,9363,9363,9362,9361,9361,9360,9359,9359,9358,9358,9357,9356,9356,9355,9355,9354,9353,9353,9352,9351,9351,9350,9350,9349,9348,9348,9347,9347,9346,9345,9345,9344,9343,9343,9342,9342,9341,9340,9340,9339,9338,9338,9337,9337,9336,9335,9335,9334,9333,9333,9332,9332,9331,9330,9330,9329,9328,9328,9327,9327,9326,9325,9325,9324,9323,9323,9322,9321,9321,9320,9320,9319,9318,9318,9317,9316,9316,9315,9315,9314,9313,9313,9312,9311,9311,9310,9309,9309,9308,9308,9307,9306,9306,9305,9304,9304,9303,9302,9302,9301,9300,9300,9299,9299,9298,9297,9297,9296,9295,9295,9294,9293,9293,9292,9291,9291,9290,9290,9289,9288,9288,9287,9286,9286,9285,9284,9284,9283,9282,9282,9281,9280,9280,9279,9279,9278,9277,9277,9276,9275,9275,9274,9273,9273,9272,9271,9271,9270,9269,9269,9268,9267,9267,9266,9265,9265,9264,9263,9263,9262,9261,9261,9260,9260,9259,9258,9258,9257,9256,9256,9255,9254,9254,9253,9252,9252,9251,9250,9250,9249,9248,9248,9247,9246,9246,9245,9244,9244,9243,9242,9242,9241,9240,9240,9239,9238,9238,9237,9236,9236,9235,9234,9234,9233,9232,9232,9231,9230,9230,9229,9228,9228,9227,9226,9226,9225,9224,9224,9223,9222,9222,9221,9220,9219,9219,9218,9217,9217,9216,9215,9215,9214,9213,9213,9212,9211,9211,9210,9209,9209,9208,9207,9207,9206,9205,9205,9204,9203,9203,9202,9201,9200,9200,9199,9198,9198,9197,9196,9196,9195,9194,9194,9193,9192,9192,9191,9190,9189,9189,9188,9187,9187,9186,9185,9185,9184,9183,9183,9182,9181,9181,9180,9179,9178,9178,9177,9176,9176,9175,9174,9174,9173,9172,9171,9171,9170,9169,9169,9168,9167,9167,9166,9165,9165,9164,9163,9162,9162,9161,9160,9160,9159,9158,9158,9157,9156,9155,9155,9154,9153,9153,9152,9151,9151,9150,9149,9148,9148,9147,9146,9146,9145,9144,9143,9143,9142,9141,9141,9140,9139,9139,9138,9137,9136,9136,9135,9134,9134,9133,9132,9131,9131,9130,9129,9129,9128,9127,9126,9126,9125,9124,9124,9123,9122,9121,9121,9120,9119,9119,9118,9117,9116,9116,9115,9114,9114,9113,9112,9111,9111,9110,9109,9108,9108,9107,9106,9106,9105,9104,9103,9103,9102,9101,9101,9100,9099,9098,9098,9097,9096,9095,9095,9094,9093,9093,9092,9091,9090,9090,9089,9088,9087,9087,9086,9085,9085,9084,9083,9082,9082,9081,9080,9079,9079,9078,9077,9077,9076,9075,9074,9074,9073,9072,9071,9071,9070,9069,9068,9068,9067,9066,9066,9065,9064,9063,9063,9062,9061,9060,9060,9059,9058,9057,9057,9056,9055,9054,9054,9053,9052,9051,9051,9050,9049,9049,9048,9047,9046,9046,9045,9044,9043,9043,9042,9041,9040,9040,9039,9038,9037,9037,9036,9035,9034,9034,9033,9032,9031,9031,9030,9029,9028,9028,9027,9026,9025,9025,9024,9023,9022,9022,9021,9020,9019,9019,9018,9017,9016,9016,9015,9014,9013,9013,9012,9011,9010,9010,9009,9008,9007,9006,9006,9005,9004,9003,9003,9002,9001,9000,9000,8999,8998,8997,8997,8996,8995,8994,8994,8993,8992,8991,8990,8990,8989,8988,8987,8987,8986,8985,8984,8984,8983,8982,8981,8981,8980,8979,8978,8977,8977,8976,8975,8974,8974,8973,8972,8971,8971,8970,8969,8968,8967,8967,8966,8965,8964,8964,8963,8962,8961,8960,8960,8959,8958,8957,8957,8956,8955,8954,8954,8953,8952,8951,8950,8950,8949,8948,8947,8947,8946,8945,8944,8943,8943,8942,8941,8940,8939,8939,8938,8937,8936,8936,8935,8934,8933,8932,8932,8931,8930,8929,8929,8928,8927,8926,8925,8925,8924,8923,8922,8921,8921,8920,8919,8918,8917,8917,8916,8915,8914,8914,8913,8912,8911,8910,8910,8909,8908,8907,8906,8906,8905,8904,8903,8902,8902,8901,8900,8899,8898,8898,8897,8896,8895,8894,8894,8893,8892,8891,8890,8890,8889,8888,8887,8886,8886,8885,8884,8883,8882,8882,8881,8880,8879,8878,8878,8877,8876,8875,8874,8874,8873,8872,8871,8870,8870,8869,8868,8867,8866,8866,8865,8864,8863,8862,8862,8861,8860,8859,8858,8857,8857,8856,8855,8854,8853,8853,8852,8851,8850,8849,8849,8848,8847,8846,8845,8844,8844,8843,8842,8841,8840,8840,8839,8838,8837,8836,8836,8835,8834,8833,8832,8831,8831,8830,8829,8828,8827,8827,8826,8825,8824,8823,8822,8822,8821,8820,8819,8818,8817,8817,8816,8815,8814,8813,8813,8812,8811,8810,8809,8808,8808,8807,8806,8805,8804,8803,8803,8802,8801,8800,8799,8798,8798,8797,8796,8795,8794,8793,8793,8792,8791,8790,8789,8789,8788,8787,8786,8785,8784,8784,8783,8782,8781,8780,8779,8778,8778,8777,8776,8775,8774,8773,8773,8772,8771,8770,8769,8768,8768,8767,8766,8765,8764,8763,8763,8762,8761,8760,8759,8758,8758,8757,8756,8755,8754,8753,8752,8752,8751,8750,8749,8748,8747,8747,8746,8745,8744,8743,8742,8741,8741,8740,8739,8738,8737,8736,8736,8735,8734,8733,8732,8731,8730,8730,8729,8728,8727,8726,8725,8724,8724,8723,8722,8721,8720,8719,8718,8718,8717,8716,8715,8714,8713,8712,8712,8711,8710,8709,8708,8707,8706,8706,8705,8704,8703,8702,8701,8700,8700,8699,8698,8697,8696,8695,8694,8694,8693,8692,8691,8690,8689,8688,8688,8687,8686,8685,8684,8683,8682,8681,8681,8680,8679,8678,8677,8676,8675,8675,8674,8673,8672,8671,8670,8669,8668,8668,8667,8666,8665,8664,8663,8662,8661,8661,8660,8659,8658,8657,8656,8655,8655,8654,8653,8652,8651,8650,8649,8648,8648,8647,8646,8645,8644,8643,8642,8641,8640,8640,8639,8638,8637,8636,8635,8634,8633,8633,8632,8631,8630,8629,8628,8627,8626,8626,8625,8624,8623,8622,8621,8620,8619,8618,8618,8617,8616,8615,8614,8613,8612,8611,8610,8610,8609,8608,8607,8606,8605,8604,8603,8602,8602,8601,8600,8599,8598,8597,8596,8595,8594,8594,8593,8592,8591,8590,8589,8588,8587,8586,8586,8585,8584,8583,8582,8581,8580,8579,8578,8577,8577,8576,8575,8574,8573,8572,8571,8570,8569,8568,8568,8567,8566,8565,8564,8563,8562,8561,8560,8559,8559,8558,8557,8556,8555,8554,8553,8552,8551,8550,8550,8549,8548,8547,8546,8545,8544,8543,8542,8541,8540,8540,8539,8538,8537,8536,8535,8534,8533,8532,8531,8530,8530,8529,8528,8527,8526,8525,8524,8523,8522,8521,8520,8520,8519,8518,8517,8516,8515,8514,8513,8512,8511,8510,8509,8509,8508,8507,8506,8505,8504,8503,8502,8501,8500,8499,8498,8498,8497,8496,8495,8494,8493,8492,8491,8490,8489,8488,8487,8486,8486,8485,8484,8483,8482,8481,8480,8479,8478,8477,8476,8475,8474,8474,8473,8472,8471,8470,8469,8468,8467,8466,8465,8464,8463,8462,8461,8461,8460,8459,8458,8457,8456,8455,8454,8453,8452,8451,8450,8449,8448,8447,8447,8446,8445,8444,8443,8442,8441,8440,8439,8438,8437,8436,8435,8434,8433,8432,8432,8431,8430,8429,8428,8427,8426,8425,8424,8423,8422,8421,8420,8419,8418,8417,8416,8416,8415,8414,8413,8412,8411,8410,8409,8408,8407,8406,8405,8404,8403,8402,8401,8400,8399,8399,8398,8397,8396,8395,8394,8393,8392,8391,8390,8389,8388,8387,8386,8385,8384,8383,8382,8381,8380,8380,8379,8378,8377,8376,8375,8374,8373,8372,8371,8370,8369,8368,8367,8366,8365,8364,8363,8362,8361,8360,8359,8359,8358,8357,8356,8355,8354,8353,8352,8351,8350,8349,8348,8347,8346,8345,8344,8343,8342,8341,8340,8339,8338,8337,8336,8335,8335,8334,8333,8332,8331,8330,8329,8328,8327,8326,8325,8324,8323,8322,8321,8320,8319,8318,8317,8316,8315,8314,8313,8312,8311,8310,8309,8308,8307,8306,8305,8304,8304,8303,8302,8301,8300,8299,8298,8297,8296,8295,8294,8293,8292,8291,8290,8289,8288,8287,8286,8285,8284,8283,8282,8281,8280,8279,8278,8277,8276,8275,8274,8273,8272,8271,8270,8269,8268,8267,8266,8265,8264,8263,8262,8261,8260,8259,8259,8258,8257,8256,8255,8254,8253,8252,8251,8250,8249,8248,8247,8246,8245,8244,8243,8242,8241,8240,8239,8238,8237,8236,8235,8234,8233,8232,8231,8230,8229,8228,8227,8226,8225,8224,8223,8222,8221,8220,8219,8218,8217,8216,8215,8214,8213,8212,8211,8210,8209,8208,8207,8206,8205,8204,8203,8202,8201,8200,8199,8198,8197,8196,8195,8194,8193,8192,8191,8190,8189,8188,8187,8186,8185,8184,8183,8182,8181,8180,8179,8178,8177,8176,8175,8174,8173,8172,8171,8170,8169,8168,8167,8166,8165,8164,8163,8162,8161,8160,8159,8158,8157,8156,8155,8154,8153,8152,8151,8150,8149,8148,8147,8146,8145,8144,8143,8142,8141,8140,8139,8138,8137,8136,8135,8134,8133,8132,8131,8129,8128,8127,8126,8125,8124,8123,8122,8121,8120,8119,8118,8117,8116,8115,8114,8113,8112,8111,8110,8109,8108,8107,8106,8105,8104,8103,8102,8101,8100,8099,8098,8097,8096,8095,8094,8093,8092,8091,8090,8089,8088,8087,8086,8085,8084,8082,8081,8080,8079,8078,8077,8076,8075,8074,8073,8072,8071,8070,8069,8068,8067,8066,8065,8064,8063,8062,8061,8060,8059,8058,8057,8056,8055,8054,8053,8052,8051,8049,8048,8047,8046,8045,8044,8043,8042,8041,8040,8039,8038,8037,8036,8035,8034,8033,8032,8031,8030,8029,8028,8027,8026,8025,8024,8022,8021,8020,8019,8018,8017,8016,8015,8014,8013,8012,8011,8010,8009,8008,8007,8006,8005,8004,8003,8002,8001,7999,7998,7997,7996,7995,7994,7993,7992,7991,7990,7989,7988,7987,7986,7985,7984,7983,7982,7981,7980,7978,7977,7976,7975,7974,7973,7972,7971,7970,7969,7968,7967,7966,7965,7964,7963,7962,7961,7960,7958,7957,7956,7955,7954,7953,7952,7951,7950,7949,7948,7947,7946,7945,7944,7943,7942,7940,7939,7938,7937,7936,7935,7934,7933,7932,7931,7930,7929,7928,7927,7926,7925,7923,7922,7921,7920,7919,7918,7917,7916,7915,7914,7913,7912,7911,7910,7909,7907,7906,7905,7904,7903,7902,7901,7900,7899,7898,7897,7896,7895,7894,7892,7891,7890,7889,7888,7887,7886,7885,7884,7883,7882,7881,7880,7879,7877,7876,7875,7874,7873,7872,7871,7870,7869,7868,7867,7866,7865,7863,7862,7861,7860,7859,7858,7857,7856,7855,7854,7853,7852,7851,7849,7848,7847,7846,7845,7844,7843,7842,7841,7840,7839,7838,7836,7835,7834,7833,7832,7831,7830,7829,7828,7827,7826,7824,7823,7822,7821,7820,7819,7818,7817,7816,7815,7814,7813,7811,7810,7809,7808,7807,7806,7805,7804,7803,7802,7801,7799,7798,7797,7796,7795,7794,7793,7792,7791,7790,7789,7787,7786,7785,7784,7783,7782,7781,7780,7779,7778,7776,7775,7774,7773,7772,7771,7770,7769,7768,7767,7765,7764,7763,7762,7761,7760,7759,7758,7757,7756,7754,7753,7752,7751,7750,7749,7748,7747,7746,7745,7743,7742,7741,7740,7739,7738,7737,7736,7735,7733,7732,7731,7730,7729,7728,7727,7726,7725,7724,7722,7721,7720,7719,7718,7717,7716,7715,7714,7712,7711,7710,7709,7708,7707,7706,7705,7704,7702,7701,7700,7699,7698,7697,7696,7695,7693,7692,7691,7690,7689,7688,7687,7686,7685,7683,7682,7681,7680,7679,7678,7677,7676,7675,7673,7672,7671,7670,7669,7668,7667,7666,7664,7663,7662,7661,7660,7659,7658,7657,7655,7654,7653,7652,7651,7650,7649,7648,7646,7645,7644,7643,7642,7641,7640,7639,7637,7636,7635,7634,7633,7632,7631,7630,7628,7627,7626,7625,7624,7623,7622,7621,7619,7618,7617,7616,7615,7614,7613,7611,7610,7609,7608,7607,7606,7605,7604,7602,7601,7600,7599,7598,7597,7596,7594,7593,7592,7591,7590,7589,7588,7587,7585,7584,7583,7582,7581,7580,7579,7577,7576,7575,7574,7573,7572,7571,7569,7568,7567,7566,7565,7564,7563,7561,7560,7559,7558,7557,7556,7555,7553,7552,7551,7550,7549,7548,7547,7545,7544,7543,7542,7541,7540,7539,7537,7536,7535,7534,7533,7532,7531,7529,7528,7527,7526,7525,7524,7522,7521,7520,7519,7518,7517,7516,7514,7513,7512,7511,7510,7509,7508,7506,7505,7504,7503,7502,7501,7499,7498,7497,7496,7495,7494,7493,7491,7490,7489,7488,7487,7486,7484,7483,7482,7481,7480,7479,7477,7476,7475,7474,7473,7472,7471,7469,7468,7467,7466,7465,7464,7462,7461,7460,7459,7458,7457,7455,7454,7453,7452,7451,7450,7448,7447,7446,7445,7444,7443,7441,7440,7439,7438,7437,7436,7434,7433,7432,7431,7430,7429,7427,7426,7425,7424,7423,7422,7420,7419,7418,7417,7416,7415,7413,7412,7411,7410,7409,7408,7406,7405,7404,7403,7402,7401,7399,7398,7397,7396,7395,7393,7392,7391,7390,7389,7388,7386,7385,7384,7383,7382,7381,7379,7378,7377,7376,7375,7373,7372,7371,7370,7369,7368,7366,7365,7364,7363,7362,7360,7359,7358,7357,7356,7355,7353,7352,7351,7350,7349,7347,7346,7345,7344,7343,7342,7340,7339,7338,7337,7336,7334,7333,7332,7331,7330,7328,7327,7326,7325,7324,7323,7321,7320,7319,7318,7317,7315,7314,7313,7312,7311,7309,7308,7307,7306,7305,7304,7302,7301,7300,7299,7298,7296,7295,7294,7293,7292,7290,7289,7288,7287,7286,7284,7283,7282,7281,7280,7278,7277,7276,7275,7274,7272,7271,7270,7269,7268,7266,7265,7264,7263,7262,7260,7259,7258,7257,7256,7254,7253,7252,7251,7250,7248,7247,7246,7245,7244,7242,7241,7240,7239,7238,7236,7235,7234,7233,7232,7230,7229,7228,7227,7226,7224,7223,7222,7221,7220,7218,7217,7216,7215,7213,7212,7211,7210,7209,7207,7206,7205,7204,7203,7201,7200,7199,7198,7197,7195,7194,7193,7192,7190,7189,7188,7187,7186,7184,7183,7182,7181,7180,7178,7177,7176,7175,7173,7172,7171,7170,7169,7167,7166,7165,7164,7163,7161,7160,7159,7158,7156,7155,7154,7153,7152,7150,7149,7148,7147,7145,7144,7143,7142,7141,7139,7138,7137,7136,7134,7133,7132,7131,7130,7128,7127,7126,7125,7123,7122,7121,7120,7119,7117,7116,7115,7114,7112,7111,7110,7109,7107,7106,7105,7104,7103,7101,7100,7099,7098,7096,7095,7094,7093,7092,7090,7089,7088,7087,7085,7084,7083,7082,7080,7079,7078,7077,7076,7074,7073,7072,7071,7069,7068,7067,7066,7064,7063,7062,7061,7059,7058,7057,7056,7055,7053,7052,7051,7050,7048,7047,7046,7045,7043,7042,7041,7040,7038,7037,7036,7035,7033,7032,7031,7030,7028,7027,7026,7025,7024,7022,7021,7020,7019,7017,7016,7015,7014,7012,7011,7010,7009,7007,7006,7005,7004,7002,7001,7000,6999,6997,6996,6995,6994,6992,6991,6990,6989,6987,6986,6985,6984,6982,6981,6980,6979,6977,6976,6975,6974,6972,6971,6970,6969,6967,6966,6965,6964,6962,6961,6960,6959,6957,6956,6955,6954,6952,6951,6950,6949,6947,6946,6945,6944,6942,6941,6940,6939,6937,6936,6935,6934,6932,6931,6930,6928,6927,6926,6925,6923,6922,6921,6920,6918,6917,6916,6915,6913,6912,6911,6910,6908,6907,6906,6905,6903,6902,6901,6899,6898,6897,6896,6894,6893,6892,6891,6889,6888,6887,6886,6884,6883,6882,6881,6879,6878,6877,6875,6874,6873,6872,6870,6869,6868,6867,6865,6864,6863,6861,6860,6859,6858,6856,6855,6854,6853,6851,6850,6849,6848,6846,6845,6844,6842,6841,6840,6839,6837,6836,6835,6834,6832,6831,6830,6828,6827,6826,6825,6823,6822,6821,6819,6818,6817,6816,6814,6813,6812,6811,6809,6808,6807,6805,6804,6803,6802,6800,6799,6798,6796,6795,6794,6793,6791,6790,6789,6788,6786,6785,6784,6782,6781,6780,6779,6777,6776,6775,6773,6772,6771,6770,6768,6767,6766,6764,6763,6762,6761,6759,6758,6757,6755,6754,6753,6752,6750,6749,6748,6746,6745,6744,6743,6741,6740,6739,6737,6736,6735,6733,6732,6731,6730,6728,6727,6726,6724,6723,6722,6721,6719,6718,6717,6715,6714,6713,6712,6710,6709,6708,6706,6705,6704,6702,6701,6700,6699,6697,6696,6695,6693,6692,6691,6690,6688,6687,6686,6684,6683,6682,6680,6679,6678,6677,6675,6674,6673,6671,6670,6669,6667,6666,6665,6664,6662,6661,6660,6658,6657,6656,6654,6653,6652,6651,6649,6648,6647,6645,6644,6643,6641,6640,6639,6637,6636,6635,6634,6632,6631,6630,6628,6627,6626,6624,6623,6622,6620,6619,6618,6617,6615,6614,6613,6611,6610,6609,6607,6606,6605,6603,6602,6601,6600,6598,6597,6596,6594,6593,6592,6590,6589,6588,6586,6585,6584,6582,6581,6580,6579,6577,6576,6575,6573,6572,6571,6569,6568,6567,6565,6564,6563,6561,6560,6559,6557,6556,6555,6554,6552,6551,6550,6548,6547,6546,6544,6543,6542,6540,6539,6538,6536,6535,6534,6532,6531,6530,6528,6527,6526,6524,6523,6522,6520,6519,6518,6517,6515,6514,6513,6511,6510,6509,6507,6506,6505,6503,6502,6501,6499,6498,6497,6495,6494,6493,6491,6490,6489,6487,6486,6485,6483,6482,6481,6479,6478,6477,6475,6474,6473,6471,6470,6469,6467,6466,6465,6463,6462,6461,6459,6458,6457,6455,6454,6453,6451,6450,6449,6447,6446,6445,6443,6442,6441,6439,6438,6437,6435,6434,6433,6431,6430,6429,6427,6426,6425,6423,6422,6421,6419,6418,6417,6415,6414,6413,6411,6410,6409,6407,6406,6405,6403,6402,6401,6399,6398,6397,6395,6394,6393,6391,6390,6389,6387,6386,6384,6383,6382,6380,6379,6378,6376,6375,6374,6372,6371,6370,6368,6367,6366,6364,6363,6362,6360,6359,6358,6356,6355,6354,6352,6351,6350,6348,6347,6345,6344,6343,6341,6340,6339,6337,6336,6335,6333,6332,6331,6329,6328,6327,6325,6324,6322,6321,6320,6318,6317,6316,6314,6313,6312,6310,6309,6308,6306,6305,6304,6302,6301,6299,6298,6297,6295,6294,6293,6291,6290,6289,6287,6286,6285,6283,6282,6280,6279,6278,6276,6275,6274,6272,6271,6270,6268,6267,6266,6264,6263,6261,6260,6259,6257,6256,6255,6253,6252,6251,6249,6248,6246,6245,6244,6242,6241,6240,6238,6237,6236,6234,6233,6231,6230,6229,6227,6226,6225,6223,6222,6221,6219,6218,6216,6215,6214,6212,6211,6210,6208,6207,6206,6204,6203,6201,6200,6199,6197,6196,6195,6193,6192,6190,6189,6188,6186,6185,6184,6182,6181,6179,6178,6177,6175,6174,6173,6171,6170,6168,6167,6166,6164,6163,6162,6160,6159,6157,6156,6155,6153,6152,6151,6149,6148,6146,6145,6144,6142,6141,6140,6138,6137,6135,6134,6133,6131,6130,6129,6127,6126,6124,6123,6122,6120,6119,6118,6116,6115,6113,6112,6111,6109,6108,6106,6105,6104,6102,6101,6100,6098,6097,6095,6094,6093,6091,6090,6088,6087,6086,6084,6083,6082,6080,6079,6077,6076,6075,6073,6072,6070,6069,6068,6066,6065,6064,6062,6061,6059,6058,6057,6055,6054,6052,6051,6050,6048,6047,6045,6044,6043,6041,6040,6039,6037,6036,6034,6033,6032,6030,6029,6027,6026,6025,6023,6022,6020,6019,6018,6016,6015,6013,6012,6011,6009,6008,6006,6005,6004,6002,6001,6000,5998,5997,5995,5994,5993,5991,5990,5988,5987,5986,5984,5983,5981,5980,5979,5977,5976,5974,5973,5972,5970,5969,5967,5966,5965,5963,5962,5960,5959,5958,5956,5955,5953,5952,5951,5949,5948,5946,5945,5944,5942,5941,5939,5938,5936,5935,5934,5932,5931,5929,5928,5927,5925,5924,5922,5921,5920,5918,5917,5915,5914,5913,5911,5910,5908,5907,5906,5904,5903,5901,5900,5899,5897,5896,5894,5893,5891,5890,5889,5887,5886,5884,5883,5882,5880,5879,5877,5876,5875,5873,5872,5870,5869,5867,5866,5865,5863,5862,5860,5859,5858,5856,5855,5853,5852,5850,5849,5848,5846,5845,5843,5842,5841,5839,5838,5836,5835,5833,5832,5831,5829,5828,5826,5825,5824,5822,5821,5819,5818,5816,5815,5814,5812,5811,5809,5808,5807,5805,5804,5802,5801,5799,5798,5797,5795,5794,5792,5791,5789,5788,5787,5785,5784,5782,5781,5780,5778,5777,5775,5774,5772,5771,5770,5768,5767,5765,5764,5762,5761,5760,5758,5757,5755,5754,5752,5751,5750,5748,5747,5745,5744,5742,5741,5740,5738,5737,5735,5734,5732,5731,5730,5728,5727,5725,5724,5722,5721,5720,5718,5717,5715,5714,5712,5711,5710,5708,5707,5705,5704,5702,5701,5699,5698,5697,5695,5694,5692,5691,5689,5688,5687,5685,5684,5682,5681,5679,5678,5677,5675,5674,5672,5671,5669,5668,5666,5665,5664,5662,5661,5659,5658,5656,5655,5653,5652,5651,5649,5648,5646,5645,5643,5642,5641,5639,5638,5636,5635,5633,5632,5630,5629,5628,5626,5625,5623,5622,5620,5619,5617,5616,5615,5613,5612,5610,5609,5607,5606,5604,5603,5602,5600,5599,5597,5596,5594,5593,5591,5590,5589,5587,5586,5584,5583,5581,5580,5578,5577,5576,5574,5573,5571,5570,5568,5567,5565,5564,5562,5561,5560,5558,5557,5555,5554,5552,5551,5549,5548,5546,5545,5544,5542,5541,5539,5538,5536,5535,5533,5532,5531,5529,5528,5526,5525,5523,5522,5520,5519,5517,5516,5515,5513,5512,5510,5509,5507,5506,5504,5503,5501,5500,5498,5497,5496,5494,5493,5491,5490,5488,5487,5485,5484,5482,5481,5480,5478,5477,5475,5474,5472,5471,5469,5468,5466,5465,5463,5462,5461,5459,5458,5456,5455,5453,5452,5450,5449,5447,5446,5444,5443,5441,5440,5439,5437,5436,5434,5433,5431,5430,5428,5427,5425,5424,5422,5421,5420,5418,5417,5415,5414,5412,5411,5409,5408,5406,5405,5403,5402,5400,5399,5397,5396,5395,5393,5392,5390,5389,5387,5386,5384,5383,5381,5380,5378,5377,5375,5374,5372,5371,5370,5368,5367,5365,5364,5362,5361,5359,5358,5356,5355,5353,5352,5350,5349,5347,5346,5344,5343,5342,5340,5339,5337,5336,5334,5333,5331,5330,5328,5327,5325,5324,5322,5321,5319,5318,5316,5315,5313,5312,5311,5309,5308,5306,5305,5303,5302,5300,5299,5297,5296,5294,5293,5291,5290,5288,5287,5285,5284,5282,5281,5279,5278,5276,5275,5274,5272,5271,5269,5268,5266,5265,5263,5262,5260,5259,5257,5256,5254,5253,5251,5250,5248,5247,5245,5244,5242,5241,5239,5238,5236,5235,5233,5232,5230,5229,5227,5226,5224,5223,5222,5220,5219,5217,5216,5214,5213,5211,5210,5208,5207,5205,5204,5202,5201,5199,5198,5196,5195,5193,5192,5190,5189,5187,5186,5184,5183,5181,5180,5178,5177,5175,5174,5172,5171,5169,5168,5166,5165,5163,5162,5160,5159,5157,5156,5154,5153,5151,5150,5148,5147,5145,5144,5142,5141,5139,5138,5136,5135,5133,5132,5130,5129,5127,5126,5124,5123,5121,5120,5118,5117,5115,5114,5112,5111,5109,5108,5106,5105,5103,5102,5100,5099,5097,5096,5094,5093,5091,5090,5088,5087,5085,5084,5082,5081,5079,5078,5076,5075,5073,5072,5070,5069,5067,5066,5064,5063,5061,5060,5058,5057,5055,5054,5052,5051,5049,5048,5046,5045,5043,5042,5040,5039,5037,5036,5034,5033,5031,5030,5028,5027,5025,5024,5022,5021,5019,5018,5016,5015,5013,5012,5010,5009,5007,5006,5004,5003,5001,5000,4998,4996,4995,4993,4992,4990,4989,4987,4986,4984,4983,4981,4980,4978,4977,4975,4974,4972,4971,4969,4968,4966,4965,4963,4962,4960,4959,4957,4956,4954,4953,4951,4950,4948,4947,4945,4943,4942,4940,4939,4937,4936,4934,4933,4931,4930,4928,4927,4925,4924,4922,4921,4919,4918,4916,4915,4913,4912,4910,4909,4907,4905,4904,4902,4901,4899,4898,4896,4895,4893,4892,4890,4889,4887,4886,4884,4883,4881,4880,4878,4877,4875,4874,4872,4870,4869,4867,4866,4864,4863,4861,4860,4858,4857,4855,4854,4852,4851,4849,4848,4846,4845,4843,4841,4840,4838,4837,4835,4834,4832,4831,4829,4828,4826,4825,4823,4822,4820,4819,4817,4816,4814,4812,4811,4809,4808,4806,4805,4803,4802,4800,4799,4797,4796,4794,4793,4791,4789,4788,4786,4785,4783,4782,4780,4779,4777,4776,4774,4773,4771,4770,4768,4766,4765,4763,4762,4760,4759,4757,4756,4754,4753,4751,4750,4748,4747,4745,4743,4742,4740,4739,4737,4736,4734,4733,4731,4730,4728,4727,4725,4723,4722,4720,4719,4717,4716,4714,4713,4711,4710,4708,4707,4705,4703,4702,4700,4699,4697,4696,4694,4693,4691,4690,4688,4687,4685,4683,4682,4680,4679,4677,4676,4674,4673,4671,4670,4668,4666,4665,4663,4662,4660,4659,4657,4656,4654,4653,4651,4649,4648,4646,4645,4643,4642,4640,4639,4637,4636,4634,4632,4631,4629,4628,4626,4625,4623,4622,4620,4619,4617,4615,4614,4612,4611,4609,4608,4606,4605,4603,4601,4600,4598,4597,4595,4594,4592,4591,4589,4588,4586,4584,4583,4581,4580,4578,4577,4575,4574,4572,4570,4569,4567,4566,4564,4563,4561,4560,4558,4557,4555,4553,4552,4550,4549,4547,4546,4544,4543,4541,4539,4538,4536,4535,4533,4532,4530,4529,4527,4525,4524,4522,4521,4519,4518,4516,4515,4513,4511,4510,4508,4507,4505,4504,4502,4500,4499,4497,4496,4494,4493,4491,4490,4488,4486,4485,4483,4482,4480,4479,4477,4476,4474,4472,4471,4469,4468,4466,4465,4463,4461,4460,4458,4457,4455,4454,4452,4451,4449,4447,4446,4444,4443,4441,4440,4438,4436,4435,4433,4432,4430,4429,4427,4426,4424,4422,4421,4419,4418,4416,4415,4413,4411,4410,4408,4407,4405,4404,4402,4400,4399,4397,4396,4394,4393,4391,4389,4388,4386,4385,4383,4382,4380,4379,4377,4375,4374,4372,4371,4369,4368,4366,4364,4363,4361,4360,4358,4357,4355,4353,4352,4350,4349,4347,4346,4344,4342,4341,4339,4338,4336,4335,4333,4331,4330,4328,4327,4325,4324,4322,4320,4319,4317,4316,4314,4312,4311,4309,4308,4306,4305,4303,4301,4300,4298,4297,4295,4294,4292,4290,4289,4287,4286,4284,4283,4281,4279,4278,4276,4275,4273,4272,4270,4268,4267,4265,4264,4262,4260,4259,4257,4256,4254,4253,4251,4249,4248,4246,4245,4243,4241,4240,4238,4237,4235,4234,4232,4230,4229,4227,4226,4224,4223,4221,4219,4218,4216,4215,4213,4211,4210,4208,4207,4205,4204,4202,4200,4199,4197,4196,4194,4192,4191,4189,4188,4186,4185,4183,4181,4180,4178,4177,4175,4173,4172,4170,4169,4167,4165,4164,4162,4161,4159,4158,4156,4154,4153,4151,4150,4148,4146,4145,4143,4142,4140,4138,4137,4135,4134,4132,4131,4129,4127,4126,4124,4123,4121,4119,4118,4116,4115,4113,4111,4110,4108,4107,4105,4104,4102,4100,4099,4097,4096,4094,4092,4091,4089,4088,4086,4084,4083,4081,4080,4078,4076,4075,4073,4072,4070,4068,4067,4065,4064,4062,4060,4059,4057,4056,4054,4053,4051,4049,4048,4046,4045,4043,4041,4040,4038,4037,4035,4033,4032,4030,4029,4027,4025,4024,4022,4021,4019,4017,4016,4014,4013,4011,4009,4008,4006,4005,4003,4001,4000,3998,3997,3995,3993,3992,3990,3989,3987,3985,3984,3982,3981,3979,3977,3976,3974,3973,3971,3969,3968,3966,3965,3963,3961,3960,3958,3957,3955,3953,3952,3950,3949,3947,3945,3944,3942,3941,3939,3937,3936,3934,3933,3931,3929,3928,3926,3924,3923,3921,3920,3918,3916,3915,3913,3912,3910,3908,3907,3905,3904,3902,3900,3899,3897,3896,3894,3892,3891,3889,3888,3886,3884,3883,3881,3879,3878,3876,3875,3873,3871,3870,3868,3867,3865,3863,3862,3860,3859,3857,3855,3854,3852,3851,3849,3847,3846,3844,3842,3841,3839,3838,3836,3834,3833,3831,3830,3828,3826,3825,3823,3821,3820,3818,3817,3815,3813,3812,3810,3809,3807,3805,3804,3802,3801,3799,3797,3796,3794,3792,3791,3789,3788,3786,3784,3783,3781,3780,3778,3776,3775,3773,3771,3770,3768,3767,3765,3763,3762,3760,3759,3757,3755,3754,3752,3750,3749,3747,3746,3744,3742,3741,3739,3737,3736,3734,3733,3731,3729,3728,3726,3725,3723,3721,3720,3718,3716,3715,3713,3712,3710,3708,3707,3705,3703,3702,3700,3699,3697,3695,3694,3692,3690,3689,3687,3686,3684,3682,3681,3679,3677,3676,3674,3673,3671,3669,3668,3666,3665,3663,3661,3660,3658,3656,3655,3653,3652,3650,3648,3647,3645,3643,3642,3640,3639,3637,3635,3634,3632,3630,3629,3627,3626,3624,3622,3621,3619,3617,3616,3614,3612,3611,3609,3608,3606,3604,3603,3601,3599,3598,3596,3595,3593,3591,3590,3588,3586,3585,3583,3582,3580,3578,3577,3575,3573,3572,3570,3569,3567,3565,3564,3562,3560,3559,3557,3555,3554,3552,3551,3549,3547,3546,3544,3542,3541,3539,3538,3536,3534,3533,3531,3529,3528,3526,3524,3523,3521,3520,3518,3516,3515,3513,3511,3510,3508,3506,3505,3503,3502,3500,3498,3497,3495,3493,3492,3490,3488,3487,3485,3484,3482,3480,3479,3477,3475,3474,3472,3470,3469,3467,3466,3464,3462,3461,3459,3457,3456,3454,3452,3451,3449,3448,3446,3444,3443,3441,3439,3438,3436,3434,3433,3431,3430,3428,3426,3425,3423,3421,3420,3418,3416,3415,3413,3411,3410,3408,3407,3405,3403,3402,3400,3398,3397,3395,3393,3392,3390,3389,3387,3385,3384,3382,3380,3379,3377,3375,3374,3372,3370,3369,3367,3366,3364,3362,3361,3359,3357,3356,3354,3352,3351,3349,3347,3346,3344,3343,3341,3339,3338,3336,3334,3333,3331,3329,3328,3326,3324,3323,3321,3319,3318,3316,3315,3313,3311,3310,3308,3306,3305,3303,3301,3300,3298,3296,3295,3293,3291,3290,3288,3287,3285,3283,3282,3280,3278,3277,3275,3273,3272,3270,3268,3267,3265,3263,3262,3260,3258,3257,3255,3254,3252,3250,3249,3247,3245,3244,3242,3240,3239,3237,3235,3234,3232,3230,3229,3227,3225,3224,3222,3221,3219,3217,3216,3214,3212,3211,3209,3207,3206,3204,3202,3201,3199,3197,3196,3194,3192,3191,3189,3187,3186,3184,3182,3181,3179,3178,3176,3174,3173,3171,3169,3168,3166,3164,3163,3161,3159,3158,3156,3154,3153,3151,3149,3148,3146,3144,3143,3141,3139,3138,3136,3134,3133,3131,3129,3128,3126,3125,3123,3121,3120,3118,3116,3115,3113,3111,3110,3108,3106,3105,3103,3101,3100,3098,3096,3095,3093,3091,3090,3088,3086,3085,3083,3081,3080,3078,3076,3075,3073,3071,3070,3068,3066,3065,3063,3061,3060,3058,3056,3055,3053,3051,3050,3048,3046,3045,3043,3041,3040,3038,3037,3035,3033,3032,3030,3028,3027,3025,3023,3022,3020,3018,3017,3015,3013,3012,3010,3008,3007,3005,3003,3002,3000,2998,2997,2995,2993,2992,2990,2988,2987,2985,2983,2982,2980,2978,2977,2975,2973,2972,2970,2968,2967,2965,2963,2962,2960,2958,2957,2955,2953,2952,2950,2948,2947,2945,2943,2942,2940,2938,2937,2935,2933,2932,2930,2928,2927,2925,2923,2922,2920,2918,2917,2915,2913,2912,2910,2908,2907,2905,2903,2902,2900,2898,2897,2895,2893,2891,2890,2888,2886,2885,2883,2881,2880,2878,2876,2875,2873,2871,2870,2868,2866,2865,2863,2861,2860,2858,2856,2855,2853,2851,2850,2848,2846,2845,2843,2841,2840,2838,2836,2835,2833,2831,2830,2828,2826,2825,2823,2821,2820,2818,2816,2815,2813,2811,2810,2808,2806,2804,2803,2801,2799,2798,2796,2794,2793,2791,2789,2788,2786,2784,2783,2781,2779,2778,2776,2774,2773,2771,2769,2768,2766,2764,2763,2761,2759,2758,2756,2754,2753,2751,2749,2747,2746,2744,2742,2741,2739,2737,2736,2734,2732,2731,2729,2727,2726,2724,2722,2721,2719,2717,2716,2714,2712,2711,2709,2707,2706,2704,2702,2700,2699,2697,2695,2694,2692,2690,2689,2687,2685,2684,2682,2680,2679,2677,2675,2674,2672,2670,2669,2667,2665,2663,2662,2660,2658,2657,2655,2653,2652,2650,2648,2647,2645,2643,2642,2640,2638,2637,2635,2633,2631,2630,2628,2626,2625,2623,2621,2620,2618,2616,2615,2613,2611,2610,2608,2606,2605,2603,2601,2599,2598,2596,2594,2593,2591,2589,2588,2586,2584,2583,2581,2579,2578,2576,2574,2573,2571,2569,2567,2566,2564,2562,2561,2559,2557,2556,2554,2552,2551,2549,2547,2546,2544,2542,2540,2539,2537,2535,2534,2532,2530,2529,2527,2525,2524,2522,2520,2519,2517,2515,2513,2512,2510,2508,2507,2505,2503,2502,2500,2498,2497,2495,2493,2491,2490,2488,2486,2485,2483,2481,2480,2478,2476,2475,2473,2471,2469,2468,2466,2464,2463,2461,2459,2458,2456,2454,2453,2451,2449,2447,2446,2444,2442,2441,2439,2437,2436,2434,2432,2431,2429,2427,2425,2424,2422,2420,2419,2417,2415,2414,2412,2410,2409,2407,2405,2403,2402,2400,2398,2397,2395,2393,2392,2390,2388,2387,2385,2383,2381,2380,2378,2376,2375,2373,2371,2370,2368,2366,2364,2363,2361,2359,2358,2356,2354,2353,2351,2349,2348,2346,2344,2342,2341,2339,2337,2336,2334,2332,2331,2329,2327,2325,2324,2322,2320,2319,2317,2315,2314,2312,2310,2308,2307,2305,2303,2302,2300,2298,2297,2295,2293,2292,2290,2288,2286,2285,2283,2281,2280,2278,2276,2275,2273,2271,2269,2268,2266,2264,2263,2261,2259,2258,2256,2254,2252,2251,2249,2247,2246,2244,2242,2241,2239,2237,2235,2234,2232,2230,2229,2227,2225,2223,2222,2220,2218,2217,2215,2213,2212,2210,2208,2206,2205,2203,2201,2200,2198,2196,2195,2193,2191,2189,2188,2186,2184,2183,2181,2179,2178,2176,2174,2172,2171,2169,2167,2166,2164,2162,2160,2159,2157,2155,2154,2152,2150,2149,2147,2145,2143,2142,2140,2138,2137,2135,2133,2132,2130,2128,2126,2125,2123,2121,2120,2118,2116,2114,2113,2111,2109,2108,2106,2104,2103,2101,2099,2097,2096,2094,2092,2091,2089,2087,2085,2084,2082,2080,2079,2077,2075,2073,2072,2070,2068,2067,2065,2063,2062,2060,2058,2056,2055,2053,2051,2050,2048,2046,2044,2043,2041,2039,2038,2036,2034,2032,2031,2029,2027,2026,2024,2022,2021,2019,2017,2015,2014,2012,2010,2009,2007,2005,2003,2002,2000,1998,1997,1995,1993,1991,1990,1988,1986,1985,1983,1981,1979,1978,1976,1974,1973,1971,1969,1968,1966,1964,1962,1961,1959,1957,1956,1954,1952,1950,1949,1947,1945,1944,1942,1940,1938,1937,1935,1933,1932,1930,1928,1926,1925,1923,1921,1920,1918,1916,1914,1913,1911,1909,1908,1906,1904,1902,1901,1899,1897,1896,1894,1892,1890,1889,1887,1885,1884,1882,1880,1878,1877,1875,1873,1872,1870,1868,1866,1865,1863,1861,1860,1858,1856,1854,1853,1851,1849,1848,1846,1844,1842,1841,1839,1837,1836,1834,1832,1830,1829,1827,1825,1824,1822,1820,1818,1817,1815,1813,1812,1810,1808,1806,1805,1803,1801,1800,1798,1796,1794,1793,1791,1789,1788,1786,1784,1782,1781,1779,1777,1776,1774,1772,1770,1769,1767,1765,1763,1762,1760,1758,1757,1755,1753,1751,1750,1748,1746,1745,1743,1741,1739,1738,1736,1734,1733,1731,1729,1727,1726,1724,1722,1721,1719,1717,1715,1714,1712,1710,1708,1707,1705,1703,1702,1700,1698,1696,1695,1693,1691,1690,1688,1686,1684,1683,1681,1679,1678,1676,1674,1672,1671,1669,1667,1665,1664,1662,1660,1659,1657,1655,1653,1652,1650,1648,1647,1645,1643,1641,1640,1638,1636,1634,1633,1631,1629,1628,1626,1624,1622,1621,1619,1617,1616,1614,1612,1610,1609,1607,1605,1603,1602,1600,1598,1597,1595,1593,1591,1590,1588,1586,1585,1583,1581,1579,1578,1576,1574,1572,1571,1569,1567,1566,1564,1562,1560,1559,1557,1555,1554,1552,1550,1548,1547,1545,1543,1541,1540,1538,1536,1535,1533,1531,1529,1528,1526,1524,1522,1521,1519,1517,1516,1514,1512,1510,1509,1507,1505,1503,1502,1500,1498,1497,1495,1493,1491,1490,1488,1486,1484,1483,1481,1479,1478,1476,1474,1472,1471,1469,1467,1466,1464,1462,1460,1459,1457,1455,1453,1452,1450,1448,1447,1445,1443,1441,1440,1438,1436,1434,1433,1431,1429,1428,1426,1424,1422,1421,1419,1417,1415,1414,1412,1410,1409,1407,1405,1403,1402,1400,1398,1396,1395,1393,1391,1390,1388,1386,1384,1383,1381,1379,1377,1376,1374,1372,1370,1369,1367,1365,1364,1362,1360,1358,1357,1355,1353,1351,1350,1348,1346,1345,1343,1341,1339,1338,1336,1334,1332,1331,1329,1327,1326,1324,1322,1320,1319,1317,1315,1313,1312,1310,1308,1306,1305,1303,1301,1300,1298,1296,1294,1293,1291,1289,1287,1286,1284,1282,1281,1279,1277,1275,1274,1272,1270,1268,1267,1265,1263,1261,1260,1258,1256,1255,1253,1251,1249,1248,1246,1244,1242,1241,1239,1237,1236,1234,1232,1230,1229,1227,1225,1223,1222,1220,1218,1216,1215,1213,1211,1210,1208,1206,1204,1203,1201,1199,1197,1196,1194,1192,1190,1189,1187,1185,1184,1182,1180,1178,1177,1175,1173,1171,1170,1168,1166,1164,1163,1161,1159,1158,1156,1154,1152,1151,1149,1147,1145,1144,1142,1140,1138,1137,1135,1133,1132,1130,1128,1126,1125,1123,1121,1119,1118,1116,1114,1112,1111,1109,1107,1106,1104,1102,1100,1099,1097,1095,1093,1092,1090,1088,1086,1085,1083,1081,1079,1078,1076,1074,1073,1071,1069,1067,1066,1064,1062,1060,1059,1057,1055,1053,1052,1050,1048,1047,1045,1043,1041,1040,1038,1036,1034,1033,1031,1029,1027,1026,1024,1022,1020,1019,1017,1015,1014,1012,1010,1008,1007,1005,1003,1001,1000,998,996,994,993,991,989,987,986,984,982,981,979,977,975,974,972,970,968,967,965,963,961,960,958,956,954,953,951,949,948,946,944,942,941,939,937,935,934,932,930,928,927,925,923,921,920,918,916,915,913,911,909,908,906,904,902,901,899,897,895,894,892,890,888,887,885,883,881,880,878,876,875,873,871,869,868,866,864,862,861,859,857,855,854,852,850,848,847,845,843,841,840,838,836,835,833,831,829,828,826,824,822,821,819,817,815,814,812,810,808,807,805,803,801,800,798,796,795,793,791,789,788,786,784,782,781,779,777,775,774,772,770,768,767,765,763,761,760,758,756,755,753,751,749,748,746,744,742,741,739,737,735,734,732,730,728,727,725,723,721,720,718,716,714,713,711,709,708,706,704,702,701,699,697,695,694,692,690,688,687,685,683,681,680,678,676,674,673,671,669,667,666,664,662,660,659,657,655,654,652,650,648,647,645,643,641,640,638,636,634,633,631,629,627,626,624,622,620,619,617,615,613,612,610,608,607,605,603,601,600,598,596,594,593,591,589,587,586,584,582,580,579,577,575,573,572,570,568,566,565,563,561,559,558,556,554,552,551,549,547,546,544,542,540,539,537,535,533,532,530,528,526,525,523,521,519,518,516,514,512,511,509,507,505,504,502,500,498,497,495,493,491,490,488,486,485,483,481,479,478,476,474,472,471,469,467,465,464,462,460,458,457,455,453,451,450,448,446,444,443,441,439,437,436,434,432,430,429,427,425,423,422,420,418,417,415,413,411,410,408,406,404,403,401,399,397,396,394,392,390,389,387,385,383,382,380,378,376,375,373,371,369,368,366,364,362,361,359,357,355,354,352,350,348,347,345,343,342,340,338,336,335,333,331,329,328,326,324,322,321,319,317,315,314,312,310,308,307,305,303,301,300,298,296,294,293,291,289,287,286,284,282,280,279,277,275,273,272,270,268,267,265,263,261,260,258,256,254,253,251,249,247,246,244,242,240,239,237,235,233,232,230,228,226,225,223,221,219,218,216,214,212,211,209,207,205,204,202,200,198,197,195,193,191,190,188,186,184,183,181,179,178,176,174,172,171,169,167,165,164,162,160,158,157,155,153,151,150,148,146,144,143,141,139,137,136,134,132,130,129,127,125,123,122,120,118,116,115,113,111,109,108,106,104,102,101,99,97,95,94,92,90,89,87,85,83,82,80,78,76,75,73,71,69,68,66,64,62,61,59,57,55,54,52,50,48,47,45,43,41,40,38,36,34,33,31,29,27,26,24,22,20,19,17,15,13,12,10,8,6,5,3,1,0]\r\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/load.mcfunction",
    "content": "# (GM4) moved from internal/technical/load\n# LOAD FUNCTION\n\n# STORAGE\ndata modify storage gm4_player_motion:math unitvector set value [0.0d,0.0d,0.0d]\ndata modify storage gm4_player_motion:math motion set value [0.0d,0.0d,0.0d]\ndata modify storage gm4_player_motion:math pos set value [0.0d,0.0d,0.0d]\n\n# TICK FUNCTION\nschedule function gm4_player_motion:internal/technical/tick 1t append\n\n# SCORES\nscoreboard objectives add gm4_player_motion.api.launch dummy\nscoreboard objectives add gm4_player_motion.internal.dummy dummy\nscoreboard objectives add gm4_player_motion.internal.math dummy\n    scoreboard objectives add gm4_player_motion.internal.math.sqrt dummy\nscoreboard objectives add gm4_player_motion.internal.const dummy\n    scoreboard players set #constant.-1 gm4_player_motion.internal.const -1\n    scoreboard players set #constant.2 gm4_player_motion.internal.const 2\n    scoreboard players set #constant.10 gm4_player_motion.internal.const 10\n    scoreboard players set #constant.12 gm4_player_motion.internal.const 12\n    scoreboard players set #constant.1000 gm4_player_motion.internal.const 1000\n    scoreboard players set #constant.100 gm4_player_motion.internal.const 100\n    scoreboard players set #constant.fpc gm4_player_motion.internal.const 8000\nscoreboard objectives add gm4_player_motion.internal.motion.x dummy\nscoreboard objectives add gm4_player_motion.internal.motion.y dummy\nscoreboard objectives add gm4_player_motion.internal.motion.z dummy\nscoreboard objectives add gm4_player_motion.internal.gamemode dummy\n\n# MARKER\nkill 9a347e6c-1ce5-434a-b717-6707d51f4299\n#    ^ (GM4) changed UUID to prevent potential conflict\nsummon marker 29999998.0 0.0 7133.0 {UUID:[I; -1707835796, 484787018, -1223203065, -719371623], Tags:[\"smithed.strict\", \"smithed.entity\"]}\n#             ^ (GM4) changed position to GM4 forceloaded chunk and changed UUID to prevent potential conflict\n\n# TRIG LOOKUP TABLE:\nfunction gm4_player_motion:internal/technical/trig\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/resolve_load/launch_looking.mcfunction",
    "content": "execute if score gm4_player_motion load.status matches 1 if score gm4_lore_minor load.status matches 0.. run function gm4_player_motion:api/launch_looking\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/function/resolve_load/launch_xyz.mcfunction",
    "content": "execute if score gm4_player_motion load.status matches 1 if score gm4_lore_minor load.status matches 0.. run function gm4_player_motion:api/launch_xyz\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/tags/function/launch_looking.json",
    "content": "{\n    \"values\": [\n        \"gm4_player_motion:resolve_load/launch_looking\"\n    ]\n}\n"
  },
  {
    "path": "lib_player_motion/data/gm4_player_motion/tags/function/launch_xyz.json",
    "content": "{\n    \"values\": [\n        \"gm4_player_motion:resolve_load/launch_xyz\"\n    ]\n}\n"
  },
  {
    "path": "lib_potion_tracking/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2021 Gamemode 4 Development\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib_potion_tracking/README.md",
    "content": "# lib_potion_tracking\nlib_potion_tracking is a mcfunction library that allows other data packs to track thrown splash or lingering potions. This can be used to create custom splash/lingering potion events.\n\n## How to Use\nThere are 2 function tags to be used: one to initially tag the potion to be tracked, and another which activates when the tracked potion lands.\n\n### Marking the Potion to be Tracked\nThe function tag `#gm4_potion_tracking:tag_potion` is used to tag potions. This function tag runs every tick `as @e[type=potion,tag=!gm4_potion_tracking_checked]` (all potions are tagged with `gm4_potion_tracking_checked`, so each potion is only checked once). Modules should add the tag `gm4_potion` to allow the library to track the potion.\n\nThe entire entity data of the potion is stored in data storage under the namespace `gm4_potion_tracking:temp entity_data`. This storage can be used to verify the potion, but directly tagging the entity using a conditional `@s` is usually more efficient:\n```mcfunction\ntag @s[tag=!gm4_potion,nbt={<REQUIRED_NBT>}] add gm4_potion\n```\n- Note that `tag=!gm4_potion` **should** be used before checking NBT, since multiple modules will be calling this function tag, thus checking for the tag first will prevent extra unnecessary nbt checks\n\nWhen the potion is tracked, a marker entity with the tag `gm4_potion_tracker` will be linked to the potion. The entire NBT data of the potion when it was thrown will be stored in the marker entity under the NBT `{data:{gm4_potion:{<Potion Entity NBT>}}}`.\n\n#### Tagging Example\nThe follow function will tag all invisibility splash/lingering potions for tracking:\n```mcfunction\ntag @s[tag=!gm4_potion,nbt={Item:{components:{\"minecraft:potion_contents\":{potion:\"minecraft:invisibility\"}}}}] add gm4_potion\ntag @s[tag=!gm4_potion,nbt={Item:{components:{\"minecraft:potion_contents\":{potion:\"minecraft:long_invisibility\"}}}}] add gm4_potion\ntag @s[tag=!gm4_potion,nbt={Item:{components:{\"minecraft:potion_contents\":{custom_effects:[{id:\"minecraft:invisibility\"}]}}}}] add gm4_potion\n```\n\nSo if the potion was a splash potion of invisibility, the summoned marker will have the following nbt: `{data:{gm4_potion:{Item:{id:\"minecraft:splash_potion\",count:1,components:{\"minecraft:potion_contents\":{potion:\"minecraft:invisibility\"}}}}}}`\n\n\n### Executing When the Potion Lands\nA function tag under the namespace `#gm4_potion_tracking:potion_landed` can be used to execute commands when the potion lands. This runs `as @e[type=marker,tag=gm4_potion_tracker] at @s`.\n\nWhen the potion lands, data storage under the namespace `gm4_potion_tracking:temp entity_data` is set to the original potion's entity nbt (set from the marker's entity NBT `{data:{gm4_potion:{<This data is copied over>}}}`). \n\nThe storage should be used to verify if the potion matches the module's custom potion. The marker's entity nbt is available (This is `@s` in the context of the function tag), but storage look up is more efficient in almost all cases.\n\n#### Landing Example\nThe following function will catch when invisibility potions hit something:\n```mcfunction\nexecute if data storage gm4_potion_tracking:temp entity_data.Item.components.\"minecraft:potion_contents\"{potion:\"minecraft:invisibility\"} run function ...\nexecute if data storage gm4_potion_tracking:temp entity_data.Item.components.\"minecraft:potion_contents\"{potion:\"minecraft:long_invisibility\"} run function ...\nexecute if data storage gm4_potion_tracking:temp entity_data.Item.components.\"minecraft:potion_contents\"{custom_effects:[{id:\"minecraft:invisibility\"}]} run function ...\n```\n\n## License\nThis library, and the contents of the `lib_potion_tracking` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License.\n"
  },
  {
    "path": "lib_potion_tracking/beet.yaml",
    "content": "id: gm4_potion_tracking\nname: Gamemode 4 Potion Tracking\nversion: 1.4.X\ndescription: Allows other datapacks to track thrown splash or lingering potions.\n\ndata_pack:\n  load: \n    data: data\n\npipeline:\n  - gm4.plugins.extend.library\n  - gm4.plugins.include.lib_forceload\n\nmeta:\n  gm4:\n    versioning:\n      required: \n        lib_forceload: 1.6.0\n      extra_version_injections: \n        functions: [resolve_tick]\n    smithed:\n      pack_id: gm4_lib_potion_tracking\n    credits:\n      Creator:\n        - BPR\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_forceload/tags/function/command_block_tick.json",
    "content": "{\n    \"values\": [\n        \"gm4_potion_tracking:resolve_tick\"\n    ]\n}\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_potion_tracking/function/load.mcfunction",
    "content": "scoreboard objectives add gm4_potion_id dummy\nscoreboard objectives add gm4_potion_time dummy\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_potion_tracking/function/potion.mcfunction",
    "content": "# executes commands as all potion entities\n# @s = all potion entities\n# located at world spawn\n# run from gm4_potion_tracking-1.0:tick\n\n# allow modules to check if potions should be tracked\nexecute if entity @s[tag=!gm4_potion_tracking_checked] run function gm4_potion_tracking:track/check_potion\n\n# track custom potions\nexecute if entity @s[tag=gm4_potion] at @s run function gm4_potion_tracking:track/potion\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_potion_tracking/function/resolve_tick.mcfunction",
    "content": "# checks if potion_tracking module is loaded\n# @s = forceloaded command block \n# located at 29999998 1 7131\n# run from function tag #gm4_forceload:command_block_tick\n\nexecute if score gm4_potion_tracking load.status matches 1 run function gm4_potion_tracking:tick\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_potion_tracking/function/tick.mcfunction",
    "content": "# finds custom gm4 potions\n# @s = forceloaded command block \n# located at 29999998 1 7131\n# run from gm4_potion_tracking-1.0:resolve_tick\n\n# execute as all potions\nexecute as @e[type=#gm4_potion_tracking:potion] run function gm4_potion_tracking:potion\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_potion_tracking/function/track/check_marker.mcfunction",
    "content": "# checks potion_tracker markers \n# @s = none\n# located at world spawn\n# run from gm4_potion_tracking-1.0:track/potion\n\nexecute as @e[type=marker,tag=gm4_potion_tracker] at @s run function gm4_potion_tracking:track/marker\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_potion_tracking/function/track/check_potion.mcfunction",
    "content": "# checks if potions should be tracked\n# @s = all potions that haven't yet been checked\n# located at world spawn\n# run from gm4_potion_tracking-1.0:potion\n\n# set storage to be used when the function tag below is called\ndata modify storage gm4_potion_tracking:temp entity_data set from entity @s {}\n\n# function tag to allow modules to tag their custom potions (add tag gm4_potion)\nfunction #gm4_potion_tracking:tag_potion\n\n# don't check this potion again\ntag @s add gm4_potion_tracking_checked\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_potion_tracking/function/track/initialize_potion.mcfunction",
    "content": "# initializes potion with an id and potion tracker marker\n# @s = new custom potion\n# located at @s\n# run from gm4_potion_tracking-1.0:track/potion\n\n# give potion a score based on their UUID\nexecute store result score @s gm4_potion_id run data get entity @s UUID[3]\n\n# summon potion tracker marker\nsummon marker ~ ~ ~ {Tags:[\"gm4_potion_tracker\",\"gm4_potion_tracker_new\"]}\n\n# match potion tracker id to potion id\nscoreboard players operation @e[type=marker,tag=gm4_potion_tracker_new,limit=1] gm4_potion_id = @s gm4_potion_id\n\n# store entire potion data into marker data\ndata modify entity @e[type=marker,tag=gm4_potion_tracker_new,limit=1] data.gm4_potion set from storage gm4_potion_tracking:temp entity_data\n\n# clean up\ntag @e[type=marker] remove gm4_potion_tracker_new\ndata remove storage gm4_potion_tracking:temp entity_data\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_potion_tracking/function/track/marker.mcfunction",
    "content": "# runs commands for all custom potion tracker markers\n# @s = potion tracker marker\n# located at @s\n# run from gm4_potion_tracking-1.0:track/check_marker\n\n# check if their potion still exists\nscoreboard players operation $current gm4_potion_id = @s gm4_potion_id\nscoreboard players set $match gm4_potion_id 0\nexecute as @e[type=#gm4_potion_tracking:potion,tag=gm4_potion] if score @s gm4_potion_id = $current gm4_potion_id run scoreboard players set $match gm4_potion_id 1\n\n# if there is no matching potion, run their commands\nexecute unless score $match gm4_potion_id matches 1 run function gm4_potion_tracking:track/potion_landed\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_potion_tracking/function/track/potion.mcfunction",
    "content": "# runs commands for all custom potions\n# @s = custom gm4 potion (tag=gm4_potion)\n# located at @s\n# run from gm4_potion_tracking-1.0:potion\n\n# initialize potions\nexecute unless score @s gm4_potion_id = @s gm4_potion_id run function gm4_potion_tracking:track/initialize_potion\n\n# constantly teleport potion tracker marker to the potion\nscoreboard players operation $current gm4_potion_id = @s gm4_potion_id\nexecute as @e[type=marker,tag=gm4_potion_tracker] if score @s gm4_potion_id = $current gm4_potion_id run tp ~ ~ ~\n\n# schedule potion tracker detection\nschedule function gm4_potion_tracking:track/check_marker 1t\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_potion_tracking/function/track/potion_landed.mcfunction",
    "content": "# runs commands for landed custom potion tracker markers\n# @s = potion tracker marker\n# located at @s\n# run from gm4_potion_tracking-1.0:track/marker\n\n# run commands\ndata modify storage gm4_potion_tracking:temp entity_data set from entity @s data.gm4_potion\nfunction #gm4_potion_tracking:potion_landed\n\n# clean up\ndata remove storage gm4_potion_tracking:temp entity_data\nkill @s\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_potion_tracking/tags/entity_type/potion.json",
    "content": "{\n  \"values\": [\n    \"minecraft:lingering_potion\",\n    \"minecraft:splash_potion\"\n  ]\n}\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_potion_tracking/tags/function/potion_landed.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "lib_potion_tracking/data/gm4_potion_tracking/tags/function/tag_potion.json",
    "content": "{\n    \"values\": []\n}\n"
  },
  {
    "path": "lib_potion_tracking/mod.mcdoc",
    "content": "use ::java::world::entity::projectile::throwable::Potion\n\ndispatch minecraft:storage[gm4_potion_tracking:temp] to struct {\n  entity_data?: Potion,\n}\n"
  },
  {
    "path": "lib_trees/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2021 Gamemode 4 Development\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "lib_trees/README.md",
    "content": "# lib_trees\nlib_trees is a mcfunction library that facilites the creation of custom trees. This library handles many of the functions required for growing custom trees from saplings: sapling placement and breaking, tree growth via saplings, and sapling drops from specific leaves.\n\n## Example Pack\nThe example data pack has everything required to use this library (except for full lantern load implementation). This document will refer to the example pack for specific details.\n\n## Generating Trees with Worldgen\nThis library does not handle generation of trees via worldgen, but information of how to generate trees to be used in conjunction of this library will be outlined below.\n\nTrees will need to be defined using custom structures. It is technically possible to use configured features (how normal trees generate), but the sapling drops become more complex. This will only outline the process using structures. Refer to the `worldgen`, `tags`, and `structures` folder of the example pack to set up custom structures.\n\n### Leaf Markers\nThe most important thing for custom trees to be usable with this data pack is to add leaf markers to your trees. Leaf markers must be created with the `gm4_tree_leaf` tag and an additional identifier tag:\n```mcfunction\nsummon marker ~ ~ ~ {Tags:[\"gm4_tree_leaf\",\"LEAF_IDENTIFIER_TAG\"]}\n```\n\nMarkers can be placed in a few ways; this document will outline the 3 most reasonable ways.\n- Place a marker in every leaf\n    - This may get laggy if your trees have a lot of leaves, but will allow the tree to be \"fully custom\" since normal leaf drops can be deleted and replaced.\n- Place a few markers manually\n    - This is an option if you just want specific leaves to be able to drop saplings, but it will be the same for every tree\n- Use jigsaws to randomly select where markers should generate\n    - This is a better option if you don't want every leaf to have a marker, since it will allow for random leaves to have a sapling drop chance. This is the method present in the example pack.\n    - During worldgen, the location of these markers will be the same when using the same seed; this can be used to your advantage if you, for example, want fruit to generate at these leaves and have that be seed random.\n\n## Custom Saplings\n### Leaf Drops\nWhen a leaf marker is no longer in a leaf block, it will run the `#gm4_trees:destroy_leaf` function tag at the location of the leaf marker. The function tag should call a verification function to check if the marker was a custom marker from your data pack:\n```mcfunction\nexecute if entity @s[tag=LEAF_IDENTIFIER_TAG] run function ...\n```\nThat should run a function that drops a sapling and kills the marker (`@s`). The easiest way to drop saplings is to use a loot table to drop a custom sapling upon a specific chance, as shown in the example pack:\n```mcfunction\nloot spawn ~ ~ ~ loot ...\nkill @s\n```\n\n### Placing Saplings\nCustom sapling items need some specific data so this library knows it's a custom sapling and should be tracked when placed. You can use a command like below, or a loot table, like in the example pack. A loot table is recommended since it's more versatile.\n```mcfunction\n# any sapling type can be used\ngive @s oak_sapling{gm4_trees:{item:{id:\"sapling\",type:\"IDENTIFIER\"}}}\n```\n\nWhen these custom saplings are placed, the library will find the placed sapling and run the `#gm4_trees:initialize_sapling` function tag at the location of the sapling. The function tag should call a verification function to check if the sapling was a custom sapling from your data pack:\n```mcfunction\nexecute if data storage gm4_trees:temp sapling{type:\"IDENTIFIER\"} run function ...\n```\nThat should run a function that summons a marker with the `gm4_tree_sapling` tag and an additional identifier tag, and then sets its `gm4_sap_growth` score to a positive number. This score increases every time the sapling increases its `Age` block state. Vanilla saplings have 2 growth stages until they grow into a tree.\n```mcfunction\n# this marker must be spawned at the center of the block (which is where it's run from)\nsummon marker ~ ~ ~ {Tags:[\"gm4_tree_sapling\",\"SAPLING_ID_TAG\"]}\n# set stage requirement (higher = longer to grow)\nscoreboard players set @e[type=marker,tag=SAPLING_ID_TAG,distance=..0.1] gm4_sap_growth 2\n```\n\n### Breaking Saplings\nWhen a custom sapling is broken, the `#gm4_trees:destroy_sapling` function tag is run from the sapling marker. The function tag should call a verification function to check if the sapling marker was a custom sapling from your data pack:\n```mcfunction\nexecute if entity @s[tag=SAPLING_ID_TAG] run function ...\n```\nThat should run a function that replaces the normal item with the custom sapling item:\n```mcfunction\n# any sapling type can be used (as long as it matches the custom item)\nkill @e[type=item,nbt={Age:0s,Item:{id:\"minecraft:oak_sapling\",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0]\nloot spawn ~ ~ ~ loot gm4_trees_example:items/apple_tree_sapling\n```\n\n### Growing Saplings\nCustom saplings can be grown like vanilla saplings. The growth is based on the block state of the sapling, so bonemeal can be used like normal. When the age reaches the sapling marker's `gm4_sap_growth` score, it will generate a tree. When this happens, the `#gm4_trees:generate_tree` function tag will run at the location of the sapling marker. The function tag should call a verification function to check if the sapling was a custom sapling from your data pack:\n```mcfunction\nexecute if entity @s[tag=SAPLING_ID_TAG] run function ...\n```\nThat should run a function that generates the tree using `/place jigsaw` then kills the marker (`@s`):\n```mcfunction\n# generate tree using custom structure\nplace jigsaw gm4_trees_example:apple_trees gm4_trees:trunk 6 ~ ~1 ~\nkill @s\n```\n\n## License\nThis library, and the contents of the `lib_trees` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License.\n"
  },
  {
    "path": "lib_trees/beet.yaml",
    "content": "id: gm4_trees\nname: Gamemode 4 Trees\nversion: 1.5.X\ndescription: A mcfunction library that facilitates the creation of custom trees.\n\ndata_pack:\n  load: \n    data: data\n\npipeline:\n  - gm4.plugins.extend.library\n\nmeta: \n  gm4:\n    versioning:\n      schedule_loops:\n        - tick\n        - main\n      extra_version_injections:\n        advancements:\n          - place_sapling\n    smithed:\n      pack_id: gm4_lib_trees\n    credits:\n      Creator:\n        - BPR\n        - Bloo\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/advancement/place_sapling.json",
    "content": "{\n  \"criteria\": {\n    \"place_sapling\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:match_tool\",\n            \"predicate\": {\n              \"predicates\": {\n                \"minecraft:custom_data\": \"{gm4_trees:{item:{id:\\\"sapling\\\"}}}\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    \"backwards_compat\": {\n      \"trigger\": \"minecraft:placed_block\",\n      \"conditions\": {\n        \"location\": [\n          {\n            \"condition\": \"minecraft:match_tool\",\n            \"predicate\": {\n              \"predicates\": {\n                \"minecraft:custom_data\": \"{gm4_fruiting_trees:{item:{id:\\\"sapling\\\"}}}\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"requirements\": [\n    [\n      \"place_sapling\",\n      \"backwards_compat\"\n    ]\n  ],\n  \"rewards\": {\n    \"function\": \"gm4_trees:sapling/place_sapling\"\n  }\n}\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/function/load.mcfunction",
    "content": "scoreboard objectives add gm4_tree_data dummy\nscoreboard objectives add gm4_sap_stage dummy\nscoreboard objectives add gm4_sap_growth dummy\n\nschedule function gm4_trees:tick 1t replace\nschedule function gm4_trees:main 2t replace\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/function/main.mcfunction",
    "content": "\nschedule function gm4_trees:main 8t\n\n# upgrade old entities\nexecute as @e[type=marker,tag=gm4_fruiting_sapling] run function #gm4_trees:upgrade_fruiting_to_general\n\n# process leaves\nexecute as @e[type=marker,tag=gm4_tree_leaf] at @s if block ~ ~ ~ #gm4_trees:empty_block run function #gm4_trees:destroy_leaf\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/function/sapling/advance_stage.mcfunction",
    "content": "# reverts the sapling to stage=0\n# @s = sapling marker\n# at @s align xyz\n# run from gm4_trees:sapling/process\n\n# prevent normal tree from spawning\nexecute if block ~ ~ ~ minecraft:oak_sapling run setblock ~ ~ ~ minecraft:oak_sapling[stage=0]\nexecute if block ~ ~ ~ minecraft:birch_sapling run setblock ~ ~ ~ minecraft:birch_sapling[stage=0]\nexecute if block ~ ~ ~ minecraft:spruce_sapling run setblock ~ ~ ~ minecraft:spruce_sapling[stage=0]\nexecute if block ~ ~ ~ minecraft:jungle_sapling run setblock ~ ~ ~ minecraft:jungle_sapling[stage=0]\nexecute if block ~ ~ ~ minecraft:acacia_sapling run setblock ~ ~ ~ minecraft:acacia_sapling[stage=0]\nexecute if block ~ ~ ~ minecraft:dark_oak_sapling run setblock ~ ~ ~ minecraft:dark_oak_sapling[stage=0]\nexecute if block ~ ~ ~ minecraft:pale_oak_sapling run setblock ~ ~ ~ minecraft:pale_oak_sapling[stage=0]\nexecute if block ~ ~ ~ minecraft:mangrove_propagule[waterlogged=false,hanging=false,age=4] run setblock ~ ~ ~ minecraft:mangrove_propagule[stage=0,age=4,waterlogged=false]\nexecute if block ~ ~ ~ minecraft:mangrove_propagule[waterlogged=true,hanging=false,age=4] run setblock ~ ~ ~ minecraft:mangrove_propagule[stage=0,age=4,waterlogged=true]\nexecute if block ~ ~ ~ minecraft:cherry_sapling run setblock ~ ~ ~ minecraft:cherry_sapling[stage=0]\n\n# advance stage of custom sapling, if stage is large enough, grow the tree\nscoreboard players add @s gm4_sap_stage 1\nexecute if score @s gm4_sap_stage >= @s gm4_sap_growth run function #gm4_trees:generate_tree\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/function/sapling/destroy.mcfunction",
    "content": "# kill marker if not inside a sapling anymore\n# @s = any gm4_tree_sapling\n# at @s\n# run from gm4_trees:sapling/process\n\n# restore the data of the sapling and kill marker\nfunction #gm4_trees:destroy_sapling\nkill @s\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/function/sapling/find_adjacent_sapling.mcfunction",
    "content": "# ray cast to find sapling\n# @s = player that placed a custom sapling\n# at a position along a ray originating from the player's eyes\n# run from gm4_trees:sapling/place_sapling\n\n# check adjacent blocks\nexecute positioned ~1 ~ ~ if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker\nexecute positioned ~ ~1 ~ if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker\nexecute positioned ~ ~ ~1 if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker\nexecute positioned ~-1 ~ ~ if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker\nexecute positioned ~ ~-1 ~ if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker\nexecute positioned ~ ~ ~-1 if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker\n\n# runs the loop again\nscoreboard players remove $ray gm4_tree_data 1\nexecute if score $ray gm4_tree_data matches 1.. positioned ^ ^ ^0.013 run function gm4_trees:sapling/find_adjacent_sapling\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/function/sapling/find_sapling.mcfunction",
    "content": "# ray cast to find sapling\n# @s = player that placed a custom sapling\n# at a position along a ray originating from the player's eyes\n# run from gm4_trees:sapling/place_sapling\n\n# check blocks on looking vector\nexecute if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker\n\n# runs the loop again\nscoreboard players remove $ray gm4_tree_data 1\nexecute if score $ray gm4_tree_data matches 0.. positioned ^ ^ ^0.013 run return run function gm4_trees:sapling/find_sapling\nexecute unless score $ray gm4_tree_data matches 0.. run return fail\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/function/sapling/place_sapling.mcfunction",
    "content": "# Initiates the search for the placed sapling\n# @s = player that just placed a custom sapling\n# at @s\n# run from advancement gm4_trees:place_sapling\n# run from function tag gm4_trees:place_sapling\n\nadvancement revoke @s only gm4_trees:place_sapling\n\n# check for sapling blocks on the looking vector of the player (most likely location)\nscoreboard players set $ray gm4_tree_data 500\nexecute store success score $found_sapling gm4_tree_data anchored eyes positioned ^ ^ ^ run function gm4_trees:sapling/find_sapling\n\n# if no sapling was found, check blocks adjacent to the looking vector\nexecute unless score $found_sapling gm4_tree_data matches 1 anchored eyes positioned ^ ^ ^ run function gm4_trees:sapling/find_adjacent_sapling\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/function/sapling/process.mcfunction",
    "content": "# processes the sapling every tick for stage change or broken block\n# @s = sapling marker\n# at @s\n# run from gm4_fruiting_trees:tick\n\n# destroy if not in a sapling\nexecute unless block ~ ~ ~ #minecraft:saplings run function gm4_trees:sapling/destroy\n\n# prevents normal trees from growing by preventing the sapling from reaching stage 2\n# also allows saplings to run their own stage growth checks\nexecute if block ~ ~ ~ #minecraft:saplings[stage=1] run function gm4_trees:sapling/advance_stage\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/function/sapling/summon_marker.mcfunction",
    "content": "# summons the sapling marker\n# @s = player who placed the custom sapling\n# located align xyz of the newly placed sapling\n# run from gm4_trees:sapling/place_sapling\n\n# set up storage to be read from\n# mainhand\ndata modify storage gm4_trees:temp sapling.type set from entity @s SelectedItem.components.\"minecraft:custom_data\".gm4_trees.item.type\n## backwards compatibility with old items\nexecute unless data storage gm4_trees:temp sapling run data modify storage gm4_trees:temp sapling.type set from entity @s SelectedItem.components.\"minecraft:custom_data\".gm4_fruiting_trees.item.type\n\n# offhand\nexecute unless data storage gm4_trees:temp sapling run data modify storage gm4_trees:temp sapling.type set from entity @s equipment.offhand.components.\"minecraft:custom_data\".gm4_trees.item.type\n## backwards compatibility with old items\nexecute unless data storage gm4_trees:temp sapling run data modify storage gm4_trees:temp sapling.type set from entity @s equipment.offhand.components.\"minecraft:custom_data\".gm4_fruiting_trees.item.type\n\n# call initialize function so other modules can add their markers\n# | NOTE positioned ~.5 ~.5 ~.5 to not break data packs that relied on this behavior of old versions of this library\nexecute positioned ~.5 ~.5 ~.5 run function #gm4_trees:initialize_sapling\n\n# clean up\ndata remove storage gm4_trees:temp sapling\n\n# signal that a sapling was found\nreturn 1\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/function/tick.mcfunction",
    "content": "schedule function gm4_trees:tick 1t\n\n# process saplings\nexecute as @e[type=marker,tag=gm4_tree_sapling] at @s run function gm4_trees:sapling/process\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/tags/block/empty_block.json",
    "content": "{\n    \"values\": [\n        \"minecraft:air\",\n        \"minecraft:moving_piston\",\n        \"minecraft:water\",\n        \"minecraft:lava\"\n    ]\n}\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/tags/function/destroy_leaf.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/tags/function/destroy_sapling.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/tags/function/generate_tree.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/tags/function/initialize_sapling.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/tags/function/place_sapling.json",
    "content": "{\n    \"values\": [\n        \"gm4_trees:sapling/place_sapling\"\n    ]\n}\n"
  },
  {
    "path": "lib_trees/data/gm4_trees/tags/function/upgrade_fruiting_to_general.json",
    "content": "{\n  \"values\": []\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees/tags/functions/destroy_leaf.json",
    "content": "{\n  \"values\": [\n    \"gm4_trees_example:verify/destroy_leaf\"\n  ]\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees/tags/functions/destroy_sapling.json",
    "content": "{\n  \"values\": [\n    \"gm4_trees_example:verify/destroy_sapling\"\n  ]\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees/tags/functions/generate_tree.json",
    "content": "{\n  \"values\": [\n    \"gm4_trees_example:verify/generate_tree\"\n  ]\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees/tags/functions/initialize_sapling.json",
    "content": "{\n  \"values\": [\n    \"gm4_trees_example:verify/initialize_sapling\"\n  ]\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/functions/destroy_leaf.mcfunction",
    "content": "# removes a leaf marker if it's no longer in a leaf block\n# @s = gm4_example_leaf marker\n# located at @s\n# run from gm4_trees_example:verify/destroy_leaf\n\n# drop sapling\nloot spawn ~ ~ ~ loot gm4_trees_example:blocks/apple_tree_leaf\n# (if you want special drops from silk touch, you can instead use these command below)\n##execute if entity @e[type=item,nbt={Age:0s,Item:{id:\"minecraft:oak_leaves\",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0] run loot spawn ~ ~ ~ loot gm4_trees_example:blocks/apple_tree_leaf_silk_touch\n##execute unless entity @e[type=item,nbt={Age:0s,Item:{id:\"minecraft:oak_leaves\",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0] run loot spawn ~ ~ ~ loot gm4_trees_example:blocks/apple_tree_leaf\n\n# if desired, these commands can be used to replace all normally dropped items\n# this should really only be used if there's a marker in every leaf from this tree\n##kill @e[type=item,nbt={Age:0s,Item:{id:\"minecraft:stick\",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0]\n##kill @e[type=item,nbt={Age:0s,Item:{id:\"minecraft:oak_sapling\",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0]\n##kill @e[type=item,nbt={Age:0s,Item:{id:\"minecraft:oak_leaves\",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0]\n\n# kill marker\nkill @s\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/functions/destroy_sapling.mcfunction",
    "content": "# restores the data of the sapling when breaking the block\n# @s = example tree sapling marker\n# located at @s\n# run from gm4_trees_example:verify/destroy_sapling\n\n# kill old sapling (in this case the base item is an oak sapling)\nkill @e[type=item,nbt={Age:0s,Item:{id:\"minecraft:oak_sapling\",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0]\n# spawn the new sapling\nloot spawn ~ ~ ~ loot gm4_trees_example:items/apple_tree_sapling\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/functions/generate_tree.mcfunction",
    "content": "# generates the example tree\n# @s = example sapling marker\n# located at @s\n# run from gm4_trees_example:verify/generate_tree\n\n# generate tree using custom structure\nplace jigsaw gm4_trees_example:apple_trees gm4_trees:trunk 6 ~ ~1 ~\nkill @s\n\n# replace grass with dirt (optional)\nexecute if block ~ ~-1 ~ grass_block run setblock ~ ~-1 ~ dirt\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/functions/initialize_sapling.mcfunction",
    "content": "# initializes the example tree's marker\n# @s = player who placed down the example tree sapling\n# located at the center of the placed sapling\n# run from gm4_trees:example:verify/initialize_sapling\n\n# summon marker\nsummon marker ~ ~ ~ {CustomName:\"gm4_apple_tree_sapling\",Tags:[\"gm4_tree_sapling\",\"gm4_apple_tree_sapling\",\"smithed.entity\",\"smithed.strict\",\"smithed.block\"]}\n# set stage requirement (higher = longer to grow)\nscoreboard players set @e[type=marker,tag=gm4_apple_tree_sapling,distance=..0.1] gm4_sap_growth 2\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/functions/verify/destroy_leaf.mcfunction",
    "content": "# verifies that the leaf type is from this module\n# @s = gm4_tree_leaf marker\n# located at @s\n# run from gm4_trees:tick via #gm4_trees:destroy_leaf\n\nexecute if entity @s[tag=gm4_apple_leaf] run function gm4_trees_example:destroy_leaf\n# multiple tree type can be checked here\nexecute if entity @s[tag=gm4_example_leaf2] run function gm4_trees_example:destroy_leaf2\nexecute if entity @s[tag=gm4_example_leaf3] run function gm4_trees_example:destroy_leaf3\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/functions/verify/destroy_sapling.mcfunction",
    "content": "# verifies that the sapling type is from this module\n# @s = gm4_tree_sapling marker\n# located at @s\n# run from gm4_trees:sapling/process via #gm4_trees:destroy_sapling\n\nexecute if entity @s[tag=gm4_apple_tree_sapling] run function gm4_trees_example:destroy_sapling\n# multiple tree type can be checked here\nexecute if entity @s[tag=gm4_example_tree_sapling2] run function gm4_trees_example:destroy_sapling2\nexecute if entity @s[tag=gm4_example_tree_sapling3] run function gm4_trees_example:destroy_sapling3\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/functions/verify/generate_tree.mcfunction",
    "content": "# verifies that the sapling type is from this module\n# @s = gm4_tree_sapling marker\n# located at @s\n# run from gm4_trees:advance_stage via #gm4_trees:generate_tree\n\nexecute if entity @s[tag=gm4_apple_tree_sapling] run function gm4_trees_example:generate_tree\n# multiple tree type can be checked here\nexecute if entity @s[tag=gm4_example_tree_sapling2] run function gm4_trees_example:generate_tree2\nexecute if entity @s[tag=gm4_example_tree_sapling3] run function gm4_trees_example:generate_tree3\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/functions/verify/initialize_sapling.mcfunction",
    "content": "# verifies that the sapling type is from this module\n# @s = player who just placed down a custom sapling\n# located at the center sapling block\n# run from gm4_trees:sapling/summon marker via #gm4_trees:initialize_sapling\n\nexecute if data storage gm4_trees:temp sapling{type:\"apple\"} run function gm4_trees_example:initialize_sapling\n# multiple tree type can be checked here\nexecute if data storage gm4_trees:temp sapling{type:\"example2\"} run function gm4_trees_example:initialize_sapling2\nexecute if data storage gm4_trees:temp sapling{type:\"example3\"} run function gm4_trees_example:initialize_sapling3\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/loot_tables/blocks/apple_tree_leaf.json",
    "content": "{\n    \"type\": \"minecraft:block\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:loot_table\",\n                    \"value\": \"gm4_trees_example:items/apple_tree_sapling\",\n                    \"conditions\": [\n                        {\n                            \"condition\": \"minecraft:random_chance\",\n                            \"chance\": 0.75\n                        }\n                    ]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/loot_tables/items/apple_tree_sapling.json",
    "content": "{\n\t\"type\": \"minecraft:block\",\n\t\"pools\": [\n\t\t{\n\t\t\t\"rolls\": 1,\n\t\t\t\"entries\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"minecraft:item\",\n\t\t\t\t\t\"name\": \"minecraft:oak_sapling\",\n\t\t\t\t\t\"functions\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_name\",\n\t\t\t\t\t\t\t\"target\": \"item_name\",\n\t\t\t\t\t\t\t\"name\": {\n\t\t\t\t\t\t\t\t\"text\": \"Apple Tree Sapling\",\n\t\t\t\t\t\t\t\t\"italic\": false\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"function\": \"minecraft:set_nbt\",\n\t\t\t\t\t\t\t\"tag\": \"{gm4_trees:{item:{id:\\\"sapling\\\",type:\\\"apple\\\"}}}\"\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/tags/worldgen/biome/has_structure/apple_tree.json",
    "content": "{\n  \"values\": [\n    \"minecraft:dark_forest\",\n    \"minecraft:flower_forest\",\n    \"minecraft:forest\"\n  ]\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/worldgen/structure/apple_tree.json",
    "content": "{\n  \"type\": \"minecraft:jigsaw\",\n  \"biomes\": \"#gm4_trees_example:has_structure/apple_tree\",\n  \"step\": \"vegetal_decoration\",\n  \"spawn_overrides\": {},\n  \"terrain_adaptation\": \"beard_thin\",\n  \"start_pool\": \"gm4_trees_example:apple_trees\",\n  \"size\": 6,\n  \"start_height\": {\n    \"absolute\": 0\n  },\n  \"start_jigsaw_name\": \"gm4_trees:trunk\",\n  \"project_start_to_heightmap\": \"MOTION_BLOCKING_NO_LEAVES\",\n  \"max_distance_from_center\": 80,\n  \"use_expansion_hack\": false\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/worldgen/structure_set/apple_tree.json",
    "content": "{\n  \"structures\": [\n    {\n      \"structure\": \"gm4_trees_example:apple_tree\",\n      \"weight\": 1\n    }\n  ],\n  \"placement\": {\n    \"type\": \"minecraft:random_spread\",\n    \"salt\": 114563218,\n    \"frequency_reduction_method\": \"default\",\n    \"frequency\": 0.4,\n    \"locate_offset\": [\n      8,\n      0,\n      8\n    ],\n    \"spacing\": 3,\n    \"separation\": 0\n  }\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/worldgen/template_pool/apple_leaf.json",
    "content": "{\n  \"name\": \"gm4_trees_example:apple_leaf\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_trees_example:apple_leaf\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:empty_pool_element\",\n        \"projection\": \"rigid\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/worldgen/template_pool/apple_trees.json",
    "content": "{\n  \"name\": \"gm4_trees_example:apple_trees\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_trees_example:apple_tree_1\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_trees_example:apple_tree_2\",\n        \"processors\": \"minecraft:empty\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/gm4_trees_example/worldgen/template_pool/corner_leaf.json",
    "content": "{\n  \"name\": \"gm4_trees_example:corner_leaf\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 1,\n      \"element\": {\n        \"element_type\": \"minecraft:legacy_single_pool_element\",\n        \"projection\": \"rigid\",\n        \"location\": \"gm4_trees_example:corner_leaf\",\n        \"processors\": \"minecraft:empty\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:empty_pool_element\",\n        \"projection\": \"rigid\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/load/tags/functions/gm4_trees_example.json",
    "content": "{\n    \"values\":[\n        { \"id\": \"#load:gm4_trees\", \"required\": false }\n    ]\n}\n"
  },
  {
    "path": "lib_trees/example_use/data/load/tags/functions/load.json",
    "content": "{\n    \"values\": [\n        \"#load:gm4_trees_example\"\n    ]\n}\n"
  },
  {
    "path": "lib_trees/example_use/pack.mcmeta",
    "content": "{\n    \"pack\": {\n        \"pack_format\": 10,\n        \"description\": [\n            \"Example Use of GM4 Trees Library\"\n        ]\n    }\n}\n"
  },
  {
    "path": "lib_trees/mod.mcdoc",
    "content": "dispatch minecraft:storage[gm4_trees:temp] to struct {\n  sapling?: struct {\n    type: string,\n  },\n}\n\ndispatch mcdoc:custom_data[gm4_trees] to struct {\n  item?: struct {\n    type: string,\n  },\n}\n"
  },
  {
    "path": "library.yaml",
    "content": "pipeline:\n  - gm4.plugins.upgrade_paths.lib\n  - gm4.plugins.versioning.libraries\n"
  },
  {
    "path": "module.yaml",
    "content": "pipeline:\n  - gm4.plugins.module.default_pack_icon\n  - gm4.plugins.module.gm4_root_advancement\n  - gm4.plugins.versioning.modules\n  - gm4.plugins.upgrade_paths\n  - gm4_guidebook.generate_guidebooks\n  - gm4.plugins.resource_pack.build\n  - mecha\n  - directory: '../base'\n    extend: 'beet.yaml'\n"
  },
  {
    "path": "pfb_biome_extensions/beet.yaml",
    "content": "data_pack:\n  load: .\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/bamboo_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/basalt_deltas.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_nether\",\n      \"required\": false\n    },\n    \"minecraft:nether_cave\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/cherry_grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/crimson_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_nether\",\n      \"required\": false\n    },\n    \"minecraft:nether_cave\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/dark_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/deep_cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/deep_dark.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/deep_frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/deep_lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/deep_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/desert.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/dripstone_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/end_barrens.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/end_highlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/end_midlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/eroded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/flower_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/frozen_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/frozen_river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/ice_spikes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/jagged_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/lush_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/mangrove_swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/meadow.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/mushroom_fields.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/nether_wastes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_nether\",\n      \"required\": false\n    },\n    \"minecraft:nether_cave\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/old_growth_birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/old_growth_pine_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/old_growth_spruce_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/pale_garden.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/savanna_plateau.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/small_end_islands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/snowy_beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/snowy_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/snowy_slopes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/snowy_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/soul_sand_valley.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_nether\",\n      \"required\": false\n    },\n    \"minecraft:nether_cave\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/sparse_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/stony_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/stony_shore.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/sunflower_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/the_end.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/the_void.json",
    "content": "{\n  \"replace\": false,\n  \"values\": []\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/warm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/warped_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_nether\",\n      \"required\": false\n    },\n    \"minecraft:nether_cave\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/windswept_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/windswept_gravelly_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/windswept_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/windswept_savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/wooded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:cave\",\n    \"minecraft:cave_extra_underground\",\n    \"minecraft:canyon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/bamboo_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/basalt_deltas.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/cherry_grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/crimson_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/dark_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/deep_cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/deep_dark.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/deep_frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/deep_lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/deep_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/desert.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/dripstone_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/end_barrens.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/end_highlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/end_midlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/eroded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/flower_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/frozen_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\",\n    \"minecraft:spring_lava_frozen\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/frozen_river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\",\n    \"minecraft:spring_lava_frozen\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/ice_spikes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/jagged_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\",\n    \"minecraft:spring_lava_frozen\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/lush_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/mangrove_swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/meadow.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/mushroom_fields.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/nether_wastes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/old_growth_birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/old_growth_pine_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/old_growth_spruce_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/pale_garden.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/savanna_plateau.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/small_end_islands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/snowy_beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/snowy_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/snowy_slopes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\",\n    \"minecraft:spring_lava_frozen\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/snowy_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/soul_sand_valley.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/sparse_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/stony_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/stony_shore.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/sunflower_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/the_end.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/the_void.json",
    "content": "{\n  \"replace\": false,\n  \"values\": []\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/warm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/warped_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/windswept_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/windswept_gravelly_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/windswept_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/windswept_savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/wooded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:fluid_springs/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:spring_water\",\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/bamboo_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/basalt_deltas.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/cherry_grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/crimson_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/dark_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/deep_cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/deep_dark.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/deep_frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/deep_lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/deep_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/desert.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/dripstone_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/end_barrens.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/end_highlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/end_midlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/eroded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/flower_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/frozen_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/frozen_river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/ice_spikes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/jagged_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/lush_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/mangrove_swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/meadow.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/mushroom_fields.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/nether_wastes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/old_growth_birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/old_growth_pine_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/old_growth_spruce_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/pale_garden.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/savanna_plateau.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/small_end_islands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/snowy_beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/snowy_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/snowy_slopes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/snowy_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/soul_sand_valley.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/sparse_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/stony_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/stony_shore.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/sunflower_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/the_end.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/the_void.json",
    "content": "{\n  \"replace\": false,\n  \"values\": []\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/warm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/warped_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/windswept_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/windswept_gravelly_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/windswept_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/windswept_savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/wooded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:lakes/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:lake_lava_underground\",\n    \"minecraft:lake_lava_surface\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/bamboo_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/basalt_deltas.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/cherry_grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/crimson_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/dark_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/deep_cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/deep_dark.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/deep_frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:iceberg_packed\",\n    \"minecraft:iceberg_blue\",\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/deep_lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/deep_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/desert.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/dripstone_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\",\n    \"minecraft:large_dripstone\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/end_barrens.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/end_highlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/end_midlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/eroded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/flower_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:iceberg_packed\",\n    \"minecraft:iceberg_blue\",\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/frozen_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/frozen_river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/ice_spikes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/jagged_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/lush_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/mangrove_swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/meadow.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/mushroom_fields.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/nether_wastes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/old_growth_birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/old_growth_pine_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\",\n    \"minecraft:forest_rock\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/old_growth_spruce_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\",\n    \"minecraft:forest_rock\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/pale_garden.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/savanna_plateau.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/small_end_islands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/snowy_beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/snowy_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/snowy_slopes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/snowy_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/soul_sand_valley.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_nether\",\n      \"required\": false\n    },\n    \"minecraft:basalt_pillar\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/sparse_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/stony_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/stony_shore.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/sunflower_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/the_end.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/the_void.json",
    "content": "{\n  \"replace\": false,\n  \"values\": []\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/warm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/warped_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/windswept_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/windswept_gravelly_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/windswept_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/windswept_savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/wooded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:local_modifications/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:amethyst_geode\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/bamboo_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/basalt_deltas.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/cherry_grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/crimson_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/dark_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/deep_cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/deep_dark.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/deep_frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/deep_lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/deep_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/desert.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/dripstone_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/end_barrens.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/end_highlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/end_midlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/eroded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/flower_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/frozen_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/frozen_river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/ice_spikes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/jagged_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/lush_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/mangrove_swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/meadow.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/mushroom_fields.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/nether_wastes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/old_growth_birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/old_growth_pine_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/old_growth_spruce_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/pale_garden.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/savanna_plateau.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/small_end_islands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_end\",\n      \"required\": false\n    },\n    \"minecraft:end_island_decorated\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/snowy_beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/snowy_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/snowy_slopes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/snowy_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/soul_sand_valley.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/sparse_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/stony_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/stony_shore.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/sunflower_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/the_end.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/the_void.json",
    "content": "{\n  \"replace\": false,\n  \"values\": []\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/warm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/warped_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/windswept_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/windswept_gravelly_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/windswept_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/windswept_savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/wooded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:raw_generation/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/bamboo_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/basalt_deltas.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/cherry_grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/crimson_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/dark_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/deep_cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/deep_dark.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/deep_frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/deep_lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/deep_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/desert.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/dripstone_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/end_barrens.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/end_highlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/end_midlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/eroded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/flower_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/frozen_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/frozen_river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/ice_spikes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/jagged_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/lush_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/mangrove_swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/meadow.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/mushroom_fields.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/nether_wastes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/old_growth_birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/old_growth_pine_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/old_growth_spruce_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/pale_garden.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/savanna_plateau.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/small_end_islands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/snowy_beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/snowy_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/snowy_slopes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/snowy_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/soul_sand_valley.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/sparse_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/stony_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/stony_shore.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/sunflower_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/the_end.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/the_void.json",
    "content": "{\n  \"replace\": false,\n  \"values\": []\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/warm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/warped_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/windswept_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/windswept_gravelly_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/windswept_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/windswept_savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/wooded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:strongholds/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/bamboo_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/basalt_deltas.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_nether\",\n      \"required\": false\n    },\n    \"minecraft:delta\",\n    \"minecraft:small_basalt_columns\",\n    \"minecraft:large_basalt_columns\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/cherry_grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/crimson_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/dark_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/deep_cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/deep_dark.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/deep_frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:blue_ice\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/deep_lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/deep_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/desert.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:desert_well\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/dripstone_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/end_barrens.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/end_highlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_end\",\n      \"required\": false\n    },\n    \"minecraft:end_gateway_return\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/end_midlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/eroded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/flower_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:blue_ice\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/frozen_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/frozen_river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/ice_spikes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ice_spike\",\n    \"minecraft:ice_patch\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/jagged_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/lush_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/mangrove_swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/meadow.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/mushroom_fields.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/nether_wastes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/old_growth_birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/old_growth_pine_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/old_growth_spruce_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/pale_garden.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/savanna_plateau.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/small_end_islands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/snowy_beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/snowy_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/snowy_slopes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/snowy_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/soul_sand_valley.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/sparse_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/stony_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/stony_shore.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/sunflower_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/the_end.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_end\",\n      \"required\": false\n    },\n    \"minecraft:end_spike\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/the_void.json",
    "content": "{\n  \"replace\": false,\n  \"values\": []\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/warm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/warped_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/windswept_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/windswept_gravelly_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/windswept_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/windswept_savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/wooded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:surface_structures/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/bamboo_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/basalt_deltas.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/cherry_grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/crimson_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/dark_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/deep_cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/deep_dark.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/deep_frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/deep_lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/deep_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/desert.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/dripstone_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/end_barrens.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/end_highlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/end_midlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/eroded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/flower_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/frozen_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/frozen_river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/ice_spikes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/jagged_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/lush_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/mangrove_swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/meadow.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/mushroom_fields.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/nether_wastes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/old_growth_birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/old_growth_pine_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/old_growth_spruce_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/pale_garden.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/savanna_plateau.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/small_end_islands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/snowy_beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/snowy_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/snowy_slopes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/snowy_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/soul_sand_valley.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/sparse_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/stony_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/stony_shore.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/sunflower_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/the_end.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_end\",\n      \"required\": false\n    },\n    \"minecraft:end_platform\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/the_void.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    \"minecraft:void_start_platform\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/warm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/warped_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/windswept_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/windswept_gravelly_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/windswept_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/windswept_savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/wooded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:top_layer_modification/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:freeze_top_layer\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/bamboo_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/basalt_deltas.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_nether\",\n      \"required\": false\n    },\n    \"minecraft:basalt_blobs\",\n    \"minecraft:blackstone_blobs\",\n    \"minecraft:spring_delta\",\n    \"minecraft:patch_fire\",\n    \"minecraft:patch_soul_fire\",\n    \"minecraft:glowstone_extra\",\n    \"minecraft:glowstone\",\n    \"minecraft:brown_mushroom_nether\",\n    \"minecraft:red_mushroom_nether\",\n    \"minecraft:ore_magma\",\n    \"minecraft:spring_closed_double\",\n    \"minecraft:ore_gold_deltas\",\n    \"minecraft:ore_quartz_deltas\",\n    \"minecraft:ore_ancient_debris_large\",\n    \"minecraft:ore_debris_small\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/cherry_grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_infested\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/crimson_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_nether\",\n      \"required\": false\n    },\n    \"minecraft:spring_open\",\n    \"minecraft:patch_fire\",\n    \"minecraft:glowstone_extra\",\n    \"minecraft:glowstone\",\n    \"minecraft:ore_magma\",\n    \"minecraft:spring_closed\",\n    \"minecraft:ore_gravel_nether\",\n    \"minecraft:ore_blackstone\",\n    \"minecraft:ore_gold_nether\",\n    \"minecraft:ore_quartz_nether\",\n    \"minecraft:ore_ancient_debris_large\",\n    \"minecraft:ore_debris_small\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/dark_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/deep_cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/deep_dark.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:sculk_vein\",\n    \"minecraft:sculk_patch_deep_dark\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/deep_frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/deep_lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/deep_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/desert.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/dripstone_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:dripstone_cluster\",\n    \"minecraft:pointed_dripstone\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/end_barrens.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/end_highlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/end_midlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/eroded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/flower_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/frozen_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_infested\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/frozen_river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_infested\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/ice_spikes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/jagged_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_infested\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/lush_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/mangrove_swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/meadow.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_infested\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/mushroom_fields.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/nether_wastes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_nether\",\n      \"required\": false\n    },\n    \"minecraft:spring_open\",\n    \"minecraft:patch_fire\",\n    \"minecraft:patch_soul_fire\",\n    \"minecraft:glowstone_extra\",\n    \"minecraft:glowstone\",\n    \"minecraft:brown_mushroom_nether\",\n    \"minecraft:red_mushroom_nether\",\n    \"minecraft:ore_magma\",\n    \"minecraft:spring_closed\",\n    \"minecraft:ore_gravel_nether\",\n    \"minecraft:ore_blackstone\",\n    \"minecraft:ore_gold_nether\",\n    \"minecraft:ore_quartz_nether\",\n    \"minecraft:ore_ancient_debris_large\",\n    \"minecraft:ore_debris_small\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/old_growth_birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/old_growth_pine_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/old_growth_spruce_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/pale_garden.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/savanna_plateau.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/small_end_islands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/snowy_beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/snowy_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/snowy_slopes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_infested\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/snowy_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/soul_sand_valley.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_nether\",\n      \"required\": false\n    },\n    \"minecraft:spring_open\",\n    \"minecraft:patch_fire\",\n    \"minecraft:patch_soul_fire\",\n    \"minecraft:glowstone_extra\",\n    \"minecraft:glowstone\",\n    \"minecraft:patch_crimson_roots\",\n    \"minecraft:ore_magma\",\n    \"minecraft:spring_closed\",\n    \"minecraft:ore_soul_sand\",\n    \"minecraft:ore_gravel_nether\",\n    \"minecraft:ore_blackstone\",\n    \"minecraft:ore_gold_nether\",\n    \"minecraft:ore_quartz_nether\",\n    \"minecraft:ore_ancient_debris_large\",\n    \"minecraft:ore_debris_small\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/sparse_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/stony_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_infested\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/stony_shore.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/sunflower_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/the_end.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/the_void.json",
    "content": "{\n  \"replace\": false,\n  \"values\": []\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/warm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/warped_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_nether\",\n      \"required\": false\n    },\n    \"minecraft:spring_open\",\n    \"minecraft:patch_fire\",\n    \"minecraft:patch_soul_fire\",\n    \"minecraft:glowstone_extra\",\n    \"minecraft:glowstone\",\n    \"minecraft:ore_magma\",\n    \"minecraft:spring_closed\",\n    \"minecraft:ore_gravel_nether\",\n    \"minecraft:ore_blackstone\",\n    \"minecraft:ore_gold_nether\",\n    \"minecraft:ore_quartz_nether\",\n    \"minecraft:ore_ancient_debris_large\",\n    \"minecraft:ore_debris_small\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/windswept_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_infested\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/windswept_gravelly_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_infested\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/windswept_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_infested\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/windswept_savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/wooded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_decoration/in_overworld\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:ore_gold_extra\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/bamboo_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/basalt_deltas.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/cherry_grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\",\n    \"minecraft:ore_emerald\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/crimson_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/dark_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/deep_cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/deep_dark.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/deep_frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/deep_lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/deep_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/desert.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/dripstone_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper_large\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/end_barrens.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/end_highlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/end_midlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/eroded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:ore_gold_extra\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/flower_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/frozen_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\",\n    \"minecraft:ore_emerald\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/frozen_river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\",\n    \"minecraft:ore_emerald\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/ice_spikes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/jagged_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\",\n    \"minecraft:ore_emerald\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/lush_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:ore_clay\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/mangrove_swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_grass\",\n    \"minecraft:disk_clay\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/meadow.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\",\n    \"minecraft:ore_emerald\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/mushroom_fields.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/nether_wastes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/old_growth_birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/old_growth_pine_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/old_growth_spruce_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/pale_garden.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/savanna_plateau.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/small_end_islands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_slopes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\",\n    \"minecraft:ore_emerald\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/soul_sand_valley.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/sparse_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/stony_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\",\n    \"minecraft:ore_emerald\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/stony_shore.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/sunflower_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_clay\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/the_end.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/the_void.json",
    "content": "{\n  \"replace\": false,\n  \"values\": []\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/warm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/warped_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/windswept_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\",\n    \"minecraft:ore_emerald\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/windswept_gravelly_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\",\n    \"minecraft:ore_emerald\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/windswept_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\",\n    \"minecraft:ore_emerald\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/windswept_savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/wooded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_ores/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:ore_dirt\",\n    \"minecraft:ore_gravel\",\n    \"minecraft:ore_granite_upper\",\n    \"minecraft:ore_granite_lower\",\n    \"minecraft:ore_diorite_upper\",\n    \"minecraft:ore_diorite_lower\",\n    \"minecraft:ore_andesite_upper\",\n    \"minecraft:ore_andesite_lower\",\n    \"minecraft:ore_tuff\",\n    \"minecraft:ore_coal_upper\",\n    \"minecraft:ore_coal_lower\",\n    \"minecraft:ore_iron_upper\",\n    \"minecraft:ore_iron_middle\",\n    \"minecraft:ore_iron_small\",\n    \"minecraft:ore_gold\",\n    \"minecraft:ore_gold_lower\",\n    \"minecraft:ore_redstone\",\n    \"minecraft:ore_redstone_lower\",\n    \"minecraft:ore_diamond\",\n    \"minecraft:ore_diamond_medium\",\n    \"minecraft:ore_diamond_large\",\n    \"minecraft:ore_diamond_buried\",\n    \"minecraft:ore_lapis\",\n    \"minecraft:ore_lapis_buried\",\n    \"minecraft:ore_copper\",\n    \"minecraft:underwater_magma\",\n    \"minecraft:ore_gold_extra\",\n    \"minecraft:disk_sand\",\n    \"minecraft:disk_clay\",\n    \"minecraft:disk_gravel\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/bamboo_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/basalt_deltas.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/cherry_grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/crimson_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/dark_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/deep_cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/deep_dark.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/deep_frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/deep_lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/deep_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/desert.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:fossil_upper\",\n    \"minecraft:fossil_lower\",\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/dripstone_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/end_barrens.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/end_highlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/end_midlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/eroded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/flower_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/frozen_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/frozen_river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/ice_spikes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/jagged_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/lush_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/mangrove_swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:fossil_upper\",\n    \"minecraft:fossil_lower\",\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/meadow.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/mushroom_fields.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/nether_wastes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/old_growth_birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/old_growth_pine_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/old_growth_spruce_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/pale_garden.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/savanna_plateau.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/small_end_islands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/snowy_beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/snowy_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/snowy_slopes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/snowy_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/soul_sand_valley.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/sparse_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/stony_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/stony_shore.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/sunflower_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:fossil_upper\",\n    \"minecraft:fossil_lower\",\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/the_end.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/the_void.json",
    "content": "{\n  \"replace\": false,\n  \"values\": []\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/warm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/warped_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/windswept_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/windswept_gravelly_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/windswept_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/windswept_savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/wooded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:underground_structures/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:monster_room\",\n    \"minecraft:monster_room_deep\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:patch_dry_grass_badlands\",\n    \"minecraft:patch_dead_bush_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_sugar_cane_badlands\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_cactus_decorated\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/bamboo_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:bamboo\",\n    \"minecraft:bamboo_vegetation\",\n    \"minecraft:flower_warm\",\n    \"minecraft:patch_grass_jungle\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:vines\",\n    \"minecraft:patch_melon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/basalt_deltas.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_nether\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:forest_flowers\",\n    \"minecraft:wildflowers_birch_forest\",\n    \"minecraft:trees_birch\",\n    \"minecraft:patch_bush\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_forest\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/cherry_grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_tall_grass_2\",\n    \"minecraft:patch_grass_plain\",\n    \"minecraft:flower_cherry\",\n    \"minecraft:trees_cherry\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_water\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:seagrass_cold\",\n    \"minecraft:kelp_cold\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/crimson_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_nether\",\n      \"required\": false\n    },\n    \"minecraft:spring_lava\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:weeping_vines\",\n    \"minecraft:crimson_fungi\",\n    \"minecraft:crimson_forest_vegetation\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/dark_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:dark_forest_vegetation\",\n    \"minecraft:forest_flowers\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_forest\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_leaf_litter\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/deep_cold_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_water\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:seagrass_deep_cold\",\n    \"minecraft:kelp_cold\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/deep_dark.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_tall_grass_2\",\n    \"minecraft:trees_plains\",\n    \"minecraft:flower_plains\",\n    \"minecraft:patch_grass_plain\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/deep_frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_water\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/deep_lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_water\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:seagrass_deep_warm\",\n    \"minecraft:kelp_warm\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/deep_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_water\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:seagrass_deep\",\n    \"minecraft:kelp_cold\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/desert.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:patch_dry_grass_desert\",\n    \"minecraft:patch_dead_bush_2\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_sugar_cane_desert\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_cactus_desert\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/dripstone_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_tall_grass_2\",\n    \"minecraft:trees_plains\",\n    \"minecraft:flower_plains\",\n    \"minecraft:patch_grass_plain\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/end_barrens.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/end_highlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_end\",\n      \"required\": false\n    },\n    \"minecraft:chorus_plant\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/end_midlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/eroded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:patch_dry_grass_badlands\",\n    \"minecraft:patch_dead_bush_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_sugar_cane_badlands\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_cactus_decorated\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/flower_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:flower_forest_flowers\",\n    \"minecraft:trees_flower_forest\",\n    \"minecraft:flower_flower_forest\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:forest_flowers\",\n    \"minecraft:trees_birch_and_oak_leaf_litter\",\n    \"minecraft:patch_bush\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_forest\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/frozen_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_water\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/frozen_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/frozen_river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_water\",\n    \"minecraft:patch_bush\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/grove.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_grove\",\n    \"minecraft:patch_pumpkin\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/ice_spikes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_snowy\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/jagged_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:bamboo_light\",\n    \"minecraft:trees_jungle\",\n    \"minecraft:flower_warm\",\n    \"minecraft:patch_grass_jungle\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:vines\",\n    \"minecraft:patch_melon\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/lukewarm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_water\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:seagrass_warm\",\n    \"minecraft:kelp_warm\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/lush_caves.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_tall_grass_2\",\n    \"minecraft:lush_caves_ceiling_vegetation\",\n    \"minecraft:cave_vines\",\n    \"minecraft:lush_caves_clay\",\n    \"minecraft:lush_caves_vegetation\",\n    \"minecraft:rooted_azalea_tree\",\n    \"minecraft:spore_blossom\",\n    \"minecraft:classic_vines_cave_feature\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/mangrove_swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_mangrove\",\n    \"minecraft:patch_grass_normal\",\n    \"minecraft:patch_dead_bush\",\n    \"minecraft:patch_waterlily\",\n    \"minecraft:seagrass_swamp\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/meadow.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_tall_grass_2\",\n    \"minecraft:patch_grass_meadow\",\n    \"minecraft:flower_meadow\",\n    \"minecraft:trees_meadow\",\n    \"minecraft:wildflowers_meadow\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/mushroom_fields.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:mushroom_island_vegetation\",\n    \"minecraft:brown_mushroom_taiga\",\n    \"minecraft:red_mushroom_taiga\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/nether_wastes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_nether\",\n      \"required\": false\n    },\n    \"minecraft:spring_lava\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_water\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:seagrass_normal\",\n    \"minecraft:kelp_cold\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/old_growth_birch_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:forest_flowers\",\n    \"minecraft:wildflowers_birch_forest\",\n    \"minecraft:birch_tall\",\n    \"minecraft:patch_bush\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_forest\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/old_growth_pine_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_large_fern\",\n    \"minecraft:trees_old_growth_pine_taiga\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_taiga\",\n    \"minecraft:patch_dead_bush\",\n    \"minecraft:brown_mushroom_old_growth\",\n    \"minecraft:red_mushroom_old_growth\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:patch_berry_common\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/old_growth_spruce_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_large_fern\",\n    \"minecraft:trees_old_growth_spruce_taiga\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_taiga\",\n    \"minecraft:patch_dead_bush\",\n    \"minecraft:brown_mushroom_old_growth\",\n    \"minecraft:red_mushroom_old_growth\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:patch_berry_common\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/pale_garden.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:pale_garden_vegetation\",\n    \"minecraft:pale_moss_patch\",\n    \"minecraft:pale_garden_flowers\",\n    \"minecraft:flower_pale_garden\",\n    \"minecraft:patch_grass_forest\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_tall_grass_2\",\n    \"minecraft:patch_bush\",\n    \"minecraft:trees_plains\",\n    \"minecraft:flower_plains\",\n    \"minecraft:patch_grass_plain\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/river.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_water\",\n    \"minecraft:patch_bush\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:seagrass_river\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_tall_grass\",\n    \"minecraft:trees_savanna\",\n    \"minecraft:flower_warm\",\n    \"minecraft:patch_grass_savanna\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/savanna_plateau.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_tall_grass\",\n    \"minecraft:trees_savanna\",\n    \"minecraft:flower_warm\",\n    \"minecraft:patch_grass_savanna\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/small_end_islands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_beach.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_snowy\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_slopes.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_pumpkin\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_large_fern\",\n    \"minecraft:trees_taiga\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_taiga_2\",\n    \"minecraft:brown_mushroom_taiga\",\n    \"minecraft:red_mushroom_taiga\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:patch_berry_rare\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/soul_sand_valley.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_nether\",\n      \"required\": false\n    },\n    \"minecraft:spring_lava\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/sparse_jungle.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_sparse_jungle\",\n    \"minecraft:flower_warm\",\n    \"minecraft:patch_grass_jungle\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:vines\",\n    \"minecraft:patch_melon_sparse\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/stony_peaks.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/stony_shore.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/sunflower_plains.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_tall_grass_2\",\n    \"minecraft:patch_sunflower\",\n    \"minecraft:trees_plains\",\n    \"minecraft:flower_plains\",\n    \"minecraft:patch_grass_plain\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/swamp.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_swamp\",\n    \"minecraft:flower_swamp\",\n    \"minecraft:patch_grass_normal\",\n    \"minecraft:patch_dead_bush\",\n    \"minecraft:patch_waterlily\",\n    \"minecraft:brown_mushroom_swamp\",\n    \"minecraft:red_mushroom_swamp\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_sugar_cane_swamp\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_firefly_bush_swamp\",\n    \"minecraft:patch_firefly_bush_near_water_swamp\",\n    \"minecraft:seagrass_swamp\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/taiga.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:patch_large_fern\",\n    \"minecraft:trees_taiga\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_taiga_2\",\n    \"minecraft:brown_mushroom_taiga\",\n    \"minecraft:red_mushroom_taiga\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:patch_berry_common\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/the_end.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_end\",\n      \"required\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/the_void.json",
    "content": "{\n  \"replace\": false,\n  \"values\": []\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/warm_ocean.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_water\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\",\n    \"minecraft:warm_ocean_vegetation\",\n    \"minecraft:seagrass_warm\",\n    \"minecraft:sea_pickle\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/warped_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_nether\",\n      \"required\": false\n    },\n    \"minecraft:spring_lava\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:warped_fungi\",\n    \"minecraft:warped_forest_vegetation\",\n    \"minecraft:nether_sprouts\",\n    \"minecraft:twisting_vines\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/windswept_forest.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_windswept_forest\",\n    \"minecraft:patch_bush\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/windswept_gravelly_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_windswept_hills\",\n    \"minecraft:patch_bush\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/windswept_hills.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_windswept_hills\",\n    \"minecraft:patch_bush\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/windswept_savanna.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_windswept_savanna\",\n    \"minecraft:flower_default\",\n    \"minecraft:patch_grass_normal\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_sugar_cane\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/wooded_badlands.json",
    "content": "{\n  \"replace\": false,\n  \"values\": [\n    {\n      \"id\": \"#minecraft:vegetal_decoration/in_overworld\",\n      \"required\": false\n    },\n    \"minecraft:glow_lichen\",\n    \"minecraft:trees_badlands\",\n    \"minecraft:patch_grass_badlands\",\n    \"minecraft:patch_dry_grass_badlands\",\n    \"minecraft:patch_dead_bush_badlands\",\n    \"minecraft:brown_mushroom_normal\",\n    \"minecraft:red_mushroom_normal\",\n    \"minecraft:patch_sugar_cane_badlands\",\n    \"minecraft:patch_pumpkin\",\n    \"minecraft:patch_cactus_decorated\",\n    \"minecraft:patch_firefly_bush_near_water\"\n  ]\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/badlands.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.badlands\"\n      }\n    },\n    \"minecraft:gameplay/snow_golem_melts\": true,\n    \"minecraft:visual/sky_color\": \"#6eb1ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/badlands\",\n  \"creature_spawn_probability\": 0.03,\n  \"downfall\": 0.0,\n  \"effects\": {\n    \"foliage_color\": \"#9e814d\",\n    \"grass_color\": \"#90814d\",\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/badlands\",\n    \"#minecraft:lakes/in_biome/badlands\",\n    \"#minecraft:local_modifications/in_biome/badlands\",\n    \"#minecraft:underground_structures/in_biome/badlands\",\n    \"#minecraft:surface_structures/in_biome/badlands\",\n    \"#minecraft:strongholds/in_biome/badlands\",\n    \"#minecraft:underground_ores/in_biome/badlands\",\n    \"#minecraft:underground_decoration/in_biome/badlands\",\n    \"#minecraft:fluid_springs/in_biome/badlands\",\n    \"#minecraft:vegetal_decoration/in_biome/badlands\",\n    \"#minecraft:top_layer_modification/in_biome/badlands\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:armadillo\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 6\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 2.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/bamboo_jungle.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.bamboo_jungle\"\n      }\n    },\n    \"minecraft:gameplay/increased_fire_burnout\": true,\n    \"minecraft:visual/sky_color\": \"#77a8ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/bamboo_jungle\",\n  \"downfall\": 0.9,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/bamboo_jungle\",\n    \"#minecraft:lakes/in_biome/bamboo_jungle\",\n    \"#minecraft:local_modifications/in_biome/bamboo_jungle\",\n    \"#minecraft:underground_structures/in_biome/bamboo_jungle\",\n    \"#minecraft:surface_structures/in_biome/bamboo_jungle\",\n    \"#minecraft:strongholds/in_biome/bamboo_jungle\",\n    \"#minecraft:underground_ores/in_biome/bamboo_jungle\",\n    \"#minecraft:underground_decoration/in_biome/bamboo_jungle\",\n    \"#minecraft:fluid_springs/in_biome/bamboo_jungle\",\n    \"#minecraft:vegetal_decoration/in_biome/bamboo_jungle\",\n    \"#minecraft:top_layer_modification/in_biome/bamboo_jungle\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:parrot\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 40\n      },\n      {\n        \"type\": \"minecraft:panda\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 80\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:ocelot\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 2\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.95\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/basalt_deltas.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/ambient_sounds\": {\n      \"additions\": {\n        \"sound\": \"minecraft:ambient.basalt_deltas.additions\",\n        \"tick_chance\": 0.0111\n      },\n      \"loop\": \"minecraft:ambient.basalt_deltas.loop\",\n      \"mood\": {\n        \"block_search_extent\": 8,\n        \"offset\": 2.0,\n        \"sound\": \"minecraft:ambient.basalt_deltas.mood\",\n        \"tick_delay\": 6000\n      }\n    },\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.nether.basalt_deltas\"\n      }\n    },\n    \"minecraft:visual/ambient_particles\": [\n      {\n        \"particle\": {\n          \"type\": \"minecraft:white_ash\"\n        },\n        \"probability\": 0.118093334\n      }\n    ],\n    \"minecraft:visual/fog_color\": \"#685f70\"\n  },\n  \"carvers\": \"#minecraft:in_biome/basalt_deltas\",\n  \"downfall\": 0.0,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/basalt_deltas\",\n    \"#minecraft:lakes/in_biome/basalt_deltas\",\n    \"#minecraft:local_modifications/in_biome/basalt_deltas\",\n    \"#minecraft:underground_structures/in_biome/basalt_deltas\",\n    \"#minecraft:surface_structures/in_biome/basalt_deltas\",\n    \"#minecraft:strongholds/in_biome/basalt_deltas\",\n    \"#minecraft:underground_ores/in_biome/basalt_deltas\",\n    \"#minecraft:underground_decoration/in_biome/basalt_deltas\",\n    \"#minecraft:fluid_springs/in_biome/basalt_deltas\",\n    \"#minecraft:vegetal_decoration/in_biome/basalt_deltas\",\n    \"#minecraft:top_layer_modification/in_biome/basalt_deltas\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:strider\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 60\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:ghast\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 40\n      },\n      {\n        \"type\": \"minecraft:magma_cube\",\n        \"maxCount\": 5,\n        \"minCount\": 2,\n        \"weight\": 100\n      }\n    ],\n    \"underground_water_creature\": [],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 2.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/beach.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#78a7ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/beach\",\n  \"downfall\": 0.4,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/beach\",\n    \"#minecraft:lakes/in_biome/beach\",\n    \"#minecraft:local_modifications/in_biome/beach\",\n    \"#minecraft:underground_structures/in_biome/beach\",\n    \"#minecraft:surface_structures/in_biome/beach\",\n    \"#minecraft:strongholds/in_biome/beach\",\n    \"#minecraft:underground_ores/in_biome/beach\",\n    \"#minecraft:underground_decoration/in_biome/beach\",\n    \"#minecraft:fluid_springs/in_biome/beach\",\n    \"#minecraft:vegetal_decoration/in_biome/beach\",\n    \"#minecraft:top_layer_modification/in_biome/beach\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:turtle\",\n        \"maxCount\": 5,\n        \"minCount\": 2,\n        \"weight\": 5\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.8\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/birch_forest.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.forest\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7aa5ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/birch_forest\",\n  \"downfall\": 0.6,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/birch_forest\",\n    \"#minecraft:lakes/in_biome/birch_forest\",\n    \"#minecraft:local_modifications/in_biome/birch_forest\",\n    \"#minecraft:underground_structures/in_biome/birch_forest\",\n    \"#minecraft:surface_structures/in_biome/birch_forest\",\n    \"#minecraft:strongholds/in_biome/birch_forest\",\n    \"#minecraft:underground_ores/in_biome/birch_forest\",\n    \"#minecraft:underground_decoration/in_biome/birch_forest\",\n    \"#minecraft:fluid_springs/in_biome/birch_forest\",\n    \"#minecraft:vegetal_decoration/in_biome/birch_forest\",\n    \"#minecraft:top_layer_modification/in_biome/birch_forest\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.6\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/cherry_grove.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.cherry_grove\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7ba4ff\",\n    \"minecraft:visual/water_fog_color\": \"#5db7ef\"\n  },\n  \"carvers\": \"#minecraft:in_biome/cherry_grove\",\n  \"downfall\": 0.8,\n  \"effects\": {\n    \"foliage_color\": \"#b6db61\",\n    \"grass_color\": \"#b6db61\",\n    \"water_color\": \"#5db7ef\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/cherry_grove\",\n    \"#minecraft:lakes/in_biome/cherry_grove\",\n    \"#minecraft:local_modifications/in_biome/cherry_grove\",\n    \"#minecraft:underground_structures/in_biome/cherry_grove\",\n    \"#minecraft:surface_structures/in_biome/cherry_grove\",\n    \"#minecraft:strongholds/in_biome/cherry_grove\",\n    \"#minecraft:underground_ores/in_biome/cherry_grove\",\n    \"#minecraft:underground_decoration/in_biome/cherry_grove\",\n    \"#minecraft:fluid_springs/in_biome/cherry_grove\",\n    \"#minecraft:vegetal_decoration/in_biome/cherry_grove\",\n    \"#minecraft:top_layer_modification/in_biome/cherry_grove\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:rabbit\",\n        \"maxCount\": 6,\n        \"minCount\": 2,\n        \"weight\": 2\n      },\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 2,\n        \"weight\": 2\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/cold_ocean.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"creative\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.creative\"\n      },\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.game\"\n      },\n      \"underwater\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.under_water\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7ba4ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/cold_ocean\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3d57d6\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/cold_ocean\",\n    \"#minecraft:lakes/in_biome/cold_ocean\",\n    \"#minecraft:local_modifications/in_biome/cold_ocean\",\n    \"#minecraft:underground_structures/in_biome/cold_ocean\",\n    \"#minecraft:surface_structures/in_biome/cold_ocean\",\n    \"#minecraft:strongholds/in_biome/cold_ocean\",\n    \"#minecraft:underground_ores/in_biome/cold_ocean\",\n    \"#minecraft:underground_decoration/in_biome/cold_ocean\",\n    \"#minecraft:fluid_springs/in_biome/cold_ocean\",\n    \"#minecraft:vegetal_decoration/in_biome/cold_ocean\",\n    \"#minecraft:top_layer_modification/in_biome/cold_ocean\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:drowned\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [\n      {\n        \"type\": \"minecraft:cod\",\n        \"maxCount\": 6,\n        \"minCount\": 3,\n        \"weight\": 15\n      },\n      {\n        \"type\": \"minecraft:salmon\",\n        \"maxCount\": 5,\n        \"minCount\": 1,\n        \"weight\": 15\n      }\n    ],\n    \"water_creature\": [\n      {\n        \"type\": \"minecraft:squid\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 3\n      },\n      {\n        \"type\": \"minecraft:nautilus\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 2\n      }\n    ]\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/crimson_forest.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/ambient_sounds\": {\n      \"additions\": {\n        \"sound\": \"minecraft:ambient.crimson_forest.additions\",\n        \"tick_chance\": 0.0111\n      },\n      \"loop\": \"minecraft:ambient.crimson_forest.loop\",\n      \"mood\": {\n        \"block_search_extent\": 8,\n        \"offset\": 2.0,\n        \"sound\": \"minecraft:ambient.crimson_forest.mood\",\n        \"tick_delay\": 6000\n      }\n    },\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.nether.crimson_forest\"\n      }\n    },\n    \"minecraft:visual/ambient_particles\": [\n      {\n        \"particle\": {\n          \"type\": \"minecraft:crimson_spore\"\n        },\n        \"probability\": 0.025\n      }\n    ],\n    \"minecraft:visual/fog_color\": \"#330303\"\n  },\n  \"carvers\": \"#minecraft:in_biome/crimson_forest\",\n  \"downfall\": 0.0,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/crimson_forest\",\n    \"#minecraft:lakes/in_biome/crimson_forest\",\n    \"#minecraft:local_modifications/in_biome/crimson_forest\",\n    \"#minecraft:underground_structures/in_biome/crimson_forest\",\n    \"#minecraft:surface_structures/in_biome/crimson_forest\",\n    \"#minecraft:strongholds/in_biome/crimson_forest\",\n    \"#minecraft:underground_ores/in_biome/crimson_forest\",\n    \"#minecraft:underground_decoration/in_biome/crimson_forest\",\n    \"#minecraft:fluid_springs/in_biome/crimson_forest\",\n    \"#minecraft:vegetal_decoration/in_biome/crimson_forest\",\n    \"#minecraft:top_layer_modification/in_biome/crimson_forest\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:strider\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 60\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:zombified_piglin\",\n        \"maxCount\": 4,\n        \"minCount\": 2,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:hoglin\",\n        \"maxCount\": 4,\n        \"minCount\": 3,\n        \"weight\": 9\n      },\n      {\n        \"type\": \"minecraft:piglin\",\n        \"maxCount\": 4,\n        \"minCount\": 3,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 2.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/dark_forest.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.forest\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#79a6ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/dark_forest\",\n  \"downfall\": 0.8,\n  \"effects\": {\n    \"dry_foliage_color\": \"#7b5334\",\n    \"grass_color_modifier\": \"dark_forest\",\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/dark_forest\",\n    \"#minecraft:lakes/in_biome/dark_forest\",\n    \"#minecraft:local_modifications/in_biome/dark_forest\",\n    \"#minecraft:underground_structures/in_biome/dark_forest\",\n    \"#minecraft:surface_structures/in_biome/dark_forest\",\n    \"#minecraft:strongholds/in_biome/dark_forest\",\n    \"#minecraft:underground_ores/in_biome/dark_forest\",\n    \"#minecraft:underground_decoration/in_biome/dark_forest\",\n    \"#minecraft:fluid_springs/in_biome/dark_forest\",\n    \"#minecraft:vegetal_decoration/in_biome/dark_forest\",\n    \"#minecraft:top_layer_modification/in_biome/dark_forest\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.7\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/deep_cold_ocean.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"creative\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.creative\"\n      },\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.game\"\n      },\n      \"underwater\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.under_water\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7ba4ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/deep_cold_ocean\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3d57d6\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/deep_cold_ocean\",\n    \"#minecraft:lakes/in_biome/deep_cold_ocean\",\n    \"#minecraft:local_modifications/in_biome/deep_cold_ocean\",\n    \"#minecraft:underground_structures/in_biome/deep_cold_ocean\",\n    \"#minecraft:surface_structures/in_biome/deep_cold_ocean\",\n    \"#minecraft:strongholds/in_biome/deep_cold_ocean\",\n    \"#minecraft:underground_ores/in_biome/deep_cold_ocean\",\n    \"#minecraft:underground_decoration/in_biome/deep_cold_ocean\",\n    \"#minecraft:fluid_springs/in_biome/deep_cold_ocean\",\n    \"#minecraft:vegetal_decoration/in_biome/deep_cold_ocean\",\n    \"#minecraft:top_layer_modification/in_biome/deep_cold_ocean\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:drowned\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [\n      {\n        \"type\": \"minecraft:cod\",\n        \"maxCount\": 6,\n        \"minCount\": 3,\n        \"weight\": 15\n      },\n      {\n        \"type\": \"minecraft:salmon\",\n        \"maxCount\": 5,\n        \"minCount\": 1,\n        \"weight\": 15\n      }\n    ],\n    \"water_creature\": [\n      {\n        \"type\": \"minecraft:squid\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 3\n      },\n      {\n        \"type\": \"minecraft:nautilus\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 2\n      }\n    ]\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/deep_dark.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.deep_dark\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#78a7ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/deep_dark\",\n  \"downfall\": 0.4,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/deep_dark\",\n    \"#minecraft:lakes/in_biome/deep_dark\",\n    \"#minecraft:local_modifications/in_biome/deep_dark\",\n    \"#minecraft:underground_structures/in_biome/deep_dark\",\n    \"#minecraft:surface_structures/in_biome/deep_dark\",\n    \"#minecraft:strongholds/in_biome/deep_dark\",\n    \"#minecraft:underground_ores/in_biome/deep_dark\",\n    \"#minecraft:underground_decoration/in_biome/deep_dark\",\n    \"#minecraft:fluid_springs/in_biome/deep_dark\",\n    \"#minecraft:vegetal_decoration/in_biome/deep_dark\",\n    \"#minecraft:top_layer_modification/in_biome/deep_dark\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [],\n    \"underground_water_creature\": [],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.8\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/deep_frozen_ocean.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#7ba4ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/deep_frozen_ocean\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3938c9\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/deep_frozen_ocean\",\n    \"#minecraft:lakes/in_biome/deep_frozen_ocean\",\n    \"#minecraft:local_modifications/in_biome/deep_frozen_ocean\",\n    \"#minecraft:underground_structures/in_biome/deep_frozen_ocean\",\n    \"#minecraft:surface_structures/in_biome/deep_frozen_ocean\",\n    \"#minecraft:strongholds/in_biome/deep_frozen_ocean\",\n    \"#minecraft:underground_ores/in_biome/deep_frozen_ocean\",\n    \"#minecraft:underground_decoration/in_biome/deep_frozen_ocean\",\n    \"#minecraft:fluid_springs/in_biome/deep_frozen_ocean\",\n    \"#minecraft:vegetal_decoration/in_biome/deep_frozen_ocean\",\n    \"#minecraft:top_layer_modification/in_biome/deep_frozen_ocean\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:polar_bear\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 1\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:drowned\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [\n      {\n        \"type\": \"minecraft:salmon\",\n        \"maxCount\": 5,\n        \"minCount\": 1,\n        \"weight\": 15\n      }\n    ],\n    \"water_creature\": [\n      {\n        \"type\": \"minecraft:squid\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:nautilus\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 2\n      }\n    ]\n  },\n  \"temperature\": 0.5,\n  \"temperature_modifier\": \"frozen\"\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/deep_lukewarm_ocean.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"creative\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.creative\"\n      },\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.game\"\n      },\n      \"underwater\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.under_water\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7ba4ff\",\n    \"minecraft:visual/water_fog_color\": \"#041633\"\n  },\n  \"carvers\": \"#minecraft:in_biome/deep_lukewarm_ocean\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#45adf2\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/deep_lukewarm_ocean\",\n    \"#minecraft:lakes/in_biome/deep_lukewarm_ocean\",\n    \"#minecraft:local_modifications/in_biome/deep_lukewarm_ocean\",\n    \"#minecraft:underground_structures/in_biome/deep_lukewarm_ocean\",\n    \"#minecraft:surface_structures/in_biome/deep_lukewarm_ocean\",\n    \"#minecraft:strongholds/in_biome/deep_lukewarm_ocean\",\n    \"#minecraft:underground_ores/in_biome/deep_lukewarm_ocean\",\n    \"#minecraft:underground_decoration/in_biome/deep_lukewarm_ocean\",\n    \"#minecraft:fluid_springs/in_biome/deep_lukewarm_ocean\",\n    \"#minecraft:vegetal_decoration/in_biome/deep_lukewarm_ocean\",\n    \"#minecraft:top_layer_modification/in_biome/deep_lukewarm_ocean\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:drowned\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [\n      {\n        \"type\": \"minecraft:cod\",\n        \"maxCount\": 6,\n        \"minCount\": 3,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:pufferfish\",\n        \"maxCount\": 3,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:tropical_fish\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 25\n      }\n    ],\n    \"water_creature\": [\n      {\n        \"type\": \"minecraft:squid\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:dolphin\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 2\n      },\n      {\n        \"type\": \"minecraft:nautilus\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ]\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/deep_ocean.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"creative\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.creative\"\n      },\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.game\"\n      },\n      \"underwater\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.under_water\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7ba4ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/deep_ocean\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/deep_ocean\",\n    \"#minecraft:lakes/in_biome/deep_ocean\",\n    \"#minecraft:local_modifications/in_biome/deep_ocean\",\n    \"#minecraft:underground_structures/in_biome/deep_ocean\",\n    \"#minecraft:surface_structures/in_biome/deep_ocean\",\n    \"#minecraft:strongholds/in_biome/deep_ocean\",\n    \"#minecraft:underground_ores/in_biome/deep_ocean\",\n    \"#minecraft:underground_decoration/in_biome/deep_ocean\",\n    \"#minecraft:fluid_springs/in_biome/deep_ocean\",\n    \"#minecraft:vegetal_decoration/in_biome/deep_ocean\",\n    \"#minecraft:top_layer_modification/in_biome/deep_ocean\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:drowned\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [\n      {\n        \"type\": \"minecraft:cod\",\n        \"maxCount\": 6,\n        \"minCount\": 3,\n        \"weight\": 10\n      }\n    ],\n    \"water_creature\": [\n      {\n        \"type\": \"minecraft:squid\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:dolphin\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:nautilus\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ]\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/desert.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.desert\"\n      }\n    },\n    \"minecraft:gameplay/snow_golem_melts\": true,\n    \"minecraft:visual/sky_color\": \"#6eb1ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/desert\",\n  \"downfall\": 0.0,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/desert\",\n    \"#minecraft:lakes/in_biome/desert\",\n    \"#minecraft:local_modifications/in_biome/desert\",\n    \"#minecraft:underground_structures/in_biome/desert\",\n    \"#minecraft:surface_structures/in_biome/desert\",\n    \"#minecraft:strongholds/in_biome/desert\",\n    \"#minecraft:underground_ores/in_biome/desert\",\n    \"#minecraft:underground_decoration/in_biome/desert\",\n    \"#minecraft:fluid_springs/in_biome/desert\",\n    \"#minecraft:vegetal_decoration/in_biome/desert\",\n    \"#minecraft:top_layer_modification/in_biome/desert\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:rabbit\",\n        \"maxCount\": 3,\n        \"minCount\": 2,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:camel\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 1\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 19\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 50\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:husk\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 80\n      },\n      {\n        \"type\": \"minecraft:parched\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 50\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 2.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/dripstone_caves.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.dripstone_caves\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#78a7ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/dripstone_caves\",\n  \"downfall\": 0.4,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/dripstone_caves\",\n    \"#minecraft:lakes/in_biome/dripstone_caves\",\n    \"#minecraft:local_modifications/in_biome/dripstone_caves\",\n    \"#minecraft:underground_structures/in_biome/dripstone_caves\",\n    \"#minecraft:surface_structures/in_biome/dripstone_caves\",\n    \"#minecraft:strongholds/in_biome/dripstone_caves\",\n    \"#minecraft:underground_ores/in_biome/dripstone_caves\",\n    \"#minecraft:underground_decoration/in_biome/dripstone_caves\",\n    \"#minecraft:fluid_springs/in_biome/dripstone_caves\",\n    \"#minecraft:vegetal_decoration/in_biome/dripstone_caves\",\n    \"#minecraft:top_layer_modification/in_biome/dripstone_caves\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:drowned\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.8\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/end_barrens.json",
    "content": "{\n  \"carvers\": \"#minecraft:in_biome/end_barrens\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/end_barrens\",\n    \"#minecraft:lakes/in_biome/end_barrens\",\n    \"#minecraft:local_modifications/in_biome/end_barrens\",\n    \"#minecraft:underground_structures/in_biome/end_barrens\",\n    \"#minecraft:surface_structures/in_biome/end_barrens\",\n    \"#minecraft:strongholds/in_biome/end_barrens\",\n    \"#minecraft:underground_ores/in_biome/end_barrens\",\n    \"#minecraft:underground_decoration/in_biome/end_barrens\",\n    \"#minecraft:fluid_springs/in_biome/end_barrens\",\n    \"#minecraft:vegetal_decoration/in_biome/end_barrens\",\n    \"#minecraft:top_layer_modification/in_biome/end_barrens\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"underground_water_creature\": [],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/end_highlands.json",
    "content": "{\n  \"carvers\": \"#minecraft:in_biome/end_highlands\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/end_highlands\",\n    \"#minecraft:lakes/in_biome/end_highlands\",\n    \"#minecraft:local_modifications/in_biome/end_highlands\",\n    \"#minecraft:underground_structures/in_biome/end_highlands\",\n    \"#minecraft:surface_structures/in_biome/end_highlands\",\n    \"#minecraft:strongholds/in_biome/end_highlands\",\n    \"#minecraft:underground_ores/in_biome/end_highlands\",\n    \"#minecraft:underground_decoration/in_biome/end_highlands\",\n    \"#minecraft:fluid_springs/in_biome/end_highlands\",\n    \"#minecraft:vegetal_decoration/in_biome/end_highlands\",\n    \"#minecraft:top_layer_modification/in_biome/end_highlands\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"underground_water_creature\": [],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/end_midlands.json",
    "content": "{\n  \"carvers\": \"#minecraft:in_biome/end_midlands\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/end_midlands\",\n    \"#minecraft:lakes/in_biome/end_midlands\",\n    \"#minecraft:local_modifications/in_biome/end_midlands\",\n    \"#minecraft:underground_structures/in_biome/end_midlands\",\n    \"#minecraft:surface_structures/in_biome/end_midlands\",\n    \"#minecraft:strongholds/in_biome/end_midlands\",\n    \"#minecraft:underground_ores/in_biome/end_midlands\",\n    \"#minecraft:underground_decoration/in_biome/end_midlands\",\n    \"#minecraft:fluid_springs/in_biome/end_midlands\",\n    \"#minecraft:vegetal_decoration/in_biome/end_midlands\",\n    \"#minecraft:top_layer_modification/in_biome/end_midlands\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"underground_water_creature\": [],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/eroded_badlands.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.badlands\"\n      }\n    },\n    \"minecraft:gameplay/snow_golem_melts\": true,\n    \"minecraft:visual/sky_color\": \"#6eb1ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/eroded_badlands\",\n  \"creature_spawn_probability\": 0.03,\n  \"downfall\": 0.0,\n  \"effects\": {\n    \"foliage_color\": \"#9e814d\",\n    \"grass_color\": \"#90814d\",\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/eroded_badlands\",\n    \"#minecraft:lakes/in_biome/eroded_badlands\",\n    \"#minecraft:local_modifications/in_biome/eroded_badlands\",\n    \"#minecraft:underground_structures/in_biome/eroded_badlands\",\n    \"#minecraft:surface_structures/in_biome/eroded_badlands\",\n    \"#minecraft:strongholds/in_biome/eroded_badlands\",\n    \"#minecraft:underground_ores/in_biome/eroded_badlands\",\n    \"#minecraft:underground_decoration/in_biome/eroded_badlands\",\n    \"#minecraft:fluid_springs/in_biome/eroded_badlands\",\n    \"#minecraft:vegetal_decoration/in_biome/eroded_badlands\",\n    \"#minecraft:top_layer_modification/in_biome/eroded_badlands\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:armadillo\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 6\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 2.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/flower_forest.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.flower_forest\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#79a6ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/flower_forest\",\n  \"downfall\": 0.8,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/flower_forest\",\n    \"#minecraft:lakes/in_biome/flower_forest\",\n    \"#minecraft:local_modifications/in_biome/flower_forest\",\n    \"#minecraft:underground_structures/in_biome/flower_forest\",\n    \"#minecraft:surface_structures/in_biome/flower_forest\",\n    \"#minecraft:strongholds/in_biome/flower_forest\",\n    \"#minecraft:underground_ores/in_biome/flower_forest\",\n    \"#minecraft:underground_decoration/in_biome/flower_forest\",\n    \"#minecraft:fluid_springs/in_biome/flower_forest\",\n    \"#minecraft:vegetal_decoration/in_biome/flower_forest\",\n    \"#minecraft:top_layer_modification/in_biome/flower_forest\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:rabbit\",\n        \"maxCount\": 3,\n        \"minCount\": 2,\n        \"weight\": 4\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.7\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/forest.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.forest\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#79a6ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/forest\",\n  \"downfall\": 0.8,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/forest\",\n    \"#minecraft:lakes/in_biome/forest\",\n    \"#minecraft:local_modifications/in_biome/forest\",\n    \"#minecraft:underground_structures/in_biome/forest\",\n    \"#minecraft:surface_structures/in_biome/forest\",\n    \"#minecraft:strongholds/in_biome/forest\",\n    \"#minecraft:underground_ores/in_biome/forest\",\n    \"#minecraft:underground_decoration/in_biome/forest\",\n    \"#minecraft:fluid_springs/in_biome/forest\",\n    \"#minecraft:vegetal_decoration/in_biome/forest\",\n    \"#minecraft:top_layer_modification/in_biome/forest\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:wolf\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 5\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.7\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/frozen_ocean.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#7fa1ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/frozen_ocean\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3938c9\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/frozen_ocean\",\n    \"#minecraft:lakes/in_biome/frozen_ocean\",\n    \"#minecraft:local_modifications/in_biome/frozen_ocean\",\n    \"#minecraft:underground_structures/in_biome/frozen_ocean\",\n    \"#minecraft:surface_structures/in_biome/frozen_ocean\",\n    \"#minecraft:strongholds/in_biome/frozen_ocean\",\n    \"#minecraft:underground_ores/in_biome/frozen_ocean\",\n    \"#minecraft:underground_decoration/in_biome/frozen_ocean\",\n    \"#minecraft:fluid_springs/in_biome/frozen_ocean\",\n    \"#minecraft:vegetal_decoration/in_biome/frozen_ocean\",\n    \"#minecraft:top_layer_modification/in_biome/frozen_ocean\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:polar_bear\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 1\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:drowned\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [\n      {\n        \"type\": \"minecraft:salmon\",\n        \"maxCount\": 5,\n        \"minCount\": 1,\n        \"weight\": 15\n      }\n    ],\n    \"water_creature\": [\n      {\n        \"type\": \"minecraft:squid\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:nautilus\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 2\n      }\n    ]\n  },\n  \"temperature\": 0.0,\n  \"temperature_modifier\": \"frozen\"\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/frozen_peaks.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.frozen_peaks\"\n      }\n    },\n    \"minecraft:gameplay/increased_fire_burnout\": true,\n    \"minecraft:visual/sky_color\": \"#859dff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/frozen_peaks\",\n  \"downfall\": 0.9,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/frozen_peaks\",\n    \"#minecraft:lakes/in_biome/frozen_peaks\",\n    \"#minecraft:local_modifications/in_biome/frozen_peaks\",\n    \"#minecraft:underground_structures/in_biome/frozen_peaks\",\n    \"#minecraft:surface_structures/in_biome/frozen_peaks\",\n    \"#minecraft:strongholds/in_biome/frozen_peaks\",\n    \"#minecraft:underground_ores/in_biome/frozen_peaks\",\n    \"#minecraft:underground_decoration/in_biome/frozen_peaks\",\n    \"#minecraft:fluid_springs/in_biome/frozen_peaks\",\n    \"#minecraft:vegetal_decoration/in_biome/frozen_peaks\",\n    \"#minecraft:top_layer_modification/in_biome/frozen_peaks\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:goat\",\n        \"maxCount\": 3,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": -0.7\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/frozen_river.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"creative\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.creative\"\n      },\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.game\"\n      },\n      \"underwater\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.under_water\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7fa1ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/frozen_river\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3938c9\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/frozen_river\",\n    \"#minecraft:lakes/in_biome/frozen_river\",\n    \"#minecraft:local_modifications/in_biome/frozen_river\",\n    \"#minecraft:underground_structures/in_biome/frozen_river\",\n    \"#minecraft:surface_structures/in_biome/frozen_river\",\n    \"#minecraft:strongholds/in_biome/frozen_river\",\n    \"#minecraft:underground_ores/in_biome/frozen_river\",\n    \"#minecraft:underground_decoration/in_biome/frozen_river\",\n    \"#minecraft:fluid_springs/in_biome/frozen_river\",\n    \"#minecraft:vegetal_decoration/in_biome/frozen_river\",\n    \"#minecraft:top_layer_modification/in_biome/frozen_river\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:drowned\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 1\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [\n      {\n        \"type\": \"minecraft:salmon\",\n        \"maxCount\": 5,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"water_creature\": [\n      {\n        \"type\": \"minecraft:squid\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 2\n      }\n    ]\n  },\n  \"temperature\": 0.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/grove.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.grove\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#81a0ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/grove\",\n  \"downfall\": 0.8,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/grove\",\n    \"#minecraft:lakes/in_biome/grove\",\n    \"#minecraft:local_modifications/in_biome/grove\",\n    \"#minecraft:underground_structures/in_biome/grove\",\n    \"#minecraft:surface_structures/in_biome/grove\",\n    \"#minecraft:strongholds/in_biome/grove\",\n    \"#minecraft:underground_ores/in_biome/grove\",\n    \"#minecraft:underground_decoration/in_biome/grove\",\n    \"#minecraft:fluid_springs/in_biome/grove\",\n    \"#minecraft:vegetal_decoration/in_biome/grove\",\n    \"#minecraft:top_layer_modification/in_biome/grove\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:wolf\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:rabbit\",\n        \"maxCount\": 3,\n        \"minCount\": 2,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:fox\",\n        \"maxCount\": 4,\n        \"minCount\": 2,\n        \"weight\": 4\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": -0.2\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/ice_spikes.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#7fa1ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/ice_spikes\",\n  \"creature_spawn_probability\": 0.07,\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/ice_spikes\",\n    \"#minecraft:lakes/in_biome/ice_spikes\",\n    \"#minecraft:local_modifications/in_biome/ice_spikes\",\n    \"#minecraft:underground_structures/in_biome/ice_spikes\",\n    \"#minecraft:surface_structures/in_biome/ice_spikes\",\n    \"#minecraft:strongholds/in_biome/ice_spikes\",\n    \"#minecraft:underground_ores/in_biome/ice_spikes\",\n    \"#minecraft:underground_decoration/in_biome/ice_spikes\",\n    \"#minecraft:fluid_springs/in_biome/ice_spikes\",\n    \"#minecraft:vegetal_decoration/in_biome/ice_spikes\",\n    \"#minecraft:top_layer_modification/in_biome/ice_spikes\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:rabbit\",\n        \"maxCount\": 3,\n        \"minCount\": 2,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:polar_bear\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 1\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 20\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:stray\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 80\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/jagged_peaks.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.jagged_peaks\"\n      }\n    },\n    \"minecraft:gameplay/increased_fire_burnout\": true,\n    \"minecraft:visual/sky_color\": \"#859dff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/jagged_peaks\",\n  \"downfall\": 0.9,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/jagged_peaks\",\n    \"#minecraft:lakes/in_biome/jagged_peaks\",\n    \"#minecraft:local_modifications/in_biome/jagged_peaks\",\n    \"#minecraft:underground_structures/in_biome/jagged_peaks\",\n    \"#minecraft:surface_structures/in_biome/jagged_peaks\",\n    \"#minecraft:strongholds/in_biome/jagged_peaks\",\n    \"#minecraft:underground_ores/in_biome/jagged_peaks\",\n    \"#minecraft:underground_decoration/in_biome/jagged_peaks\",\n    \"#minecraft:fluid_springs/in_biome/jagged_peaks\",\n    \"#minecraft:vegetal_decoration/in_biome/jagged_peaks\",\n    \"#minecraft:top_layer_modification/in_biome/jagged_peaks\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:goat\",\n        \"maxCount\": 3,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": -0.7\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/jungle.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.jungle\"\n      }\n    },\n    \"minecraft:gameplay/increased_fire_burnout\": true,\n    \"minecraft:visual/sky_color\": \"#77a8ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/jungle\",\n  \"downfall\": 0.9,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/jungle\",\n    \"#minecraft:lakes/in_biome/jungle\",\n    \"#minecraft:local_modifications/in_biome/jungle\",\n    \"#minecraft:underground_structures/in_biome/jungle\",\n    \"#minecraft:surface_structures/in_biome/jungle\",\n    \"#minecraft:strongholds/in_biome/jungle\",\n    \"#minecraft:underground_ores/in_biome/jungle\",\n    \"#minecraft:underground_decoration/in_biome/jungle\",\n    \"#minecraft:fluid_springs/in_biome/jungle\",\n    \"#minecraft:vegetal_decoration/in_biome/jungle\",\n    \"#minecraft:top_layer_modification/in_biome/jungle\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:parrot\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 40\n      },\n      {\n        \"type\": \"minecraft:panda\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 1\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:ocelot\",\n        \"maxCount\": 3,\n        \"minCount\": 1,\n        \"weight\": 2\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.95\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/lukewarm_ocean.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"creative\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.creative\"\n      },\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.game\"\n      },\n      \"underwater\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.under_water\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7ba4ff\",\n    \"minecraft:visual/water_fog_color\": \"#041633\"\n  },\n  \"carvers\": \"#minecraft:in_biome/lukewarm_ocean\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#45adf2\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/lukewarm_ocean\",\n    \"#minecraft:lakes/in_biome/lukewarm_ocean\",\n    \"#minecraft:local_modifications/in_biome/lukewarm_ocean\",\n    \"#minecraft:underground_structures/in_biome/lukewarm_ocean\",\n    \"#minecraft:surface_structures/in_biome/lukewarm_ocean\",\n    \"#minecraft:strongholds/in_biome/lukewarm_ocean\",\n    \"#minecraft:underground_ores/in_biome/lukewarm_ocean\",\n    \"#minecraft:underground_decoration/in_biome/lukewarm_ocean\",\n    \"#minecraft:fluid_springs/in_biome/lukewarm_ocean\",\n    \"#minecraft:vegetal_decoration/in_biome/lukewarm_ocean\",\n    \"#minecraft:top_layer_modification/in_biome/lukewarm_ocean\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:drowned\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [\n      {\n        \"type\": \"minecraft:cod\",\n        \"maxCount\": 6,\n        \"minCount\": 3,\n        \"weight\": 15\n      },\n      {\n        \"type\": \"minecraft:pufferfish\",\n        \"maxCount\": 3,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:tropical_fish\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 25\n      }\n    ],\n    \"water_creature\": [\n      {\n        \"type\": \"minecraft:squid\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:dolphin\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 2\n      },\n      {\n        \"type\": \"minecraft:nautilus\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ]\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/lush_caves.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.lush_caves\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7ba4ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/lush_caves\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/lush_caves\",\n    \"#minecraft:lakes/in_biome/lush_caves\",\n    \"#minecraft:local_modifications/in_biome/lush_caves\",\n    \"#minecraft:underground_structures/in_biome/lush_caves\",\n    \"#minecraft:surface_structures/in_biome/lush_caves\",\n    \"#minecraft:strongholds/in_biome/lush_caves\",\n    \"#minecraft:underground_ores/in_biome/lush_caves\",\n    \"#minecraft:underground_decoration/in_biome/lush_caves\",\n    \"#minecraft:fluid_springs/in_biome/lush_caves\",\n    \"#minecraft:vegetal_decoration/in_biome/lush_caves\",\n    \"#minecraft:top_layer_modification/in_biome/lush_caves\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [\n      {\n        \"type\": \"minecraft:axolotl\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [\n      {\n        \"type\": \"minecraft:tropical_fish\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 25\n      }\n    ],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/mangrove_swamp.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.swamp\"\n      }\n    },\n    \"minecraft:gameplay/increased_fire_burnout\": true,\n    \"minecraft:visual/fog_color\": \"#c0d8ff\",\n    \"minecraft:visual/sky_color\": \"#78a7ff\",\n    \"minecraft:visual/water_fog_color\": \"#4d7a60\",\n    \"minecraft:visual/water_fog_end_distance\": {\n      \"argument\": 0.85,\n      \"modifier\": \"multiply\"\n    }\n  },\n  \"carvers\": \"#minecraft:in_biome/mangrove_swamp\",\n  \"downfall\": 0.9,\n  \"effects\": {\n    \"dry_foliage_color\": \"#7b5334\",\n    \"foliage_color\": \"#8db127\",\n    \"grass_color_modifier\": \"swamp\",\n    \"water_color\": \"#3a7a6a\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/mangrove_swamp\",\n    \"#minecraft:lakes/in_biome/mangrove_swamp\",\n    \"#minecraft:local_modifications/in_biome/mangrove_swamp\",\n    \"#minecraft:underground_structures/in_biome/mangrove_swamp\",\n    \"#minecraft:surface_structures/in_biome/mangrove_swamp\",\n    \"#minecraft:strongholds/in_biome/mangrove_swamp\",\n    \"#minecraft:underground_ores/in_biome/mangrove_swamp\",\n    \"#minecraft:underground_decoration/in_biome/mangrove_swamp\",\n    \"#minecraft:fluid_springs/in_biome/mangrove_swamp\",\n    \"#minecraft:vegetal_decoration/in_biome/mangrove_swamp\",\n    \"#minecraft:top_layer_modification/in_biome/mangrove_swamp\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:frog\",\n        \"maxCount\": 5,\n        \"minCount\": 2,\n        \"weight\": 10\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 70\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:bogged\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 30\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [\n      {\n        \"type\": \"minecraft:tropical_fish\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 25\n      }\n    ],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.8\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/meadow.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.meadow\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7ba4ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/meadow\",\n  \"downfall\": 0.8,\n  \"effects\": {\n    \"water_color\": \"#0e4ecf\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/meadow\",\n    \"#minecraft:lakes/in_biome/meadow\",\n    \"#minecraft:local_modifications/in_biome/meadow\",\n    \"#minecraft:underground_structures/in_biome/meadow\",\n    \"#minecraft:surface_structures/in_biome/meadow\",\n    \"#minecraft:strongholds/in_biome/meadow\",\n    \"#minecraft:underground_ores/in_biome/meadow\",\n    \"#minecraft:underground_decoration/in_biome/meadow\",\n    \"#minecraft:fluid_springs/in_biome/meadow\",\n    \"#minecraft:vegetal_decoration/in_biome/meadow\",\n    \"#minecraft:top_layer_modification/in_biome/meadow\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:donkey\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:rabbit\",\n        \"maxCount\": 6,\n        \"minCount\": 2,\n        \"weight\": 2\n      },\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 2,\n        \"weight\": 2\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/mushroom_fields.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:gameplay/can_pillager_patrol_spawn\": false,\n    \"minecraft:gameplay/increased_fire_burnout\": true,\n    \"minecraft:visual/sky_color\": \"#77a8ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/mushroom_fields\",\n  \"downfall\": 1.0,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/mushroom_fields\",\n    \"#minecraft:lakes/in_biome/mushroom_fields\",\n    \"#minecraft:local_modifications/in_biome/mushroom_fields\",\n    \"#minecraft:underground_structures/in_biome/mushroom_fields\",\n    \"#minecraft:surface_structures/in_biome/mushroom_fields\",\n    \"#minecraft:strongholds/in_biome/mushroom_fields\",\n    \"#minecraft:underground_ores/in_biome/mushroom_fields\",\n    \"#minecraft:underground_decoration/in_biome/mushroom_fields\",\n    \"#minecraft:fluid_springs/in_biome/mushroom_fields\",\n    \"#minecraft:vegetal_decoration/in_biome/mushroom_fields\",\n    \"#minecraft:top_layer_modification/in_biome/mushroom_fields\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:mooshroom\",\n        \"maxCount\": 8,\n        \"minCount\": 4,\n        \"weight\": 8\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.9\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/nether_wastes.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/ambient_sounds\": {\n      \"additions\": {\n        \"sound\": \"minecraft:ambient.nether_wastes.additions\",\n        \"tick_chance\": 0.0111\n      },\n      \"loop\": \"minecraft:ambient.nether_wastes.loop\",\n      \"mood\": {\n        \"block_search_extent\": 8,\n        \"offset\": 2.0,\n        \"sound\": \"minecraft:ambient.nether_wastes.mood\",\n        \"tick_delay\": 6000\n      }\n    },\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.nether.nether_wastes\"\n      }\n    },\n    \"minecraft:visual/fog_color\": \"#330808\"\n  },\n  \"carvers\": \"#minecraft:in_biome/nether_wastes\",\n  \"downfall\": 0.0,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/nether_wastes\",\n    \"#minecraft:lakes/in_biome/nether_wastes\",\n    \"#minecraft:local_modifications/in_biome/nether_wastes\",\n    \"#minecraft:underground_structures/in_biome/nether_wastes\",\n    \"#minecraft:surface_structures/in_biome/nether_wastes\",\n    \"#minecraft:strongholds/in_biome/nether_wastes\",\n    \"#minecraft:underground_ores/in_biome/nether_wastes\",\n    \"#minecraft:underground_decoration/in_biome/nether_wastes\",\n    \"#minecraft:fluid_springs/in_biome/nether_wastes\",\n    \"#minecraft:vegetal_decoration/in_biome/nether_wastes\",\n    \"#minecraft:top_layer_modification/in_biome/nether_wastes\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:strider\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 60\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:ghast\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 50\n      },\n      {\n        \"type\": \"minecraft:zombified_piglin\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:magma_cube\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 2\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:piglin\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 15\n      }\n    ],\n    \"underground_water_creature\": [],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 2.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/ocean.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"creative\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.creative\"\n      },\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.game\"\n      },\n      \"underwater\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.under_water\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7ba4ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/ocean\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/ocean\",\n    \"#minecraft:lakes/in_biome/ocean\",\n    \"#minecraft:local_modifications/in_biome/ocean\",\n    \"#minecraft:underground_structures/in_biome/ocean\",\n    \"#minecraft:surface_structures/in_biome/ocean\",\n    \"#minecraft:strongholds/in_biome/ocean\",\n    \"#minecraft:underground_ores/in_biome/ocean\",\n    \"#minecraft:underground_decoration/in_biome/ocean\",\n    \"#minecraft:fluid_springs/in_biome/ocean\",\n    \"#minecraft:vegetal_decoration/in_biome/ocean\",\n    \"#minecraft:top_layer_modification/in_biome/ocean\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:drowned\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [\n      {\n        \"type\": \"minecraft:cod\",\n        \"maxCount\": 6,\n        \"minCount\": 3,\n        \"weight\": 10\n      }\n    ],\n    \"water_creature\": [\n      {\n        \"type\": \"minecraft:squid\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:dolphin\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:nautilus\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ]\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/old_growth_birch_forest.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.forest\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7aa5ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/old_growth_birch_forest\",\n  \"downfall\": 0.6,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/old_growth_birch_forest\",\n    \"#minecraft:lakes/in_biome/old_growth_birch_forest\",\n    \"#minecraft:local_modifications/in_biome/old_growth_birch_forest\",\n    \"#minecraft:underground_structures/in_biome/old_growth_birch_forest\",\n    \"#minecraft:surface_structures/in_biome/old_growth_birch_forest\",\n    \"#minecraft:strongholds/in_biome/old_growth_birch_forest\",\n    \"#minecraft:underground_ores/in_biome/old_growth_birch_forest\",\n    \"#minecraft:underground_decoration/in_biome/old_growth_birch_forest\",\n    \"#minecraft:fluid_springs/in_biome/old_growth_birch_forest\",\n    \"#minecraft:vegetal_decoration/in_biome/old_growth_birch_forest\",\n    \"#minecraft:top_layer_modification/in_biome/old_growth_birch_forest\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.6\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/old_growth_pine_taiga.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.old_growth_taiga\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7ca3ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/old_growth_pine_taiga\",\n  \"downfall\": 0.8,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/old_growth_pine_taiga\",\n    \"#minecraft:lakes/in_biome/old_growth_pine_taiga\",\n    \"#minecraft:local_modifications/in_biome/old_growth_pine_taiga\",\n    \"#minecraft:underground_structures/in_biome/old_growth_pine_taiga\",\n    \"#minecraft:surface_structures/in_biome/old_growth_pine_taiga\",\n    \"#minecraft:strongholds/in_biome/old_growth_pine_taiga\",\n    \"#minecraft:underground_ores/in_biome/old_growth_pine_taiga\",\n    \"#minecraft:underground_decoration/in_biome/old_growth_pine_taiga\",\n    \"#minecraft:fluid_springs/in_biome/old_growth_pine_taiga\",\n    \"#minecraft:vegetal_decoration/in_biome/old_growth_pine_taiga\",\n    \"#minecraft:top_layer_modification/in_biome/old_growth_pine_taiga\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:wolf\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:rabbit\",\n        \"maxCount\": 3,\n        \"minCount\": 2,\n        \"weight\": 4\n      },\n      {\n        \"type\": \"minecraft:fox\",\n        \"maxCount\": 4,\n        \"minCount\": 2,\n        \"weight\": 8\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 25\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.3\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/old_growth_spruce_taiga.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.old_growth_taiga\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7da3ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/old_growth_spruce_taiga\",\n  \"downfall\": 0.8,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/old_growth_spruce_taiga\",\n    \"#minecraft:lakes/in_biome/old_growth_spruce_taiga\",\n    \"#minecraft:local_modifications/in_biome/old_growth_spruce_taiga\",\n    \"#minecraft:underground_structures/in_biome/old_growth_spruce_taiga\",\n    \"#minecraft:surface_structures/in_biome/old_growth_spruce_taiga\",\n    \"#minecraft:strongholds/in_biome/old_growth_spruce_taiga\",\n    \"#minecraft:underground_ores/in_biome/old_growth_spruce_taiga\",\n    \"#minecraft:underground_decoration/in_biome/old_growth_spruce_taiga\",\n    \"#minecraft:fluid_springs/in_biome/old_growth_spruce_taiga\",\n    \"#minecraft:vegetal_decoration/in_biome/old_growth_spruce_taiga\",\n    \"#minecraft:top_layer_modification/in_biome/old_growth_spruce_taiga\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:wolf\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:rabbit\",\n        \"maxCount\": 3,\n        \"minCount\": 2,\n        \"weight\": 4\n      },\n      {\n        \"type\": \"minecraft:fox\",\n        \"maxCount\": 4,\n        \"minCount\": 2,\n        \"weight\": 8\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.25\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/pale_garden.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {},\n    \"minecraft:audio/music_volume\": 0.0,\n    \"minecraft:visual/fog_color\": \"#817770\",\n    \"minecraft:visual/sky_color\": \"#b9b9b9\",\n    \"minecraft:visual/water_fog_color\": \"#556980\"\n  },\n  \"carvers\": \"#minecraft:in_biome/pale_garden\",\n  \"downfall\": 0.8,\n  \"effects\": {\n    \"dry_foliage_color\": \"#a0a69c\",\n    \"foliage_color\": \"#878d76\",\n    \"grass_color\": \"#778272\",\n    \"water_color\": \"#76889d\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/pale_garden\",\n    \"#minecraft:lakes/in_biome/pale_garden\",\n    \"#minecraft:local_modifications/in_biome/pale_garden\",\n    \"#minecraft:underground_structures/in_biome/pale_garden\",\n    \"#minecraft:surface_structures/in_biome/pale_garden\",\n    \"#minecraft:strongholds/in_biome/pale_garden\",\n    \"#minecraft:underground_ores/in_biome/pale_garden\",\n    \"#minecraft:underground_decoration/in_biome/pale_garden\",\n    \"#minecraft:fluid_springs/in_biome/pale_garden\",\n    \"#minecraft:vegetal_decoration/in_biome/pale_garden\",\n    \"#minecraft:top_layer_modification/in_biome/pale_garden\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.7\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/plains.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#78a7ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/plains\",\n  \"downfall\": 0.4,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/plains\",\n    \"#minecraft:lakes/in_biome/plains\",\n    \"#minecraft:local_modifications/in_biome/plains\",\n    \"#minecraft:underground_structures/in_biome/plains\",\n    \"#minecraft:surface_structures/in_biome/plains\",\n    \"#minecraft:strongholds/in_biome/plains\",\n    \"#minecraft:underground_ores/in_biome/plains\",\n    \"#minecraft:underground_decoration/in_biome/plains\",\n    \"#minecraft:fluid_springs/in_biome/plains\",\n    \"#minecraft:vegetal_decoration/in_biome/plains\",\n    \"#minecraft:top_layer_modification/in_biome/plains\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:horse\",\n        \"maxCount\": 6,\n        \"minCount\": 2,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:donkey\",\n        \"maxCount\": 3,\n        \"minCount\": 1,\n        \"weight\": 1\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 90\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:zombie_horse\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.8\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/river.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"creative\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.creative\"\n      },\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.game\"\n      },\n      \"underwater\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.under_water\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7ba4ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/river\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/river\",\n    \"#minecraft:lakes/in_biome/river\",\n    \"#minecraft:local_modifications/in_biome/river\",\n    \"#minecraft:underground_structures/in_biome/river\",\n    \"#minecraft:surface_structures/in_biome/river\",\n    \"#minecraft:strongholds/in_biome/river\",\n    \"#minecraft:underground_ores/in_biome/river\",\n    \"#minecraft:underground_decoration/in_biome/river\",\n    \"#minecraft:fluid_springs/in_biome/river\",\n    \"#minecraft:vegetal_decoration/in_biome/river\",\n    \"#minecraft:top_layer_modification/in_biome/river\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:drowned\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 100\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [\n      {\n        \"type\": \"minecraft:salmon\",\n        \"maxCount\": 5,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"water_creature\": [\n      {\n        \"type\": \"minecraft:squid\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 2\n      }\n    ]\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/savanna.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:gameplay/snow_golem_melts\": true,\n    \"minecraft:visual/sky_color\": \"#6eb1ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/savanna\",\n  \"downfall\": 0.0,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/savanna\",\n    \"#minecraft:lakes/in_biome/savanna\",\n    \"#minecraft:local_modifications/in_biome/savanna\",\n    \"#minecraft:underground_structures/in_biome/savanna\",\n    \"#minecraft:surface_structures/in_biome/savanna\",\n    \"#minecraft:strongholds/in_biome/savanna\",\n    \"#minecraft:underground_ores/in_biome/savanna\",\n    \"#minecraft:underground_decoration/in_biome/savanna\",\n    \"#minecraft:fluid_springs/in_biome/savanna\",\n    \"#minecraft:vegetal_decoration/in_biome/savanna\",\n    \"#minecraft:top_layer_modification/in_biome/savanna\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:horse\",\n        \"maxCount\": 6,\n        \"minCount\": 2,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:donkey\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:armadillo\",\n        \"maxCount\": 3,\n        \"minCount\": 2,\n        \"weight\": 10\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 90\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:zombie_horse\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 2.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/savanna_plateau.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:gameplay/snow_golem_melts\": true,\n    \"minecraft:visual/sky_color\": \"#6eb1ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/savanna_plateau\",\n  \"downfall\": 0.0,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/savanna_plateau\",\n    \"#minecraft:lakes/in_biome/savanna_plateau\",\n    \"#minecraft:local_modifications/in_biome/savanna_plateau\",\n    \"#minecraft:underground_structures/in_biome/savanna_plateau\",\n    \"#minecraft:surface_structures/in_biome/savanna_plateau\",\n    \"#minecraft:strongholds/in_biome/savanna_plateau\",\n    \"#minecraft:underground_ores/in_biome/savanna_plateau\",\n    \"#minecraft:underground_decoration/in_biome/savanna_plateau\",\n    \"#minecraft:fluid_springs/in_biome/savanna_plateau\",\n    \"#minecraft:vegetal_decoration/in_biome/savanna_plateau\",\n    \"#minecraft:top_layer_modification/in_biome/savanna_plateau\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:horse\",\n        \"maxCount\": 6,\n        \"minCount\": 2,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:donkey\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:armadillo\",\n        \"maxCount\": 3,\n        \"minCount\": 2,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:llama\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:wolf\",\n        \"maxCount\": 8,\n        \"minCount\": 4,\n        \"weight\": 8\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 90\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:zombie_horse\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 2.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/small_end_islands.json",
    "content": "{\n  \"carvers\": \"#minecraft:in_biome/small_end_islands\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/small_end_islands\",\n    \"#minecraft:lakes/in_biome/small_end_islands\",\n    \"#minecraft:local_modifications/in_biome/small_end_islands\",\n    \"#minecraft:underground_structures/in_biome/small_end_islands\",\n    \"#minecraft:surface_structures/in_biome/small_end_islands\",\n    \"#minecraft:strongholds/in_biome/small_end_islands\",\n    \"#minecraft:underground_ores/in_biome/small_end_islands\",\n    \"#minecraft:underground_decoration/in_biome/small_end_islands\",\n    \"#minecraft:fluid_springs/in_biome/small_end_islands\",\n    \"#minecraft:vegetal_decoration/in_biome/small_end_islands\",\n    \"#minecraft:top_layer_modification/in_biome/small_end_islands\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"underground_water_creature\": [],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/snowy_beach.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#7fa1ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/snowy_beach\",\n  \"downfall\": 0.3,\n  \"effects\": {\n    \"water_color\": \"#3d57d6\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/snowy_beach\",\n    \"#minecraft:lakes/in_biome/snowy_beach\",\n    \"#minecraft:local_modifications/in_biome/snowy_beach\",\n    \"#minecraft:underground_structures/in_biome/snowy_beach\",\n    \"#minecraft:surface_structures/in_biome/snowy_beach\",\n    \"#minecraft:strongholds/in_biome/snowy_beach\",\n    \"#minecraft:underground_ores/in_biome/snowy_beach\",\n    \"#minecraft:underground_decoration/in_biome/snowy_beach\",\n    \"#minecraft:fluid_springs/in_biome/snowy_beach\",\n    \"#minecraft:vegetal_decoration/in_biome/snowy_beach\",\n    \"#minecraft:top_layer_modification/in_biome/snowy_beach\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.05\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/snowy_plains.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#7fa1ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/snowy_plains\",\n  \"creature_spawn_probability\": 0.07,\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/snowy_plains\",\n    \"#minecraft:lakes/in_biome/snowy_plains\",\n    \"#minecraft:local_modifications/in_biome/snowy_plains\",\n    \"#minecraft:underground_structures/in_biome/snowy_plains\",\n    \"#minecraft:surface_structures/in_biome/snowy_plains\",\n    \"#minecraft:strongholds/in_biome/snowy_plains\",\n    \"#minecraft:underground_ores/in_biome/snowy_plains\",\n    \"#minecraft:underground_decoration/in_biome/snowy_plains\",\n    \"#minecraft:fluid_springs/in_biome/snowy_plains\",\n    \"#minecraft:vegetal_decoration/in_biome/snowy_plains\",\n    \"#minecraft:top_layer_modification/in_biome/snowy_plains\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:rabbit\",\n        \"maxCount\": 3,\n        \"minCount\": 2,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:polar_bear\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 1\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 90\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:zombie_horse\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 20\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:stray\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 80\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/snowy_slopes.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.snowy_slopes\"\n      }\n    },\n    \"minecraft:gameplay/increased_fire_burnout\": true,\n    \"minecraft:visual/sky_color\": \"#829fff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/snowy_slopes\",\n  \"downfall\": 0.9,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/snowy_slopes\",\n    \"#minecraft:lakes/in_biome/snowy_slopes\",\n    \"#minecraft:local_modifications/in_biome/snowy_slopes\",\n    \"#minecraft:underground_structures/in_biome/snowy_slopes\",\n    \"#minecraft:surface_structures/in_biome/snowy_slopes\",\n    \"#minecraft:strongholds/in_biome/snowy_slopes\",\n    \"#minecraft:underground_ores/in_biome/snowy_slopes\",\n    \"#minecraft:underground_decoration/in_biome/snowy_slopes\",\n    \"#minecraft:fluid_springs/in_biome/snowy_slopes\",\n    \"#minecraft:vegetal_decoration/in_biome/snowy_slopes\",\n    \"#minecraft:top_layer_modification/in_biome/snowy_slopes\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:rabbit\",\n        \"maxCount\": 3,\n        \"minCount\": 2,\n        \"weight\": 4\n      },\n      {\n        \"type\": \"minecraft:goat\",\n        \"maxCount\": 3,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": -0.3\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/snowy_taiga.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#839eff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/snowy_taiga\",\n  \"downfall\": 0.4,\n  \"effects\": {\n    \"water_color\": \"#3d57d6\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/snowy_taiga\",\n    \"#minecraft:lakes/in_biome/snowy_taiga\",\n    \"#minecraft:local_modifications/in_biome/snowy_taiga\",\n    \"#minecraft:underground_structures/in_biome/snowy_taiga\",\n    \"#minecraft:surface_structures/in_biome/snowy_taiga\",\n    \"#minecraft:strongholds/in_biome/snowy_taiga\",\n    \"#minecraft:underground_ores/in_biome/snowy_taiga\",\n    \"#minecraft:underground_decoration/in_biome/snowy_taiga\",\n    \"#minecraft:fluid_springs/in_biome/snowy_taiga\",\n    \"#minecraft:vegetal_decoration/in_biome/snowy_taiga\",\n    \"#minecraft:top_layer_modification/in_biome/snowy_taiga\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:wolf\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:rabbit\",\n        \"maxCount\": 3,\n        \"minCount\": 2,\n        \"weight\": 4\n      },\n      {\n        \"type\": \"minecraft:fox\",\n        \"maxCount\": 4,\n        \"minCount\": 2,\n        \"weight\": 8\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": -0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/soul_sand_valley.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/ambient_sounds\": {\n      \"additions\": {\n        \"sound\": \"minecraft:ambient.soul_sand_valley.additions\",\n        \"tick_chance\": 0.0111\n      },\n      \"loop\": \"minecraft:ambient.soul_sand_valley.loop\",\n      \"mood\": {\n        \"block_search_extent\": 8,\n        \"offset\": 2.0,\n        \"sound\": \"minecraft:ambient.soul_sand_valley.mood\",\n        \"tick_delay\": 6000\n      }\n    },\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.nether.soul_sand_valley\"\n      }\n    },\n    \"minecraft:visual/ambient_particles\": [\n      {\n        \"particle\": {\n          \"type\": \"minecraft:ash\"\n        },\n        \"probability\": 0.00625\n      }\n    ],\n    \"minecraft:visual/fog_color\": \"#1b4745\"\n  },\n  \"carvers\": \"#minecraft:in_biome/soul_sand_valley\",\n  \"downfall\": 0.0,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/soul_sand_valley\",\n    \"#minecraft:lakes/in_biome/soul_sand_valley\",\n    \"#minecraft:local_modifications/in_biome/soul_sand_valley\",\n    \"#minecraft:underground_structures/in_biome/soul_sand_valley\",\n    \"#minecraft:surface_structures/in_biome/soul_sand_valley\",\n    \"#minecraft:strongholds/in_biome/soul_sand_valley\",\n    \"#minecraft:underground_ores/in_biome/soul_sand_valley\",\n    \"#minecraft:underground_decoration/in_biome/soul_sand_valley\",\n    \"#minecraft:fluid_springs/in_biome/soul_sand_valley\",\n    \"#minecraft:vegetal_decoration/in_biome/soul_sand_valley\",\n    \"#minecraft:top_layer_modification/in_biome/soul_sand_valley\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {\n    \"minecraft:enderman\": {\n      \"charge\": 0.7,\n      \"energy_budget\": 0.15\n    },\n    \"minecraft:ghast\": {\n      \"charge\": 0.7,\n      \"energy_budget\": 0.15\n    },\n    \"minecraft:skeleton\": {\n      \"charge\": 0.7,\n      \"energy_budget\": 0.15\n    },\n    \"minecraft:strider\": {\n      \"charge\": 0.7,\n      \"energy_budget\": 0.15\n    }\n  },\n  \"spawners\": {\n    \"ambient\": [],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:strider\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 60\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 5,\n        \"minCount\": 5,\n        \"weight\": 20\n      },\n      {\n        \"type\": \"minecraft:ghast\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 50\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 1\n      }\n    ],\n    \"underground_water_creature\": [],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 2.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/sparse_jungle.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.sparse_jungle\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#77a8ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/sparse_jungle\",\n  \"downfall\": 0.8,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/sparse_jungle\",\n    \"#minecraft:lakes/in_biome/sparse_jungle\",\n    \"#minecraft:local_modifications/in_biome/sparse_jungle\",\n    \"#minecraft:underground_structures/in_biome/sparse_jungle\",\n    \"#minecraft:surface_structures/in_biome/sparse_jungle\",\n    \"#minecraft:strongholds/in_biome/sparse_jungle\",\n    \"#minecraft:underground_ores/in_biome/sparse_jungle\",\n    \"#minecraft:underground_decoration/in_biome/sparse_jungle\",\n    \"#minecraft:fluid_springs/in_biome/sparse_jungle\",\n    \"#minecraft:vegetal_decoration/in_biome/sparse_jungle\",\n    \"#minecraft:top_layer_modification/in_biome/sparse_jungle\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:wolf\",\n        \"maxCount\": 4,\n        \"minCount\": 2,\n        \"weight\": 8\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.95\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/stony_peaks.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.stony_peaks\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#76a8ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/stony_peaks\",\n  \"downfall\": 0.3,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/stony_peaks\",\n    \"#minecraft:lakes/in_biome/stony_peaks\",\n    \"#minecraft:local_modifications/in_biome/stony_peaks\",\n    \"#minecraft:underground_structures/in_biome/stony_peaks\",\n    \"#minecraft:surface_structures/in_biome/stony_peaks\",\n    \"#minecraft:strongholds/in_biome/stony_peaks\",\n    \"#minecraft:underground_ores/in_biome/stony_peaks\",\n    \"#minecraft:underground_decoration/in_biome/stony_peaks\",\n    \"#minecraft:fluid_springs/in_biome/stony_peaks\",\n    \"#minecraft:vegetal_decoration/in_biome/stony_peaks\",\n    \"#minecraft:top_layer_modification/in_biome/stony_peaks\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 1.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/stony_shore.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#7da2ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/stony_shore\",\n  \"downfall\": 0.3,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/stony_shore\",\n    \"#minecraft:lakes/in_biome/stony_shore\",\n    \"#minecraft:local_modifications/in_biome/stony_shore\",\n    \"#minecraft:underground_structures/in_biome/stony_shore\",\n    \"#minecraft:surface_structures/in_biome/stony_shore\",\n    \"#minecraft:strongholds/in_biome/stony_shore\",\n    \"#minecraft:underground_ores/in_biome/stony_shore\",\n    \"#minecraft:underground_decoration/in_biome/stony_shore\",\n    \"#minecraft:fluid_springs/in_biome/stony_shore\",\n    \"#minecraft:vegetal_decoration/in_biome/stony_shore\",\n    \"#minecraft:top_layer_modification/in_biome/stony_shore\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.2\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/sunflower_plains.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#78a7ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/sunflower_plains\",\n  \"downfall\": 0.4,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/sunflower_plains\",\n    \"#minecraft:lakes/in_biome/sunflower_plains\",\n    \"#minecraft:local_modifications/in_biome/sunflower_plains\",\n    \"#minecraft:underground_structures/in_biome/sunflower_plains\",\n    \"#minecraft:surface_structures/in_biome/sunflower_plains\",\n    \"#minecraft:strongholds/in_biome/sunflower_plains\",\n    \"#minecraft:underground_ores/in_biome/sunflower_plains\",\n    \"#minecraft:underground_decoration/in_biome/sunflower_plains\",\n    \"#minecraft:fluid_springs/in_biome/sunflower_plains\",\n    \"#minecraft:vegetal_decoration/in_biome/sunflower_plains\",\n    \"#minecraft:top_layer_modification/in_biome/sunflower_plains\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:horse\",\n        \"maxCount\": 6,\n        \"minCount\": 2,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:donkey\",\n        \"maxCount\": 3,\n        \"minCount\": 1,\n        \"weight\": 1\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 90\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:zombie_horse\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.8\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/swamp.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.swamp\"\n      }\n    },\n    \"minecraft:gameplay/increased_fire_burnout\": true,\n    \"minecraft:visual/sky_color\": \"#78a7ff\",\n    \"minecraft:visual/water_fog_color\": \"#232317\",\n    \"minecraft:visual/water_fog_end_distance\": {\n      \"argument\": 0.85,\n      \"modifier\": \"multiply\"\n    }\n  },\n  \"carvers\": \"#minecraft:in_biome/swamp\",\n  \"downfall\": 0.9,\n  \"effects\": {\n    \"dry_foliage_color\": \"#7b5334\",\n    \"foliage_color\": \"#6a7039\",\n    \"grass_color_modifier\": \"swamp\",\n    \"water_color\": \"#617b64\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/swamp\",\n    \"#minecraft:lakes/in_biome/swamp\",\n    \"#minecraft:local_modifications/in_biome/swamp\",\n    \"#minecraft:underground_structures/in_biome/swamp\",\n    \"#minecraft:surface_structures/in_biome/swamp\",\n    \"#minecraft:strongholds/in_biome/swamp\",\n    \"#minecraft:underground_ores/in_biome/swamp\",\n    \"#minecraft:underground_decoration/in_biome/swamp\",\n    \"#minecraft:fluid_springs/in_biome/swamp\",\n    \"#minecraft:vegetal_decoration/in_biome/swamp\",\n    \"#minecraft:top_layer_modification/in_biome/swamp\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:frog\",\n        \"maxCount\": 5,\n        \"minCount\": 2,\n        \"weight\": 10\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 70\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:bogged\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 30\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.8\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/taiga.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#7da3ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/taiga\",\n  \"downfall\": 0.8,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/taiga\",\n    \"#minecraft:lakes/in_biome/taiga\",\n    \"#minecraft:local_modifications/in_biome/taiga\",\n    \"#minecraft:underground_structures/in_biome/taiga\",\n    \"#minecraft:surface_structures/in_biome/taiga\",\n    \"#minecraft:strongholds/in_biome/taiga\",\n    \"#minecraft:underground_ores/in_biome/taiga\",\n    \"#minecraft:underground_decoration/in_biome/taiga\",\n    \"#minecraft:fluid_springs/in_biome/taiga\",\n    \"#minecraft:vegetal_decoration/in_biome/taiga\",\n    \"#minecraft:top_layer_modification/in_biome/taiga\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:wolf\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:rabbit\",\n        \"maxCount\": 3,\n        \"minCount\": 2,\n        \"weight\": 4\n      },\n      {\n        \"type\": \"minecraft:fox\",\n        \"maxCount\": 4,\n        \"minCount\": 2,\n        \"weight\": 8\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.25\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/the_end.json",
    "content": "{\n  \"carvers\": \"#minecraft:in_biome/the_end\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/the_end\",\n    \"#minecraft:lakes/in_biome/the_end\",\n    \"#minecraft:local_modifications/in_biome/the_end\",\n    \"#minecraft:underground_structures/in_biome/the_end\",\n    \"#minecraft:surface_structures/in_biome/the_end\",\n    \"#minecraft:strongholds/in_biome/the_end\",\n    \"#minecraft:underground_ores/in_biome/the_end\",\n    \"#minecraft:underground_decoration/in_biome/the_end\",\n    \"#minecraft:fluid_springs/in_biome/the_end\",\n    \"#minecraft:vegetal_decoration/in_biome/the_end\",\n    \"#minecraft:top_layer_modification/in_biome/the_end\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"underground_water_creature\": [],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/the_void.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#7ba4ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/the_void\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/the_void\",\n    \"#minecraft:lakes/in_biome/the_void\",\n    \"#minecraft:local_modifications/in_biome/the_void\",\n    \"#minecraft:underground_structures/in_biome/the_void\",\n    \"#minecraft:surface_structures/in_biome/the_void\",\n    \"#minecraft:strongholds/in_biome/the_void\",\n    \"#minecraft:underground_ores/in_biome/the_void\",\n    \"#minecraft:underground_decoration/in_biome/the_void\",\n    \"#minecraft:fluid_springs/in_biome/the_void\",\n    \"#minecraft:vegetal_decoration/in_biome/the_void\",\n    \"#minecraft:top_layer_modification/in_biome/the_void\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [],\n    \"underground_water_creature\": [],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/warm_ocean.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"creative\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.creative\"\n      },\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.game\"\n      },\n      \"underwater\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.under_water\"\n      }\n    },\n    \"minecraft:visual/sky_color\": \"#7ba4ff\",\n    \"minecraft:visual/water_fog_color\": \"#041f33\"\n  },\n  \"carvers\": \"#minecraft:in_biome/warm_ocean\",\n  \"downfall\": 0.5,\n  \"effects\": {\n    \"water_color\": \"#43d5ee\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/warm_ocean\",\n    \"#minecraft:lakes/in_biome/warm_ocean\",\n    \"#minecraft:local_modifications/in_biome/warm_ocean\",\n    \"#minecraft:underground_structures/in_biome/warm_ocean\",\n    \"#minecraft:surface_structures/in_biome/warm_ocean\",\n    \"#minecraft:strongholds/in_biome/warm_ocean\",\n    \"#minecraft:underground_ores/in_biome/warm_ocean\",\n    \"#minecraft:underground_decoration/in_biome/warm_ocean\",\n    \"#minecraft:fluid_springs/in_biome/warm_ocean\",\n    \"#minecraft:vegetal_decoration/in_biome/warm_ocean\",\n    \"#minecraft:top_layer_modification/in_biome/warm_ocean\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:drowned\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [\n      {\n        \"type\": \"minecraft:pufferfish\",\n        \"maxCount\": 3,\n        \"minCount\": 1,\n        \"weight\": 15\n      },\n      {\n        \"type\": \"minecraft:tropical_fish\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 25\n      }\n    ],\n    \"water_creature\": [\n      {\n        \"type\": \"minecraft:nautilus\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:squid\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:dolphin\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 2\n      }\n    ]\n  },\n  \"temperature\": 0.5\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/warped_forest.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/ambient_sounds\": {\n      \"additions\": {\n        \"sound\": \"minecraft:ambient.warped_forest.additions\",\n        \"tick_chance\": 0.0111\n      },\n      \"loop\": \"minecraft:ambient.warped_forest.loop\",\n      \"mood\": {\n        \"block_search_extent\": 8,\n        \"offset\": 2.0,\n        \"sound\": \"minecraft:ambient.warped_forest.mood\",\n        \"tick_delay\": 6000\n      }\n    },\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.nether.warped_forest\"\n      }\n    },\n    \"minecraft:visual/ambient_particles\": [\n      {\n        \"particle\": {\n          \"type\": \"minecraft:warped_spore\"\n        },\n        \"probability\": 0.01428\n      }\n    ],\n    \"minecraft:visual/fog_color\": \"#1a051a\"\n  },\n  \"carvers\": \"#minecraft:in_biome/warped_forest\",\n  \"downfall\": 0.0,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/warped_forest\",\n    \"#minecraft:lakes/in_biome/warped_forest\",\n    \"#minecraft:local_modifications/in_biome/warped_forest\",\n    \"#minecraft:underground_structures/in_biome/warped_forest\",\n    \"#minecraft:surface_structures/in_biome/warped_forest\",\n    \"#minecraft:strongholds/in_biome/warped_forest\",\n    \"#minecraft:underground_ores/in_biome/warped_forest\",\n    \"#minecraft:underground_decoration/in_biome/warped_forest\",\n    \"#minecraft:fluid_springs/in_biome/warped_forest\",\n    \"#minecraft:vegetal_decoration/in_biome/warped_forest\",\n    \"#minecraft:top_layer_modification/in_biome/warped_forest\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {\n    \"minecraft:enderman\": {\n      \"charge\": 1.0,\n      \"energy_budget\": 0.12\n    }\n  },\n  \"spawners\": {\n    \"ambient\": [],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:strider\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 60\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 1\n      }\n    ],\n    \"underground_water_creature\": [],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 2.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/windswept_forest.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#7da2ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/windswept_forest\",\n  \"downfall\": 0.3,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/windswept_forest\",\n    \"#minecraft:lakes/in_biome/windswept_forest\",\n    \"#minecraft:local_modifications/in_biome/windswept_forest\",\n    \"#minecraft:underground_structures/in_biome/windswept_forest\",\n    \"#minecraft:surface_structures/in_biome/windswept_forest\",\n    \"#minecraft:strongholds/in_biome/windswept_forest\",\n    \"#minecraft:underground_ores/in_biome/windswept_forest\",\n    \"#minecraft:underground_decoration/in_biome/windswept_forest\",\n    \"#minecraft:fluid_springs/in_biome/windswept_forest\",\n    \"#minecraft:vegetal_decoration/in_biome/windswept_forest\",\n    \"#minecraft:top_layer_modification/in_biome/windswept_forest\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:llama\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 5\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.2\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/windswept_gravelly_hills.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#7da2ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/windswept_gravelly_hills\",\n  \"downfall\": 0.3,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/windswept_gravelly_hills\",\n    \"#minecraft:lakes/in_biome/windswept_gravelly_hills\",\n    \"#minecraft:local_modifications/in_biome/windswept_gravelly_hills\",\n    \"#minecraft:underground_structures/in_biome/windswept_gravelly_hills\",\n    \"#minecraft:surface_structures/in_biome/windswept_gravelly_hills\",\n    \"#minecraft:strongholds/in_biome/windswept_gravelly_hills\",\n    \"#minecraft:underground_ores/in_biome/windswept_gravelly_hills\",\n    \"#minecraft:underground_decoration/in_biome/windswept_gravelly_hills\",\n    \"#minecraft:fluid_springs/in_biome/windswept_gravelly_hills\",\n    \"#minecraft:vegetal_decoration/in_biome/windswept_gravelly_hills\",\n    \"#minecraft:top_layer_modification/in_biome/windswept_gravelly_hills\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:llama\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 5\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.2\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/windswept_hills.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:visual/sky_color\": \"#7da2ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/windswept_hills\",\n  \"downfall\": 0.3,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/windswept_hills\",\n    \"#minecraft:lakes/in_biome/windswept_hills\",\n    \"#minecraft:local_modifications/in_biome/windswept_hills\",\n    \"#minecraft:underground_structures/in_biome/windswept_hills\",\n    \"#minecraft:surface_structures/in_biome/windswept_hills\",\n    \"#minecraft:strongholds/in_biome/windswept_hills\",\n    \"#minecraft:underground_ores/in_biome/windswept_hills\",\n    \"#minecraft:underground_decoration/in_biome/windswept_hills\",\n    \"#minecraft:fluid_springs/in_biome/windswept_hills\",\n    \"#minecraft:vegetal_decoration/in_biome/windswept_hills\",\n    \"#minecraft:top_layer_modification/in_biome/windswept_hills\"\n  ],\n  \"has_precipitation\": true,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:llama\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 5\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 0.2\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/windswept_savanna.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:gameplay/snow_golem_melts\": true,\n    \"minecraft:visual/sky_color\": \"#6eb1ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/windswept_savanna\",\n  \"downfall\": 0.0,\n  \"effects\": {\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/windswept_savanna\",\n    \"#minecraft:lakes/in_biome/windswept_savanna\",\n    \"#minecraft:local_modifications/in_biome/windswept_savanna\",\n    \"#minecraft:underground_structures/in_biome/windswept_savanna\",\n    \"#minecraft:surface_structures/in_biome/windswept_savanna\",\n    \"#minecraft:strongholds/in_biome/windswept_savanna\",\n    \"#minecraft:underground_ores/in_biome/windswept_savanna\",\n    \"#minecraft:underground_decoration/in_biome/windswept_savanna\",\n    \"#minecraft:fluid_springs/in_biome/windswept_savanna\",\n    \"#minecraft:vegetal_decoration/in_biome/windswept_savanna\",\n    \"#minecraft:top_layer_modification/in_biome/windswept_savanna\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:horse\",\n        \"maxCount\": 6,\n        \"minCount\": 2,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:donkey\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 1\n      },\n      {\n        \"type\": \"minecraft:armadillo\",\n        \"maxCount\": 3,\n        \"minCount\": 2,\n        \"weight\": 10\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 90\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:zombie_horse\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 2.0\n}\n"
  },
  {
    "path": "pfb_biome_extensions/data/minecraft/worldgen/biome/wooded_badlands.json",
    "content": "{\n  \"attributes\": {\n    \"minecraft:audio/background_music\": {\n      \"default\": {\n        \"max_delay\": 24000,\n        \"min_delay\": 12000,\n        \"sound\": \"minecraft:music.overworld.badlands\"\n      }\n    },\n    \"minecraft:gameplay/snow_golem_melts\": true,\n    \"minecraft:visual/sky_color\": \"#6eb1ff\"\n  },\n  \"carvers\": \"#minecraft:in_biome/wooded_badlands\",\n  \"creature_spawn_probability\": 0.04,\n  \"downfall\": 0.0,\n  \"effects\": {\n    \"foliage_color\": \"#9e814d\",\n    \"grass_color\": \"#90814d\",\n    \"water_color\": \"#3f76e4\"\n  },\n  \"features\": [\n    \"#minecraft:raw_generation/in_biome/wooded_badlands\",\n    \"#minecraft:lakes/in_biome/wooded_badlands\",\n    \"#minecraft:local_modifications/in_biome/wooded_badlands\",\n    \"#minecraft:underground_structures/in_biome/wooded_badlands\",\n    \"#minecraft:surface_structures/in_biome/wooded_badlands\",\n    \"#minecraft:strongholds/in_biome/wooded_badlands\",\n    \"#minecraft:underground_ores/in_biome/wooded_badlands\",\n    \"#minecraft:underground_decoration/in_biome/wooded_badlands\",\n    \"#minecraft:fluid_springs/in_biome/wooded_badlands\",\n    \"#minecraft:vegetal_decoration/in_biome/wooded_badlands\",\n    \"#minecraft:top_layer_modification/in_biome/wooded_badlands\"\n  ],\n  \"has_precipitation\": false,\n  \"spawn_costs\": {},\n  \"spawners\": {\n    \"ambient\": [\n      {\n        \"type\": \"minecraft:bat\",\n        \"maxCount\": 8,\n        \"minCount\": 8,\n        \"weight\": 10\n      }\n    ],\n    \"axolotls\": [],\n    \"creature\": [\n      {\n        \"type\": \"minecraft:sheep\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 12\n      },\n      {\n        \"type\": \"minecraft:pig\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:chicken\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:cow\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 8\n      },\n      {\n        \"type\": \"minecraft:armadillo\",\n        \"maxCount\": 2,\n        \"minCount\": 1,\n        \"weight\": 6\n      },\n      {\n        \"type\": \"minecraft:wolf\",\n        \"maxCount\": 8,\n        \"minCount\": 4,\n        \"weight\": 2\n      }\n    ],\n    \"misc\": [],\n    \"monster\": [\n      {\n        \"type\": \"minecraft:spider\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:zombie\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 95\n      },\n      {\n        \"type\": \"minecraft:zombie_villager\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      },\n      {\n        \"type\": \"minecraft:skeleton\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:creeper\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:slime\",\n        \"maxCount\": 4,\n        \"minCount\": 4,\n        \"weight\": 100\n      },\n      {\n        \"type\": \"minecraft:enderman\",\n        \"maxCount\": 4,\n        \"minCount\": 1,\n        \"weight\": 10\n      },\n      {\n        \"type\": \"minecraft:witch\",\n        \"maxCount\": 1,\n        \"minCount\": 1,\n        \"weight\": 5\n      }\n    ],\n    \"underground_water_creature\": [\n      {\n        \"type\": \"minecraft:glow_squid\",\n        \"maxCount\": 6,\n        \"minCount\": 4,\n        \"weight\": 10\n      }\n    ],\n    \"water_ambient\": [],\n    \"water_creature\": []\n  },\n  \"temperature\": 2.0\n}\n"
  },
  {
    "path": "pfb_orbis/beet.yaml",
    "content": "id: gm4_orbis\nname: Orbis Prefabs\n\ndata_pack:\n  load: .\n\npipeline:\n  - gm4.plugins.prefabs\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/chests/dungeon/common.json",
    "content": "{\n  \"type\": \"minecraft:chest\",\n  \"pools\": [\n    {\n      \"rolls\": {\n        \"min\": 2,\n        \"max\": 4\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:rotten_flesh\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 5\n              },\n              \"add\": true\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 9,\n          \"name\": \"minecraft:bone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:gunpowder\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:spider_eye\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:string\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:melon_seeds\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:beetroot_seeds\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:pumpkin_seeds\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 2\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:bread\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 2,\n          \"name\": \"minecraft:golden_apple\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 9,\n          \"name\": \"minecraft:arrow\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:wheat\"\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:iron_pickaxe\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 2,\n          \"name\": \"minecraft:iron_chestplate\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:diamond\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:iron_boots\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:iron_shovel\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 2\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:gold_ingot\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:iron_ingot\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:lapis_lazuli\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 4\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/chests/dungeon/rare.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:iron_chestplate\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.5\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:iron_leggings\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.5\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:diamond_leggings\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:diamond_boots\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:diamond_pickaxe\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.8\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:diamond_axe\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:diamond_shovel\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 2\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:diamond_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:iron_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:golden_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:leather_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:golden_apple\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 2,\n          \"name\": \"minecraft:enchanted_golden_apple\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:obsidian\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:music_disc_mellohi\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:music_disc_mall\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:music_disc_otherside\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:bucket\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:name_tag\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:pumpkin_seeds\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:melon_seeds\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 4\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:rotten_flesh\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:bone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:gunpowder\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:spider_eye\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 9,\n          \"name\": \"minecraft:redstone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:arrow\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:string\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 2\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:wheat\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:bread\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:carrot\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 2,\n        \"max\": 3\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:iron_ingot\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 9,\n          \"name\": \"minecraft:gold_ingot\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:diamond\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:lapis_lazuli\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:ender_pearl\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/chests/dungeon/uncommon.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:iron_helmet\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:iron_chestplate\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:iron_leggings\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:iron_boots\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 9,\n          \"name\": \"minecraft:iron_pickaxe\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.5\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:iron_shovel\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 2,\n          \"name\": \"minecraft:diamond_leggings\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 2,\n          \"name\": \"minecraft:diamond_boots\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:diamond_pickaxe\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.3\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 2\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:diamond_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:iron_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:golden_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:leather_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:golden_apple\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:enchanted_golden_apple\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:obsidian\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:music_disc_mellohi\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:music_disc_mall\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:music_disc_otherside\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:bucket\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:name_tag\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:pumpkin_seeds\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:melon_seeds\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 9,\n          \"name\": \"minecraft:saddle\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 2,\n        \"max\": 6\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:rotten_flesh\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:bone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:gunpowder\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:spider_eye\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:redstone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:arrow\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:string\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 2\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:wheat\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:bread\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:carrot\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 2\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:iron_ingot\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:gold_ingot\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 2,\n          \"name\": \"minecraft:diamond\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:lapis_lazuli\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:ender_pearl\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/chests/dungeon.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 15,\n          \"value\": \"gm4_orbis:chests/dungeon/rare\"\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 35,\n          \"value\": \"gm4_orbis:chests/dungeon/uncommon\"\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 60,\n          \"value\": \"gm4_orbis:chests/dungeon/common\"\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:book\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_with_levels\",\n              \"levels\": {\n                \"min\": 5,\n                \"max\": 10\n              },\n              \"options\": \"#minecraft:non_treasure\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:location_check\",\n                  \"predicate\": {\n                    \"position\": {\n                      \"y\": {\n                        \"min\": 50\n                      }\n                    }\n                  }\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:enchant_with_levels\",\n              \"levels\": {\n                \"min\": 8,\n                \"max\": 15\n              },\n              \"options\": \"#minecraft:non_treasure\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:location_check\",\n                  \"predicate\": {\n                    \"position\": {\n                      \"y\": {\n                        \"min\": 32,\n                        \"max\": 49\n                      }\n                    }\n                  }\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:enchant_with_levels\",\n              \"levels\": {\n                \"min\": 10,\n                \"max\": 20\n              },\n              \"options\": \"#minecraft:non_treasure\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:location_check\",\n                  \"predicate\": {\n                    \"position\": {\n                      \"y\": {\n                        \"min\": 10,\n                        \"max\": 31\n                      }\n                    }\n                  }\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:enchant_with_levels\",\n              \"levels\": {\n                \"min\": 15,\n                \"max\": 25\n              },\n              \"options\": \"#minecraft:non_treasure\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:location_check\",\n                  \"predicate\": {\n                    \"position\": {\n                      \"y\": {\n                        \"min\": -20,\n                        \"max\": 9\n                      }\n                    }\n                  }\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:enchant_with_levels\",\n              \"levels\": {\n                \"min\": 20,\n                \"max\": 30\n              },\n              \"options\": \"#minecraft:non_treasure\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:location_check\",\n                  \"predicate\": {\n                    \"position\": {\n                      \"y\": {\n                        \"min\": -40,\n                        \"max\": -21\n                      }\n                    }\n                  }\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:enchant_with_levels\",\n              \"levels\": {\n                \"min\": 25,\n                \"max\": 30\n              },\n              \"options\": \"#minecraft:non_treasure\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:location_check\",\n                  \"predicate\": {\n                    \"position\": {\n                      \"y\": {\n                        \"max\": -41\n                      }\n                    }\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:random_chance\",\n          \"chance\": 0.7\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/chests/tower/common.json",
    "content": "{\n  \"type\": \"minecraft:chest\",\n  \"pools\": [\n    {\n      \"rolls\": {\n        \"min\": 2,\n        \"max\": 4\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:rotten_flesh\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 5\n              },\n              \"add\": true\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:bone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:gunpowder\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:feather\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:string\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:phantom_membrane\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:beetroot_seeds\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:pumpkin_seeds\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 2,\n        \"max\": 4\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:bread\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:lapis_lazuli\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:golden_apple\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:iron_ingot\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 9,\n          \"name\": \"minecraft:arrow\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:wheat\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:copper_ingot\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:campfire\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:spyglass\"\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:iron_axe\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 2,\n          \"name\": \"minecraft:iron_leggings\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:diamond\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:iron_helmet\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:iron_hoe\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/chests/tower/rare.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:iron_chestplate\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.5\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:iron_leggings\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.5\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:diamond_chestplate\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:diamond_boots\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:diamond_axe\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:diamond_shovel\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:diamond_sword\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.8\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:diamond_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:iron_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:golden_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:leather_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:golden_apple\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 2,\n          \"name\": \"minecraft:enchanted_golden_apple\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:music_disc_mall\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:music_disc_blocks\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:music_disc_wait\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:spyglass\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:pumpkin_seeds\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:melon_seeds\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:campfire\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 4\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:rotten_flesh\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:bone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:gunpowder\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:spider_eye\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 9,\n          \"name\": \"minecraft:redstone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:phantom_membrane\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:feather\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 2\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:wheat\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:bread\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:potato\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:carrot\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 2,\n        \"max\": 3\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:copper_ingot\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 2,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:gold_ingot\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:diamond\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:lapis_lazuli\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:ender_pearl\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/chests/tower/uncommon.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:iron_helmet\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:iron_chestplate\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.5\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:iron_leggings\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:iron_boots\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 9,\n          \"name\": \"minecraft:iron_sword\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.8\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:iron_hoe\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:diamond_chestplate\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 2,\n          \"name\": \"minecraft:diamond_helmet\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:diamond_sword\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_randomly\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:random_chance\",\n                  \"chance\": 0.3\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:iron_pickaxe\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 2\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:diamond_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:iron_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:golden_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:leather_horse_armor\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:golden_apple\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 1,\n          \"name\": \"minecraft:enchanted_golden_apple\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:music_disc_mall\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:music_disc_blocks\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:music_disc_wait\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:campfire\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 9,\n          \"name\": \"minecraft:spyglass\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:pumpkin_seeds\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:melon_seeds\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 9,\n          \"name\": \"minecraft:saddle\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 2,\n        \"max\": 6\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 10,\n          \"name\": \"minecraft:rotten_flesh\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 5\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:bone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 6,\n          \"name\": \"minecraft:gunpowder\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:spider_eye\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:redstone\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:arrow\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:string\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 2\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 5,\n          \"name\": \"minecraft:wheat\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 3,\n          \"name\": \"minecraft:bread\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 4,\n          \"name\": \"minecraft:carrot\"\n        }\n      ]\n    },\n    {\n      \"rolls\": {\n        \"min\": 1,\n        \"max\": 2\n      },\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 15,\n          \"name\": \"minecraft:iron_ingot\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 4\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:gold_ingot\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 2\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 2,\n          \"name\": \"minecraft:diamond\"\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 8,\n          \"name\": \"minecraft:lapis_lazuli\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 3\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"weight\": 7,\n          \"name\": \"minecraft:ender_pearl\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/chests/tower.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 15,\n          \"value\": \"gm4_orbis:chests/tower/rare\"\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 35,\n          \"value\": \"gm4_orbis:chests/tower/uncommon\"\n        },\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"weight\": 60,\n          \"value\": \"gm4_orbis:chests/tower/common\"\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:book\",\n          \"functions\": [\n            {\n              \"function\": \"minecraft:enchant_with_levels\",\n              \"levels\": {\n                \"min\": 1,\n                \"max\": 5\n              },\n              \"options\": \"#minecraft:non_treasure\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:location_check\",\n                  \"predicate\": {\n                    \"position\": {\n                      \"y\": {\n                        \"max\": 64\n                      }\n                    }\n                  }\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:enchant_with_levels\",\n              \"levels\": {\n                \"min\": 5,\n                \"max\": 10\n              },\n              \"options\": \"#minecraft:non_treasure\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:location_check\",\n                  \"predicate\": {\n                    \"position\": {\n                      \"y\": {\n                        \"min\": 65,\n                        \"max\": 70\n                      }\n                    }\n                  }\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:enchant_with_levels\",\n              \"levels\": {\n                \"min\": 10,\n                \"max\": 20\n              },\n              \"options\": \"#minecraft:non_treasure\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:location_check\",\n                  \"predicate\": {\n                    \"position\": {\n                      \"y\": {\n                        \"min\": 71,\n                        \"max\": 90\n                      }\n                    }\n                  }\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:enchant_with_levels\",\n              \"levels\": {\n                \"min\": 15,\n                \"max\": 25\n              },\n              \"options\": \"#minecraft:non_treasure\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:location_check\",\n                  \"predicate\": {\n                    \"position\": {\n                      \"y\": {\n                        \"min\": 90,\n                        \"max\": 131\n                      }\n                    }\n                  }\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:enchant_with_levels\",\n              \"levels\": {\n                \"min\": 20,\n                \"max\": 30\n              },\n              \"options\": \"#minecraft:non_treasure\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:location_check\",\n                  \"predicate\": {\n                    \"position\": {\n                      \"y\": {\n                        \"min\": 131,\n                        \"max\": 180\n                      }\n                    }\n                  }\n                }\n              ]\n            },\n            {\n              \"function\": \"minecraft:enchant_with_levels\",\n              \"levels\": {\n                \"min\": 25,\n                \"max\": 30\n              },\n              \"options\": \"#minecraft:non_treasure\",\n              \"conditions\": [\n                {\n                  \"condition\": \"minecraft:location_check\",\n                  \"predicate\": {\n                    \"position\": {\n                      \"y\": {\n                        \"min\": 180\n                      }\n                    }\n                  }\n                }\n              ]\n            }\n          ]\n        }\n      ],\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:random_chance\",\n          \"chance\": 0.7\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/entities/cave_spider.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"minecraft:entities/cave_spider\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/entities/creeper.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"minecraft:entities/creeper\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/entities/drowned.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"minecraft:entities/drowned\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/entities/glow_squid.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"minecraft:entities/glow_squid\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/entities/guardian.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"minecraft:entities/guardian\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/entities/pufferfish.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"minecraft:entities/pufferfish\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/entities/skeleton.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"minecraft:entities/skeleton\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/entities/spider.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"minecraft:entities/spider\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/entities/zombie.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": 1,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:loot_table\",\n          \"value\": \"minecraft:entities/zombie\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/loot_table/traps/arrow_dispenser.json",
    "content": "{\n  \"pools\": [\n    {\n      \"rolls\": {\n        \"min\": 2,\n        \"max\": 4\n      },\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:arrow\",\n          \"functions\": [\n            {\n              \"function\": \"set_count\",\n              \"count\": {\n                \"min\": 1,\n                \"max\": 4\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"rolls\": 1,\n      \"conditions\": [\n        {\n          \"condition\": \"random_chance\",\n          \"chance\": 0.25\n        }\n      ],\n      \"entries\": [\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:tipped_arrow\",\n          \"functions\": [\n            {\n              \"function\": \"set_potion\",\n              \"id\": \"poison\"\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:tipped_arrow\",\n          \"functions\": [\n            {\n              \"function\": \"set_potion\",\n              \"id\": \"harming\"\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:tipped_arrow\",\n          \"functions\": [\n            {\n              \"function\": \"set_potion\",\n              \"id\": \"weakness\"\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:tipped_arrow\",\n          \"functions\": [\n            {\n              \"function\": \"set_potion\",\n              \"id\": \"strong_harming\"\n            }\n          ]\n        },\n        {\n          \"type\": \"item\",\n          \"name\": \"minecraft:tipped_arrow\",\n          \"functions\": [\n            {\n              \"function\": \"set_potion\",\n              \"id\": \"slowness\"\n            }\n          ]\n        }\n      ],\n      \"functions\": [\n        {\n          \"function\": \"set_count\",\n          \"count\": {\n            \"min\": 1,\n            \"max\": 3\n          }\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/worldgen/template_pool/spawner/default.json",
    "content": "{\n  \"name\": \"gm4_orbis:spawner/default\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/zombie_down\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/spider_down\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/creeper_down\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/skeleton_down\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/zombie_up\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/spider_up\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/creeper_up\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/skeleton_up\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/zombie_side\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/spider_side\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/creeper_side\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/skeleton_side\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/worldgen/template_pool/spawner/spider.json",
    "content": "{\n  \"name\": \"gm4_orbis:spawner/spider\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/spider_down\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/spider_side\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/spider_up\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/extra/cave_spider_down\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/extra/cave_spider_side\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/extra/cave_spider_up\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/worldgen/template_pool/spawner/undead.json",
    "content": "{\n  \"name\": \"gm4_orbis:spawner/default\",\n  \"fallback\": \"minecraft:empty\",\n  \"elements\": [\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/zombie_down\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/skeleton_down\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/zombie_up\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/skeleton_up\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/zombie_side\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/default/skeleton_side\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "pfb_orbis/data/gm4_orbis/worldgen/template_pool/spawner/water.json",
    "content": "{\n  \"name\": \"gm4_orbis:spawner/water\",\n  \"fallback\": \"gm4_orbis:spawner/water\",\n  \"elements\": [\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/water/drowned_down\"\n      }\n    },\n    {\n      \"weight\": 3,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/water/glow_squid_down\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/water/guardian_down\"\n      }\n    },\n    {\n      \"weight\": 3,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/water/pufferfish_down\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/water/drowned_up\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/water/glow_squid_up\"\n      }\n    },\n    {\n      \"weight\": 6,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/water/guardian_up\"\n      }\n    },\n    {\n      \"weight\": 2,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/water/pufferfish_up\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/water/drowned_side\"\n      }\n    },\n    {\n      \"weight\": 3,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/water/glow_squid_side\"\n      }\n    },\n    {\n      \"weight\": 5,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/water/guardian_side\"\n      }\n    },\n    {\n      \"weight\": 3,\n      \"element\": {\n        \"element_type\": \"minecraft:single_pool_element\",\n        \"projection\": \"rigid\",\n        \"processors\": \"minecraft:empty\",\n        \"location\": \"gm4_orbis:spawner/water/pufferfish_side\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[project]\nname = \"gm4\"\nversion = \"1.0.0\"\ndescription = \"Data packs for https://gm4.co\"\nauthors = [\n    {name = \"Gamemode 4 Contributors\"},\n]\nrequires-python = \">=3.14\"\ndependencies = [\n    \"beet>=0.115.0\",\n    \"mecha>=0.103.0\",\n    \"bolt>=0.50.1\",\n    \"requests>=2.28.1\",\n    \"repro-zipfile>=0.1.0\",\n]\n\n[dependency-groups]\ndev = [\n    \"black>=22.6.0\",\n    \"isort>=5.10.1\",\n]\n\n[project.entry-points.beet]\ncommands = \"gm4.commands\"\nautoload = \"gm4.plugins.autoload\"\n\n[tool.beet]\n\n[tool.pyright]\ntypeCheckingMode = \"strict\"\n\n[tool.isort]\nprofile = \"black\"\n\n[build-system]\nrequires = [\"setuptools\"]\n\n[tool.setuptools]\npackages = [\"gm4\"]\n"
  },
  {
    "path": "resource_pack/beet.yaml",
    "content": "id: gm4_resource_pack\nname: Resource Pack\nversion: 1.5.X\n\nresource_pack:\n  load:\n    pack.png: pack.png\n    # other files are inherited by the full-project build\n\npipeline:\n  - dev_warning\n\nmeta:\n  gm4: \n    website:\n      description: Use our resource pack for the definitive Gamemode 4 experience! This resource pack does not touch vanilla textures, but adds textures and models to most Gamemode 4 blocks, items and mobs.\n      recommended: []\n      notes: []\n    wiki: null\n    credits:\n      Textures:\n        - Memo\n        - Hozz\n      Translations:\n        - ToffeeMax\n        - SarguCopperpot\n        - TheRedCommander\n        - KompetenterKeks\n      Font Magic:\n        - BPR\n"
  },
  {
    "path": "resource_pack/dev_description.py",
    "content": "from beet import Context\n\ndef beet_default(ctx: Context):\n    ctx.assets.description = [\n\t\t\t\"Merged Developer Resources\\n\",\n\t\t\t{\n\t\t\t\t\"text\": f\"Development Only!\",\n\t\t\t\t\"color\": \"red\"\n\t\t\t}\n\t\t]\n    ctx.assets.min_format = 84\n    ctx.assets.max_format = 84\n"
  },
  {
    "path": "resource_pack/dev_warning.py",
    "content": "from beet import Context\nimport logging\n\nlogger = logging.getLogger(\"gm4.gm4_resource_pack\")\n\ndef beet_default(ctx: Context):\n    if ctx.meta.get(\"gm4_dev\"):\n        logger.error(\"The resource pack cannot be cherry-picked by the 'beet dev' command - it inherits all its resources from other modules as they are built by the beet pipeline. If a full build is necessary, use the full project build 'beet build', otherwise just list the desired module(s) in 'beet dev' and use the partial resource pack output.\")\n"
  },
  {
    "path": "spyglass.json",
    "content": "{\n  \"env\": {\n    \"gameVersion\": \"Latest snapshot\",\n    \"exclude\": [\n      \".*/**\",\n      \"docs/**\",\n      \"out/**\",\n      \"release/**\"\n    ],\n    \"mcmetaSummaryOverrides\": {\n      \"commands\": {\n        \"path\": \"./commands.json\",\n        \"replace\": false\n      }\n    },\n    \"customResources\": {\n      \"guidebook\": {\n        \"category\": \"gm4_guidebook\"\n      },\n      \"templates/loot_table\": {\n        \"category\": \"loot_table\"\n      },\n      \"templates/worldgen/biome\": {\n        \"category\": \"worldgen/biome\"\n      },\n      \"templates/worldgen/configured_feature\": {\n        \"category\": \"worldgen/configured_feature\"\n      },\n      \"templates/worldgen/placed_feature\": {\n        \"category\": \"worldgen/placed_feature\"\n      }\n    }\n  }\n}\n"
  }
]